From 88a525f1a75bd9df523cb2b53eadc482aae2335a Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Thu, 12 Nov 2020 00:32:16 +0000 Subject: [PATCH 01/90] [ci skip] Translation update --- translations/frontend/af.json | 58 +++++++++--- translations/frontend/ca.json | 2 + translations/frontend/cs.json | 144 +++++++++++++++-------------- translations/frontend/de.json | 42 ++++++++- translations/frontend/en.json | 29 ++++++ translations/frontend/es.json | 2 + translations/frontend/et.json | 4 +- translations/frontend/it.json | 6 +- translations/frontend/ja.json | 79 ++++++++++++++++ translations/frontend/lb.json | 70 ++++++++++++++ translations/frontend/nb.json | 12 ++- translations/frontend/nl.json | 2 +- translations/frontend/pl.json | 4 +- translations/frontend/pt.json | 73 ++++++++++++++- translations/frontend/ru.json | 80 ++++++++++++++-- translations/frontend/sl.json | 11 ++- translations/frontend/zh-Hant.json | 116 +++++++++++++++++++---- 17 files changed, 605 insertions(+), 129 deletions(-) diff --git a/translations/frontend/af.json b/translations/frontend/af.json index 7a1320e448..8ed62c5993 100644 --- a/translations/frontend/af.json +++ b/translations/frontend/af.json @@ -324,7 +324,7 @@ "auth_store": { "ask": "Wil u hierdie aanmelding stoor?", "confirm": "Stoor aanmelding", - "decline": "Nee dankie" + "decline": "Nee" }, "card": { "alarm_control_panel": { @@ -486,7 +486,7 @@ "season": "Stagione", "track": "Traccia", "tv_show": "Programma televisivo", - "url": "Url", + "url": "URL", "video": "Video" } }, @@ -529,17 +529,17 @@ "dismiss": "Ontslaan", "editor": { "confirm_delete": "Is u seker dat u hierdie inskrywing wil verwyder?", - "delete": "SKRAP", + "delete": "Verwyder", "enabled_cause": "ge deaktiveer", "enabled_description": "Ge deaktiveerde entiteite sal nie by die Huisassistent gevoeg word nie.", "enabled_label": "Aktiveer entiteit", "entity_id": "Entiteit ID", - "icon": "Ikoon oorskry", + "icon": "Ikoon", "icon_error": "Ikone moet in die formaat 'voorvoegsel: iconname' wees, byvoorbeeld 'mdi: home'", - "name": "Naam Oorheers", + "name": "Naam", "note": "Let wel: dit werk dalk nog nie met alle integrasies nie.", "unavailable": "Hierdie entiteit is nie tans beskikbaar nie.", - "update": "OPDATEER" + "update": "Opdateer" }, "no_unique_id": "Hierdie entiteit het nie 'n unieke ID nie, daarom kan die instellings nie vanuit die UI bestuur word nie.", "related": "Verwante", @@ -660,7 +660,7 @@ "link_profile_page": "jou profiel bladsy" }, "areas": { - "caption": "Gebiedsregister", + "caption": "Areas", "description": "Oorsig van alle gebiede in u huis.", "editor": { "create": "SKEP", @@ -670,7 +670,7 @@ }, "picker": { "create_area": "SKEP GEBIED", - "header": "Gebiedsregister", + "header": "Areas", "integrations_page": "Integrasies bladsy", "introduction": "Gebiede word gebruik om toestelle te organiseer gebaseer op waar hulle is. Hierdie inligting sal regdeur Home Assistant gebruik word om u te help om u koppelvlak, toestemmings en integrasies met ander stelsels te organiseer.", "introduction2": "Om toestelle in 'n gebied te plaas, gebruik die skakel hieronder om na die integrasies bladsy toe te gaan en klik dan op 'n opgestelde integrasie om na die toestelkaarte toe te gaan.", @@ -771,6 +771,9 @@ "introduction": "Gebruik outomatisasies om jou huis lewend te maak", "load_error_not_editable": "Slegs outomatisasies in automations.yaml kan verander word.", "load_error_unknown": "Kon nie outomatisering laai nie ({err_no}).", + "modes": { + "parallel": "Parallel" + }, "save": "Stoor", "triggers": { "add": "Voeg sneller by", @@ -1033,6 +1036,16 @@ } }, "info": { + "system_health": { + "checks": { + "homeassistant": { + "os_name": "Bedryfstelselnaam", + "os_version": "Bedryfstelsel Weergawe", + "timezone": "Tydsone", + "version": "Weergawe" + } + } + }, "title": "Inligting" }, "integrations": { @@ -1116,7 +1129,7 @@ "show_sidebar": "Wys in Kantbalk", "title": "Kantbalk-titel", "update": "Opdateer", - "url": "Url", + "url": "URL", "url_error_msg": "Die url kan nie spasies of spesiale karakters bevat nie, behalwe vir _ en -" }, "picker": { @@ -1142,8 +1155,8 @@ "dismiss": "maak toe", "new_resource": "Voeg nuwe hulpbronne by", "update": "opdateer", - "url": "Url", - "url_error_msg": "Url is n vereiste", + "url": "URL", + "url_error_msg": "URL is n vereiste", "warning_header": "Wees versigtig!", "warning_text": "Dit kan gevaarlik wees om hulpbronne by te voeg, maak seker dat u die bron van die bron ken en vertrou. Swak hulpbronne kan u stelsel ernstig benadeel." }, @@ -1151,7 +1164,7 @@ "add_resource": "Voeg hulpbron by", "headers": { "type": "tipe", - "url": "Url" + "url": "URL" } }, "refresh_body": "U moet die bladsy verfris om die verwydering te voltooi, wil u nou verfris?", @@ -1230,11 +1243,13 @@ "sequence_sentence": "Die volgorde van aksies van hierdie skrip." }, "picker": { + "duplicate": "Dupliseer", "edit_script": "Redigeer skrip", "trigger_script": "Sneller skrip" } }, "server_control": { + "caption": "Bedienerkontroles", "section": { "reloading": { "person": "Herlaai persone", @@ -1298,7 +1313,7 @@ "create_group": "Zigbee Home Automation - Skep 'n groep", "create_group_details": "Voer die nodige besonderhede in om 'n nuwe zigbeegroep te skep", "creating_group": "Skep 'n groep", - "description": "Skep en verander Zigbee-groepe", + "description": "Bestuur Zigbee-groepe", "group_details": "Hier is al die besonderhede vir die geselekteerde Zigbee groep.", "group_id": "Groep-ID", "group_info": "Groeps Inligting", @@ -1375,13 +1390,17 @@ "header": "Knooppuntkonfigurasieopsies", "set_config_parameter": "Stel Config-parameter in" }, + "node_management": { + "add_to_group": "Voeg by Groep", + "remove_from_group": "Verwyder van Groep" + }, "services": { "add_node": "Voeg Knooppunt By", "add_node_secure": "Voeg Veilige Knooppunt By", "cancel_command": "Kanselleer Opdrag", "heal_network": "Herstel Netwerk", "remove_node": "Verwyder Knooppunt", - "save_config": "Stoor Instellings", + "save_config": "Stoor Konfigurasie", "soft_reset": "Sagte Herstel", "start_network": "Skakel Netwerk Aan", "stop_network": "Stop Netwerk", @@ -1465,10 +1484,18 @@ "refresh": "Herlaai" }, "editor": { + "action-editor": { + "actions": { + "url": "URL" + } + }, "card": { "button": { "name": "Knoppie" }, + "generic": { + "url": "URL" + }, "humidifier": { "description": "Die Luchtbevochtigerkaart verleen beheer oor u lugbevochtiger-entiteit. Hiermee kan u die humiditeit en modus van die entiteit verander." }, @@ -1482,6 +1509,7 @@ "edit_card": { "add": "Voeg Kaart by", "delete": "Skrap kaart", + "duplicate": "Dupliseer Kaart", "edit": "Wysig", "header": "Kaart opstelling", "move": "Skuif", @@ -1549,7 +1577,7 @@ "refresh": "Verfris", "start_conversation": "Begin gesprek" }, - "reload_lovelace": "Herlaai Lovelace", + "reload_lovelace": "Herlaai UI", "unused_entities": { "available_entities": "Dit is die entiteite wat u beskikbaar het, maar is nog nie in u Lovelace UI nie.", "domain": "Domein", diff --git a/translations/frontend/ca.json b/translations/frontend/ca.json index 386b563a0a..7151215159 100644 --- a/translations/frontend/ca.json +++ b/translations/frontend/ca.json @@ -2187,6 +2187,8 @@ }, "picker": { "add_script": "Afegeix script", + "duplicate": "Duplica", + "duplicate_script": "Duplica l'script", "edit_script": "Edita l'script", "header": "Editor de scripts", "headers": { diff --git a/translations/frontend/cs.json b/translations/frontend/cs.json index c332adc563..34c8c2e8da 100644 --- a/translations/frontend/cs.json +++ b/translations/frontend/cs.json @@ -1,7 +1,7 @@ { "config_entry": { "disabled_by": { - "config_entry": "Položka konfigurace", + "config_entry": "Položka nastavení", "integration": "Integrace", "user": "Uživatel" } @@ -209,8 +209,8 @@ "off": "Vypnuto" }, "configurator": { - "configure": "Konfigurovat", - "configured": "Nakonfigurováno" + "configure": "Nastavit", + "configured": "Nastaveno" }, "cover": { "closed": "Zavřeno", @@ -792,12 +792,12 @@ "pattern": "Vzor regex pro ověření na straně klienta", "text": "Text" }, - "platform_not_loaded": "Integrace {platform} není načtena. Přidejte ji do své konfigurace buďto přidáním 'default_config:' nebo ''{platform}:''.", + "platform_not_loaded": "Integrace {platform} není načtena. Přidejte ji do své konfigurace buďto přidáním \"default_config:\" nebo ''{platform}:''.", "required_error_msg": "Toto pole je povinné", "timer": { "duration": "Doba trvání" }, - "yaml_not_editable": "Nastavení této entity nelze upravovat z uživatelského rozhraní. Pouze entity nastavené z uživatelského rozhraní lze konfigurovat v uživatelském rozhraní." + "yaml_not_editable": "Nastavení této entity nelze upravovat z uživatelského rozhraní. Pouze entity nastavené z uživatelského rozhraní lze spravovat v uživatelském rozhraní." }, "image_cropper": { "crop": "Oříznout" @@ -889,7 +889,7 @@ "input_select": "Nově načíst pomocníky - výběry", "input_text": "Nově načíst pomocníky - texty", "min_max": "Nově načíst entity integrace Min/Max", - "mqtt": "Nově načíst ručně nakonfigurované entity integrace MQTT", + "mqtt": "Nově načíst ručně nastavené entity integrace MQTT", "person": "Nově načíst osoby", "ping": "Nově načíst entity integrace Ping", "reload": "Nově načíst integraci {domain}", @@ -925,7 +925,7 @@ "buttons": { "add": "Přidejte zařízení prostřednictvím tohoto zařízení", "clusters": "Clustery", - "reconfigure": "Překonfigurovat zařízení", + "reconfigure": "Přenastavit zařízení", "remove": "Odebrat zařízení", "zigbee_information": "Podpis zařízení Zigbee" }, @@ -939,7 +939,7 @@ "power_source": "Zdroj napájení", "quirk": "Zvláštnost", "services": { - "reconfigure": "Překonfigurovat zařízení ZHA (opravit zařízení). Použijte, pokud se zařízením máte problémy. Je-li dotyčné zařízení napájené bateriemi, ujistěte se prosím, že je při používání této služby spuštěné a přijímá příkazy.", + "reconfigure": "Přenastavení zařízení ZHA (oprava zařízení). Použijte, pokud se zařízením máte problémy. Je-li dotyčné zařízení napájené bateriemi, ujistěte se prosím, že je při používání této služby spuštěné a přijímá příkazy.", "remove": "Odebrat zařízení ze sítě Zigbee.", "updateDeviceName": "Nastavte vlastní název tohoto zařízení v seznamu zařízení.", "zigbee_information": "Zobrazit Zigbee informace zařízení." @@ -986,7 +986,7 @@ }, "config": { "advanced_mode": { - "hint_enable": "Chybí vám možnosti konfigurace? Zapněte rozšířený režim", + "hint_enable": "Chybí vám možnosti nastavení? Zapněte rozšířený režim", "link_profile_page": "stránka vašeho profilu" }, "areas": { @@ -1015,7 +1015,7 @@ "header": "Oblasti", "integrations_page": "Stránka integrací", "introduction": "Oblasti se používají k uspořádání zařízení podle místa kde jsou. Tato informace bude použita k organizaci rozhraní, k nastavení oprávnění a v integraci s ostatnímy systémy.", - "introduction2": "Pro přídání zařízení do oblasti přejděte na stránku integrací pomocí odkazu níže tam klikněte na nakonfigurovanou integraci abyste se dostali na kartu zažízení.", + "introduction2": "Pro přídání zařízení do oblasti přejděte na stránku integrací pomocí odkazu níže, tam klikněte na nastavenou integraci, abyste se dostali ke kartám zařízení.", "no_areas": "Vypadá to, že ještě nemáte žádné oblasti!" } }, @@ -1320,7 +1320,7 @@ "headers": { "name": "Název" }, - "introduction": "Editor automatizací umožňuje vytvářet a upravovat automatizace. Přečtěte si prosím [pokyny] (https://home-assistant.io/docs/automation/editor/), abyste se ujistili, že jste Home Assistant nakonfigurovali správně.", + "introduction": "Editor automatizací umožňuje vytvářet a upravovat automatizace. Přečtěte si prosím pokyny na odkazu níže, abyste se ujistili, že jste Home Assistant nastavili správně.", "learn_more": "Další informace o automatizacích", "no_automations": "Nemohli jsme najít žádné upravitelné automatizace", "only_editable": "Upravitelné mohou být pouze automatizace definované v automations.yaml.", @@ -1347,7 +1347,7 @@ "cloud": { "account": { "alexa": { - "config_documentation": "Dokumentace ke konfiguraci", + "config_documentation": "Dokumentace pro nastavení", "disable": "zakázat", "enable": "povolit", "enable_ha_skill": "Povolte Home Assistant skill pro Alexu", @@ -1364,7 +1364,7 @@ "connection_status": "Stav cloudového připojení", "fetching_subscription": "Načítání předplatného ...", "google": { - "config_documentation": "Dokumentace ke konfiguraci", + "config_documentation": "Dokumentace pro nastavení", "devices_pin": "PIN pro zabezpečovací zařízení", "enable_ha_skill": "Povolte Home Assistant skill pro Google Assistant", "enable_state_reporting": "Povolit hlášení stavu", @@ -1399,11 +1399,11 @@ "thank_you_note": "Děkujeme, že jste se stali součástí Home Assistant Cloud. Díky lidem, jako jste vy, jsme schopni udělat skvělý zážitek z domácí automatizace pro každého. Díky!", "webhooks": { "disable_hook_error_msg": "Nepodařilo se deaktivovat webhook:", - "info": "Všechno, co je nakonfigurováno tak, aby bylo spouštěno webhookem, může mít veřejně přístupnou adresu URL, která vám umožní posílat data zpět Home Assistant odkudkoli, aniž by byla vaše instance vystavena internetu.", + "info": "Všechno, co je nastaveno tak, aby bylo spouštěno webhookem, může mít veřejně přístupnou adresu URL, která vám umožní posílat data zpět Home Assistant odkudkoli, aniž by byla vaše instance vystavena internetu.", "link_learn_more": "Další informace o vytváření automatizací využívajících webhook.", "loading": "Načítání ...", "manage": "Spravovat", - "no_hooks_yet": "Vypadá to, že ještě nemáte žádné webhooky. Začněte konfigurací ", + "no_hooks_yet": "Vypadá to, že ještě nemáte žádné webhooky. Začněte nastavením ", "no_hooks_yet_link_automation": "automatizace webhooků", "no_hooks_yet_link_integration": "integrace založené na webhooku", "no_hooks_yet2": "nebo vytvořením", @@ -1411,7 +1411,7 @@ } }, "alexa": { - "banner": "Úprava entit, které jsou exponované prostřednictvím tohoto uživatelského rozhraní je zakázána, protože jste nakonfigurovali filtry entit v souboru configuration.yaml.", + "banner": "Nastavení, které entity jsou vystaveny, pomocí uživatelského rozhraní je zakázáno, protože jste nastavili filtry entit v souboru configuration.yaml.", "dont_expose_entity": "Nevystavovat entitu", "expose": "Exponovat do Alexa", "expose_entity": "Vystavit entitu", @@ -1455,7 +1455,7 @@ "title": "Zapomenuté heslo" }, "google": { - "banner": "Úprava entity, které jsou exponované prostřednictvím tohoto uživatelského rozhraní je zakázána, protože jste nakonfigurovali filtry entit v souboru configuration.yaml.", + "banner": "Nastavení, které entity jsou vystaveny, pomocí uživatelského rozhraní je zakázáno, protože jste nastavili filtry entit v souboru configuration.yaml.", "disable_2FA": "Zakázat dvoufaktorové ověřování", "dont_expose_entity": "Nevystavovat entitu", "expose": "Exponovat do Google Assistant", @@ -1523,7 +1523,7 @@ "section": { "core": { "core_config": { - "edit_requires_storage": "Editor je zakázán, protože konfigurace je uložena v configuration.yaml.", + "edit_requires_storage": "Editor je zakázán, protože nastavení je uloženo v configuration.yaml.", "elevation": "Nadmořská výška", "elevation_meters": "metrů", "external_url": "Externí adresa URL", @@ -1540,7 +1540,7 @@ "unit_system_metric": "Metrický" }, "header": "Obecná nastavení", - "introduction": "Moc dobře víme, že změna konfigurace může být velmi únavným procesem. Tato sekce se proto pokusí udělat váš život alespoň trochu jednodušší." + "introduction": "Moc dobře víme, že změna nastavení může být velmi únavný proces. Tato sekce se proto pokusí udělat váš život alespoň trochu jednodušší." } } }, @@ -1594,7 +1594,7 @@ "caption": "Zařízení", "confirm_delete": "Opravdu chcete toto zařízení odstranit?", "confirm_rename_entity_ids": "Chcete také přejmenovat ID entit?", - "confirm_rename_entity_ids_warning": "Žádná konfigurace (např. automatizace, skripty, scény, dashboardy), která tyto entity aktuálně používá, nebude změněna! Budete vše muset aktualizovat sami, aby používaly nová ID entit!", + "confirm_rename_entity_ids_warning": "Žádná nastavení (např. automatizace, skripty, scény, dashboardy), která tyto entity aktuálně používá, nebudou změněna! Vše budete muset aktualizovat sami, aby se používaly nová ID entit!", "data_table": { "area": "Oblast", "battery": "Baterie", @@ -1708,7 +1708,7 @@ }, "types": { "counter": "Počítadlo", - "input_boolean": "Přepínač", + "input_boolean": "Přepnout", "input_datetime": "Datum a/nebo čas", "input_number": "Číslo", "input_select": "Výběr", @@ -1774,8 +1774,8 @@ }, "integration_panel_move": { "link_integration_page": "stránka integrací", - "missing_zha": "Hledáte konfiguraci ZHA? Byl přesunut do položky Z-Wave na {integrations_page} .", - "missing_zwave": "Hledáte konfiguraci Z-Wave? Byl přesunut do položky Z-Wave na {integrations_page} ." + "missing_zha": "Hledáte nastavení ZHA? Bylo přesunuto do položky ZHA na {integrations_page}.", + "missing_zwave": "Hledáte nastavení Z-Wave? Bylo přesunuto do položky Z-Wave na {integrations_page}." }, "integrations": { "add_integration": "Přidat integraci", @@ -1824,8 +1824,8 @@ "not_all_required_fields": "Nejsou vyplněna všechna povinná pole.", "submit": "Odeslat" }, - "configure": "Konfigurovat", - "configured": "Zkonfigurováno", + "configure": "Nastavit", + "configured": "Nastaveno", "description": "Správa integrací", "details": "Podrobnosti o integraci", "discovered": "Objeveno", @@ -1844,18 +1844,18 @@ "integration": "integrace", "integration_not_found": "Integrace nebyla nalezena.", "new": "Nastavte novou integraci", - "no_integrations": "Vypadá to, že ještě nemáte nakonfigurovány žádné integrace. Kliknutím na tlačítko níže přidáte svou první integraci!", - "none": "Zatím nic nezkonfigurováno", + "no_integrations": "Vypadá to, že ještě nemáte nastaveny žádné integrace. Kliknutím na tlačítko níže přidáte svou první integraci!", + "none": "Zatím nic nastaveno", "none_found": "Žádné integrace nenalezeny.", "none_found_detail": "Upravte kritéria vyhledávání.", - "note_about_integrations": "Ne všechny integrace lze prozatím konfigurovat prostřednictvím uživatelského rozhraní.", + "note_about_integrations": "Některé integrace zatím nelze nastavit prostřednictvím uživatelského rozhraní.", "note_about_website_reference": "Další jsou k dispozici na ", - "reconfigure": "Překonfigurovat", + "reconfigure": "Přenastavit", "rename_dialog": "Upravit název této položky nastavení", "rename_input_label": "Název položky", "search": "Hledat integraci" }, - "introduction": "Zde je možné konfigurovat vaše komponenty a Home Assistant.\nZatím není možné vše konfigurovat přímo z uživatelského rozhraní, ale pracujeme na tom.", + "introduction": "Zde je možné nastavit vaše komponenty a Home Assistant.\nZatím není možné vše nastavit přímo z uživatelského rozhraní, ale pracujeme na tom.", "logs": { "caption": "Logy", "clear": "Zrušit", @@ -1947,7 +1947,7 @@ } }, "mqtt": { - "button": "Konfigurovat", + "button": "Nastavit", "description_listen": "Naslouchat tématu", "description_publish": "Publikovat paket", "listening_to": "Naslouchám", @@ -1961,7 +1961,7 @@ "topic": "téma" }, "ozw": { - "button": "Konfigurovat", + "button": "Nastavit", "common": { "controller": "Ovladač", "instance": "Instance", @@ -1980,7 +1980,7 @@ "navigation": { "network": "Síť", "node": { - "config": "Konfigurace", + "config": "Nastavení", "dashboard": "Dashboard" }, "nodes": "Uzly", @@ -2013,9 +2013,9 @@ }, "node_config": { "header": "Nastavení uzlu", - "help_source": "Popisy parametrů konfigurace a text nápovědy poskytuje projekt OpenZWave.", - "introduction": "Spravujte různé konfigurační parametry pro uzel Z-Wave.", - "wakeup_help": "Uzly napájené z baterie musí být vzhůru, aby mohly změnit svou konfiguraci. Pokud uzel není vzhůru, OpenZWave se pokusí aktualizovat konfiguraci uzlu při příštím probuzení, což může být o několik hodin (nebo dní) později. Zařízení probudíte takto:" + "help_source": "Popisy parametrů nastavení a text nápovědy poskytuje projekt OpenZWave.", + "introduction": "Spravujte různé parametry nastavení uzlu Z-Wave.", + "wakeup_help": "Uzly napájené z baterie musí být vzhůru, aby mohly změnit své nastavení. Pokud uzel není vzhůru, OpenZWave se pokusí aktualizovat nastavení uzlu při příštím probuzení, což může být o několik hodin (nebo dní) později. Zařízení probudíte takto:" }, "node_metadata": { "product_manual": "Příručka k produktu" @@ -2024,7 +2024,7 @@ "associations": "Obnovuji přidružené skupiny a členství", "cacheload": "Načítám informace ze souboru mezipaměti OpenZWave. Uzly baterií zůstanou v této fázi, dokud se uzel neprobudí.", "complete": "Proces komunikace je dokončen", - "configuration": "Získávám konfiguraci z uzlu", + "configuration": "Získávám nastavení z uzlu", "dynamic": "Získávám často se měnící hodnoty z uzlu", "instances": "Získávám podrobnosti o tom, jaké instance nebo kanály zařízení podporuje", "manufacturerspecific1": "Získávám z uzlu kody výrobce a produktů", @@ -2103,7 +2103,7 @@ "introduction": "Zde můžete definovat každou osobu v Home Assistant.", "learn_more": "Další informace o osobách", "no_persons_created_yet": "Vypadá to, že jste dosud žádné osoby nevytvořili.", - "note_about_persons_configured_in_yaml": "Poznámka: Osoby konfigurované pomocí configuration.yaml nelze upravovat pomocí uživatelského rozhraní.", + "note_about_persons_configured_in_yaml": "Poznámka: Osoby nastavené pomocí configuration.yaml nelze upravovat pomocí uživatelského rozhraní.", "person_not_found": "Nedaří se nám najít osobu, kterou jste se pokoušeli upravit.", "person_not_found_title": "Osoba nenalezena" }, @@ -2144,7 +2144,7 @@ "headers": { "name": "Název" }, - "introduction": "Editor scén vám umožňuje vytvářet a upravovat scény. Postupujte podle níže uvedeného odkazu a přečtěte si pokyny, abyste se ujistili, že jste Home Assistant nakonfigurovali správně.", + "introduction": "Editor scén vám umožňuje vytvářet a upravovat scény. Přečtěte si pokyny na odkazy níže, abyste se ujistili, že jste Home Assistant nastavili správně.", "learn_more": "Další informace o scénách", "no_scenes": "Nemohli jsme najít žádné upravitelné scény", "only_editable": "Lze upravovat pouze scény definované v souboru scenes.yaml.", @@ -2187,12 +2187,14 @@ }, "picker": { "add_script": "Přidat skript", + "duplicate": "Duplikát", + "duplicate_script": "Duplikovat skript", "edit_script": "Upravit skript", "header": "Editor skriptů", "headers": { "name": "Název" }, - "introduction": "Editor skriptů umožňuje vytvářet a upravovat skripty. Postupujte podle níže uvedeného odkazu a přečtěte si pokyny, abyste se ujistili, že jste Home Assistant nakonfigurovali správně.", + "introduction": "Editor skriptů umožňuje vytvářet a upravovat skripty. Přečtěte si pokyny na odkazy níže, abyste se ujistili, že jste Home Assistant nastavili správně.", "learn_more": "Další informace o skriptech", "no_scripts": "Nemohli jsme najít žádné upravitelné skripty", "run_script": "Spustit skript", @@ -2213,7 +2215,7 @@ "generic": "Nově načíst entity integrace Generic IP camera", "generic_thermostat": "Nově načíst entity integrace Generic thermostat", "group": "Nově načíst skupiny, skupiny entit a notifikační služby", - "heading": "Konfigurace z YAML se načítá", + "heading": "Nastavení z YAML se načítá", "history_stats": "Nově načíst entity integrace History stats", "homekit": "Nově načíst entity integrace HomeKit", "input_boolean": "Nově načíst pomocníky - přepínače", @@ -2221,9 +2223,9 @@ "input_number": "Nově načíst pomocníky - čísla", "input_select": "Nově načíst pomocníky - výběry", "input_text": "Nově načíst pomocníky - texty", - "introduction": "Některé části Home Assistant lze nově načíst bez nutnosti restartování. Nové načtení zahodí jejich aktuální konfiguraci a načte novou.", + "introduction": "Některé části Home Assistant lze nově načíst bez nutnosti restartování. Nové načtení zahodí jejich aktuální nastavení a načte nové.", "min_max": "Nově načíst entity integrace Min/Max", - "mqtt": "Nově načíst ručně nakonfigurované entity integrace MQTT", + "mqtt": "Nově načíst ručně nastavené entity integrace MQTT", "person": "Nově načíst osoby", "ping": "Nově načíst entity integrace Ping", "reload": "Nově načíst integraci {domain}", @@ -2250,7 +2252,7 @@ "validation": { "check_config": "Zkontrolujte konfiguraci", "heading": "Ověření konfigurace", - "introduction": "Pokud jste nedávno provedli změny konfigurace a chcete se ujistit, že je vše v pořádku, můžete ji zde ověřit", + "introduction": "Pokud jste nedávno provedli změny konfigurace a chcete se ujistit, že je vše v pořádku, můžete zde konfiguraci ověřit", "invalid": "Konfigurace není v pořádku!", "valid": "Konfigurace je v pořádku!" } @@ -2343,7 +2345,7 @@ "caption": "Přidat zařízení", "description": "Přidat zařízení do sítě Zigbee" }, - "button": "Konfigurovat", + "button": "Nastavit", "caption": "ZHA", "cluster_attributes": { "attributes_of_cluster": "Atributy vybraného klastru", @@ -2417,7 +2419,7 @@ "zha_zigbee_groups": "ZHA Zigbee skupiny" }, "header": "Nastavení Zigbee Home Automation", - "introduction": "Zde je možné konfigurovat vaše komponenty a Home Assistant. Z uživatelského rozhraní sice zatím není možné konfigurovat vše, ale pracujeme na tom.", + "introduction": "Zde je možné nastavit vaše komponenty ZHA a Home Assistant. Z uživatelského rozhraní sice zatím není možné nastavit úplně vše, ale pracujeme na tom.", "network_management": { "header": "Správa sítě", "introduction": "Příkazy, které ovlivňují celou síť" @@ -2437,7 +2439,7 @@ "zone": { "add_zone": "Přidat zónu", "caption": "Zóny", - "configured_in_yaml": "Zóny konfigurované pomocí configuration.yaml nelze upravovat pomocí UI.", + "configured_in_yaml": "Zóny nastavené pomocí configuration.yaml nelze upravovat v uživatelském rozhraní.", "confirm_delete": "Opravdu chcete tuto zónu smazat?", "create_zone": "Vytvořit zónu", "description": "Spravá zón, ve kterých chcete sledovat osoby", @@ -2458,13 +2460,13 @@ }, "edit_home_zone": "Poloměr domovské zóny zatím nelze upravit z frontendu. Z frontendu se dá změnit jen poloha domovské zóny.", "edit_home_zone_narrow": "Poloměr domovské zóny zatím nelze upravit z rozhraní. Umístění lze změnit z obecného nastavení.", - "go_to_core_config": "Přejít na obecnou konfiguraci?", - "home_zone_core_config": "Umístění vaší domovské zóny lze upravit na stránce obecného nastavení. Poloměr domovské zóny zatím nelze upravit z rozhraní. Chcete přejít na obecnou konfiguraci?", + "go_to_core_config": "Přejít na obecnou nastavení?", + "home_zone_core_config": "Umístění vaší domovské zóny lze upravit na stránce obecného nastavení. Poloměr domovské zóny zatím nelze upravit z rozhraní. Chcete přejít do obecného nastavení?", "introduction": "Zóny umožňují určit určité oblasti na zemi. Když je osoba v zóně, stav převezme název ze zóny. Zóny lze také použít jako aktivační událost nebo podmínku v nastavení automatizace.", "no_zones_created_yet": "Vypadá to, že nejsou vytvořené žádné zóny." }, "zwave": { - "button": "Konfigurovat", + "button": "Nastavit", "caption": "Z-Wave", "common": { "index": "Index", @@ -2488,12 +2490,12 @@ "network_stopped": "Síť Z-Wave byla zastavena" }, "node_config": { - "config_parameter": "Konfigurační parametr", - "config_value": "Konfigurační hodnota", + "config_parameter": "Parametr nastavení", + "config_value": "Hodnota nastavení", "false": "False", "header": "Možnosti nastavení uzlu", "seconds": "sekund", - "set_config_parameter": "Nastavte konfigurační parametr", + "set_config_parameter": "Nastavte parametr", "set_wakeup": "Nastavit interval probuzení", "true": "True" }, @@ -2538,7 +2540,7 @@ "remove_failed_node": "Odebrat selhaný uzel", "remove_node": "Odebrat uzel", "replace_failed_node": "Nahradit selhaný uzel", - "save_config": "Uložit konfiguraci", + "save_config": "Uložit nastavení", "soft_reset": "Měkký reset", "start_network": "Spustit síť", "stop_network": "Zastavit síť", @@ -2940,7 +2942,7 @@ "delete": "Smazat kartu", "duplicate": "Duplikovat kartu", "edit": "Upravit", - "header": "Konfigurace karty", + "header": "Nastavení karty", "move": "Přesunout", "move_after": "Posunout kartu za", "move_before": "Posunout kartu před", @@ -2964,8 +2966,8 @@ "add": "Přidat pohled", "delete": "Odstranit pohled", "edit": "Upravit pohled", - "header": "Zobrazit konfiguraci", - "header_name": "{name} Zobrazit konfiguraci", + "header": "Zobrazit nastavení", + "header_name": "Zobrazit nastavení {name}", "move_left": "Posunout pohled doleva", "move_right": "Posunout pohled doprava", "tab_badges": "Odznaky", @@ -2994,19 +2996,19 @@ }, "menu": { "open": "Otevřít Lovelace menu", - "raw_editor": "Editor kódu konfigurace" + "raw_editor": "Editor kódu nastavení" }, "migrate": { - "header": "Konfigurace není kompatibilní", - "migrate": "Migrovat konfiguraci", - "para_migrate": "Home Assistant může automaticky přidat ID ke všem vašim kartám a pohledům stisknutím tlačítka \"Migrovat konfiguraci\".", + "header": "Nastavení není kompatibilní", + "migrate": "Migrovat nastavení", + "para_migrate": "Home Assistant může automaticky přidat ID ke všem vašim kartám a pohledům stisknutím tlačítka \"Migrovat nastavení\".", "para_no_id": "Tento prvek nemá ID. Přidejte k tomuto prvku ID v 'ui-lovelace.yaml'." }, "move_card": { "header": "Vyberte pohled, do kterého chcete kartu přesunout" }, "raw_editor": { - "confirm_remove_config_text": "Pokud odeberete konfiguraci uživatelského rozhraní Lovelace, automaticky vygenerujeme pohledy Lovelace s vašimi oblastmi a zařízeními.", + "confirm_remove_config_text": "Pokud odeberete nastavení uživatelského rozhraní Lovelace, automaticky vygenerujeme pohledy Lovelace s vašimi oblastmi a zařízeními.", "confirm_remove_config_title": "Opravdu chcete odstranit nastavení uživatelského rozhraní Lovelace?", "confirm_unsaved_changes": "Máte neuložené změny. Opravdu chcete odejít?", "confirm_unsaved_comments": "Vaše konfigurace obsahuje komentáře, které se neuloží. Chcete pokračovat?", @@ -3014,8 +3016,8 @@ "error_parse_yaml": "Chyba při parsování YAML: {error}", "error_remove": "Nelze odstranit nastavení: {error}", "error_save_yaml": "Nelze uložit YAML: {error}", - "header": "Upravit konfiguraci", - "resources_moved": "Zdroje by již neměly být přidávány do konfigurace Lovelace, ale mohou být přidávány v konfiguračním panelu Lovelace.", + "header": "Upravit nastavení", + "resources_moved": "Zdroje by již neměly být přidávány do konfigurace Lovelace, ale mohou být přidávány v panelu nastavení Lovelace.", "save": "Uložit", "saved": "Uloženo", "unsaved_changes": "Neuložené změny" @@ -3028,9 +3030,9 @@ "para": "Tento dashboard momentálně spravuje Home Assistant. Je automaticky aktualizován při přidání nové entity nebo Lovelace komponenty. Pokud převezmete kontrolu, nebudeme již provádět změny automaticky za vás. Vždy si můžete vytvořit nový dashboard na hraní.", "para_sure": "Opravdu chcete převzít kontrolu nad uživalským rozhraním ?", "save": "Převzít kontrolu", - "yaml_config": "Abyste mohli snadněji začít, zde je aktuální konfigurace tohoto dashboardu:", - "yaml_control": "Chcete-li převzít kontrolu v režimu YAML, vytvořte soubor YAML s názvem, který jste uvedli ve své konfiguraci pro tento dashboard nebo výchozí 'ui-lovelace.yaml'.", - "yaml_mode": "Používáte režim YAML, což znamená, že nemůžete změnit konfiguraci Lovelace z uživatelského rozhraní. Pokud chcete měnit Lovelace z uživatelského rozhraní, odstraňte 'mode: yaml' z vaší konfigurace Lovelace v 'configuration.yaml.'" + "yaml_config": "Abyste mohli snadněji začít, zde je aktuální nastavení tohoto dashboardu:", + "yaml_control": "Chcete-li převzít kontrolu v režimu YAML, vytvořte soubor YAML s názvem, který jste uvedli ve svém nastavení pro tento dashboard, nebo výchozí \"ui-lovelace.yaml\".", + "yaml_mode": "Používáte režim YAML, což znamená, že nemůžete změnit nastavení Lovelace z uživatelského rozhraní. Pokud chcete měnit Lovelace z uživatelského rozhraní, odstraňte \"mode: yaml\" z vašeho nastavení Lovelace v \"configuration.yaml\"." }, "select_view": { "dashboard_label": "Dashboard", @@ -3157,7 +3159,7 @@ "legacy_api_password": { "abort": { "login_expired": "Relace vypršela, přihlaste se prosím znovu.", - "no_api_password_set": "Nemáte nakonfigurované heslo API." + "no_api_password_set": "Nemáte nastavené heslo k API." }, "error": { "invalid_auth": "Neplatné heslo API", @@ -3168,7 +3170,7 @@ "data": { "password": "Heslo API" }, - "description": "Zadejte heslo pro API ve své HTTP konfiguraci" + "description": "Zadejte heslo k API ve svém nastavení HTTP:" }, "mfa": { "data": { @@ -3257,7 +3259,7 @@ }, "integration": { "finish": "Dokončit", - "intro": "Zařízení a služby jsou v Home Assistant reprezentovány jako integrace. Tyto můžete nastavit nyní nebo později z konfigurační obrazovky.", + "intro": "Zařízení a služby jsou v Home Assistant reprezentovány jako integrace. Ty můžete nastavit nyní nebo později v nastavení.", "more_integrations": "Více" }, "intro": "Jste připraveni oživit svůj domov, zachovat si své soukromí a připojit se k celosvětové komunitě tvůrců?", @@ -3361,7 +3363,7 @@ "title": "Jak by se toto zařízení mělo jmenovat?" }, "description": "Posílat oznámení na toto zařízení", - "error_load_platform": "Konfigurovat notify.html5.", + "error_load_platform": "Nastavit notify.html5.", "error_use_https": "Vyžaduje SSL pro frontend.", "header": "Push notifikace", "link_promo": "Další informace", diff --git a/translations/frontend/de.json b/translations/frontend/de.json index 58e9509db9..b7d7f0f2c4 100644 --- a/translations/frontend/de.json +++ b/translations/frontend/de.json @@ -519,6 +519,7 @@ "menu": "Menü", "next": "Weiter", "no": "Nein", + "not_now": "Später", "overflow_menu": "Überlauf-Menü", "previous": "Vorher", "refresh": "Aktualisieren", @@ -526,6 +527,7 @@ "rename": "Umbenennen", "save": "Speichern", "skip": "Überspringen", + "stay": "Bleiben", "successfully_deleted": "Erfolgreich gelöscht", "successfully_saved": "Erfolgreich gespeichert", "undo": "Rückgängig machen", @@ -726,6 +728,7 @@ "confirm_delete": "Möchtest du diesen Eintrag wirklich löschen?", "delete": "Löschen", "enabled_cause": "Deaktiviert durch {cause}.", + "enabled_delay_confirm": "Die aktivierten Entitäten werden in {delay} Sekunden zu Home Assistant hinzugefügt", "enabled_description": "Deaktivierte Entitäten werden nicht zu Home Assistant hinzugefügt.", "enabled_label": "Entität aktivieren", "enabled_restart_confirm": "Starte Home Assistant neu, um die Aktivierung der Entitäten abzuschließen", @@ -866,10 +869,14 @@ "commands": { "reload": { "automation": "Automationen neu laden", + "command_line": "Komandozeilen Entätien neu laden", + "core": "Positionsdaten & Anpassungen neu laden", "filesize": "Dateigröße-Entitäten neu laden", "filter": "Filter Entitäten neu laden", "generic": "Allgemeine IP Kamera Entitäten neu laden", "generic_thermostat": "Allgemeine Thermostat Entitäte neu laden", + "group": "Gruppen, Gruppen Entitäten und Benachrichtigungsservices neu laden", + "history_stats": "Verlaufsstatistiken neu laden", "homekit": "HomeKit neu laden", "input_boolean": "Input-Booleans neu laden", "input_datetime": "Input-Datum/Zeit neu laden", @@ -881,6 +888,7 @@ "person": "Personen neu laden", "ping": "Binäre-Ping-Entitäten neu laden", "reload": "{domain} neu laden", + "rest": "Rest Entitäten und Benachrichtigunsdienste neu laden", "rpi_gpio": "Raspberry Pi GPIO Entitäten neu laden", "scene": "Szenen neu laden", "script": "Skripte neu laden", @@ -888,6 +896,8 @@ "statistics": "Statistik Entitäten neu laden", "telegram": "Telegram-Benachrichtigungsdienst neu laden", "template": "Templates neu laden", + "trend": "Trend Entitäten neu laden", + "universal": "Universelle Medien Player Entitäten neu laden ", "zone": "Zonen neu laden" }, "server_control": { @@ -1315,6 +1325,7 @@ "thingtalk": { "create": "Automatisierung erstellen", "link_devices": { + "ambiguous_entities": "Ein oder mehrere Geräte haben mehr als eine übereinstimmende Entität. Wähle diejenige aus, die du verwenden möchtest.", "header": "Großartig! Jetzt müssen wir einige Geräte verknüpfen", "unknown_placeholder": "Unbekannter Platzhalter" }, @@ -1723,7 +1734,10 @@ "cloud": { "alexa_enabled": "Alexa aktiviert", "google_enabled": "Google aktiviert", - "logged_in": "Eingeloggt" + "logged_in": "Eingeloggt", + "remote_connected": "Remote verbunden", + "remote_enabled": "Remote aktiviert", + "subscription_expiration": "Ende des Abos" }, "homeassistant": { "arch": "CPU-Architektur", @@ -1739,10 +1753,12 @@ "virtualenv": "Virtuelle Umgebung" }, "lovelace": { + "dashboards": "Dashboards", "mode": "Modus", "resources": "Ressourcen" } }, + "manage": "Verwalten", "more_info": "Mehr Info" }, "title": "Info" @@ -1938,6 +1954,7 @@ "ozw": { "button": "Konfigurieren", "common": { + "controller": "Controller", "instance": "Instanz", "network": "Netzwerk", "node_id": "Knoten-ID", @@ -1948,6 +1965,7 @@ }, "device_info": { "node_failed": "Knoten fehlgeschlagen", + "stage": "Phase", "zwave_info": "Z-Wave Infos" }, "navigation": { @@ -1994,7 +2012,11 @@ }, "node_query_stages": { "associations": "Aktualisiert die verbundenen Gruppen und Mitgliedschaften", - "complete": "Der Interviewprozess ist abgeschlossen" + "complete": "Der Interviewprozess ist abgeschlossen", + "configuration": "Die Konfigurationsdaten werden vom Netzknoten abrufen", + "instances": "Details den vom Gerät unterstützten Instanzen oder Kanälen werden abgerufen", + "neighbors": "Eine Liste der Umgebung des Netzknoten wird abgerufen", + "static": "Statische Werte des Gerätes werden abgerufen" }, "node": { "button": "Gerätedetails", @@ -2009,7 +2031,11 @@ "zwave_plus": "Z-Wave Plus" }, "refresh_node": { + "battery_note": "Wenn der Netzknoten batteriebetrieben ist, muss er zunächst aktiviert werden, bevor du fortfahren kannst.", "button": "Geräte aktualisieren", + "complete": "Netzknotenaktualisierung abgeschlossen", + "node_status": "Netzknotenstatus", + "refreshing_description": "Netzknoteninformationen werden aktualisiert...", "start_refresh_button": "Aktualisierung starten", "step": "Schritt", "title": "Knoteninformationen aktualisieren", @@ -2137,6 +2163,8 @@ }, "picker": { "add_script": "Neues Skript erstellen", + "duplicate": "Duplizieren", + "duplicate_script": "Skript duplizieren", "edit_script": "Skript bearbeiten", "header": "Skript-Editor", "headers": { @@ -2161,6 +2189,7 @@ "filesize": "Dateigröße-Entitäten neu laden", "filter": "Filter-Entitäten neu laden", "generic": "Allgemeine IP-Kamera Entitäten neu laden", + "generic_thermostat": "Generische Thermostatentitäten neu laden", "group": "Gruppen, Gruppenentitäten und Benachrichtigungsdienste neu laden", "heading": "Neuladen der YAML-Konfiguration", "history_stats": "Verlaufsstatistik-Entitäten neu laden", @@ -2182,6 +2211,8 @@ "smtp": "SMTP-Benachrichtigungsdienste neu laden", "statistics": "Statistik-Entitäten neu laden", "telegram": "Telegram-Benachrichtigungsdienste neu laden", + "template": "Vorlagenentitäten neu laden", + "trend": "Trendentitäten neu laden", "zone": "Zonen neu laden" }, "server_management": { @@ -2774,6 +2805,7 @@ "name": "Glance" }, "grid": { + "description": "Mit der Grid-Karte können Sie mehrere Karten in einem Raster anzeigen.", "name": "Raster" }, "history-graph": { @@ -2871,7 +2903,8 @@ "common": { "add": "Hinzufügen", "clear": "Löschen", - "edit": "Bearbeiten" + "edit": "Bearbeiten", + "none": "Keine" }, "edit_badges": { "panel_mode": "Diese Badges werden nicht angezeigt, da sich diese Ansicht im \"Panel-Modus\" befindet." @@ -2982,7 +3015,8 @@ "sub-element-editor": { "types": { "footer": "Fußzeilen-Editor", - "header": "Kopfzeilen-Editor" + "header": "Kopfzeilen-Editor", + "row": "Editor für Entitätszeilen" } }, "suggest_card": { diff --git a/translations/frontend/en.json b/translations/frontend/en.json index 232e3790ef..481b58d893 100644 --- a/translations/frontend/en.json +++ b/translations/frontend/en.json @@ -872,6 +872,28 @@ }, "quick-bar": { "commands": { + "navigation": { + "areas": "Areas", + "automation": "Automations", + "core": "General", + "customize": "Customizations", + "devices": "Devices", + "entities": "Entities", + "helpers": "Helpers", + "info": "Info", + "integrations": "Integrations", + "logs": "Logs", + "lovelace": "Lovelace Dashboards", + "navigate_to": "Navigate to {panel}", + "navigate_to_config": "Navigate to {panel} configuration", + "person": "People", + "scene": "Scenes", + "script": "Scripts", + "server_control": "Server Controls", + "tags": "Tags", + "users": "Users", + "zone": "Zones" + }, "reload": { "automation": "Reload automations", "command_line": "Reload command line entities", @@ -2323,6 +2345,7 @@ "update_user": "Update" }, "picker": { + "add_user": "Add user", "headers": { "group": "Group", "name": "Name", @@ -2603,6 +2626,8 @@ "filter_attributes": "Filter attributes", "filter_entities": "Filter entities", "filter_states": "Filter states", + "last_changed": "Last changed", + "last_updated": "Last updated", "more_info": "More Info", "no_entities": "No entities", "set_state": "Set State", @@ -2854,6 +2879,10 @@ "description": "The Light card allows you to change the brightness of the light.", "name": "Light" }, + "logbook": { + "description": "The Logbook card shows a list of events for entities.", + "name": "Logbook" + }, "map": { "dark_mode": "Dark Mode?", "default_zoom": "Default Zoom", diff --git a/translations/frontend/es.json b/translations/frontend/es.json index e7a7fba753..5aa0d34da1 100644 --- a/translations/frontend/es.json +++ b/translations/frontend/es.json @@ -2187,6 +2187,8 @@ }, "picker": { "add_script": "Añadir script", + "duplicate": "Duplicar", + "duplicate_script": "Duplicar script", "edit_script": "Editar script", "header": "Editor de scripts", "headers": { diff --git a/translations/frontend/et.json b/translations/frontend/et.json index 6ae5f64d9f..bab048aa61 100644 --- a/translations/frontend/et.json +++ b/translations/frontend/et.json @@ -2187,6 +2187,8 @@ }, "picker": { "add_script": "Lisa uus skript", + "duplicate": "Klooni", + "duplicate_script": "Klooni skript", "edit_script": "Muuda skripti", "header": "Skriptiredaktor", "headers": { @@ -2231,7 +2233,7 @@ "rpi_gpio": "Taaslae Raspberry Pi GPIO üksused", "scene": "Taaslae stseenid", "script": "Taaslae skriptid", - "smtp": "TAASLAE SMTP TEAVITUSED", + "smtp": "TAASLAE SMTP TEAVITUSTEENUSED", "statistics": "TAASLAE STATISTIKAOLEMID", "telegram": "TAASLAE TELEGRAM TEAVITUSE OLEMID", "template": "TAASLAE MALLIOLEMID", diff --git a/translations/frontend/it.json b/translations/frontend/it.json index 7cce8a1ba8..61794d0a44 100644 --- a/translations/frontend/it.json +++ b/translations/frontend/it.json @@ -889,7 +889,7 @@ "input_select": "Ricarica input a discesa", "input_text": "Ricarica input testuali", "min_max": "Ricarica le entità min/max", - "mqtt": "Ricarica entità mqtt configurate manualmente", + "mqtt": "Ricarica le entità MQTT configurate manualmente", "person": "Ricarica le persone", "ping": "Ricarica le entità del sensore binario Ping", "reload": "Ricarica {domain}", @@ -2187,6 +2187,8 @@ }, "picker": { "add_script": "Aggiungi script", + "duplicate": "Duplica", + "duplicate_script": "Duplica script", "edit_script": "Modifica script", "header": "Editor script", "headers": { @@ -2223,7 +2225,7 @@ "input_text": "Ricarica input testuali", "introduction": "Alcune parti di Home Assistant possono essere ricaricate senza richiedere un riavvio. Premendo su Ricarica si rimuoverà la loro Configurazione YAML attuale e si caricherà la versione aggiornata.", "min_max": "Ricarica le entità min/max", - "mqtt": "Ricarica entità mqtt configurate manualmente", + "mqtt": "Ricarica le entità MQTT configurate manualmente", "person": "Ricarica le persone", "ping": "Ricarica le entità del sensore binario Ping", "reload": "Ricarica {domain}", diff --git a/translations/frontend/ja.json b/translations/frontend/ja.json index 6a40ddf9e8..808fef1328 100644 --- a/translations/frontend/ja.json +++ b/translations/frontend/ja.json @@ -498,14 +498,17 @@ "copied": "コピー", "delete": "削除", "error_required": "必須", + "leave": "離れる", "loading": "読込中", "menu": "メニュー", "next": "次", "no": "いいえ", + "not_now": "今ではありません", "overflow_menu": "オーバーフローメニュー", "previous": "前", "refresh": "更新", "save": "保存", + "stay": "滞在", "successfully_deleted": "正常に削除されました", "successfully_saved": "正常に保存されました", "undo": "元に戻す", @@ -706,8 +709,10 @@ "confirm_delete": "このエントリを削除してもよろしいですか?", "delete": "削除", "enabled_cause": "{cause} によって無効にされました。", + "enabled_delay_confirm": "有効なエンティティは {delay} 秒でホーム アシスタントに追加されます", "enabled_description": "無効化されたエンティティは Home Assistant に追加されません。", "enabled_label": "エンティティを有効化", + "enabled_restart_confirm": "ホーム アシスタントを再起動してエンティティの有効化を完了", "entity_id": "エンティティ ID", "icon": "アイコンの上書き", "icon_error": "アイコンは「prefix:iconname」の形式にする必要があります(例:「mdi:home」)。", @@ -780,6 +785,11 @@ }, "more_info_control": { "controls": "コントロール", + "cover": { + "close_tile_cover": "カバーの傾きを閉じる", + "open_tilt_cover": "オープンカバーの傾き", + "stop_cover": "カバーの動きを止めます" + }, "details": "詳細", "dismiss": "ダイアログを閉じる", "edit": "エンティティを編集", @@ -1689,6 +1699,42 @@ "server": "サーバー", "source": "ソース:", "system_health_error": "「システムの正常性」コンポーネントが有効されていません、configuration.yaml に 'system_health:' を追加してください。", + "system_health": { + "checks": { + "cloud": { + "alexa_enabled": "Alexa有効", + "can_reach_cert_server": "証明書サーバーに到達アクセスする", + "can_reach_cloud": "Home AssistantCloudにアクセスする", + "can_reach_cloud_auth": "認証サーバーにアクセスする", + "google_enabled": "Google有効", + "logged_in": "ログイン", + "relayer_connected": "接続された再レイヤー", + "remote_connected": "リモート接続", + "remote_enabled": "リモート有効", + "subscription_expiration": "サブスクリプションの有効期限" + }, + "homeassistant": { + "arch": "CPU アーキテクチャ", + "dev": "開発", + "docker": "ドッカー", + "hassio": "HassOS", + "installation_type": "インストールの種類", + "os_name": "オペレーティング システム名", + "os_version": "オペレーティング システムのバージョン", + "python_version": "Python バージョン", + "timezone": "タイムゾーン", + "version": "バージョン", + "virtualenv": "仮想環境" + }, + "lovelace": { + "dashboards": "ダッシュ ボード", + "mode": "モード", + "resources": "リソース" + } + }, + "manage": "管理", + "more_info": "詳細情報" + }, "title": "情報" }, "integration_panel_move": { @@ -2106,6 +2152,8 @@ }, "picker": { "add_script": "スクリプトを追加", + "duplicate": "複製", + "duplicate_script": "スクリプトの複製", "edit_script": "スクリプトを編集", "header": "スクリプト エディタ", "headers": { @@ -2179,6 +2227,8 @@ "add_tag": "タグを追加する", "automation_title": "{name}タグのスキャン", "caption": "タグ", + "confirm_remove": "タグ{tag}を削除してもよろしいですか?", + "confirm_remove_title": "タグを削除しますか?", "create_automation": "タグを使用したオートメーションの作成", "description": "タグの管理", "detail": { @@ -2837,11 +2887,18 @@ "entity": "エンティティ", "no_description": "説明がありません。" }, + "common": { + "add": "追加", + "clear": "クリア", + "edit": "編集", + "none": "なし" + }, "edit_badges": { "panel_mode": "このビューは「パネルモード」になっているため、これらのバッジは表示されません。" }, "edit_card": { "add": "カードを追加", + "clear": "削除", "confirm_cancel": "キャンセルしてもよいですか?", "delete": "カードを削除", "duplicate": "重複するカード", @@ -2882,6 +2939,22 @@ } }, "header": "UIを編集", + "header-footer": { + "choose_header_footer": "{type}を選択してください", + "footer": "フッタ", + "header": "ヘッダ", + "types": { + "buttons": { + "name": "ボタン" + }, + "graph": { + "name": "グラフ" + }, + "picture": { + "name": "画像" + } + } + }, "menu": { "open": "Lovelace メニューを開く", "raw_editor": "詳細設定エディター" @@ -2926,6 +2999,12 @@ "dashboard_label": "ダッシュボード", "header": "ビューに移動" }, + "sub-element-editor": { + "types": { + "footer": "フッタ エディタ", + "header": "ヘッダーエディター" + } + }, "suggest_card": { "add": "Lovelace UIに追加", "create_own": "別のカードを選択する", diff --git a/translations/frontend/lb.json b/translations/frontend/lb.json index e6f9adf16e..f6ca81caa6 100644 --- a/translations/frontend/lb.json +++ b/translations/frontend/lb.json @@ -511,16 +511,23 @@ "continue": "Weider", "copied": "Kopéiert", "delete": "Läschen", + "disable": "Desaktivéieren", + "enable": "Aktivéieren", "error_required": "Erfuerderlech", + "leave": "Fortgoen", "loading": "Lued", "menu": "Menu", "next": "Nächst", "no": "Nee", + "not_now": "Net elo", "overflow_menu": "Iwwerlaf menu", "previous": "Virdrun", "refresh": "Aktualiséieren", + "remove": "Läschen", + "rename": "Ëmbenennen", "save": "Späicheren", "skip": "Iwwersprangen", + "stay": "Bleiwen", "successfully_deleted": "Erfollegräich geläscht.", "successfully_saved": "Erfollegräich gespäichert.", "undo": "Réckgängeg maachen", @@ -1697,6 +1704,42 @@ "server": "server", "source": "Quell:", "system_health_error": "System Gesondheet Komponent net gelueden. Setz 'system_health:' zur configuration.yaml dobäi", + "system_health": { + "checks": { + "cloud": { + "alexa_enabled": "Alexa aktivéiert", + "can_reach_cert_server": "Zertifikat Server ereechbar", + "can_reach_cloud": "Home Assistant Cloud ereechbar", + "can_reach_cloud_auth": "Authentifikatioun Server ereechbar", + "google_enabled": "Google aktivéiert", + "logged_in": "Ageloggt", + "relayer_connected": "Relayer verbonnen", + "remote_connected": "Remote verbonnen", + "remote_enabled": "Remote aktivéiert", + "subscription_expiration": "Abonnement Verfallsdatum" + }, + "homeassistant": { + "arch": "CPU Architektur", + "dev": "Entwécklung", + "docker": "Docker", + "hassio": "HassOS", + "installation_type": "Typ vun Installatioun", + "os_name": "Betribssystem Numm", + "os_version": "Betribssystem Versioun", + "python_version": "Python Versioun", + "timezone": "Zäitzon", + "version": "Versioun", + "virtualenv": "Virtuellen Environnement" + }, + "lovelace": { + "dashboards": "Tableau de Bord", + "mode": "Modus", + "resources": "Ressourcen" + } + }, + "manage": "Verwalten", + "more_info": "Méi Informatiounen" + }, "title": "Info" }, "integration_panel_move": { @@ -2182,6 +2225,8 @@ "add_tag": "Tag dobäisetzen", "automation_title": "Tag {name} gouf gescannt", "caption": "Tags", + "confirm_remove": "Sécher fir den Tag {tag} ze läsche?", + "confirm_remove_title": "Tag läschen?", "create_automation": "Erstell Automatisme mam Tag", "description": "Tags verwalten", "detail": { @@ -2844,8 +2889,15 @@ "entity": "Entitéit", "no_description": "Keng Beschreiwung verfügbar" }, + "common": { + "add": "Dobäisetzen", + "clear": "Läschen", + "edit": "Änneren", + "none": "Keen" + }, "edit_card": { "add": "Kaart dobäisetzen", + "clear": "Läschen", "confirm_cancel": "Sécher fir ofzebriechen ?", "delete": "Kaart läschen", "duplicate": "Kaart Replikéieren", @@ -2886,6 +2938,18 @@ } }, "header": "UI änneren", + "header-footer": { + "footer": "Fousszeilen", + "header": "Entête", + "types": { + "buttons": { + "name": "Knäppercher" + }, + "graph": { + "name": "Graph" + } + } + }, "menu": { "open": "Lovelace Menu opmaachen", "raw_editor": "Editeur fir déi reng Konfiguratioun" @@ -2930,6 +2994,12 @@ "dashboard_label": "Tableau de Bord", "header": "Vue auswielen" }, + "sub-element-editor": { + "types": { + "footer": "Fousszeilen Editeur", + "header": "Entête Editeur" + } + }, "suggest_card": { "add": "Zu Lovelace bäisetzen", "create_own": "Aner Kaart auswielen", diff --git a/translations/frontend/nb.json b/translations/frontend/nb.json index da6f5a2d32..3c2fdb95c3 100644 --- a/translations/frontend/nb.json +++ b/translations/frontend/nb.json @@ -889,7 +889,7 @@ "input_select": "Last inn innputt valg på nytt", "input_text": "Last inn innputt tekster på nytt", "min_max": "Last inn min/maks entiteter på nytt", - "mqtt": "Laste inn manuelt konfigurerte mqtt-enheter", + "mqtt": "Laste inn manuelt konfigurerte MQTT-enheter", "person": "Last inn personer på nytt", "ping": "Last inn Ping binær sensor entiteter på nytt", "reload": "Last inn {domain} på nytt", @@ -897,7 +897,7 @@ "rpi_gpio": "Last inn Raspberry Pi GPIO entiteter på nytt", "scene": "Last inn scener på nytt", "script": "Last inn skript på nytt", - "smtp": "Last inn SMTP varslingstjenester på nytt", + "smtp": "Last SMTP-varslingstjenester på nytt", "statistics": "Last inn statistiske entiteter på nytt", "telegram": "Last inn Telegram varslingstjenester på nytt", "template": "Laste inn mal entiteter på nytt", @@ -2187,6 +2187,8 @@ }, "picker": { "add_script": "Legg til skript", + "duplicate": "Dupliser", + "duplicate_script": "Dupliser skript", "edit_script": "Rediger skript", "header": "Skriptredigering", "headers": { @@ -2223,7 +2225,7 @@ "input_text": "Last inn innputt tekster på nytt", "introduction": "Noen deler av Home Assistant kan laste inn uten å kreve omstart. Hvis du trykker last på nytt, vil du bytte den nåværende konfigurasjonen med den nye.", "min_max": "Last inn min/maks entiteter på nytt", - "mqtt": "Laste inn manuelt konfigurerte mqtt-enheter", + "mqtt": "Laste inn manuelt konfigurerte MQTT-enheter", "person": "Last inn personer på nytt", "ping": "Last inn Ping binær sensor entiteter på nytt", "reload": "Last inn {domain} på nytt", @@ -2231,7 +2233,7 @@ "rpi_gpio": "Last inn Raspberry Pi GPIO entiteter på nytt", "scene": "Last inn scener på nytt", "script": "Last inn skript på nytt", - "smtp": "Last inn SMTP varslingstjenester på nytt", + "smtp": "Last SMTP-varslingstjenester på nytt", "statistics": "Last inn statistiske entiteter på nytt", "telegram": "Last inn Telegram varslingstjenester på nytt", "template": "Laste inn mal entiteter på nytt", @@ -2938,7 +2940,7 @@ "clear": "Tøm", "confirm_cancel": "Er du sikker på at du vil avbryte?", "delete": "Slett kort", - "duplicate": "Duplisert kort", + "duplicate": "Dupliser kort", "edit": "Rediger", "header": "Kortkonfigurasjon", "move": "Flytt til visning", diff --git a/translations/frontend/nl.json b/translations/frontend/nl.json index 152b2a9676..39bfa6a82b 100644 --- a/translations/frontend/nl.json +++ b/translations/frontend/nl.json @@ -1269,7 +1269,7 @@ "sunset": "Zonsondergang" }, "tag": { - "label": "Label" + "label": "Tag" }, "template": { "label": "Sjabloon", diff --git a/translations/frontend/pl.json b/translations/frontend/pl.json index d3a482b315..b81d329d18 100644 --- a/translations/frontend/pl.json +++ b/translations/frontend/pl.json @@ -1369,7 +1369,7 @@ "enable_ha_skill": "Włącz skill Home Assistant dla Asystenta Google", "enable_state_reporting": "Włącz raportowanie stanów", "enter_pin_error": "Nie można zapisać kodu PIN:", - "enter_pin_hint": "Wprowadź kod PIN, aby korzystać z urządzeń bezpieczeństwa", + "enter_pin_hint": "Wprowadź kod PIN", "enter_pin_info": "Wpisz kod PIN, aby wejść w interakcję z urządzeniami bezpieczeństwa. Urządzeniami bezpieczeństwa są drzwi, drzwi garażowe i zamki. Podczas interakcji z takimi urządzeniami za pośrednictwem Asystenta Google zostaniesz poproszony o wprowadzenie tego kodu PIN.", "info": "Dzięki integracji z Asystentem Google dla Chmury Home Assistant będzie możliwe kontrolowanie wszystkich urządzeń Home Assistant za pośrednictwem dowolnego urządzenia obsługującego Asystenta Google.", "info_state_reporting": "Jeśli włączysz raportowanie stanów, Home Assistant wyśle wszystkie zmiany stanu udostępnionych encji na serwery Google. Dzięki temu zawsze możesz zobaczyć najnowsze stany w aplikacji Google.", @@ -2184,6 +2184,8 @@ }, "picker": { "add_script": "Dodaj skrypt", + "duplicate": "Duplikuj", + "duplicate_script": "Duplikuj skrypt", "edit_script": "Edytuj skrypt", "header": "Edytor skryptów", "headers": { diff --git a/translations/frontend/pt.json b/translations/frontend/pt.json index 5421db3bb3..67ce007196 100644 --- a/translations/frontend/pt.json +++ b/translations/frontend/pt.json @@ -511,15 +511,23 @@ "continue": "Continuar", "copied": "Copiado", "delete": "Apagar", + "disable": "Desativar", + "enable": "Ativar", "error_required": "Obrigatório", + "leave": "Sair", "loading": "A carregar", "menu": "Menu", "next": "Seguinte", "no": "Não", + "not_now": "Agora não", "overflow_menu": "Menu sobreposto", "previous": "Anterior", "refresh": "Atualizar", + "remove": "Remover", + "rename": "Renomear", "save": "Guardar", + "skip": "Saltar", + "stay": "Ficar", "successfully_deleted": "Eliminado com sucesso", "successfully_saved": "Salva com sucesso", "undo": "Desfazer", @@ -695,6 +703,11 @@ }, "service-picker": { "service": "Serviço" + }, + "user-picker": { + "add_user": "Adicionar Utilizador", + "no_user": "Nenhum utilizador", + "remove_user": "Remover utilizador" } }, "dialogs": { @@ -783,6 +796,7 @@ "dismiss": "Descartar diálogo", "edit": "Editar entidade", "history": "Histórico", + "last_changed": "Última modificação", "last_updated": "Última atualização", "person": { "create_zone": "Criar zona a partir da localização atual" @@ -873,6 +887,10 @@ "trend": "Recarregar entidades de tendência", "universal": "Recarregue entidades reprodutoras de multimédia", "zone": "Recarregar zonas" + }, + "server_control": { + "restart": "Recomeçar", + "stop": "Parar" } }, "filter_placeholder": "Filtro de Entidade" @@ -936,6 +954,7 @@ }, "notification_toast": { "connection_lost": "Ligação perdida. A ligar de novo...", + "dismiss": "Descartar", "service_call_failed": "Falha ao chamar o serviço {service}.", "started": "Home Assistant já iniciou", "starting": "Home Assistant está a inicializar, nem tudo estará disponível até o processo concluir.", @@ -1188,6 +1207,7 @@ "trigger": "Acionador" }, "event": { + "context_user_pick": "Selecionar o utilizador", "event_data": "Dados do evento", "event_type": "Tipo de evento", "label": "Evento" @@ -1284,6 +1304,14 @@ "only_editable": "Apenas as automações em automations.yaml são editáveis.", "pick_automation": "Escolha a automação a editar", "show_info_automation": "Mostra informações sobre automação" + }, + "thingtalk": { + "create": "Criar automação", + "task_selection": { + "for_example": "Por exemplo:", + "header": "Criar uma nova automação", + "language_note": "Nota: Por enquanto, apenas o inglês é suportado." + } } }, "cloud": { @@ -1667,16 +1695,34 @@ "system_health": { "checks": { "cloud": { - "alexa_enabled": "Ativo pela Alexa", - "google_enabled": "Ativo pelo Google", - "logged_in": "Ligado em" + "alexa_enabled": "Alexa ativa", + "google_enabled": "Google ativo", + "logged_in": "Ligado em", + "remote_connected": "Ligado remotamente", + "remote_enabled": "Remoto ativo", + "subscription_expiration": "Validade da Subscrição" + }, + "homeassistant": { + "arch": "Arquitetura do Processador", + "dev": "Desenvolvimento", + "docker": "Docker", + "hassio": "HassOS", + "installation_type": "Tipo de Instalação", + "os_name": "Nome do Sistema Operativo", + "os_version": "Versão do Sistema Operativo", + "python_version": "Versão Python", + "timezone": "Fuso horário", + "version": "Versão", + "virtualenv": "Ambiente Virtual" }, "lovelace": { "dashboards": "Dashboards", "mode": "Modo", "resources": "Recursos" } - } + }, + "manage": "Gerir", + "more_info": "mais informações" }, "title": "Informações" }, @@ -1964,6 +2010,7 @@ }, "services": { "add_node": "Adicionar nó", + "cancel_command": "Cancelar comando", "remove_node": "Remover nó" } }, @@ -2078,6 +2125,8 @@ }, "picker": { "add_script": "Adicionar script", + "duplicate": "Duplicado", + "duplicate_script": "Script duplicado", "edit_script": "Editar script", "header": "Editor de Script", "headers": { @@ -2151,6 +2200,8 @@ "add_tag": "Adicionar etiqueta", "automation_title": "A etiqueta {name} é lida", "caption": "Etiquetas", + "confirm_remove": "Tens a certeza que queres remover a etiqueta {tag}?", + "confirm_remove_title": "Remover a etiqueta?", "create_automation": "Criar automação com etiqueta", "description": "Gerir etiquetas", "detail": { @@ -2506,6 +2557,7 @@ "listeners": "Este modelo ouve os seguintes eventos de mudança de estado:", "no_listeners": "Este modelo não ouve nenhum evento alterado pelo estado e não será atualizado automaticamente.", "reset": "Redefinir para modelo de demonstração", + "result_type": "Tipo de resultado", "template_extensions": "Extensões de templates do Home Assistant", "title": "Template", "unknown_error_template": "Erro desconhecido ao processar o template" @@ -2649,6 +2701,7 @@ "entity-id": "ID da entidade", "last-changed": "Última modificação", "last-triggered": "Acionado pela última vez", + "last-updated": "Última atualização", "none": "Sem informações secundárias", "position": "Posição", "tilt-position": "Posição de Inclinação" @@ -2940,7 +2993,8 @@ "exit_edit_mode": "Sair do modo de edição do IU", "help": "Ajuda", "refresh": "Atualizar", - "reload_resources": "Recarregar recursos" + "reload_resources": "Recarregar recursos", + "start_conversation": "Iniciar conversa" }, "reload_lovelace": "Recarregar UI", "reload_resources": { @@ -3185,6 +3239,9 @@ "dropdown_label": "Painel de instrumentos", "header": "Painel de instrumentos" }, + "enable_shortcuts": { + "header": "Atalhos de Teclado" + }, "force_narrow": { "description": "Isto esconderá por defeito a barra lateral, semelhante à experiência no telemóvel.", "header": "Esconder sempre a barra lateral." @@ -3229,6 +3286,9 @@ "header": "Módulos de Autenticação por Multíplos-fatores" }, "push_notifications": { + "add_device_prompt": { + "input_label": "Nome do dispositivo" + }, "description": "Enviar notificações para este dispositivo.", "error_load_platform": "Configurar notify.html5.", "error_use_https": "Requer SSL ativo para o interface principal", @@ -3270,6 +3330,9 @@ "header": "Vibrar" } }, + "shopping_list": { + "start_conversation": "Iniciar conversa" + }, "shopping-list": { "add_item": "Adicionar item", "clear_completed": "Limpar concluídos", diff --git a/translations/frontend/ru.json b/translations/frontend/ru.json index b7d00de3dc..770b463a5c 100644 --- a/translations/frontend/ru.json +++ b/translations/frontend/ru.json @@ -728,8 +728,10 @@ "confirm_delete": "Вы уверены, что хотите удалить эту запись?", "delete": "Удалить", "enabled_cause": "Инициатор: {cause}.", + "enabled_delay_confirm": "Объекты будут добавлены в Home Assistant через {delay} секунд", "enabled_description": "Скрытые объекты не будут доступны в Home Assistant.", "enabled_label": "Отображать объект", + "enabled_restart_confirm": "Перезапустите Home Assistant, чтобы завершить изменение объектов", "entity_id": "ID объекта", "icon": "Значок", "icon_error": "Параметр должен быть в формате 'prefix:iconname' (например: 'mdi:home')", @@ -1020,7 +1022,7 @@ "add": "Добавить действие", "delete": "Удалить", "delete_confirm": "Вы уверены, что хотите удалить?", - "duplicate": "Копировать", + "duplicate": "Дублировать", "header": "Действия", "introduction": "Действия — это то, что сделает Home Assistant, когда правило автоматизации сработает.", "learn_more": "Узнайте больше о действиях", @@ -1099,7 +1101,7 @@ "add": "Добавить условие", "delete": "Удалить", "delete_confirm": "Вы уверены, что хотите удалить?", - "duplicate": "Копировать", + "duplicate": "Дублировать", "header": "Условия", "introduction": "Условия — это необязательная часть правила автоматизации. Действие автоматизации не будет выполнено, пока не будут удовлетворены все условия.", "learn_more": "Узнайте больше об условиях", @@ -1203,7 +1205,7 @@ "add": "Добавить триггер", "delete": "Удалить", "delete_confirm": "Вы уверены, что хотите удалить?", - "duplicate": "Копировать", + "duplicate": "Дублировать", "header": "Триггеры", "introduction": "Триггеры — это то, что запускает процесс автоматизации. Можно указать несколько триггеров на одно и то же правило. Когда триггер сработает, Home Assistant будет проверять условия (если таковые имеются), и выполнять действия.", "learn_more": "Узнайте больше о триггерах", @@ -1306,8 +1308,8 @@ "add_automation": "Добавить автоматизацию", "delete_automation": "Удалить автоматизацию", "delete_confirm": "Вы уверены, что хотите удалить эту автоматизацию?", - "duplicate": "Копировать", - "duplicate_automation": "Копировать автоматизацию", + "duplicate": "Дублировать", + "duplicate_automation": "Дублировать", "edit_automation": "Редактировать автоматизацию", "header": "Редактор автоматизаций", "headers": { @@ -1727,6 +1729,36 @@ "server": "сервер", "source": "Исходный код:", "system_health_error": "Компонент System Health не загружен. Добавьте 'system_health:' в файл configuration.yaml.", + "system_health": { + "checks": { + "cloud": { + "can_reach_cert_server": "Доступ к серверу сертификатов", + "can_reach_cloud": "Доступ к Home Assistant Cloud", + "can_reach_cloud_auth": "Доступ к серверу аутентификации", + "subscription_expiration": "Срок действия подписки" + }, + "homeassistant": { + "arch": "Архитектура ЦП", + "dev": "Среда разработки", + "docker": "Docker", + "hassio": "HassOS", + "installation_type": "Тип установки", + "os_name": "Название операционной системы", + "os_version": "Версия операционной системы", + "python_version": "Версия Python", + "timezone": "Часовой пояс", + "version": "Версия", + "virtualenv": "Виртуальное окружение" + }, + "lovelace": { + "dashboards": "Панели", + "mode": "Режим", + "resources": "Ресурсы" + } + }, + "manage": "Управление", + "more_info": "дополнительная информация" + }, "title": "О системе" }, "integration_panel_move": { @@ -2144,6 +2176,8 @@ }, "picker": { "add_script": "Добавить сценарий", + "duplicate": "Дублировать", + "duplicate_script": "Дублировать", "edit_script": "Редактировать сценарий", "header": "Редактор сценариев", "headers": { @@ -2217,6 +2251,8 @@ "add_tag": "Добавить метку", "automation_title": "Считана метка {name}", "caption": "Метки", + "confirm_remove": "Вы уверены, что хотите удалить метку {tag}?", + "confirm_remove_title": "Удалить метку?", "create_automation": "Создать автоматизацию с меткой", "description": "Управление метками", "detail": { @@ -2667,7 +2703,7 @@ "name": "Панель сигнализации" }, "button": { - "default_action_help": "Действие по умолчанию зависит от возможностей объекта. Это может быть переключение состояния, либо будет отображение дополнительной информации.", + "default_action_help": "Действие по умолчанию зависит от возможностей объекта. Это может быть переключение состояния, либо отображение дополнительной информации.", "description": "Позволяет добавлять кнопки для выполнения каких-либо задач.", "name": "Кнопка" }, @@ -2879,14 +2915,21 @@ "entity": "Объект", "no_description": "Описание недоступно." }, + "common": { + "add": "Добавить", + "clear": "Очистить", + "edit": "Изменить", + "none": "Не выбрано" + }, "edit_badges": { "panel_mode": "В режиме панели значки на вкладке отображаться не будут." }, "edit_card": { "add": "Добавить карточку", + "clear": "Очистить", "confirm_cancel": "Вы уверены, что хотите отменить?", "delete": "Удалить", - "duplicate": "Копировать", + "duplicate": "Дублировать", "edit": "Изменить", "header": "Настройка карточки", "move": "Переместить", @@ -2924,6 +2967,22 @@ } }, "header": "Редактирование интерфейса", + "header-footer": { + "choose_header_footer": "Выберите {type}", + "footer": "Footer", + "header": "Header", + "types": { + "buttons": { + "name": "Кнопки" + }, + "graph": { + "name": "График" + }, + "picture": { + "name": "Изображение" + } + } + }, "menu": { "open": "Открыть меню пользовательского интерфейса Lovelace", "raw_editor": "Текстовый редактор" @@ -2968,6 +3027,13 @@ "dashboard_label": "Панель", "header": "Выберите вкладку" }, + "sub-element-editor": { + "types": { + "footer": "Footer", + "header": "Header", + "row": "Редактор строки объекта" + } + }, "suggest_card": { "add": "Подтвердить", "create_own": "Изменить", diff --git a/translations/frontend/sl.json b/translations/frontend/sl.json index 5271f28886..d6f2533b6f 100644 --- a/translations/frontend/sl.json +++ b/translations/frontend/sl.json @@ -2021,7 +2021,14 @@ "complete": "Postopek intervjuja je končan", "configuration": "Pridobitev konfiguracijskih vrednosti iz vozlišča", "dynamic": "Pridobivanje pogosto spreminjajočih se vrednosti iz vozlišča", - "session": "Pridobitev redko spreminjajočih se vrednosti iz vozlišča" + "manufacturerspecific1": "Pridobivanje identifikacijskih kod proizvajalca in izdelka iz vozlišča", + "manufacturerspecific2": "Pridobivanje dodatnih identifikacijskih kod proizvajalca in izdelka iz vozlišča", + "nodeinfo": "Pridobivanje podprtih razredov ukazov iz vozlišča", + "nodeplusinfo": "Pridobivanje informacij o Z-Wave + iz vozlišča", + "probe": "Preverjanje, ali je vozlišče budno / živo", + "protocolinfo": "Pridobivanje osnovnih zmožnosti Z-Wave tega vozlišča od krmilnika", + "session": "Pridobitev redko spreminjajočih se vrednosti iz vozlišča", + "wakeup": "Nastavljanje podpore za vrste in sporočila za prebujanje" }, "node": { "button": "Podrobnosti o vozlišču", @@ -2167,6 +2174,8 @@ }, "picker": { "add_script": "Ustvari novo skripto", + "duplicate": "Podvoji", + "duplicate_script": "Podvoji skripto", "edit_script": "Uredi skripto", "header": "Urejevalnik skript", "headers": { diff --git a/translations/frontend/zh-Hant.json b/translations/frontend/zh-Hant.json index 79e3a98630..d5f8fb2e02 100644 --- a/translations/frontend/zh-Hant.json +++ b/translations/frontend/zh-Hant.json @@ -511,16 +511,23 @@ "continue": "繼續", "copied": "已複製", "delete": "刪除", + "disable": "關閉", + "enable": "開啟", "error_required": "必填", + "leave": "離開", "loading": "讀取中", "menu": "選單", "next": "下一步", "no": "否", + "not_now": "現在不要", "overflow_menu": "捲動選單", "previous": "上一步", "refresh": "更新", + "remove": "移除", + "rename": "重新命名", "save": "儲存", "skip": "略過", + "stay": "保持", "successfully_deleted": "成功刪除", "successfully_saved": "成功儲存", "undo": "撤消", @@ -624,7 +631,7 @@ "season": "季", "track": "音軌", "tv_show": "電視節目", - "url": "網址", + "url": "URL", "video": "影片" }, "content-type": { @@ -721,8 +728,10 @@ "confirm_delete": "確定要刪除此實體?", "delete": "刪除", "enabled_cause": "由 {cause} 關閉。", + "enabled_delay_confirm": "啟用的實體將會於 {delay} 秒後新增至 Home Assistant", "enabled_description": "關閉的實體將不會新增至 Home Assistant。", "enabled_label": "啟用實體", + "enabled_restart_confirm": "重新啟動 Home Assistant 以完成實體啟用", "entity_id": "實體 ID", "icon": "圖示", "icon_error": "圖示必須按照格式「prefix:iconname」設定,例如「mdi:home」", @@ -795,6 +804,11 @@ }, "more_info_control": { "controls": "控制", + "cover": { + "close_tile_cover": "開啟窗簾", + "open_tilt_cover": "開啟窗簾", + "stop_cover": "停止窗簾" + }, "details": "詳細資訊", "dismiss": "忽略對話", "edit": "編輯實體", @@ -875,7 +889,7 @@ "input_select": "重新載入輸入選擇", "input_text": "重新載入輸入文字", "min_max": "重新載入最低/最高實體", - "mqtt": "手動重新載入 MQTT 實體", + "mqtt": "重新載入手動設定 MQTT 實體", "person": "重新載入人員", "ping": "重新載入 Ping 二進位傳感器實體", "reload": "重新載入{domain}", @@ -1627,12 +1641,12 @@ "disable_selected": { "button": "關閉已選擇", "confirm_text": "關閉的實體將不會新增至 Home Assistant。", - "confirm_title": "是否要關閉 {number} 個實體?" + "confirm_title": "是否要關閉 {number} {number, plural,\n one {個實體}\n other {個實體}\n}?" }, "enable_selected": { "button": "開啟已選擇", "confirm_text": "假如目前為關閉狀態,將再次於 Home Assistant 中開啟。", - "confirm_title": "是否要開啟 {number} 個實體?" + "confirm_title": "是否要開啟 {number} {number, plural,\n one {個實體}\n other {個實體}\n}?" }, "filter": { "filter": "過濾器", @@ -1654,9 +1668,9 @@ "remove_selected": { "button": "移除已選擇", "confirm_partly_text": "已選擇的 {selected} 個實體中、僅有 {removable} 個可移除。僅有當整合不再提供實體時、實體方能進行移除。有時候,於移除整合之後、需重啟 Home Assistant 後、方能進行移除的動作。確定要移除可移除之實體?", - "confirm_partly_title": "僅 {number} 個已選擇之實體可移除。", + "confirm_partly_title": "僅 {number} {number, plural,\n one {個已選擇之實體}\n other {個已選擇之實體}\n}可移除。。", "confirm_text": "假如包含此些實體,應該從 Lovelace 設定與自動化中進行移除。", - "confirm_title": "是否要移除 {number} 個實體?" + "confirm_title": "是否要移除 {number} {number, plural,\n one {個實體}\n other {個實體}\n}?" }, "search": "搜尋實體", "selected": "已選擇 {number} 個", @@ -1720,6 +1734,42 @@ "server": "伺服器", "source": "來源:", "system_health_error": "系統健康元件未載入。請於 configuration.yaml 內加入「system_health:」", + "system_health": { + "checks": { + "cloud": { + "alexa_enabled": "Alexa 已啟用", + "can_reach_cert_server": "連線驗證伺服器", + "can_reach_cloud": "連線 Home Assistant Cloud", + "can_reach_cloud_auth": "連線認證伺服器", + "google_enabled": "Google 已啟用", + "logged_in": "已登入", + "relayer_connected": "中繼已連線", + "remote_connected": "遠端控制已連線", + "remote_enabled": "遠端控制已啟用", + "subscription_expiration": "訂閱到期" + }, + "homeassistant": { + "arch": "CPU 架構", + "dev": "開發版", + "docker": "Docker", + "hassio": "HassOS", + "installation_type": "安裝類型", + "os_name": "作業系統名稱", + "os_version": "作業系統版本", + "python_version": "Python 版本", + "timezone": "時區", + "version": "版本", + "virtualenv": "虛擬環境" + }, + "lovelace": { + "dashboards": "主面板", + "mode": "模式", + "resources": "資源" + } + }, + "manage": "管理", + "more_info": "更多資訊" + }, "title": "資訊" }, "integration_panel_move": { @@ -1845,7 +1895,7 @@ "title": "標題", "title_required": "必須輸入標題", "update": "更新", - "url": "網址", + "url": "URL", "url_error_msg": "網址應該包含一個 -,同時不能包含空格或特殊字元,除了 _ 及 -。" }, "picker": { @@ -1873,8 +1923,8 @@ "new_resource": "新增資源", "type": "資源類型", "update": "更新", - "url": "網址", - "url_error_msg": "網址為必填欄位", + "url": "URL", + "url_error_msg": "URL 為必填欄位", "warning_header": "請特別注意!", "warning_text": "新增資源具有風險性、請確認資源來源安全性。惡意的資源可能嚴重損害您的系統。" }, @@ -1882,7 +1932,7 @@ "add_resource": "新增資源", "headers": { "type": "類別", - "url": "網址" + "url": "URL" }, "no_resources": "沒有資源" }, @@ -2136,7 +2186,9 @@ "sequence_sentence": "此腳本所含的操作動作。" }, "picker": { - "add_script": "新增新腳本", + "add_script": "新增腳本", + "duplicate": "複製", + "duplicate_script": "複製腳本", "edit_script": "編輯腳本", "header": "腳本編輯器", "headers": { @@ -2173,7 +2225,7 @@ "input_text": "重新載入輸入文字", "introduction": "Home Assistant 中部分設定無須重啟即可重新載入生效。點選重新載入按鈕,即可解除目前 YAML 設定,並重新載入最新設定。", "min_max": "重新載入最低/最高實體", - "mqtt": "手動重新載入 MQTT 實體", + "mqtt": "重新載入手動設定 MQTT 實體", "person": "重新載入人員", "ping": "重新載入 Ping 二進位傳感器實體", "reload": "重新載入{domain}", @@ -2210,6 +2262,8 @@ "add_tag": "新增標籤", "automation_title": "標籤 {name} 已掃描", "caption": "標籤", + "confirm_remove": "是否要移除標籤 {tag}?", + "confirm_remove_title": "移除標籤?", "create_automation": "以標籤新增自動化", "description": "管理標籤", "detail": { @@ -2635,7 +2689,7 @@ } }, "changed_toast": { - "message": "此主面板 Lovelace UI 設定已更新,是否要更新頁面檢視變更?", + "message": "此主面板 Lovelace UI 設定已更新,更新頁面檢視變更?", "refresh": "更新" }, "editor": { @@ -2647,11 +2701,11 @@ "navigate": "導航", "none": "沒有動作", "toggle": "開關", - "url": "網址" + "url": "URL" }, "editor_service_data": "服務資料僅能於代碼編輯器中輸入", "navigation_path": "導航路徑", - "url_path": "網址路徑" + "url_path": "URL 路徑" }, "card": { "alarm-panel": { @@ -2769,7 +2823,7 @@ "theme": "主題", "title": "標題", "unit": "單位", - "url": "網址" + "url": "URL" }, "glance": { "columns": "列", @@ -2872,11 +2926,18 @@ "entity": "實體", "no_description": "無描述可使用。" }, + "common": { + "add": "新增", + "clear": "清除", + "edit": "編輯", + "none": "無" + }, "edit_badges": { "panel_mode": "\"面板模式\"下、圓標圖示將不會顯示。" }, "edit_card": { "add": "新增面板", + "clear": "清除", "confirm_cancel": "確定要取消?", "delete": "刪除面板", "duplicate": "複製面板", @@ -2917,6 +2978,22 @@ } }, "header": "編輯 UI", + "header-footer": { + "choose_header_footer": "選擇{type}", + "footer": "Footer", + "header": "Header", + "types": { + "buttons": { + "name": "按鈕" + }, + "graph": { + "name": "圖像" + }, + "picture": { + "name": "照片" + } + } + }, "menu": { "open": "開啟 Lovelace UI 選單", "raw_editor": "文字模式編輯器" @@ -2961,6 +3038,13 @@ "dashboard_label": "主面板", "header": "選擇面板" }, + "sub-element-editor": { + "types": { + "footer": "Footer 編輯器", + "header": "Header 編輯器", + "row": "實體編輯器" + } + }, "suggest_card": { "add": "新增至 Lovelace UI", "create_own": "選擇其他面板", From f68eff6bb356ea5ceeca804a0916d71098d1bd7f Mon Sep 17 00:00:00 2001 From: Ian Richardson Date: Thu, 12 Nov 2020 08:06:45 -0600 Subject: [PATCH 02/90] Fix state-info icon color and convert to TypeScript/LitElement (#7664) --- src/components/entity/state-info.js | 152 -------------------------- src/components/entity/state-info.ts | 158 ++++++++++++++++++++++++++++ 2 files changed, 158 insertions(+), 152 deletions(-) delete mode 100644 src/components/entity/state-info.js create mode 100644 src/components/entity/state-info.ts diff --git a/src/components/entity/state-info.js b/src/components/entity/state-info.js deleted file mode 100644 index d228de67de..0000000000 --- a/src/components/entity/state-info.js +++ /dev/null @@ -1,152 +0,0 @@ -import { html } from "@polymer/polymer/lib/utils/html-tag"; -import "@polymer/paper-tooltip/paper-tooltip"; -/* eslint-plugin-disable lit */ -import LocalizeMixin from "../../mixins/localize-mixin"; -import { PolymerElement } from "@polymer/polymer/polymer-element"; -import { computeStateName } from "../../common/entity/compute_state_name"; -import { computeRTL } from "../../common/util/compute_rtl"; -import "../ha-relative-time"; -import "./state-badge"; - -class StateInfo extends LocalizeMixin(PolymerElement) { - static get template() { - return html` - ${this.styleTemplate} ${this.stateBadgeTemplate} ${this.infoTemplate} - `; - } - - static get styleTemplate() { - return html` - - `; - } - - static get stateBadgeTemplate() { - return html` `; - } - - static get infoTemplate() { - return html` -
-
- [[computeStateName(stateObj)]] -
- - -
- `; - } - - static get properties() { - return { - hass: Object, - stateObj: Object, - inDialog: { - type: Boolean, - value: () => false, - }, - rtl: { - type: Boolean, - reflectToAttribute: true, - computed: "computeRTL(hass)", - }, - }; - } - - computeStateName(stateObj) { - return computeStateName(stateObj); - } - - computeRTL(hass) { - return computeRTL(hass); - } -} - -customElements.define("state-info", StateInfo); diff --git a/src/components/entity/state-info.ts b/src/components/entity/state-info.ts new file mode 100644 index 0000000000..91991d5e22 --- /dev/null +++ b/src/components/entity/state-info.ts @@ -0,0 +1,158 @@ +import "@polymer/paper-tooltip/paper-tooltip"; +import { + css, + CSSResult, + customElement, + html, + LitElement, + property, + TemplateResult, +} from "lit-element"; +import type { HassEntity } from "home-assistant-js-websocket"; + +import { computeStateName } from "../../common/entity/compute_state_name"; +import { computeRTL } from "../../common/util/compute_rtl"; +import type { HomeAssistant } from "../../types"; + +import "../ha-relative-time"; +import "./state-badge"; + +@customElement("state-info") +class StateInfo extends LitElement { + @property({ attribute: false }) public hass!: HomeAssistant; + + @property({ attribute: false }) public stateObj?: HassEntity; + + @property({ type: Boolean }) public inDialog = false; + + // property used only in css + @property({ type: Boolean, reflect: true }) public rtl = false; + + protected render(): TemplateResult { + if (!this.hass || !this.stateObj) { + return html``; + } + + return html` +
+
+ ${computeStateName(this.stateObj)} +
+ ${this.inDialog + ? html`
+ + +
+
+ + ${this.hass.localize( + "ui.dialogs.more_info_control.last_changed" + )}: + + +
+
+ + ${this.hass.localize( + "ui.dialogs.more_info_control.last_updated" + )}: + + +
+
+
+
` + : html`
`} +
`; + } + + protected updated(changedProps) { + super.updated(changedProps); + if (!changedProps.has("hass")) { + return; + } + + const oldHass = changedProps.get("hass") as HomeAssistant | undefined; + if (!oldHass || oldHass.language !== this.hass.language) { + this.rtl = computeRTL(this.hass); + } + } + + static get styles(): CSSResult { + return css` + :host { + @apply --paper-font-body1; + min-width: 120px; + white-space: nowrap; + } + + state-badge { + float: left; + } + + :host([rtl]) state-badge { + float: right; + } + + .info { + margin-left: 56px; + } + + :host([rtl]) .info { + margin-right: 56px; + margin-left: 0; + text-align: right; + } + + .name { + @apply --paper-font-common-nowrap; + color: var(--primary-text-color); + line-height: 40px; + } + + .name[in-dialog], + :host([secondary-line]) .name { + line-height: 20px; + } + + .time-ago, + .extra-info, + .extra-info > * { + @apply --paper-font-common-nowrap; + color: var(--secondary-text-color); + } + + .row { + display: flex; + flex-direction: row; + flex-wrap: no-wrap; + width: 100%; + justify-content: space-between; + margin: 0 2px 4px 0; + } + + .row:last-child { + margin-bottom: 0px; + } + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + "state-info": StateInfo; + } +} From 37a089c868f275b30a35a93dd307dcbe0529e891 Mon Sep 17 00:00:00 2001 From: Ian Richardson Date: Thu, 12 Nov 2020 08:29:16 -0600 Subject: [PATCH 03/90] Convert ha-cover-controls to TypeScript/LitElement (#7521) Co-authored-by: Zack Barett --- src/common/entity/cover_icon.ts | 22 +++++ src/components/ha-cover-controls.js | 126 -------------------------- src/components/ha-cover-controls.ts | 135 ++++++++++++++++++++++++++++ src/translations/en.json | 3 + 4 files changed, 160 insertions(+), 126 deletions(-) delete mode 100644 src/components/ha-cover-controls.js create mode 100644 src/components/ha-cover-controls.ts diff --git a/src/common/entity/cover_icon.ts b/src/common/entity/cover_icon.ts index 7c9bc5ed53..011f8e7294 100644 --- a/src/common/entity/cover_icon.ts +++ b/src/common/entity/cover_icon.ts @@ -78,3 +78,25 @@ export const coverIcon = (state?: string, stateObj?: HassEntity): string => { return "hass:window-open"; } }; + +export const computeOpenIcon = (stateObj: HassEntity): string => { + switch (stateObj.attributes.device_class) { + case "awning": + case "door": + case "gate": + return "hass:arrow-expand-horizontal"; + default: + return "hass:arrow-up"; + } +}; + +export const computeCloseIcon = (stateObj: HassEntity): string => { + switch (stateObj.attributes.device_class) { + case "awning": + case "door": + case "gate": + return "hass:arrow-collapse-horizontal"; + default: + return "hass:arrow-down"; + } +}; diff --git a/src/components/ha-cover-controls.js b/src/components/ha-cover-controls.js deleted file mode 100644 index 3c9288399d..0000000000 --- a/src/components/ha-cover-controls.js +++ /dev/null @@ -1,126 +0,0 @@ -import "./ha-icon-button"; -import { html } from "@polymer/polymer/lib/utils/html-tag"; -/* eslint-plugin-disable lit */ -import { PolymerElement } from "@polymer/polymer/polymer-element"; -import { UNAVAILABLE } from "../data/entity"; -import CoverEntity from "../util/cover-model"; - -class HaCoverControls extends PolymerElement { - static get template() { - return html` - - -
- - - -
- `; - } - - static get properties() { - return { - hass: { - type: Object, - }, - stateObj: { - type: Object, - }, - entityObj: { - type: Object, - computed: "computeEntityObj(hass, stateObj)", - }, - }; - } - - computeEntityObj(hass, stateObj) { - return new CoverEntity(hass, stateObj); - } - - computeOpenIcon(stateObj) { - switch (stateObj.attributes.device_class) { - case "awning": - case "door": - case "gate": - return "hass:arrow-expand-horizontal"; - default: - return "hass:arrow-up"; - } - } - - computeCloseIcon(stateObj) { - switch (stateObj.attributes.device_class) { - case "awning": - case "door": - case "gate": - return "hass:arrow-collapse-horizontal"; - default: - return "hass:arrow-down"; - } - } - - computeStopDisabled(stateObj) { - if (stateObj.state === UNAVAILABLE) { - return true; - } - return false; - } - - computeOpenDisabled(stateObj, entityObj) { - if (stateObj.state === UNAVAILABLE) { - return true; - } - const assumedState = stateObj.attributes.assumed_state === true; - return (entityObj.isFullyOpen || entityObj.isOpening) && !assumedState; - } - - computeClosedDisabled(stateObj, entityObj) { - if (stateObj.state === UNAVAILABLE) { - return true; - } - const assumedState = stateObj.attributes.assumed_state === true; - return (entityObj.isFullyClosed || entityObj.isClosing) && !assumedState; - } - - onOpenTap(ev) { - ev.stopPropagation(); - this.entityObj.openCover(); - } - - onCloseTap(ev) { - ev.stopPropagation(); - this.entityObj.closeCover(); - } - - onStopTap(ev) { - ev.stopPropagation(); - this.entityObj.stopCover(); - } -} - -customElements.define("ha-cover-controls", HaCoverControls); diff --git a/src/components/ha-cover-controls.ts b/src/components/ha-cover-controls.ts new file mode 100644 index 0000000000..06def92e23 --- /dev/null +++ b/src/components/ha-cover-controls.ts @@ -0,0 +1,135 @@ +import { + css, + CSSResult, + customElement, + html, + internalProperty, + LitElement, + property, + PropertyValues, + TemplateResult, +} from "lit-element"; +import { classMap } from "lit-html/directives/class-map"; +import type { HassEntity } from "home-assistant-js-websocket"; + +import type { HomeAssistant } from "../types"; +import { UNAVAILABLE } from "../data/entity"; +import CoverEntity from "../util/cover-model"; + +import "./ha-icon-button"; +import { computeCloseIcon, computeOpenIcon } from "../common/entity/cover_icon"; + +@customElement("ha-cover-controls") +class HaCoverControls extends LitElement { + @property({ attribute: false }) public hass!: HomeAssistant; + + @property({ attribute: false }) public stateObj!: HassEntity; + + @internalProperty() private _entityObj?: CoverEntity; + + protected updated(changedProperties: PropertyValues): void { + super.updated(changedProperties); + + if (changedProperties.has("stateObj")) { + this._entityObj = new CoverEntity(this.hass, this.stateObj); + } + } + + protected render(): TemplateResult { + if (!this._entityObj) { + return html``; + } + + return html` +
+ + + +
+ `; + } + + private _computeOpenDisabled(): boolean { + if (this.stateObj.state === UNAVAILABLE) { + return true; + } + const assumedState = this.stateObj.attributes.assumed_state === true; + return ( + (this._entityObj.isFullyOpen || this._entityObj.isOpening) && + !assumedState + ); + } + + private _computeClosedDisabled(): boolean { + if (this.stateObj.state === UNAVAILABLE) { + return true; + } + const assumedState = this.stateObj.attributes.assumed_state === true; + return ( + (this._entityObj.isFullyClosed || this._entityObj.isClosing) && + !assumedState + ); + } + + private _onOpenTap(ev): void { + ev.stopPropagation(); + this._entityObj.openCover(); + } + + private _onCloseTap(ev): void { + ev.stopPropagation(); + this._entityObj.closeCover(); + } + + private _onStopTap(ev): void { + ev.stopPropagation(); + this._entityObj.stopCover(); + } + + static get styles(): CSSResult { + return css` + .state { + white-space: nowrap; + } + .hidden { + visibility: hidden !important; + } + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + "ha-cover-controls": HaCoverControls; + } +} diff --git a/src/translations/en.json b/src/translations/en.json index 10ad5be097..c31db303c6 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -585,6 +585,9 @@ "create_zone": "Create zone from current location" }, "cover": { + "open_cover": "Open cover", + "stop_cover": "Stop the cover from moving", + "close_cover": "Close cover", "open_tilt_cover": "Open cover tilt", "close_tile_cover": "Close cover tilt", "stop_cover": "Stop cover from moving" From 6558c2c0651ef6bff041c03f5c591a528ca5a240 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Fri, 13 Nov 2020 00:32:24 +0000 Subject: [PATCH 04/90] [ci skip] Translation update --- translations/frontend/ca.json | 33 +++++++- translations/frontend/cs.json | 29 +++++++ translations/frontend/de.json | 1 + translations/frontend/en.json | 2 + translations/frontend/es.json | 39 ++++++++-- translations/frontend/et.json | 29 +++++++ translations/frontend/fr.json | 14 ++-- translations/frontend/hu.json | 137 +++++++++++++++++++++++++++++++--- translations/frontend/nb.json | 29 +++++++ translations/frontend/nl.json | 57 +++++++++++++- translations/frontend/pl.json | 38 +++++++++- translations/frontend/ru.json | 37 ++++++++- 12 files changed, 411 insertions(+), 34 deletions(-) diff --git a/translations/frontend/ca.json b/translations/frontend/ca.json index 7151215159..84a672c3ca 100644 --- a/translations/frontend/ca.json +++ b/translations/frontend/ca.json @@ -813,7 +813,7 @@ "dismiss": "Omet el diàleg", "edit": "Edita entitat", "history": "Historial", - "last_changed": "Darrer canvi", + "last_changed": "Últim canvi", "last_updated": "Última actualització", "person": { "create_zone": "Crea una zona a partir de la ubicació actual" @@ -872,6 +872,28 @@ }, "quick-bar": { "commands": { + "navigation": { + "areas": "Àrees", + "automation": "Automatització", + "core": "General", + "customize": "Personalització", + "devices": "Dispositius", + "entities": "Entitats", + "helpers": "Ajudants", + "info": "Informació", + "integrations": "Integracions", + "logs": "Registres", + "lovelace": "Panells Lovelace", + "navigate_to": "Vés a {panel}", + "navigate_to_config": "Vés a la configuració de {panel}", + "person": "Persones", + "scene": "Escenes", + "script": "Programació (scripts)", + "server_control": "Controls del servidor", + "tags": "Etiquetes", + "users": "Usuaris", + "zone": "Zones" + }, "reload": { "automation": "Actualitza automatitzacions", "command_line": "Actualitza entitats de comandes", @@ -1925,7 +1947,7 @@ "update": "Actualitza", "url": "URL", "url_error_msg": "L'URL és un camp obligatori", - "warning_header": "Ves amb compte!", + "warning_header": "Vés amb compte!", "warning_text": "Afegir recursos pot ser perillós, assegura't de conèixer i confiar en el seu origen. Els recursos fraudulents poden perjudicar greument el teu sistema." }, "picker": { @@ -2323,6 +2345,7 @@ "update_user": "Actualitza" }, "picker": { + "add_user": "Afegeix usuari", "headers": { "group": "Grup", "name": "Nom", @@ -2603,6 +2626,8 @@ "filter_attributes": "Filtra atributs", "filter_entities": "Filtra entitats", "filter_states": "Filtra estats", + "last_changed": "Últim canvi", + "last_updated": "Última actualització", "more_info": "Més informació", "no_entities": "No hi ha entitats", "set_state": "Estableix estat", @@ -2854,6 +2879,10 @@ "description": "La targeta llum et permet ajustar la brillantor d'una llum.", "name": "Llum" }, + "logbook": { + "description": "La targeta diari de registre mostra una llista d'esdeveniments de les entitats", + "name": "Diari de registre" + }, "map": { "dark_mode": "Mode fosc?", "default_zoom": "Zoom predeterminat", diff --git a/translations/frontend/cs.json b/translations/frontend/cs.json index 34c8c2e8da..74dafefe48 100644 --- a/translations/frontend/cs.json +++ b/translations/frontend/cs.json @@ -872,6 +872,28 @@ }, "quick-bar": { "commands": { + "navigation": { + "areas": "Oblasti", + "automation": "Automatizace", + "core": "Obecné", + "customize": "Přizpůsobení", + "devices": "Zařízení", + "entities": "Entity", + "helpers": "Pomocníci", + "info": "Informace", + "integrations": "Integrace", + "logs": "Logy", + "lovelace": "Lovelace Dashboardy", + "navigate_to": "Přejít na {panel}", + "navigate_to_config": "Přejít na nastavení {panel}", + "person": "Osoby", + "scene": "Scény", + "script": "Skripty", + "server_control": "Ovládání serveru", + "tags": "Značky", + "users": "Uživatelé", + "zone": "Zóny" + }, "reload": { "automation": "Nově načíst automatizace", "command_line": "Nově načíst entity integrace Command line", @@ -2323,6 +2345,7 @@ "update_user": "Aktualizovat" }, "picker": { + "add_user": "Přidat uživatele", "headers": { "group": "Skupina", "name": "Název", @@ -2603,6 +2626,8 @@ "filter_attributes": "Filtrovat atributy", "filter_entities": "Filtrovat entity", "filter_states": "Filtrovat stavy", + "last_changed": "Naposledy změněno", + "last_updated": "Poslední aktualizace", "more_info": "Více informací", "no_entities": "Žádné entity", "set_state": "Nastavit stav", @@ -2854,6 +2879,10 @@ "description": "Karta Světlo umožňuje změnit jas světla.", "name": "Světlo" }, + "logbook": { + "description": "Karta Záznamy zobrazuje seznam událostí entit.", + "name": "Záznamy" + }, "map": { "dark_mode": "Tmavý režim?", "default_zoom": "Výchozí zvětšení", diff --git a/translations/frontend/de.json b/translations/frontend/de.json index b7d7f0f2c4..4af912b410 100644 --- a/translations/frontend/de.json +++ b/translations/frontend/de.json @@ -2297,6 +2297,7 @@ "update_user": "Aktualisieren" }, "picker": { + "add_user": "Benutzer hinzufügen", "headers": { "group": "Gruppe", "name": "Name", diff --git a/translations/frontend/en.json b/translations/frontend/en.json index 481b58d893..2d7115aaad 100644 --- a/translations/frontend/en.json +++ b/translations/frontend/en.json @@ -805,7 +805,9 @@ "more_info_control": { "controls": "Controls", "cover": { + "close_cover": "Close cover", "close_tile_cover": "Close cover tilt", + "open_cover": "Open cover", "open_tilt_cover": "Open cover tilt", "stop_cover": "Stop cover from moving" }, diff --git a/translations/frontend/es.json b/translations/frontend/es.json index 5aa0d34da1..9f5c765d81 100644 --- a/translations/frontend/es.json +++ b/translations/frontend/es.json @@ -588,7 +588,7 @@ "cleared_device_class": "no detectado (no se detecta {device_class})", "detected_device_class": "detectado {device_class}", "rose": "salió", - "set": "Establecer", + "set": "se puso", "turned_off": "apagado", "turned_on": "encendido", "was_at_home": "estaba en casa", @@ -872,6 +872,28 @@ }, "quick-bar": { "commands": { + "navigation": { + "areas": "Áreas", + "automation": "Automatizaciones", + "core": "Configuración general", + "customize": "Personalizaciones", + "devices": "Dispositivos", + "entities": "Entidades", + "helpers": "Ayudantes", + "info": "Información", + "integrations": "Integraciones", + "logs": "Registros", + "lovelace": "Paneles de Control Lovelace", + "navigate_to": "Navegar a {panel}", + "navigate_to_config": "Navegar a la configuración de {panel}", + "person": "Personas", + "scene": "Escenas", + "script": "Scripts", + "server_control": "Controles del servidor", + "tags": "Etiquetas", + "users": "Usuarios", + "zone": "Zonas" + }, "reload": { "automation": "Recargar automatizaciones", "command_line": "Recargar entidades de línea de comandos", @@ -889,7 +911,7 @@ "input_select": "Recargar los campos desplegables", "input_text": "Recargar los campos de texto", "min_max": "Recargar entidades min/max", - "mqtt": "Recargar entidades mqtt configuradas manualmente", + "mqtt": "Recargar entidades MQTT configuradas manualmente", "person": "Recargar personas", "ping": "Recargar entidades de sensor binario de ping", "reload": "Recargar {domain}", @@ -897,7 +919,7 @@ "rpi_gpio": "Recargar entidades GPIO de Raspberry Pi", "scene": "Recargar escenas", "script": "Recargar scripts", - "smtp": "Recargar servicios de notificación smtp", + "smtp": "Recargar servicios de notificación SMTP", "statistics": "Recargar entidades de estadísticas", "telegram": "Recargar servicios de notificación de telegram", "template": "Recargar entidades de plantilla", @@ -2225,7 +2247,7 @@ "input_text": "Recargar los campos de texto", "introduction": "Algunas partes de Home Assistant pueden recargarse sin necesidad de reiniciar. Al pulsar en recargar se descartará la configuración YAML actual y se cargará la nueva.", "min_max": "Recargar entidades min/max", - "mqtt": "Recargar entidades mqtt configuradas manualmente", + "mqtt": "Recargar entidades MQTT configuradas manualmente", "person": "Recargar personas", "ping": "Recargar entidades de sensor binario de ping", "reload": "Recargar {domain}", @@ -2233,7 +2255,7 @@ "rpi_gpio": "Recargar entidades GPIO de Raspberry Pi", "scene": "Recargar escenas", "script": "Recargar scripts", - "smtp": "Recargar servicios de notificación smtp", + "smtp": "Recargar servicios de notificación SMTP", "statistics": "Recargar entidades de estadísticas", "telegram": "Recargar servicios de notificación de telegram", "template": "Recargar entidades de plantilla", @@ -2323,6 +2345,7 @@ "update_user": "Actualizar" }, "picker": { + "add_user": "Añadir usuario", "headers": { "group": "Grupo", "name": "Nombre", @@ -2603,6 +2626,8 @@ "filter_attributes": "Filtrar atributos", "filter_entities": "Filtrar entidades", "filter_states": "Filtrar estados", + "last_changed": "Último cambio", + "last_updated": "Última actualización", "more_info": "Más Información", "no_entities": "Sin entidades", "set_state": "Establecer estado", @@ -2854,6 +2879,10 @@ "description": "La tarjeta de luz te permite cambiar la intensidad de la luz.", "name": "Luz" }, + "logbook": { + "description": "La tarjeta Registro muestra una lista de eventos para las entidades.", + "name": "Registro" + }, "map": { "dark_mode": "¿Modo oscuro?", "default_zoom": "Zoom predeterminado", diff --git a/translations/frontend/et.json b/translations/frontend/et.json index bab048aa61..478b712aa0 100644 --- a/translations/frontend/et.json +++ b/translations/frontend/et.json @@ -872,6 +872,28 @@ }, "quick-bar": { "commands": { + "navigation": { + "areas": "Alad", + "automation": "Automatiseeringud", + "core": "Üldine", + "customize": "Kohandamised", + "devices": "Seadmed", + "entities": "Olemid", + "helpers": "Abimehed", + "info": "Info", + "integrations": "Sidumised", + "logs": "Logid", + "lovelace": "Lovelace vaated", + "navigate_to": "Mine vaatesse {panel}", + "navigate_to_config": "Mine vaate {panel} sätetesse", + "person": "Isikud", + "scene": "Stseenid", + "script": "Scriptid", + "server_control": "Serveri juhtimine", + "tags": "Märgised", + "users": "Kasutajad", + "zone": "Tsoonid" + }, "reload": { "automation": "Taaslae automatiseeringud", "command_line": "Taaslae käsurea olemid", @@ -2323,6 +2345,7 @@ "update_user": "Uuenda" }, "picker": { + "add_user": "Lisa kasutaja", "headers": { "group": "Grupp", "name": "Nimi", @@ -2603,6 +2626,8 @@ "filter_attributes": "Filtreeri atribuute", "filter_entities": "Filtreeri olemeid", "filter_states": "Filtreeri olekuid", + "last_changed": "Viimati muudetud", + "last_updated": "Viimati uuendatud", "more_info": "Rohkem infot", "no_entities": "Olemid puuduvad", "set_state": "Määra olek", @@ -2854,6 +2879,10 @@ "description": "Valgustikaart võimaldab muuta valguse heledust.", "name": "Valgusti" }, + "logbook": { + "description": "Logiraamatu kaardil kuvatakse olemite sündmuste loend.", + "name": "Logiraamat" + }, "map": { "dark_mode": "Tume režiim?", "default_zoom": "Vaikesuurendus", diff --git a/translations/frontend/fr.json b/translations/frontend/fr.json index 452ea459a3..79f16715c2 100644 --- a/translations/frontend/fr.json +++ b/translations/frontend/fr.json @@ -875,7 +875,7 @@ "input_select": "Recharger les listes de sélection (input select)", "input_text": "Recharger les entrées de texte (input text)", "min_max": "Recharger les entités min/max", - "mqtt": "Recharger les entités mqtt configurées manuellement", + "mqtt": "Recharger les entités MQTT configurées manuellement", "person": "Recharger les personnes", "ping": "Recharger les entités de capteur binaire ping", "reload": "Recharger {domain}", @@ -883,7 +883,7 @@ "rpi_gpio": "Recharger les entités GPIO du Raspberry Pi", "scene": "Recharger les scènes", "script": "Recharger les scripts", - "smtp": "Recharger les services de notification smtp", + "smtp": "Recharger les services de notification SMTP", "statistics": "Recharger les entités de statistiques", "telegram": "Recharger les services de notification de telegram", "template": "Recharger les entités modèles", @@ -1213,7 +1213,7 @@ "trigger": "Déclencheur" }, "event": { - "context_user_pick": "Ajouter un utilisateur", + "context_user_pick": "Sélectionner un utilisateur", "context_user_picked": "Événement déclenché par l'utilisateur", "context_users": "Limiter aux événements déclenchés par", "event_data": "Données de l'événement", @@ -2136,7 +2136,7 @@ "sequence_sentence": "La séquence d'actions de ce script." }, "picker": { - "add_script": "Créer un nouveau script", + "add_script": "Ajouter un script", "edit_script": "Éditer le script", "header": "Éditeur de script", "headers": { @@ -2173,7 +2173,7 @@ "input_text": "Recharger les entrées de texte (input text)", "introduction": "Certaines parties de Home Assistant peuvent être rechargées sans nécessiter de redémarrage. Le fait de cliquer sur recharger déchargera leur configuration actuelle et chargera la nouvelle.", "min_max": "Recharger les entités min/max", - "mqtt": "Recharger les entités mqtt configurées manuellement", + "mqtt": "Recharger les entités MQTT configurées manuellement", "person": "Recharger les personnes", "ping": "Recharger les entités de capteur binaire ping", "reload": "Recharger {domain}", @@ -2181,7 +2181,7 @@ "rpi_gpio": "Recharger les entités GPIO du Raspberry Pi", "scene": "Recharger les scènes", "script": "Recharger les scripts", - "smtp": "Recharger les services de notification smtp", + "smtp": "Recharger les services de notification SMTP", "statistics": "Recharger les entités de statistiques", "telegram": "Recharger les services de notification de telegram", "template": "Recharger les entités modèles", @@ -2635,7 +2635,7 @@ } }, "changed_toast": { - "message": "La configuration de l'interface utilisateur de Lovelace a été mise à jour, réactualisée pour voir les changements ?", + "message": "La configuration de l'interface utilisateur de Lovelace a été mise à jour. Voulez-vous actualiser pour voir les changements ?", "refresh": "Rafraîchir" }, "editor": { diff --git a/translations/frontend/hu.json b/translations/frontend/hu.json index 4171c52002..8ad704a285 100644 --- a/translations/frontend/hu.json +++ b/translations/frontend/hu.json @@ -511,16 +511,23 @@ "continue": "Tovább", "copied": "Másolva", "delete": "Törlés", + "disable": "Letiltás", + "enable": "Engedélyezés", "error_required": "Szükséges", + "leave": "Elhagy", "loading": "Betöltés", "menu": "Menü", "next": "Tovább", "no": "Nem", + "not_now": "Ne most", "overflow_menu": "Lebegő menü", "previous": "Előző", "refresh": "Frissítés", + "remove": "Eltávolítás", + "rename": "Átnevezés", "save": "Mentés", "skip": "Kihagyás", + "stay": "Marad", "successfully_deleted": "Sikeresen törölve", "successfully_saved": "Sikeresen elmentve", "undo": "Visszavonás", @@ -721,8 +728,10 @@ "confirm_delete": "Biztosan törölni szeretnéd ezt a bejegyzést?", "delete": "Törlés", "enabled_cause": "Letiltva. ({cause})", + "enabled_delay_confirm": "Az engedélyezett entitások {delay} másodpercen belül hozzá lesznek adva a Home Assistant-hoz", "enabled_description": "A letiltott entitások nem lesznek hozzáadva a Home Assistant-hoz.", "enabled_label": "Entitás engedélyezése", + "enabled_restart_confirm": "Az entitások engedélyezésének befejezéséhez indítsd újra a Home Assistant-et", "entity_id": "Entitás ID", "icon": "Ikon", "icon_error": "Az ikonokat a 'prefix:ikonnév' formátumban kell megadni, pl.: 'mdi:home'", @@ -795,6 +804,11 @@ }, "more_info_control": { "controls": "Vezérlők", + "cover": { + "close_tile_cover": "Árnyékoló döntésének zárása", + "open_tilt_cover": "Árnyékoló döntésének nyitása", + "stop_cover": "Árnyékoló mozgásának leállítása" + }, "details": "Részletek", "dismiss": "Párbeszédpanel elvetése", "edit": "Entitás szerkesztése", @@ -858,6 +872,28 @@ }, "quick-bar": { "commands": { + "navigation": { + "areas": "Területek", + "automation": "Automatizálások", + "core": "Általános", + "customize": "Testreszabások", + "devices": "Eszközök", + "entities": "Entitások", + "helpers": "Segítők", + "info": "Infó", + "integrations": "Integrációk", + "logs": "Napló", + "lovelace": "Lovelace Irányítópultok", + "navigate_to": "Ugrás {panel}", + "navigate_to_config": "Ugrás a(z) {panel} konfigurációra", + "person": "Személyek", + "scene": "Jelenetek", + "script": "Szkriptek", + "server_control": "Szerver vezérlés", + "tags": "Címkék", + "users": "Felhasználók", + "zone": "Zónák" + }, "reload": { "automation": "Automatizálások újratöltése", "command_line": "Parancssori entitások újratöltése", @@ -875,7 +911,7 @@ "input_select": "Választási bemenetek újratöltése", "input_text": "Szöveg bemenetek újratöltése", "min_max": "Min/max entitások újratöltése", - "mqtt": "MQTT entitások újratöltése", + "mqtt": "Manuálisan konfigurált MQTT entitások újratöltése", "person": "Személyek újratöltése", "ping": "Ping bináris érzékelő entitások újratöltése", "reload": "{domain} újratöltése", @@ -883,7 +919,7 @@ "rpi_gpio": "Raspberry Pi GPIO entitások újratöltése", "scene": "Jelenetek újratöltése", "script": "Szkriptek újratöltése", - "smtp": "Smtp értesítési szolgáltatások újratöltése", + "smtp": "SMTP értesítési szolgáltatások újratöltése", "statistics": "Statisztikai entitások újratöltése", "telegram": "Telegram értesítési szolgáltatások újratöltése", "template": "Sablon entitások újratöltése", @@ -916,7 +952,7 @@ "zigbee_information": "Zigbee eszköz aláírása" }, "confirmations": { - "remove": "Biztosan el akarod távolítani az eszközt?" + "remove": "Biztosan el szeretnéd távolítani az eszközt?" }, "device_signature": "Zigbee eszköz aláírása", "last_seen": "Utolsó jelentés", @@ -1213,7 +1249,7 @@ "trigger": "Eseményindító" }, "event": { - "context_user_pick": "Felhasználó hozzáadása", + "context_user_pick": "Felhasználó kiválasztása", "context_user_picked": "Eseményt kiváltó felhasználó", "context_users": "Korlátozás felhasználó(k) által indított eseményekre", "event_data": "Esemény adatai", @@ -1315,10 +1351,17 @@ }, "thingtalk": { "create": "Automatizálás létrehozása", + "link_devices": { + "ambiguous_entities": "Egy vagy több eszköznek több illeszkedő entitása van, válaszd ki amelyiket használni szeretnéd.", + "header": "Nagyszerű! Most össze kell kapcsolnunk néhány eszközt", + "unknown_placeholder": "Ismeretlen helykitöltő" + }, "task_selection": { "error_empty": "Írj be egy parancsot, vagy koppints a kihagyásra.", + "error_unsupported": "Ehhez (még?) nem tudunk automatizálást létrehozni.", "for_example": "Például:", "header": "Új automatizálás létrehozása", + "introduction": "Írd be alább, hogy mit kellene tennie ennek az automatizálásnak, és megpróbáljuk átalakítani Home Assistant automatizálássá.", "language_note": "Megjegyzés: Egyelőre csak az angol nyelv támogatott." } } @@ -1620,12 +1663,12 @@ "disable_selected": { "button": "Kiválasztottak letiltása", "confirm_text": "A letiltott entitások nem lesznek hozzáadva a Home Assistant-hoz.", - "confirm_title": "Le szeretnél tiltani {number} entitást?" + "confirm_title": "Le szeretnél tiltani {number} {number, plural,\n one {entitást}\n other {entitást}\n}?" }, "enable_selected": { "button": "Kiválasztottak engedélyezése", "confirm_text": "Ezzel újra elérhetővé válnak a Home Assistant-ban, ha jelenleg le vannak tiltva.", - "confirm_title": "Engedélyezni szeretnél {number} entitást?" + "confirm_title": "Engedélyezni szeretnél {number} {number, plural,\n one {entitást}\n other {entitást}\n}?" }, "filter": { "filter": "Szűrő", @@ -1647,9 +1690,9 @@ "remove_selected": { "button": "Kiválasztottak eltávolítása", "confirm_partly_text": "A kiválasztott {selected} entitás közül csak {removable} távolítható el. Az entitások csak akkor távolíthatók el, ha az integráció már nem biztosítja azokat. Néha újra kell indítani a Home Assistant-et, mielőtt el tudnád távolítani egy már eltávolított integráció entitásait. Biztosan el szeretnéd távolítani az eltávolítható entitásokat?", - "confirm_partly_title": "Csak {number} kiválasztott entitás távolítható el.", + "confirm_partly_title": "Csak {number} {number, plural,\n one {kiválasztott entitás}\n other {kiválasztott entitás}\n} távolítható el.", "confirm_text": "El kell távolítanod őket a Lovelace konfigurációból és az automatizálásokból, ha tartalmazzák ezeket az entitásokat.", - "confirm_title": "El szeretnél távolítani {number} entitást?" + "confirm_title": "El szeretnél távolítani {number} {number, plural,\n one {entitást}\n other {entitást}\n}?" }, "search": "Entitások keresése", "selected": "{number} kiválasztva", @@ -1713,6 +1756,39 @@ "server": "server", "source": "Forrás:", "system_health_error": "A rendszerállapot összetevő nincs betöltve. Add hozzá a 'system_health:' sort a configuration.yaml fájlhoz.", + "system_health": { + "checks": { + "cloud": { + "alexa_enabled": "Alexa engedélyezve", + "can_reach_cert_server": "Tanúsítványkiszolgáló elérése", + "can_reach_cloud": "Home Assistant felhő elérése", + "can_reach_cloud_auth": "Hitelesítési kiszolgáló elérése", + "google_enabled": "Google engedélyezve", + "logged_in": "Bejelentkezve", + "subscription_expiration": "Előfizetés lejárata" + }, + "homeassistant": { + "arch": "CPU architektúra", + "dev": "Fejlesztés", + "docker": "Docker", + "hassio": "HassOS", + "installation_type": "Telepítés típusa", + "os_name": "Operációs rendszer neve", + "os_version": "Operációs rendszer verziója", + "python_version": "Python verzió", + "timezone": "Időzóna", + "version": "Verzió", + "virtualenv": "Virtuális környezet" + }, + "lovelace": { + "dashboards": "Irányítópultok", + "mode": "Mód", + "resources": "Erőforrások" + } + }, + "manage": "Kezelés", + "more_info": "további infók" + }, "title": "Infó" }, "integration_panel_move": { @@ -2130,6 +2206,8 @@ }, "picker": { "add_script": "Szkript hozzáadása", + "duplicate": "Duplikálás", + "duplicate_script": "Szkript duplikálása", "edit_script": "Szkript szerkesztése", "header": "Szkript szerkesztő", "headers": { @@ -2166,7 +2244,7 @@ "input_text": "Szöveg bemenetek újratöltése", "introduction": "A Home Assistant bizonyos részei újraindítás nélkül újratölthetőek. Újratöltéskor az aktuálisan betöltött YAML konfiguráció helyére betöltődik az új.", "min_max": "Min/max entitások újratöltése", - "mqtt": "MQTT entitások újratöltése", + "mqtt": "Manuálisan konfigurált MQTT entitások újratöltése", "person": "Személyek újratöltése", "ping": "Ping bináris érzékelő entitások újratöltése", "reload": "{domain} újratöltése", @@ -2174,7 +2252,7 @@ "rpi_gpio": "Raspberry Pi GPIO entitások újratöltése", "scene": "Jelenetek újratöltése", "script": "Szkriptek újratöltése", - "smtp": "Smtp értesítési szolgáltatások újratöltése", + "smtp": "SMTP értesítési szolgáltatások újratöltése", "statistics": "Statisztikai entitások újratöltése", "telegram": "Telegram értesítési szolgáltatások újratöltése", "template": "Sablon entitások újratöltése", @@ -2203,6 +2281,8 @@ "add_tag": "Címke hozzáadása", "automation_title": "{name} címke beolvasva", "caption": "Címkék", + "confirm_remove": "Biztosan el szeretnéd távolítani a(z) {tag} címkét?", + "confirm_remove_title": "Eltávolítod a címkét?", "create_automation": "Automatizálás létrehozása címkével", "description": "Címkék kezelése", "detail": { @@ -2262,6 +2342,7 @@ "update_user": "Frissítés" }, "picker": { + "add_user": "Felhasználó hozzáadása", "headers": { "group": "Csoport", "name": "Név", @@ -2542,6 +2623,8 @@ "filter_attributes": "Attribútumok szűrése", "filter_entities": "Entitások szűrése", "filter_states": "Állapotok szűrése", + "last_changed": "Utoljára módosult", + "last_updated": "Utoljára frissítve", "more_info": "További infók", "no_entities": "Nincs entitás", "set_state": "Állapot beállítása", @@ -2793,6 +2876,10 @@ "description": "A Világítás kártya lehetővé teszi a fényerő megváltoztatását.", "name": "Világítás" }, + "logbook": { + "description": "A Napló kártya az entitások eseményeinek listáját jeleníti meg.", + "name": "Napló" + }, "map": { "dark_mode": "Sötét mód?", "default_zoom": "Alapértelmezett nagyítás", @@ -2865,11 +2952,18 @@ "entity": "Entitás", "no_description": "Nincs leírás." }, + "common": { + "add": "Hozzáadás", + "clear": "Törlés", + "edit": "Szerkesztés", + "none": "Nincs" + }, "edit_badges": { "panel_mode": "Ezek a jelvények nem lesznek megjelenítve, mert ez a nézet \"Panel módban\" van." }, "edit_card": { "add": "Kártya hozzáadása", + "clear": "Törlés", "confirm_cancel": "Biztosan meg szeretnéd szakítani?", "delete": "Kártya törlése", "duplicate": "Kártya duplikálása", @@ -2910,6 +3004,22 @@ } }, "header": "Felhasználói felület szerkesztése", + "header-footer": { + "choose_header_footer": "Válassz {type}-t", + "footer": "Lábléc", + "header": "Fejléc", + "types": { + "buttons": { + "name": "Gombok" + }, + "graph": { + "name": "Grafikon" + }, + "picture": { + "name": "Kép" + } + } + }, "menu": { "open": "Lovelace menü megnyitása", "raw_editor": "Konfiguráció szerkesztő" @@ -2954,6 +3064,13 @@ "dashboard_label": "Irányítópult", "header": "Nézet kiválasztása" }, + "sub-element-editor": { + "types": { + "footer": "Lábléc szerkesztő", + "header": "Fejléc szerkesztő", + "row": "Entitássor szerkesztő" + } + }, "suggest_card": { "add": "Hozzáadás a Lovelace-hez", "create_own": "Készítsd el a sajátod", diff --git a/translations/frontend/nb.json b/translations/frontend/nb.json index 3c2fdb95c3..e388107db0 100644 --- a/translations/frontend/nb.json +++ b/translations/frontend/nb.json @@ -872,6 +872,28 @@ }, "quick-bar": { "commands": { + "navigation": { + "areas": "Områder", + "automation": "Automasjoner", + "core": "Generelt", + "customize": "Tilpasninger", + "devices": "Enheter", + "entities": "Entiteter", + "helpers": "Hjelpere", + "info": "Informasjon", + "integrations": "Integrasjoner", + "logs": "Logger", + "lovelace": "Lovelace instrumentbord", + "navigate_to": "Naviger til {panel}", + "navigate_to_config": "Naviger til {panel} konfigurasjon", + "person": "Personer", + "scene": "Scener", + "script": "Skript", + "server_control": "Server-kontroller", + "tags": "Tagger", + "users": "Brukere", + "zone": "Soner" + }, "reload": { "automation": "Last inn automasjoner på nytt", "command_line": "Last inn kommandolinje entiteter på nytt", @@ -2323,6 +2345,7 @@ "update_user": "Oppdater" }, "picker": { + "add_user": "Legg til bruker", "headers": { "group": "Gruppe", "name": "Navn", @@ -2603,6 +2626,8 @@ "filter_attributes": "Filtrere attributter", "filter_entities": "Filtrere entiteter", "filter_states": "Filtrere tilstander", + "last_changed": "Sist endret", + "last_updated": "Sist oppdatert", "more_info": "Mer info", "no_entities": "Ingen entiteter", "set_state": "Sett tilstand", @@ -2854,6 +2879,10 @@ "description": "Med Light-kortet kan du endre lysstyrken.", "name": "Lys" }, + "logbook": { + "description": "Loggbokskortet viser en liste over hendelser for entiteter", + "name": "Loggbok" + }, "map": { "dark_mode": "Mørk modus?", "default_zoom": "Standard zoom", diff --git a/translations/frontend/nl.json b/translations/frontend/nl.json index 39bfa6a82b..d7d4175114 100644 --- a/translations/frontend/nl.json +++ b/translations/frontend/nl.json @@ -867,6 +867,28 @@ }, "quick-bar": { "commands": { + "navigation": { + "areas": "Gebieden", + "automation": "Automatiseringen", + "core": "Algemeen", + "customize": "Aanpassingen", + "devices": "Apparaten", + "entities": "Entiteiten", + "helpers": "Helpers", + "info": "Info", + "integrations": "Integraties", + "logs": "Logs", + "lovelace": "Lovelace Dashboards", + "navigate_to": "Navigeer naar {panel}", + "navigate_to_config": "Navigeer naar {panel} configuratie", + "person": "Personen", + "scene": "Scènes", + "script": "Scripts", + "server_control": "Server Controls", + "tags": "Tags", + "users": "Gebruikers", + "zone": "Zones" + }, "reload": { "automation": "Herlaad automatiseringen", "command_line": "Herlaad commandline entiteiten", @@ -1736,8 +1758,11 @@ "can_reach_cert_server": "Bereik de certificaatserver", "can_reach_cloud": "Bereik Home Assistant Cloud", "can_reach_cloud_auth": "Bereik authenticatieserver", + "google_enabled": "Google ingeschakeld", + "logged_in": "Ingelogd", "remote_connected": "Op afstand verbonden", - "remote_enabled": "Op afstand ingeschakeld" + "remote_enabled": "Op afstand ingeschakeld", + "subscription_expiration": "Abonnement vervalt" }, "homeassistant": { "arch": "CPU-architectuur", @@ -1751,6 +1776,11 @@ "timezone": "Tijdzone", "version": "Versie", "virtualenv": "Virtuele omgeving" + }, + "lovelace": { + "dashboards": "Dashboards", + "mode": "Mode", + "resources": "Bronnen" } }, "manage": "Beheer", @@ -2173,6 +2203,8 @@ }, "picker": { "add_script": "Voeg script toe", + "duplicate": "Dupliceer", + "duplicate_script": "Script dupliceren", "edit_script": "Bewerk script", "header": "Script Editor", "headers": { @@ -2209,7 +2241,7 @@ "input_text": "Herlaad input texts", "introduction": "Sommige delen van Home Assistant kunnen opnieuw worden geladen zonder dat een herstart vereist is. Als je herladen gebruikt, wordt de huidige configuratie leeggemaakt en wordt de nieuwe geladen.", "min_max": "Herlaad min/max entiteiten", - "mqtt": "Herlaad handmatig geconfigureerde mqtt-entiteiten", + "mqtt": "Herlaad handmatig geconfigureerde MQTT-entiteiten", "person": "Herlaad personen", "ping": "Herlaad ping binaire sensor entiteiten", "reload": "Herlaad {domain}", @@ -2217,7 +2249,7 @@ "rpi_gpio": "Herlaad Raspberry Pi GPIO-entiteiten", "scene": "Herlaad scenes", "script": "Herlaad scripts", - "smtp": "Herlaad smtp notify services", + "smtp": "Laad de SMTP-meldingsservices opnieuw", "statistics": "Herlaad statistische entiteiten", "telegram": "Herlaad telegram notify services", "template": "Herlaad template entiteiten", @@ -2307,6 +2339,7 @@ "update_user": "Bijwerken" }, "picker": { + "add_user": "Voeg gebruiker toe", "headers": { "group": "Groep", "name": "Naam", @@ -2587,6 +2620,8 @@ "filter_attributes": "Filter attributen", "filter_entities": "Filter entiteiten", "filter_states": "Filter toestanden", + "last_changed": "Laatst gewijzigd", + "last_updated": "Laatst bijgewerkt", "more_info": "Meer informatie", "no_entities": "Geen entiteiten", "set_state": "Definieer toestand", @@ -2838,6 +2873,10 @@ "description": "Met de Light-kaart kunt u de helderheid van het licht wijzigen.", "name": "Lamp" }, + "logbook": { + "description": "De Logboekkaart toont een lijst met gebeurtenissen voor entiteiten.", + "name": "Logboek" + }, "map": { "dark_mode": "Donkere modus?", "default_zoom": "Standaard zoom", @@ -2910,11 +2949,18 @@ "entity": "Entiteit", "no_description": "Er is geen beschrijving beschikbaar" }, + "common": { + "add": "Toevoegen", + "clear": "Wis", + "edit": "Bewerk", + "none": "Geen" + }, "edit_badges": { "panel_mode": "Deze badges worden niet weergegeven omdat deze weergave zich in de \"Paneelmodus\" bevindt." }, "edit_card": { "add": "Kaart toevoegen", + "clear": "Wis", "confirm_cancel": "Weet u zeker dat u wilt afbreken?", "delete": "Verwijder kaart", "duplicate": "Dupliceer kaart", @@ -2956,11 +3002,16 @@ }, "header": "Bewerk UI", "header-footer": { + "choose_header_footer": "Kies een {type}", + "footer": "Voettekst", "header": "Header", "types": { "buttons": { "name": "Knoppen" }, + "graph": { + "name": "Grafiek" + }, "picture": { "name": "Afbeelding" } diff --git a/translations/frontend/pl.json b/translations/frontend/pl.json index b81d329d18..aa2c646c80 100644 --- a/translations/frontend/pl.json +++ b/translations/frontend/pl.json @@ -872,6 +872,28 @@ }, "quick-bar": { "commands": { + "navigation": { + "areas": "Obszary", + "automation": "Automatyzacje", + "core": "Ogólne", + "customize": "Dostosowywanie", + "devices": "Urządzenia", + "entities": "Rejestr encji", + "helpers": "Pomocnicy", + "info": "Informacje", + "integrations": "Integracje", + "logs": "Logi", + "lovelace": "Dashboardy", + "navigate_to": "Przejdź do: {panel}", + "navigate_to_config": "Przejdź do: Konfiguracja > {panel}", + "person": "Osoby", + "scene": "Sceny", + "script": "Skrypty", + "server_control": "Kontrola serwera", + "tags": "Tagi", + "users": "Użytkownicy", + "zone": "Strefy" + }, "reload": { "automation": "Automatyzacje", "command_line": "Encje komponentu linia komend", @@ -1743,11 +1765,14 @@ "can_reach_cloud_auth": "Dostęp do serwera uwierzytelniania", "google_enabled": "Asystent Google włączony", "logged_in": "Zalogowany", + "relayer_connected": "Relayer podłączony", + "remote_connected": "Zdalny dostęp podłączony", + "remote_enabled": "Zdalny dostęp włączony", "subscription_expiration": "Wygaśnięcie subskrypcji" }, "homeassistant": { "arch": "Architektura procesora", - "dev": "Rozwój", + "dev": "Wersja rozwojowa", "docker": "Docker", "hassio": "HassOS", "installation_type": "Typ instalacji", @@ -1764,7 +1789,7 @@ "resources": "Zasoby" } }, - "manage": "Zarządzanie", + "manage": "Zarządzaj", "more_info": "więcej info" }, "title": "Informacje" @@ -2320,6 +2345,7 @@ "update_user": "Aktualizuj" }, "picker": { + "add_user": "Dodaj użytkownika", "headers": { "group": "Grupa", "name": "Nazwa", @@ -2600,6 +2626,8 @@ "filter_attributes": "filtr atrybutów", "filter_entities": "Filtr encji", "filter_states": "Filtr stanów", + "last_changed": "Ostatnia zmiana", + "last_updated": "Ostatnio zaktualizowano", "more_info": "Więcej informacji", "no_entities": "Brak encji", "set_state": "Ustaw stan", @@ -2717,7 +2745,7 @@ }, "calendar": { "calendar_entities": "Encje kalendarza", - "description": "Karta kalendarza wyświetla kalendarz zawierający widoki dnia, tygodnia i listy", + "description": "Karta kalendarza wyświetla kalendarz zawierający widoki dnia, tygodnia i listy.", "inital_view": "Widok początkowy", "name": "Kalendarz", "views": { @@ -2851,6 +2879,10 @@ "description": "Karta światło pozwala zmienić jasność światła.", "name": "Światło" }, + "logbook": { + "description": "Karta dziennika pokazuje listę zdarzeń dla encji.", + "name": "Dziennik" + }, "map": { "dark_mode": "Tryb ciemny", "default_zoom": "Domyślne powiększenie", diff --git a/translations/frontend/ru.json b/translations/frontend/ru.json index 770b463a5c..e2aed7ad48 100644 --- a/translations/frontend/ru.json +++ b/translations/frontend/ru.json @@ -867,6 +867,28 @@ }, "quick-bar": { "commands": { + "navigation": { + "areas": "Помещения", + "automation": "Автоматизация", + "core": "Общие", + "customize": "Кастомизация", + "devices": "Устройства", + "entities": "Объекты", + "helpers": "Вспомогательное", + "info": "О системе", + "integrations": "Интеграции", + "logs": "Журнал сервера", + "lovelace": "Панели Lovelace", + "navigate_to": "Открыть \"{panel}\"", + "navigate_to_config": "Перейти в раздел \"{panel}\"", + "person": "Люди", + "scene": "Сцены", + "script": "Сценарии", + "server_control": "Сервер", + "tags": "Метки", + "users": "Пользователи", + "zone": "Зоны" + }, "reload": { "automation": "Перезагрузить автоматизации", "command_line": "Перезагрузить объекты интеграции \"Command Line\"", @@ -1636,12 +1658,12 @@ "disable_selected": { "button": "Скрыть выбранные", "confirm_text": "Скрытые объекты не будут доступны в Home Assistant.", - "confirm_title": "Вы уверены, что хотите скрыть {number} выбранных объектов?" + "confirm_title": "Вы уверены, что хотите скрыть {number} {number, plural,\n one {выбранный объект}\n other {выбранных объектов}\n}?" }, "enable_selected": { "button": "Отображать выбранные", "confirm_text": "Если эти объекты ранее были скрыты, они снова будут отображаться в Home Assistant.", - "confirm_title": "Отображать {number} выбранных объектов?" + "confirm_title": "Отображать {number} {number, plural,\n one {выбранный объект}\n other {выбранных объектов}\n}?" }, "filter": { "filter": "Фильтр", @@ -1663,9 +1685,9 @@ "remove_selected": { "button": "Удалить выбранные", "confirm_partly_text": "Вы можете удалить только {removable} из выбранных {selected} объектов. Объекты могут быть удалены только когда интеграция больше не предоставляет объекты. В некоторых случаях Вам нужно будет перезапустить Home Assistant, чтобы удалить объекты удаленной интеграции. Вы уверены, что хотите удалить объекты?", - "confirm_partly_title": "Только {number} выбранных объектов могут быть удалены.", + "confirm_partly_title": "Только {number} {number, plural,\n one {выбранный объект}\n other {выбранных объектов}\n} могут быть удалены.", "confirm_text": "Вы должны удалить эти объекты из конфигурации Lovelace и из правил автоматизации.", - "confirm_title": "Вы уверены, что хотите удалить выбранные объекты? ({number})" + "confirm_title": "Вы уверены, что хотите удалить {number} {number, plural,\n one {выбранный объект}\n other {выбранных объектов}\n}?" }, "search": "Поиск объектов", "selected": "Выбрано: {number}", @@ -2312,6 +2334,7 @@ "update_user": "Обновить" }, "picker": { + "add_user": "Добавить пользователя", "headers": { "group": "Группа", "name": "Имя", @@ -2592,6 +2615,8 @@ "filter_attributes": "Поиск", "filter_entities": "Поиск", "filter_states": "Поиск", + "last_changed": "Последнее изменение", + "last_updated": "Последнее обновление", "more_info": "Подробнее", "no_entities": "Не найдено", "set_state": "Задать состояние", @@ -2843,6 +2868,10 @@ "description": "Позволяет контролировать источник света, изменять яркость.", "name": "Освещение" }, + "logbook": { + "description": "Отображает список событий для объектов.", + "name": "Журнал событий" + }, "map": { "dark_mode": "Тёмная тема", "default_zoom": "Масштаб по умолчанию", From b9f802939c7512ea1bc813ed12c0205d66cdad32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Fri, 13 Nov 2020 18:20:24 +0100 Subject: [PATCH 05/90] Add a github option when copying from system health (#7663) Co-authored-by: Bram Kragten --- src/panels/config/info/system-health-card.ts | 77 +++++++++++++------- src/translations/en.json | 2 + 2 files changed, 52 insertions(+), 27 deletions(-) diff --git a/src/panels/config/info/system-health-card.ts b/src/panels/config/info/system-health-card.ts index 765725b133..95947cce0d 100644 --- a/src/panels/config/info/system-health-card.ts +++ b/src/panels/config/info/system-health-card.ts @@ -1,7 +1,9 @@ import "@material/mwc-button/mwc-button"; import "@material/mwc-icon-button"; -import "../../../components/ha-circular-progress"; +import { ActionDetail } from "@material/mwc-list/mwc-list-foundation"; +import "@material/mwc-list/mwc-list-item"; import { mdiContentCopy } from "@mdi/js"; +import "@polymer/paper-tooltip/paper-tooltip"; import { css, CSSResult, @@ -9,21 +11,22 @@ import { internalProperty, LitElement, property, - query, TemplateResult, } from "lit-element"; +import { formatDateTime } from "../../../common/datetime/format_date_time"; +import { copyToClipboard } from "../../../common/util/copy-clipboard"; +import "../../../components/ha-button-menu"; import "../../../components/ha-card"; -import "@polymer/paper-tooltip/paper-tooltip"; -import type { PaperTooltipElement } from "@polymer/paper-tooltip/paper-tooltip"; +import "../../../components/ha-circular-progress"; +import "../../../components/ha-svg-icon"; import { domainToName } from "../../../data/integration"; import { subscribeSystemHealthInfo, - SystemHealthInfo, SystemCheckValueObject, + SystemHealthInfo, } from "../../../data/system_health"; import { HomeAssistant } from "../../../types"; -import { formatDateTime } from "../../../common/datetime/format_date_time"; -import { copyToClipboard } from "../../../common/util/copy-clipboard"; +import { showToast } from "../../../util/toast"; const sortKeys = (a: string, b: string) => { if (a === "homeassistant") { @@ -46,8 +49,6 @@ class SystemHealthCard extends LitElement { @internalProperty() private _info?: SystemHealthInfo; - @query("paper-tooltip", true) private _toolTip?: PaperTooltipElement; - protected render(): TemplateResult { if (!this.hass) { return html``; @@ -152,18 +153,21 @@ class SystemHealthCard extends LitElement {
${domainToName(this.hass.localize, "system_health")}
- - - - - ${this.hass.localize("ui.common.copied")} - + + + + + ${this.hass.localize("ui.panel.config.info.copy_raw")} + + + ${this.hass.localize("ui.panel.config.info.copy_github")} + +
${sections}
@@ -193,13 +197,24 @@ class SystemHealthCard extends LitElement { }); } - private _copyInfo(): void { + private _copyInfo(ev: CustomEvent): void { + const github = ev.detail.index === 1; let haContent: string | undefined; const domainParts: string[] = []; for (const domain of Object.keys(this._info!).sort(sortKeys)) { const domainInfo = this._info![domain]; - const parts = [`${domainToName(this.hass.localize, domain)}\n`]; + let first = true; + const parts = [ + `${ + github && domain !== "homeassistant" + ? `
${domainToName( + this.hass.localize, + domain + )}\n` + : "" + }`, + ]; for (const key of Object.keys(domainInfo.info)) { let value: unknown; @@ -217,23 +232,31 @@ class SystemHealthCard extends LitElement { } else { value = domainInfo.info[key]; } - - parts.push(`${key}: ${value}`); + if (github && first) { + parts.push(`${key} | ${value}\n-- | --`); + first = false; + } else { + parts.push(`${key}${github ? " | " : ": "}${value}`); + } } if (domain === "homeassistant") { haContent = parts.join("\n"); } else { domainParts.push(parts.join("\n")); + if (github && domain !== "homeassistant") { + domainParts.push("
"); + } } } copyToClipboard( - `System Health\n\n${haContent}\n\n${domainParts.join("\n\n")}` + `${github ? "## " : ""}System Health\n${haContent}\n\n${domainParts.join( + "\n\n" + )}` ); - this._toolTip!.show(); - setTimeout(() => this._toolTip?.hide(), 3000); + showToast(this, { message: this.hass.localize("ui.common.copied") }); } static get styles(): CSSResult { diff --git a/src/translations/en.json b/src/translations/en.json index c31db303c6..ff7739e88a 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -899,6 +899,8 @@ }, "info": { "caption": "Info", + "copy_raw": "Raw Text", + "copy_github": "For GitHub", "description": "View info about your Home Assistant installation", "home_assistant_logo": "Home Assistant logo", "path_configuration": "Path to configuration.yaml: {path}", From b6881d797cc376a0dbf12a54ac961e4c450f0c70 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Sat, 14 Nov 2020 00:32:35 +0000 Subject: [PATCH 06/90] [ci skip] Translation update --- translations/frontend/ca.json | 2 + translations/frontend/cs.json | 2 + translations/frontend/de.json | 47 ++++++++++++++++++---- translations/frontend/en.json | 2 + translations/frontend/es.json | 2 + translations/frontend/et.json | 2 + translations/frontend/it.json | 10 ++--- translations/frontend/ja.json | 63 +++++++++++++++++++++++++++++- translations/frontend/nb.json | 2 + translations/frontend/nl.json | 28 ++++++++----- translations/frontend/pl.json | 4 +- translations/frontend/zh-Hans.json | 43 ++++++++++++++++++-- translations/frontend/zh-Hant.json | 31 +++++++++++++++ 13 files changed, 210 insertions(+), 28 deletions(-) diff --git a/translations/frontend/ca.json b/translations/frontend/ca.json index 84a672c3ca..b9c1c7de59 100644 --- a/translations/frontend/ca.json +++ b/translations/frontend/ca.json @@ -805,7 +805,9 @@ "more_info_control": { "controls": "Controls", "cover": { + "close_cover": "Tanca la coberta", "close_tile_cover": "Inclinació de la coberta tancada", + "open_cover": "Obre la coberta", "open_tilt_cover": "Inclinació de la coberta oberta", "stop_cover": "Atura el moviment de la coberta" }, diff --git a/translations/frontend/cs.json b/translations/frontend/cs.json index 74dafefe48..13d1601cf8 100644 --- a/translations/frontend/cs.json +++ b/translations/frontend/cs.json @@ -805,7 +805,9 @@ "more_info_control": { "controls": "Ovládací prvky", "cover": { + "close_cover": "Zavřít", "close_tile_cover": "Snížit náklon", + "open_cover": "Otevřít", "open_tilt_cover": "Zvýšit náklon", "stop_cover": "Zastavit pohyb" }, diff --git a/translations/frontend/de.json b/translations/frontend/de.json index 4af912b410..6c5148bb5e 100644 --- a/translations/frontend/de.json +++ b/translations/frontend/de.json @@ -804,6 +804,10 @@ }, "more_info_control": { "controls": "Steuerelemente", + "cover": { + "close_cover": "Abdeckung schließen", + "open_cover": "Abdeckung öffnen" + }, "details": "Details", "dismiss": "Dialog ausblenden", "edit": "Entität bearbeiten", @@ -867,6 +871,26 @@ }, "quick-bar": { "commands": { + "navigation": { + "automation": "Automatisierungen", + "core": "Allgemein", + "customize": "Anpassungen", + "devices": "Geräte", + "entities": "Entitäten", + "helpers": "Helfer", + "info": "Info", + "integrations": "Integrationen", + "logs": "Logs", + "navigate_to": "Navigiere zu {panel}", + "navigate_to_config": "Navigiere zur {panel} Konfiguration", + "person": "Personen", + "scene": "Szenen", + "script": "Skripte", + "server_control": "Serversteuerung", + "tags": "Tags", + "users": "Benutzer", + "zone": "Zonen" + }, "reload": { "automation": "Automationen neu laden", "command_line": "Komandozeilen Entätien neu laden", @@ -1636,12 +1660,12 @@ "disable_selected": { "button": "Ausgewählte deaktivieren", "confirm_text": "Deaktivierte Entitäten werden zu Home Assistant nicht hinzugefügt.", - "confirm_title": "Möchtest du {number} Entitäten deaktivieren?" + "confirm_title": "Möchtest du {number} {number, plural,\n one {{entity}}\n other {{entities}}\n} deaktivieren?" }, "enable_selected": { "button": "Ausgewählte aktivieren", "confirm_text": "Dadurch stehen sie in Home Assistant wieder zur Verfügung, wenn sie jetzt deaktiviert sind.", - "confirm_title": "Möchtest du {number} Entitäten aktivieren?" + "confirm_title": "Möchtest du {number} {number, plural,\n one {{entity}}\n other {{entities}}\n} aktivieren?" }, "filter": { "filter": "Filter", @@ -1665,7 +1689,7 @@ "confirm_partly_text": "Du kannst nur {removable} der ausgewählten {selected} Entitäten entfernen. Entitäten können nur entfernt werden, wenn die Integration die Entitäten nicht mehr bereitstellt. Manchmal musst du Home Assistant neu starten, bevor du die Entitäten einer entfernten Integration entfernen kannst. Möchtest du die entfernbaren Entitäten wirklich entfernen?", "confirm_partly_title": "Es können nur {number} ausgewählte Objekte entfernt werden.", "confirm_text": "Du solltest sie aus deiner Lovelace-Konfiguration und deinen Automatisierungen entfernen, wenn sie diese Entitäten enthalten.", - "confirm_title": "Möchtest du {number} Entitäten entfernen?" + "confirm_title": "Möchtest du {number} {number, plural,\n one {{entity}}\n other {{entities}}\n} entfernen?" }, "search": "Entitäten suchen", "selected": "{number} ausgewählt", @@ -1733,6 +1757,9 @@ "checks": { "cloud": { "alexa_enabled": "Alexa aktiviert", + "can_reach_cert_server": "Zertifikatsserver erreichbar", + "can_reach_cloud": "Home Assistant Cloud erreichbar", + "can_reach_cloud_auth": "Authentifizierungsserver erreichbar", "google_enabled": "Google aktiviert", "logged_in": "Eingeloggt", "remote_connected": "Remote verbunden", @@ -2578,6 +2605,8 @@ "filter_attributes": "Attribute filtern", "filter_entities": "Entitäten filtern", "filter_states": "Zustände filtern", + "last_changed": "Letzte Änderung", + "last_updated": "Letzte Aktualisierung", "more_info": "Mehr Info", "no_entities": "Keine Entitäten", "set_state": "Status setzen", @@ -2676,7 +2705,7 @@ "navigate": "Navigieren", "none": "Keine Aktion", "toggle": "Umschalten", - "url": "Url" + "url": "URL" }, "editor_service_data": "Servicedaten können nur im Code-Editor eingegeben werden", "navigation_path": "Navigationspfad", @@ -2773,7 +2802,7 @@ "camera_image": "Kamera-Entität", "camera_view": "Kameraansicht", "double_tap_action": "Doppeltipp-Aktion", - "entities": "Ungenutzte Elemente", + "entities": "Entitäten", "entity": "Entität", "hold_action": "Halte-Aktion", "hours_to_show": "Stunden", @@ -2798,7 +2827,7 @@ "theme": "Aussehen", "title": "Titel", "unit": "Einheit", - "url": "Url" + "url": "URL" }, "glance": { "columns": "Spalten", @@ -2829,6 +2858,10 @@ "description": "Mit der Licht-Karte kannst du die Helligkeit des Lichts ändern.", "name": "Licht" }, + "logbook": { + "description": "Die Logbuchkarte zeigt eine Liste von Ereignissen für Entitäten.", + "name": "Logbuch" + }, "map": { "dark_mode": "Dunkler Modus?", "default_zoom": "Standard-Zoom", @@ -3027,7 +3060,7 @@ }, "view": { "panel_mode": { - "description": "Dadurch wird die erste Karte in voller Breite gerendert. Andere Karten in dieser Ansicht werden nicht gerendert.", + "description": "Dadurch wird die erste Karte in voller Breite angezeigt. Andere Karten und Marker in dieser Ansicht werden nicht angezeigt.", "title": "Panel-Modus?", "warning_multiple_cards": "Diese Ansicht enthält mehr als eine Karte, in einer Bedienfeldansicht kann jedoch nur eine Karte angezeigt werden." } diff --git a/translations/frontend/en.json b/translations/frontend/en.json index 2d7115aaad..d0563e02a2 100644 --- a/translations/frontend/en.json +++ b/translations/frontend/en.json @@ -1743,6 +1743,8 @@ "info": { "built_using": "Built using", "caption": "Info", + "copy_github": "For GitHub", + "copy_raw": "Raw Text", "custom_uis": "Custom UIs:", "description": "View info about your Home Assistant installation", "developed_by": "Developed by a bunch of awesome people.", diff --git a/translations/frontend/es.json b/translations/frontend/es.json index 9f5c765d81..b07470624d 100644 --- a/translations/frontend/es.json +++ b/translations/frontend/es.json @@ -805,7 +805,9 @@ "more_info_control": { "controls": "Controles", "cover": { + "close_cover": "Cerrar persiana", "close_tile_cover": "Cerrar la inclinación de la persiana", + "open_cover": "Abrir persiana", "open_tilt_cover": "Inclinación de la persiana abierta", "stop_cover": "Detener el movimiento de la persiana" }, diff --git a/translations/frontend/et.json b/translations/frontend/et.json index 478b712aa0..07a285f6ae 100644 --- a/translations/frontend/et.json +++ b/translations/frontend/et.json @@ -805,7 +805,9 @@ "more_info_control": { "controls": "Juhtelemendid", "cover": { + "close_cover": "Sulge kate", "close_tile_cover": "Sulge katte ribid", + "open_cover": "Ava kate", "open_tilt_cover": "Ava katte ribid", "stop_cover": "Peata katte liikumine" }, diff --git a/translations/frontend/it.json b/translations/frontend/it.json index 61794d0a44..64f9d601be 100644 --- a/translations/frontend/it.json +++ b/translations/frontend/it.json @@ -712,7 +712,7 @@ }, "dialogs": { "config_entry_system_options": { - "enable_new_entities_description": "Se disabilitato, le entità appena individuate per {integration} non verranno automaticamente aggiunte a Home Assistant.", + "enable_new_entities_description": "Se disabilitato, le entità appena rilevate per {integration} non verranno automaticamente aggiunte a Home Assistant.", "enable_new_entities_label": "Abilita nuove entità aggiunte.", "title": "Opzioni di sistema per {integration}", "update": "Aggiornamento" @@ -1828,13 +1828,13 @@ "configured": "Configurato", "description": "Gestisci le integrazioni", "details": "Dettagli dell'integrazione", - "discovered": "Scoperto", + "discovered": "Rilevato", "home_assistant_website": "Sito Web di Home Assistant", "ignore": { - "confirm_delete_ignore": "Questo farà apparire di nuovo l'integrazione nelle vostre integrazioni scoperte quando verrà scoperta. Questo potrebbe richiedere un riavvio o richiedere un po' di tempo.", + "confirm_delete_ignore": "Questo farà apparire di nuovo l'integrazione tra quelle rilevate quando verrà individuata. Questo potrebbe richiedere un riavvio o impiegare un po' di tempo.", "confirm_delete_ignore_title": "Smettere di ignorare {name}?", "confirm_ignore": "Sei sicuro di non voler configurare questa integrazione? È possibile annullare questa operazione facendo clic su 'Mostra integrazioni ignorate' nel menu di overflow in alto a destra.", - "confirm_ignore_title": "Ignorare l'individuazione di {name}?", + "confirm_ignore_title": "Ignorare a rilevazione di {name}?", "hide_ignored": "Nascondi integrazioni ignorate", "ignore": "Ignora", "ignored": "Ignorato", @@ -2333,7 +2333,7 @@ }, "zha": { "add_device_page": { - "discovered_text": "I dispositivi verranno visualizzati qui una volta scoperti.", + "discovered_text": "I dispositivi verranno visualizzati qui una volta rilevati.", "discovery_text": "I dispositivi rilevati verranno visualizzati qui. Seguire le istruzioni per il / i dispositivo / i e posizionare il / i dispositivo / i in modalità accoppiamento.", "header": "Zigbee Home Automation - Aggiungi dispositivi", "no_devices_found": "Nessun dispositivo trovato, assicurati che siano in modalità di associazione e tienili attivi mentre la scansione è in esecuzione.", diff --git a/translations/frontend/ja.json b/translations/frontend/ja.json index 808fef1328..4b2c061e08 100644 --- a/translations/frontend/ja.json +++ b/translations/frontend/ja.json @@ -497,6 +497,8 @@ "continue": "続行", "copied": "コピー", "delete": "削除", + "disable": "無効", + "enable": "有効", "error_required": "必須", "leave": "離れる", "loading": "読込中", @@ -507,7 +509,10 @@ "overflow_menu": "オーバーフローメニュー", "previous": "前", "refresh": "更新", + "remove": "削除", + "rename": "リネーム", "save": "保存", + "skip": "スキップ", "stay": "滞在", "successfully_deleted": "正常に削除されました", "successfully_saved": "正常に保存されました", @@ -786,7 +791,9 @@ "more_info_control": { "controls": "コントロール", "cover": { + "close_cover": "カバーを閉じる", "close_tile_cover": "カバーの傾きを閉じる", + "open_cover": "カバーを開く", "open_tilt_cover": "オープンカバーの傾き", "stop_cover": "カバーの動きを止めます" }, @@ -853,6 +860,28 @@ }, "quick-bar": { "commands": { + "navigation": { + "areas": "エリア", + "automation": "オートメーション", + "core": "一般", + "customize": "カスタマイズ", + "devices": "デバイス", + "entities": "エンティティ", + "helpers": "ヘルパー", + "info": "詳細", + "integrations": "インテグレーション", + "logs": "ログ", + "lovelace": "Lovelaceダッシュボード", + "navigate_to": "{panel}に移動します", + "navigate_to_config": "{panel}構成に移動します", + "person": "人々", + "scene": "シーン", + "script": "スクリプト", + "server_control": "サーバーコントロール", + "tags": "タグ", + "users": "ユーザー", + "zone": "場所" + }, "reload": { "automation": "オートメーションの再読込", "command_line": "コマンドラインエンティティをリロードする", @@ -1307,6 +1336,22 @@ "only_editable": "automations.yaml で定義されたオートメーションのみが編集可能です。", "pick_automation": "編集するオートメーションを選択", "show_info_automation": "オートメーションに関する情報を表示" + }, + "thingtalk": { + "create": "オートメーションを作成", + "link_devices": { + "ambiguous_entities": "1 つ以上のデバイスに複数の一致するエンティティがあります。", + "header": "すごい!今、我々はいくつかのデバイスをリンクする必要があります", + "unknown_placeholder": "不明なプレースホルダ" + }, + "task_selection": { + "error_empty": "コマンドを入力するか、スキップをタップします。", + "error_unsupported": "私たちは自動化を作成できませんでした(まだ?", + "for_example": "例えば:", + "header": "新しいオートメーションを作成する", + "introduction": "このオートメーションの実行内容の下に入力すると、ホーム アシスタントのオートメーションに変換されます。", + "language_note": "注: 現在は英語のみがサポートされています。" + } } }, "cloud": { @@ -2288,6 +2333,7 @@ "update_user": "更新" }, "picker": { + "add_user": "ユーザーを追加する", "headers": { "group": "グループ", "name": "名前", @@ -2568,6 +2614,8 @@ "filter_attributes": "フィルター属性", "filter_entities": "エンティティのフィルター処理", "filter_states": "状態のフィルター処理", + "last_changed": "最終変更", + "last_updated": "最終更新", "more_info": "もっと見る", "no_entities": "エンティティなし", "set_state": "状態を設定", @@ -2795,6 +2843,10 @@ "description": "Glance カードは、複数のセンサーをコンパクトな概要でグループ化するのに便利です。", "name": "一覧" }, + "grid": { + "description": "グリッド カードを使用すると、グリッドに複数のカードを表示できます。", + "name": "グリッド" + }, "history-graph": { "description": "履歴グラフ カードを使用すると、一覧表示された各エンティティのグラフを表示できます。", "name": "履歴グラフ" @@ -2815,6 +2867,10 @@ "description": "ライトカードを使用すると、ライトの明るさを変更できます。", "name": "照明" }, + "logbook": { + "description": "ログブックカードには、エンティティのイベントの一覧が表示されます。", + "name": "ログブック" + }, "map": { "dark_mode": "ダークモード?", "default_zoom": "デフォルトのズーム", @@ -3002,7 +3058,8 @@ "sub-element-editor": { "types": { "footer": "フッタ エディタ", - "header": "ヘッダーエディター" + "header": "ヘッダーエディター", + "row": "エンティティエディタ" } }, "suggest_card": { @@ -3271,6 +3328,7 @@ "header": "ダッシュボード" }, "enable_shortcuts": { + "description": "UI でさまざまな操作を実行するためのキーボード ショートカットを有効または無効にします。", "header": "キーボード ショートカット" }, "force_narrow": { @@ -3362,6 +3420,9 @@ "header": "バイブレーション機能" } }, + "shopping_list": { + "start_conversation": "会話を開始する" + }, "shopping-list": { "add_item": "アイテムを追加", "clear_completed": "完了したアイテムを削除", diff --git a/translations/frontend/nb.json b/translations/frontend/nb.json index e388107db0..421783b379 100644 --- a/translations/frontend/nb.json +++ b/translations/frontend/nb.json @@ -805,7 +805,9 @@ "more_info_control": { "controls": "Kontroller", "cover": { + "close_cover": "Lukk dekselet", "close_tile_cover": "Lukk dekkevinkel", + "open_cover": "Åpne dekselet", "open_tilt_cover": "Åpne dekkevinkel", "stop_cover": "Stopp dekke fra å bevege seg" }, diff --git a/translations/frontend/nl.json b/translations/frontend/nl.json index d7d4175114..1b5d93f69c 100644 --- a/translations/frontend/nl.json +++ b/translations/frontend/nl.json @@ -588,7 +588,7 @@ "cleared_device_class": "niets gedetecteerd (geen {device_class} gedetecteerd)", "detected_device_class": "gedetecteerd {device_class}", "rose": "opkomst", - "set": "stel in", + "set": "ondergang", "turned_off": "is uitgeschakeld", "turned_on": "is ingeschakeld", "was_at_home": "was thuis", @@ -804,6 +804,13 @@ }, "more_info_control": { "controls": "Besturing", + "cover": { + "close_cover": "Sluit zonnewering", + "close_tile_cover": "Sluit klep", + "open_cover": "Open zonnewering", + "open_tilt_cover": "Open klep", + "stop_cover": "Stop beweging van zonnewering" + }, "details": "Details", "dismiss": "Dialoogvenster sluiten", "edit": "Entiteit bewerken", @@ -984,7 +991,7 @@ "notification_drawer": { "click_to_configure": "Klik op de knop om {entity} te configureren", "close": "Sluiten", - "dismiss_all": "Alles afkeuren", + "dismiss_all": "Alles verbergen", "empty": "Geen notificaties", "title": "Notificaties" }, @@ -1345,7 +1352,7 @@ "show_info_automation": "Informatie weergeven over automatisering" }, "thingtalk": { - "create": "Creëer automatisering", + "create": "Automatisering maken", "link_devices": { "ambiguous_entities": "Een of meer apparaten hebben meer dan één overeenkomende entiteit. Kies het apparaat dat u wilt gebruiken.", "header": "Geweldig! Nu moeten we enkele apparaten koppelen", @@ -1355,7 +1362,7 @@ "error_empty": "Voer een commando in of druk op overslaan.", "error_unsupported": "Daar konden we (nog) geen automatisering voor maken.", "for_example": "Bijvoorbeeld:", - "header": "Creëer een nieuwe automatisering", + "header": "Een nieuwe automatisering maken", "introduction": "Typ hieronder wat deze automatisering zou moeten doen, en we zullen proberen om het om te zetten in een Home Assistant automatisering.", "language_note": "Opmerking: voorlopig wordt alleen Engels ondersteund." } @@ -1755,11 +1762,12 @@ "checks": { "cloud": { "alexa_enabled": "Alexa ingeschakeld", - "can_reach_cert_server": "Bereik de certificaatserver", + "can_reach_cert_server": "Bereik de certificaat server", "can_reach_cloud": "Bereik Home Assistant Cloud", "can_reach_cloud_auth": "Bereik authenticatieserver", "google_enabled": "Google ingeschakeld", "logged_in": "Ingelogd", + "relayer_connected": "Relayer verbonden", "remote_connected": "Op afstand verbonden", "remote_enabled": "Op afstand ingeschakeld", "subscription_expiration": "Abonnement vervalt" @@ -2339,7 +2347,7 @@ "update_user": "Bijwerken" }, "picker": { - "add_user": "Voeg gebruiker toe", + "add_user": "Gebruiker toevoegen", "headers": { "group": "Groep", "name": "Naam", @@ -2960,7 +2968,7 @@ }, "edit_card": { "add": "Kaart toevoegen", - "clear": "Wis", + "clear": "Leegmaken", "confirm_cancel": "Weet u zeker dat u wilt afbreken?", "delete": "Verwijder kaart", "duplicate": "Dupliceer kaart", @@ -3004,7 +3012,7 @@ "header-footer": { "choose_header_footer": "Kies een {type}", "footer": "Voettekst", - "header": "Header", + "header": "Koptekst", "types": { "buttons": { "name": "Knoppen" @@ -3064,7 +3072,7 @@ "sub-element-editor": { "types": { "footer": "Voettekst Editor", - "header": "Header Editor", + "header": "Koptekst Editor", "row": "Entiteitsrij Editor" } }, @@ -3382,7 +3390,7 @@ }, "push_notifications": { "add_device_prompt": { - "input_label": "Apparaatnaam", + "input_label": "Naam van het apparaat", "title": "Hoe moet dit apparaat genoemd worden?" }, "description": "Verstuur meldingen naar dit apparaat.", diff --git a/translations/frontend/pl.json b/translations/frontend/pl.json index aa2c646c80..611856ac66 100644 --- a/translations/frontend/pl.json +++ b/translations/frontend/pl.json @@ -805,7 +805,9 @@ "more_info_control": { "controls": "Sterowanie", "cover": { + "close_cover": "Zamknij roletę", "close_tile_cover": "Przechylenie zamkniętej rolety", + "open_cover": "Otwórz roletę", "open_tilt_cover": "Przechylenie otwartej rolety", "stop_cover": "Wstrzymanie rolety" }, @@ -1772,7 +1774,7 @@ }, "homeassistant": { "arch": "Architektura procesora", - "dev": "Wersja rozwojowa", + "dev": "Wersja deweloperska", "docker": "Docker", "hassio": "HassOS", "installation_type": "Typ instalacji", diff --git a/translations/frontend/zh-Hans.json b/translations/frontend/zh-Hans.json index 4ff7ddab2e..c64c51f43b 100644 --- a/translations/frontend/zh-Hans.json +++ b/translations/frontend/zh-Hans.json @@ -804,6 +804,10 @@ }, "more_info_control": { "controls": "控制项", + "cover": { + "close_cover": "关闭卷帘", + "open_cover": "打开卷帘" + }, "details": "详情", "dismiss": "关闭对话框", "edit": "编辑实体", @@ -867,6 +871,28 @@ }, "quick-bar": { "commands": { + "navigation": { + "areas": "区域注册表", + "automation": "自动化", + "core": "通用", + "customize": "自定义", + "devices": "设备", + "entities": "实体注册表", + "helpers": "辅助元素", + "info": "信息", + "integrations": "集成", + "logs": "日志", + "lovelace": "Lovelace 仪表盘", + "navigate_to": "导航到{panel}", + "navigate_to_config": "导航到{panel}配置", + "person": "人员", + "scene": "场景", + "script": "脚本", + "server_control": "服务控制", + "tags": "标签", + "users": "用户", + "zone": "地点" + }, "reload": { "automation": "重载自动化", "command_line": "重载命令行实体", @@ -884,7 +910,7 @@ "input_select": "重载多项选择器", "input_text": "重载文字输入", "min_max": "重载最小值/最大值实体", - "mqtt": "重载手动配置的 mqtt 实体", + "mqtt": "重载手动配置的 MQTT 实体", "person": "重载人员", "ping": "重载 ping 二元传感器实体", "reload": "重载{domain}", @@ -892,7 +918,7 @@ "rpi_gpio": "重载树莓派 GPIO 实体", "scene": "重载场景", "script": "重载脚本", - "smtp": "重载 smtp 通知服务", + "smtp": "重载 SMTP 通知服务", "statistics": "重载 statistics 实体", "telegram": "重载 telegram 通知服务", "template": "重载模板实体", @@ -2182,6 +2208,8 @@ }, "picker": { "add_script": "添加脚本", + "duplicate": "制作副本", + "duplicate_script": "复制脚本", "edit_script": "编辑脚本", "header": "脚本编辑器", "headers": { @@ -2218,7 +2246,7 @@ "input_text": "重载文字输入", "introduction": "Home Assistant 中的部分配置可以直接重载,而无需重启服务。点击重载按钮将重新载入新的配置。", "min_max": "重载最小值/最大值实体", - "mqtt": "重载手动配置的 mqtt 实体", + "mqtt": "重载手动配置的 MQTT 实体", "person": "重载人员", "ping": "重载 ping 二元传感器实体", "reload": "重载{domain}", @@ -2226,7 +2254,7 @@ "rpi_gpio": "重载树莓派 GPIO 实体", "scene": "重载场景", "script": "重载脚本", - "smtp": "重载 smtp 通知服务", + "smtp": "重载 SMTP 通知服务", "statistics": "重载 statistics 实体", "telegram": "重载 telegram 通知服务", "template": "重载模板实体", @@ -2316,6 +2344,7 @@ "update_user": "更新" }, "picker": { + "add_user": "添加用户", "headers": { "group": "群组", "name": "名称", @@ -2596,6 +2625,8 @@ "filter_attributes": "输入筛选属性", "filter_entities": "输入筛选实体", "filter_states": "输入筛选状态", + "last_changed": "上次变化", + "last_updated": "上次更新", "more_info": "更多信息", "no_entities": "没有可用实体", "set_state": "设置状态", @@ -2847,6 +2878,10 @@ "description": "“灯光”卡片用于调整灯的亮度。", "name": "灯光" }, + "logbook": { + "description": "“日志”卡片可显示实体的事件列表。", + "name": "日志" + }, "map": { "dark_mode": "夜间模式?", "default_zoom": "默认缩放", diff --git a/translations/frontend/zh-Hant.json b/translations/frontend/zh-Hant.json index d5f8fb2e02..d3c266f494 100644 --- a/translations/frontend/zh-Hant.json +++ b/translations/frontend/zh-Hant.json @@ -805,7 +805,9 @@ "more_info_control": { "controls": "控制", "cover": { + "close_cover": "關閉窗簾", "close_tile_cover": "開啟窗簾", + "open_cover": "開啟窗簾", "open_tilt_cover": "開啟窗簾", "stop_cover": "停止窗簾" }, @@ -872,6 +874,28 @@ }, "quick-bar": { "commands": { + "navigation": { + "areas": "分區", + "automation": "自動化", + "core": "一般設定", + "customize": "自訂化", + "devices": "設備", + "entities": "實體", + "helpers": "助手", + "info": "更多資訊", + "integrations": "整合", + "logs": "記錄", + "lovelace": "Lovelace 主面板", + "navigate_to": "導航至 {panel}", + "navigate_to_config": "導航至 {panel} 設定", + "person": "人員", + "scene": "場景", + "script": "腳本", + "server_control": "伺服器控制", + "tags": "標籤", + "users": "用戶", + "zone": "區域" + }, "reload": { "automation": "重新載入自動化", "command_line": "重新載入命令列實體", @@ -2323,6 +2347,7 @@ "update_user": "更新" }, "picker": { + "add_user": "新增用戶", "headers": { "group": "群組", "name": "名稱", @@ -2603,6 +2628,8 @@ "filter_attributes": "屬性過濾器", "filter_entities": "實體過濾器", "filter_states": "狀態過濾器", + "last_changed": "上次變更", + "last_updated": "最後更新", "more_info": "更多資訊", "no_entities": "無實體", "set_state": "設定狀態", @@ -2854,6 +2881,10 @@ "description": "燈光面板可供變更燈光的亮度與開關。", "name": "燈光面板" }, + "logbook": { + "description": "日誌面板顯示實體事件列表。", + "name": "日誌面板" + }, "map": { "dark_mode": "深色模式?", "default_zoom": "預設大小", From d3c51d7acdff449ebd33b3d4cdb5fa254c8a2f02 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Sun, 15 Nov 2020 00:32:20 +0000 Subject: [PATCH 07/90] [ci skip] Translation update --- translations/frontend/ca.json | 2 ++ translations/frontend/cs.json | 32 ++++++++++++++------------ translations/frontend/de.json | 8 +++++-- translations/frontend/es.json | 2 ++ translations/frontend/et.json | 2 ++ translations/frontend/hu.json | 1 + translations/frontend/it.json | 37 ++++++++++++++++++++++++++++-- translations/frontend/ru.json | 4 +++- translations/frontend/zh-Hans.json | 2 ++ 9 files changed, 70 insertions(+), 20 deletions(-) diff --git a/translations/frontend/ca.json b/translations/frontend/ca.json index b9c1c7de59..dd5366533a 100644 --- a/translations/frontend/ca.json +++ b/translations/frontend/ca.json @@ -1743,6 +1743,8 @@ "info": { "built_using": "Creat utilitzant", "caption": "Informació", + "copy_github": "Per GitHub", + "copy_raw": "Text en brut", "custom_uis": "Interfícies d'usuari personalitzades:", "description": "Consulta informació de la teva instal·lació de Home Assistant", "developed_by": "Desenvolupat per un munt de gent fantàstica.", diff --git a/translations/frontend/cs.json b/translations/frontend/cs.json index 13d1601cf8..b8c72d0336 100644 --- a/translations/frontend/cs.json +++ b/translations/frontend/cs.json @@ -892,7 +892,7 @@ "scene": "Scény", "script": "Skripty", "server_control": "Ovládání serveru", - "tags": "Značky", + "tags": "Štítky", "users": "Uživatelé", "zone": "Zóny" }, @@ -1298,7 +1298,7 @@ "sunset": "Západ slunce" }, "tag": { - "label": "Značka" + "label": "Štítek" }, "template": { "label": "Šablona", @@ -1743,6 +1743,8 @@ "info": { "built_using": "Sestaveno pomocí", "caption": "Informace", + "copy_github": "Pro GitHub", + "copy_raw": "Nezpracovaný text", "custom_uis": "Vlastní uživatelská rozhraní:", "description": "Informace o instalaci Home Assistant", "developed_by": "Vyvinuto partou úžasných lidí.", @@ -2283,13 +2285,13 @@ } }, "tags": { - "add_tag": "Přidat značku", - "automation_title": "Značka {name} je naskenována", - "caption": "Značky", - "confirm_remove": "Opravdu chcete odebrat značku {tag}?", - "confirm_remove_title": "Odebrat značku?", - "create_automation": "Vytvořit automatizaci se značkou", - "description": "Správa značek", + "add_tag": "Přidat štítek", + "automation_title": "Štítek {name} je naskenován", + "caption": "Štítky", + "confirm_remove": "Opravdu chcete odebrat štítek {tag}?", + "confirm_remove_title": "Odebrat štítek?", + "create_automation": "Vytvořit automatizaci se štítkem", + "description": "Správa štítků", "detail": { "companion_apps": "doprovodné aplikace", "create": "Vytvořit", @@ -2297,20 +2299,20 @@ "delete": "Smazat", "description": "Popis", "name": "Název", - "new_tag": "Nová značka", - "tag_id": "ID značky", + "new_tag": "Nový štítek", + "tag_id": "ID štítku", "tag_id_placeholder": "Automaticky vygenerováno, pokud zůstane prázdné", "update": "Aktualizovat", - "usage": "Značka může po naskenování spustit automatizaci. Můžete použít NFC značky, QR kódy nebo jakýkoli jiný druh značky. Použijte naše {companion_link} k zapsání této značky na programovatelnou NFC značku nebo vytvořte QR kód níže." + "usage": "Štítek může po naskenování spustit automatizaci. Můžete použít NFC tagy, QR kódy nebo jakýkoli jiný druh štítku. Použijte naše {companion_link} k zapsání tohoto štítku na programovatelný NFC tag nebo vytvořte QR kód níže." }, "edit": "Upravit", "headers": { "last_scanned": "Naposledy naskenováno", "name": "Název" }, - "learn_more": "Další informace o značkách", - "never_scanned": "Nikdy naskenováno", - "no_tags": "Žádné značky", + "learn_more": "Další informace o štítcích", + "never_scanned": "Nikdy neskenováno", + "no_tags": "Žádné štítky", "write": "Zapsat" }, "users": { diff --git a/translations/frontend/de.json b/translations/frontend/de.json index 6c5148bb5e..5adabae758 100644 --- a/translations/frontend/de.json +++ b/translations/frontend/de.json @@ -872,6 +872,7 @@ "quick-bar": { "commands": { "navigation": { + "areas": "Bereiche", "automation": "Automatisierungen", "core": "Allgemein", "customize": "Anpassungen", @@ -1738,6 +1739,8 @@ "info": { "built_using": "Gebaut mit", "caption": "Info", + "copy_github": "Für GitHub", + "copy_raw": "Roher Text", "custom_uis": "Benutzerdefinierte UIs:", "description": "Informationen über deine Home Assistant Installation", "developed_by": "Entwickelt von einem Haufen toller Leute.", @@ -2016,7 +2019,8 @@ "offline": "OZWDaemon offline", "ready": "Bereit zum Verbinden", "started": "Verbunden mit MQTT", - "starting": "Verbinde zu MQTT" + "starting": "Verbinde zu MQTT", + "stopped": "OpenZWave gestoppt" }, "offline": "Offline", "online": "Online", @@ -2230,7 +2234,7 @@ "min_max": "Min/Max-Entitäten neu laden", "mqtt": "Lade manuell konfigurierte MQTT-Entitäten neu", "person": "Personen neu laden", - "reload": "Neu laden {domain}", + "reload": "{domain} neu laden", "rest": "Rest Entitäten und Benachrichtigungsdienste neu laden", "rpi_gpio": "Raspberry Pi GPIO Entitäten neu laden", "scene": "Szenen neu laden", diff --git a/translations/frontend/es.json b/translations/frontend/es.json index b07470624d..cbd264cb42 100644 --- a/translations/frontend/es.json +++ b/translations/frontend/es.json @@ -1743,6 +1743,8 @@ "info": { "built_using": "Construido usando", "caption": "Información", + "copy_github": "Para GitHub", + "copy_raw": "Texto sin procesar", "custom_uis": "IU personalizadas:", "description": "Ver información sobre tu instalación de Home Assistant", "developed_by": "Desarrollado por un montón de gente impresionante.", diff --git a/translations/frontend/et.json b/translations/frontend/et.json index 07a285f6ae..64b4edbaa4 100644 --- a/translations/frontend/et.json +++ b/translations/frontend/et.json @@ -1743,6 +1743,8 @@ "info": { "built_using": "Ehitatud kasutades", "caption": "Info", + "copy_github": "GitHubi jaoks", + "copy_raw": "Ainult tekst", "custom_uis": "Kohandatud kasutajaliidesed:", "description": "Kuva Home Assistant'i info", "developed_by": "Tehtud paljude lahedate inimeste poolt.", diff --git a/translations/frontend/hu.json b/translations/frontend/hu.json index 8ad704a285..4a7cdd86b3 100644 --- a/translations/frontend/hu.json +++ b/translations/frontend/hu.json @@ -1741,6 +1741,7 @@ "info": { "built_using": "Buildelve:", "caption": "Infó", + "copy_raw": "Nyers szöveg", "custom_uis": "Egyéni felhasználói felületek:", "description": "Telepítési információ megtekintése a Home Assistant-ról", "developed_by": "Egy csomó fantasztikus ember által kifejlesztve.", diff --git a/translations/frontend/it.json b/translations/frontend/it.json index 64f9d601be..a3bcd625e8 100644 --- a/translations/frontend/it.json +++ b/translations/frontend/it.json @@ -805,7 +805,9 @@ "more_info_control": { "controls": "Controlli", "cover": { + "close_cover": "Chiudere gli scuri", "close_tile_cover": "Chiudere l'inclinazione della copertura", + "open_cover": "Aprire gli scuri", "open_tilt_cover": "Aprire l'inclinazione della copertura", "stop_cover": "Fermare il movimento della copertura" }, @@ -872,6 +874,28 @@ }, "quick-bar": { "commands": { + "navigation": { + "areas": "Aree", + "automation": "Automazioni", + "core": "Generale", + "customize": "Personalizzazioni", + "devices": "Dispositivi", + "entities": "Entità", + "helpers": "Aiutanti", + "info": "Informazioni", + "integrations": "Integrazioni", + "logs": "Registri", + "lovelace": "Plance di Lovelace", + "navigate_to": "Navigare verso {panel}", + "navigate_to_config": "Navigare fino a {panel} configurazione", + "person": "Persone", + "scene": "Scene", + "script": "Script", + "server_control": "Controlli del Server", + "tags": "Tag", + "users": "Utenti", + "zone": "Zone" + }, "reload": { "automation": "Ricarica le Automazioni", "command_line": "Ricarica le entità di riga di comando", @@ -1719,6 +1743,8 @@ "info": { "built_using": "Costruito usando", "caption": "Informazioni", + "copy_github": "Per GitHub", + "copy_raw": "Testo non elaborato", "custom_uis": "Interfacce Utente personalizzate:", "description": "Visualizza le informazioni sull'installazione di Home Assistant", "developed_by": "Sviluppato da un gruppo di persone fantastiche.", @@ -1857,7 +1883,7 @@ }, "introduction": "In questa vista è possibile configurare i componenti e l'Home Assistant. Non tutto è ancora configurabile dall'interfaccia utente, ma ci stiamo lavorando.", "logs": { - "caption": "Logs", + "caption": "Registri", "clear": "Pulisci", "description": "Vedi i logs di Home Assistant", "details": "Dettagli registro ({level})", @@ -2261,7 +2287,7 @@ "tags": { "add_tag": "Aggiungi Etichetta", "automation_title": "L'etichetta {name} è scansionata", - "caption": "Etichette", + "caption": "Tag", "confirm_remove": "Sei sicuro di voler rimuovere il tag {tag}?", "confirm_remove_title": "Rimuovere il tag?", "create_automation": "Creare un'automazione con l'etichetta", @@ -2323,6 +2349,7 @@ "update_user": "Aggiorna" }, "picker": { + "add_user": "Aggiungi utente", "headers": { "group": "Gruppo", "name": "Nome", @@ -2603,6 +2630,8 @@ "filter_attributes": "Filtra attributi", "filter_entities": "Filtra entità", "filter_states": "Filtra stati", + "last_changed": "Ultima modifica", + "last_updated": "Ultimo aggiornamento", "more_info": "Ulteriori informazioni", "no_entities": "Nessuna entità", "set_state": "Imposta Stato", @@ -2854,6 +2883,10 @@ "description": "La scheda Luce consente di modificare la luminosità della luce.", "name": "Luce" }, + "logbook": { + "description": "La scheda del Diario di bordo mostra un elenco di eventi per le entità.", + "name": "Diario di bordo" + }, "map": { "dark_mode": "Modalità scura?", "default_zoom": "Ingrandimento predefinito", diff --git a/translations/frontend/ru.json b/translations/frontend/ru.json index e2aed7ad48..a3008ab00f 100644 --- a/translations/frontend/ru.json +++ b/translations/frontend/ru.json @@ -377,7 +377,7 @@ "low": "низкий", "on_off": "Вкл / Выкл", "operation": "Режим работы", - "preset_mode": "Предустановка", + "preset_mode": "Пресет", "swing_mode": "Режим качания воздушных шторок", "target_humidity": "Заданная влажность", "target_temperature": "Заданная температура", @@ -1736,6 +1736,8 @@ "info": { "built_using": "Создано с использованием", "caption": "О системе", + "copy_github": "Для GitHub", + "copy_raw": "Необработанный текст", "custom_uis": "Кастомные интерфейсы:", "description": "Информация о системе", "developed_by": "Разработано множеством замечательных людей.", diff --git a/translations/frontend/zh-Hans.json b/translations/frontend/zh-Hans.json index c64c51f43b..339607753a 100644 --- a/translations/frontend/zh-Hans.json +++ b/translations/frontend/zh-Hans.json @@ -1740,6 +1740,8 @@ "info": { "built_using": "建于", "caption": "信息", + "copy_github": "用于 GitHub", + "copy_raw": "原始文本", "custom_uis": "自定义用户界面:", "description": "查看关于此 Home Assistant 安装的信息", "developed_by": "由一帮很 Awesome~~~ 的人开发。", From c7b747c4fa9acb91897b89e036048346a59a078b Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 15 Nov 2020 16:36:48 +0100 Subject: [PATCH 08/90] Add debug launch conf for VS Code (#7683) --- .gitignore | 2 + .vscode/launch.json | 41 ++++++++++ .vscode/tasks.json | 137 ++++++++++++++++++++++++++++++++++ build-scripts/gulp/webpack.js | 19 ++++- build-scripts/paths.js | 2 +- build-scripts/webpack.js | 18 ++++- 6 files changed, 213 insertions(+), 6 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 .vscode/tasks.json diff --git a/.gitignore b/.gitignore index 0fcd9b68bf..af590a8ade 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,8 @@ dist # vscode .vscode/* !.vscode/extensions.json +!.vscode/launch.json +!.vscode/tasks.json # Cast dev settings src/cast/dev_const.ts diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000000..e36792ce4c --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,41 @@ +{ + // https://github.com/microsoft/vscode-js-debug/blob/master/OPTIONS.md + "configurations": [ + { + "name": "Debug Frontend", + "request": "launch", + "type": "pwa-chrome", + "url": "http://localhost:8123/", + "webRoot": "${workspaceFolder}/hass_frontend", + "disableNetworkCache": true, + "preLaunchTask": "Develop Frontend", + }, + { + "name": "Debug Gallery", + "request": "launch", + "type": "pwa-chrome", + "url": "http://localhost:8100/", + "webRoot": "${workspaceFolder}/gallery/dist", + "disableNetworkCache": true, + "preLaunchTask": "Develop Gallery" + }, + { + "name": "Debug Demo", + "request": "launch", + "type": "pwa-chrome", + "url": "http://localhost:8090/", + "webRoot": "${workspaceFolder}/demo/dist", + "disableNetworkCache": true, + "preLaunchTask": "Develop Demo" + }, + { + "name": "Debug Cast", + "request": "launch", + "type": "pwa-chrome", + "url": "http://localhost:8080/", + "webRoot": "${workspaceFolder}/cast/dist", + "disableNetworkCache": true, + "preLaunchTask": "Develop Cast" + }, + ] +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000000..d23faf6995 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,137 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "Develop Frontend", + "type": "gulp", + "task": "develop-app", + // Sync changes here to other tasks until issue resolved + // https://github.com/Microsoft/vscode/issues/61497 + "problemMatcher": { + "owner": "ha-build", + "source": "ha-build", + "fileLocation": "absolute", + "severity": "error", + "pattern": [ + { + "regexp": "(SyntaxError): (.+): (.+) \\((\\d+):(\\d+)\\)", + "severity": 1, + "file": 2, + "message": 3, + "line": 4, + "column": 5 + } + ], + "background": { + "activeOnStart": true, + "beginsPattern": "Changes detected. Starting compilation", + "endsPattern": "Build done @" + } + }, + "isBackground": true, + "group": { + "kind": "build", + "isDefault": true + }, + "runOptions": { + "instanceLimit": 1 + } + }, + { + "label": "Develop Gallery", + "type": "gulp", + "task": "develop-gallery", + "problemMatcher": { + "owner": "ha-build", + "source": "ha-build", + "fileLocation": "absolute", + "severity": "error", + "pattern": [ + { + "regexp": "(SyntaxError): (.+): (.+) \\((\\d+):(\\d+)\\)", + "severity": 1, + "file": 2, + "message": 3, + "line": 4, + "column": 5 + } + ], + "background": { + "activeOnStart": true, + "beginsPattern": "Changes detected. Starting compilation", + "endsPattern": "Build done @" + } + }, + + "isBackground": true, + "group": "build", + "runOptions": { + "instanceLimit": 1 + } + }, + { + "label": "Develop Demo", + "type": "gulp", + "task": "develop-demo", + "problemMatcher": { + "owner": "ha-build", + "source": "ha-build", + "fileLocation": "absolute", + "severity": "error", + "pattern": [ + { + "regexp": "(SyntaxError): (.+): (.+) \\((\\d+):(\\d+)\\)", + "severity": 1, + "file": 2, + "message": 3, + "line": 4, + "column": 5 + } + ], + "background": { + "activeOnStart": true, + "beginsPattern": "Changes detected. Starting compilation", + "endsPattern": "Build done @" + } + }, + + "isBackground": true, + "group": "build", + "runOptions": { + "instanceLimit": 1 + } + }, + { + "label": "Develop Cast", + "type": "gulp", + "task": "develop-cast", + "problemMatcher": { + "owner": "ha-build", + "source": "ha-build", + "fileLocation": "absolute", + "severity": "error", + "pattern": [ + { + "regexp": "(SyntaxError): (.+): (.+) \\((\\d+):(\\d+)\\)", + "severity": 1, + "file": 2, + "message": 3, + "line": 4, + "column": 5 + } + ], + "background": { + "activeOnStart": true, + "beginsPattern": "Changes detected. Starting compilation", + "endsPattern": "Build done @" + } + }, + + "isBackground": true, + "group": "build", + "runOptions": { + "instanceLimit": 1 + } + }, + ] +} diff --git a/build-scripts/gulp/webpack.js b/build-scripts/gulp/webpack.js index 38fba59640..dc6570ba4e 100644 --- a/build-scripts/gulp/webpack.js +++ b/build-scripts/gulp/webpack.js @@ -18,6 +18,14 @@ const bothBuilds = (createConfigFunc, params) => [ createConfigFunc({ ...params, latestBuild: false }), ]; +/** + * @param {{ + * compiler: import("webpack").Compiler, + * contentBase: string, + * port: number, + * listenHost?: string + * }} + */ const runDevServer = ({ compiler, contentBase, @@ -33,7 +41,10 @@ const runDevServer = ({ throw err; } // Server listening - log("[webpack-dev-server]", `http://localhost:${port}`); + log( + "[webpack-dev-server]", + `Project is running at http://localhost:${port}` + ); }); const handler = (done) => (err, stats) => { @@ -45,12 +56,12 @@ const handler = (done) => (err, stats) => { return; } - log(`Build done @ ${new Date().toLocaleTimeString()}`); - if (stats.hasErrors() || stats.hasWarnings()) { - log.warn(stats.toString("minimal")); + console.log(stats.toString("minimal")); } + log(`Build done @ ${new Date().toLocaleTimeString()}`); + if (done) { done(); } diff --git a/build-scripts/paths.js b/build-scripts/paths.js index ab1b6d3853..ae613b9b10 100644 --- a/build-scripts/paths.js +++ b/build-scripts/paths.js @@ -1,4 +1,4 @@ -var path = require("path"); +const path = require("path"); module.exports = { polymer_dir: path.resolve(__dirname, ".."), diff --git a/build-scripts/webpack.js b/build-scripts/webpack.js index 65d4287a34..d29521ce35 100644 --- a/build-scripts/webpack.js +++ b/build-scripts/webpack.js @@ -4,6 +4,21 @@ const TerserPlugin = require("terser-webpack-plugin"); const ManifestPlugin = require("webpack-manifest-plugin"); const paths = require("./paths.js"); const bundle = require("./bundle"); +const log = require("fancy-log"); + +class LogStartCompilePlugin { + ignoredFirst = false; + + apply(compiler) { + compiler.hooks.beforeCompile.tap("LogStartCompilePlugin", () => { + if (!this.ignoredFirst) { + this.ignoredFirst = true; + return; + } + log("Changes detected. Starting compilation"); + }); + } +} const createWebpackConfig = ({ entry, @@ -104,7 +119,8 @@ const createWebpackConfig = ({ ), path.resolve(paths.polymer_dir, "src/resources/EventTarget-ponyfill.js") ), - ], + !isProdBuild && new LogStartCompilePlugin(), + ].filter(Boolean), resolve: { extensions: [".ts", ".js", ".json"], }, From bc5cb46e7dc1e608c8762f3f8b3227443079dff8 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 15 Nov 2020 15:37:43 +0000 Subject: [PATCH 09/90] Add missing outFiles --- .vscode/launch.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.vscode/launch.json b/.vscode/launch.json index e36792ce4c..e3be0de9c7 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -9,6 +9,9 @@ "webRoot": "${workspaceFolder}/hass_frontend", "disableNetworkCache": true, "preLaunchTask": "Develop Frontend", + "outFiles": [ + "${workspaceFolder}/hass_frontend/frontend_latest/*.js" + ] }, { "name": "Debug Gallery", From d6f3c34b33410253bef201cfca080c261797839f Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Mon, 16 Nov 2020 00:32:42 +0000 Subject: [PATCH 10/90] [ci skip] Translation update --- translations/frontend/ca.json | 2 +- translations/frontend/fr.json | 2 +- translations/frontend/hu.json | 7 +++-- translations/frontend/nb.json | 2 ++ translations/frontend/nl.json | 2 ++ translations/frontend/ru.json | 10 ++++++-- translations/frontend/sl.json | 41 +++++++++++++++++++++++++++--- translations/frontend/zh-Hans.json | 5 +++- translations/frontend/zh-Hant.json | 2 ++ 9 files changed, 62 insertions(+), 11 deletions(-) diff --git a/translations/frontend/ca.json b/translations/frontend/ca.json index dd5366533a..7406ddaeb7 100644 --- a/translations/frontend/ca.json +++ b/translations/frontend/ca.json @@ -584,7 +584,7 @@ "entries_not_found": "No s'han trobat entrades al registre.", "messages": { "became_unavailable": "no està disponible", - "changed_to_state": "a canviat a {state}", + "changed_to_state": "ha canviat a {state}", "cleared_device_class": "s'ha esborrat (no s'ha detectat cap {device_class})", "detected_device_class": "s'ha detectat {device_class}", "rose": "rosa", diff --git a/translations/frontend/fr.json b/translations/frontend/fr.json index 79f16715c2..7fd28dc739 100644 --- a/translations/frontend/fr.json +++ b/translations/frontend/fr.json @@ -320,7 +320,7 @@ "hail": "Grêle", "lightning": "Orage", "lightning-rainy": "Orage / Pluvieux", - "partlycloudy": "Partiellement nuageux", + "partlycloudy": "Éclaircies", "pouring": "Averses", "rainy": "Pluvieux", "snowy": "Neigeux", diff --git a/translations/frontend/hu.json b/translations/frontend/hu.json index 4a7cdd86b3..0e9669e77f 100644 --- a/translations/frontend/hu.json +++ b/translations/frontend/hu.json @@ -585,8 +585,8 @@ "messages": { "became_unavailable": "elérhetetlenné vált", "changed_to_state": "állapota megváltozott: {state}", - "cleared_device_class": "{device_class} érzékelés befejeződött", - "detected_device_class": "{device_class}-t érzékelt", + "cleared_device_class": "{device_class} észlelés befejeződött", + "detected_device_class": "{device_class} észlelve", "rose": "felkelt", "set": "lenyugodott", "turned_off": "ki lett kapcsolva", @@ -805,7 +805,9 @@ "more_info_control": { "controls": "Vezérlők", "cover": { + "close_cover": "Árnyékoló zárása", "close_tile_cover": "Árnyékoló döntésének zárása", + "open_cover": "Árnyékoló nyitása", "open_tilt_cover": "Árnyékoló döntésének nyitása", "stop_cover": "Árnyékoló mozgásának leállítása" }, @@ -1741,6 +1743,7 @@ "info": { "built_using": "Buildelve:", "caption": "Infó", + "copy_github": "A GitHub számára", "copy_raw": "Nyers szöveg", "custom_uis": "Egyéni felhasználói felületek:", "description": "Telepítési információ megtekintése a Home Assistant-ról", diff --git a/translations/frontend/nb.json b/translations/frontend/nb.json index 421783b379..349155a18b 100644 --- a/translations/frontend/nb.json +++ b/translations/frontend/nb.json @@ -1743,6 +1743,8 @@ "info": { "built_using": "Bygget med", "caption": "Informasjon", + "copy_github": "", + "copy_raw": "Rå tekst", "custom_uis": "Tilpassede brukergrensesnitt:", "description": "Vise informasjon om installasjonen av Home Assistant", "developed_by": "Utviklet av en gjeng med fantastiske mennesker.", diff --git a/translations/frontend/nl.json b/translations/frontend/nl.json index 1b5d93f69c..9cd321e2c6 100644 --- a/translations/frontend/nl.json +++ b/translations/frontend/nl.json @@ -1743,6 +1743,8 @@ "info": { "built_using": "Gebouwd met behulp van", "caption": "Info", + "copy_github": "Voor GitHub", + "copy_raw": "Ruwe tekst", "custom_uis": "Aangepaste UI's:", "description": "Informatie over je Home Assistant installatie", "developed_by": "Ontwikkeld door een stel geweldige mensen.", diff --git a/translations/frontend/ru.json b/translations/frontend/ru.json index a3008ab00f..c5ae1a29a4 100644 --- a/translations/frontend/ru.json +++ b/translations/frontend/ru.json @@ -367,7 +367,7 @@ }, "climate": { "aux_heat": "Дополнительный нагрев", - "away_mode": "Режим ожидания", + "away_mode": "Режим \"не дома\"", "cooling": "{name} охлаждение", "current_temperature": "{name} текущая температура", "currently": "Сейчас", @@ -514,7 +514,7 @@ "disable": "Отключить", "enable": "Включить", "error_required": "Обязательное поле", - "leave": "Покинуть", + "leave": "Выйти", "loading": "Загрузка", "menu": "Меню", "next": "Далее", @@ -1756,9 +1756,15 @@ "system_health": { "checks": { "cloud": { + "alexa_enabled": "Интеграция с Alexa", "can_reach_cert_server": "Доступ к серверу сертификатов", "can_reach_cloud": "Доступ к Home Assistant Cloud", "can_reach_cloud_auth": "Доступ к серверу аутентификации", + "google_enabled": "Интеграция с Google", + "logged_in": "Вход в систему", + "relayer_connected": "Relayer подключен", + "remote_connected": "Удалённый доступ подключен", + "remote_enabled": "Удалённый доступ активирован", "subscription_expiration": "Срок действия подписки" }, "homeassistant": { diff --git a/translations/frontend/sl.json b/translations/frontend/sl.json index d6f2533b6f..7ec05352e6 100644 --- a/translations/frontend/sl.json +++ b/translations/frontend/sl.json @@ -805,7 +805,9 @@ "more_info_control": { "controls": "Kontrolniki", "cover": { + "close_cover": "Zapri pokrov", "close_tile_cover": "Zapri nagib pokrova", + "open_cover": "Odpri pokrov", "open_tilt_cover": "Odpri nagib pokrova", "stop_cover": "Zaustavite premikanje pokrova" }, @@ -872,6 +874,28 @@ }, "quick-bar": { "commands": { + "navigation": { + "areas": "Področja", + "automation": "Avtomatizacije", + "core": "Splošno", + "customize": "Prilagoditve", + "devices": "Naprave", + "entities": "Entitete", + "helpers": "Pomočniki", + "info": "Informacije", + "integrations": "Integracije", + "logs": "Dnevniki", + "lovelace": "Nadzorne plošče Lovelace", + "navigate_to": "Pojdi na {panel}", + "navigate_to_config": "Pojdi na nastavitve {location}", + "person": "Osebe", + "scene": "Scene", + "script": "Skripti", + "server_control": "Nadzor strežnika", + "tags": "Značke", + "users": "Uporabniki", + "zone": "Območja" + }, "reload": { "automation": "Znova naloži avtomatizacije", "command_line": "Znova naloži entitete ukazne vrstice", @@ -1393,7 +1417,7 @@ "instance_is_available": "Vaš primerek je na voljo na", "instance_will_be_available": "Vaš primerek bo na voljo na", "link_learn_how_it_works": "Naučite se, kako deluje", - "title": "Daljinsko Upravljanje" + "title": "Oddaljeno upravljanje" }, "sign_out": "Izpis", "thank_you_note": "Zahvaljujemo se vam za to, da ste del Home Assistant Cloud-a. Zaradi ljudi, kot ste vi, smo sposobni narediti dobro izkušnjo avtomatizacije doma za vsakogar. hvala!", @@ -1406,7 +1430,7 @@ "no_hooks_yet": "Izgleda, da še nimate webhooks-ov. Začnite s konfiguracijo ", "no_hooks_yet_link_automation": "webhook avtomatizacije", "no_hooks_yet_link_integration": "integracijo, ki temelji na Webhook-u", - "no_hooks_yet2": "ali z ustvarjanjem", + "no_hooks_yet2": " ali z ustvarjanjem ", "title": "Webhooks" } }, @@ -1567,7 +1591,7 @@ } }, "devices": { - "add_prompt": "Noben {name} še ni bil dodan s to napravo. Lahko ga dodaš s klikom na gumb + spodaj.", + "add_prompt": "{name} še niso bile dodana za to napravo. Lahko jih dodaš s klikom na gumb + spodaj.", "automation": { "actions": { "caption": "Ko se nekaj sproži ...", @@ -1719,6 +1743,8 @@ "info": { "built_using": "Zgrajen z uporabo", "caption": "Info", + "copy_github": "Za GitHub", + "copy_raw": "Surovo besedilo", "custom_uis": "Uporabniški vmesniki po meri:", "description": "Ogled informacij o namestitvi Home Assistant", "developed_by": "Razvija ga kup osupljivih ljudi.", @@ -1793,7 +1819,7 @@ "entity_unavailable": "entiteta ni na voljo", "firmware": "Firmware: {version}", "hub": "Povezan prek", - "manuf": "po {manufacturer}", + "manuf": "naredil: {manufacturer}", "no_area": "Brez območja", "no_device": "Entitete brez naprav", "no_devices": "Ta integracija je brez naprav.", @@ -2310,6 +2336,7 @@ "update_user": "Posodobi" }, "picker": { + "add_user": "Dodaj uporabnika", "headers": { "group": "Skupina", "name": "Ime", @@ -2590,6 +2617,8 @@ "filter_attributes": "Filter atributov", "filter_entities": "Filter entitet", "filter_states": "Filter stanj", + "last_changed": "Zadnja sprememba", + "last_updated": "Zadnja osvežitev", "more_info": "Več informacij", "no_entities": "Brez entitet", "set_state": "Nastavi stanje", @@ -2841,6 +2870,10 @@ "description": "Kartica Light omogoča spreminjanje svetlosti luči.", "name": "Luči" }, + "logbook": { + "description": "Na kartici Dnevnik je prikazan seznam dogodkov za entitete.", + "name": "Dnevnik" + }, "map": { "dark_mode": "Temni način?", "default_zoom": "Privzeta povečava", diff --git a/translations/frontend/zh-Hans.json b/translations/frontend/zh-Hans.json index 339607753a..9c3099d8cb 100644 --- a/translations/frontend/zh-Hans.json +++ b/translations/frontend/zh-Hans.json @@ -806,7 +806,10 @@ "controls": "控制项", "cover": { "close_cover": "关闭卷帘", - "open_cover": "打开卷帘" + "close_tile_cover": "关闭翻转式卷帘", + "open_cover": "打开卷帘", + "open_tilt_cover": "打开翻转式卷帘", + "stop_cover": "停止卷帘移动" }, "details": "详情", "dismiss": "关闭对话框", diff --git a/translations/frontend/zh-Hant.json b/translations/frontend/zh-Hant.json index d3c266f494..bf70be9f6f 100644 --- a/translations/frontend/zh-Hant.json +++ b/translations/frontend/zh-Hant.json @@ -1743,6 +1743,8 @@ "info": { "built_using": "建置使用", "caption": "更多資訊", + "copy_github": "GitHub", + "copy_raw": "原始文字", "custom_uis": "自定介面:", "description": "檢視 Home Assistant 安裝資訊", "developed_by": "由一群充滿熱情的人們所開發。", From e37b7bd73f1191cdaaaee375d0ff10c57e40e30f Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 16 Nov 2020 11:43:25 +0100 Subject: [PATCH 11/90] Cleanup (#7702) --- package.json | 2 +- src/util/app-localstorage-document.js | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 7fc0f96c56..d8dc5f2b92 100644 --- a/package.json +++ b/package.json @@ -90,7 +90,6 @@ "codemirror": "^5.49.0", "comlink": "^4.3.0", "core-js": "^3.6.5", - "cpx": "^1.5.0", "cropperjs": "^1.5.7", "deep-clone-simple": "^1.1.1", "deep-freeze": "^0.0.1", @@ -162,6 +161,7 @@ "@typescript-eslint/parser": "^4.4.0", "babel-loader": "^8.1.0", "chai": "^4.2.0", + "cpx": "^1.5.0", "del": "^4.0.0", "eslint": "^6.8.0", "eslint-config-airbnb-typescript": "^7.2.1", diff --git a/src/util/app-localstorage-document.js b/src/util/app-localstorage-document.js index b00fdffba1..5a02ab3405 100644 --- a/src/util/app-localstorage-document.js +++ b/src/util/app-localstorage-document.js @@ -10,8 +10,7 @@ Code distributed by Google as part of the polymer project is also subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt */ import { AppStorageBehavior } from "@polymer/app-storage/app-storage-behavior"; -import { Polymer } from "@polymer/polymer/lib/legacy/polymer-fn"; -import "@polymer/polymer/polymer-legacy"; +import { Polymer } from "@polymer/polymer/polymer-legacy"; /** * app-localstorage-document synchronizes storage between an in-memory From 79c542b76a51fd6786a24941678e8f8fca2ce6d8 Mon Sep 17 00:00:00 2001 From: Philip Allgaier Date: Mon, 16 Nov 2020 12:44:58 +0100 Subject: [PATCH 12/90] Add missing 1px to prevent slider pin cutoff (#7657) --- src/components/ha-labeled-slider.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ha-labeled-slider.js b/src/components/ha-labeled-slider.js index 4d15c37b5e..ef9077074b 100644 --- a/src/components/ha-labeled-slider.js +++ b/src/components/ha-labeled-slider.js @@ -14,7 +14,7 @@ class HaLabeledSlider extends PolymerElement { } .title { - margin: 4px 0 8px; + margin: 5px 0 8px; color: var(--primary-text-color); } From 3b7a189708cdc39d8d5793ba8d0cada7dd60213f Mon Sep 17 00:00:00 2001 From: Donnie Date: Mon, 16 Nov 2020 03:45:20 -0800 Subject: [PATCH 13/90] Quick Bar should only capitalize letters in Command Palette (#7671) --- src/dialogs/quick-bar/ha-quick-bar.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/dialogs/quick-bar/ha-quick-bar.ts b/src/dialogs/quick-bar/ha-quick-bar.ts index 49920892c2..cddf042669 100644 --- a/src/dialogs/quick-bar/ha-quick-bar.ts +++ b/src/dialogs/quick-bar/ha-quick-bar.ts @@ -207,6 +207,7 @@ export class QuickBar extends LitElement { .item=${item} index=${ifDefined(index)} graphic="icon" + class=${this._commandMode ? "command-item" : ""} > ${item.iconPath ? html` Date: Mon, 16 Nov 2020 12:45:52 +0100 Subject: [PATCH 14/90] Fix number format in state-card-display (#7703) --- src/state-summary/state-card-display.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/state-summary/state-card-display.js b/src/state-summary/state-card-display.js index 1312e5da52..b49bb16845 100755 --- a/src/state-summary/state-card-display.js +++ b/src/state-summary/state-card-display.js @@ -52,7 +52,7 @@ class StateCardDisplay extends LocalizeMixin(PolymerElement) { ${this.stateInfoTemplate}
- [[computeStateDisplay(localize, stateObj, language)]] + [[computeStateDisplay(localize, stateObj, hass.language)]]
`; } From a856337eae576da3ceb81db9a42192bafa0864db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Mon, 16 Nov 2020 16:53:47 +0100 Subject: [PATCH 15/90] Devcontainer (#7697) Co-authored-by: Paulus Schoutsen --- .devcontainer/Dockerfile | 13 ++++++ .devcontainer/devcontainer.json | 31 ++++++++++++++ .gitignore | 3 ++ .vscode/tasks.json | 71 +++++++++++++++++++++++++++++++++ script/core | 55 +++++++++++++++++++++++++ 5 files changed, 173 insertions(+) create mode 100644 .devcontainer/Dockerfile create mode 100644 .devcontainer/devcontainer.json create mode 100755 script/core diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 0000000000..94218355ff --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,13 @@ +# See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.148.1/containers/python-3/.devcontainer/base.Dockerfile +FROM mcr.microsoft.com/vscode/devcontainers/python:0-3.9 + +ENV \ + DEBIAN_FRONTEND=noninteractive \ + DEVCONTAINER=true \ + PATH=$PATH:./node_modules/.bin + +# Install nvm +COPY .nvmrc /tmp/.nvmrc +RUN \ + su vscode -c \ + "source /usr/local/share/nvm/nvm.sh && nvm install $(cat /tmp/.nvmrc) 2>&1" \ No newline at end of file diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000000..78d39cd415 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,31 @@ +{ + "name": "Home Assistant Frontend", + "build": { + "dockerfile": "Dockerfile", + "context": ".." + }, + "appPort": 8123, + "context": "..", + "postCreateCommand": "script/bootstrap", + "extensions": [ + "github.vscode-pull-request-github", + "dbaeumer.vscode-eslint", + "ms-vscode.vscode-typescript-tslint-plugin", + "esbenp.prettier-vscode", + "bierner.lit-html", + "runem.lit-plugin", + "ms-python.vscode-pylance" + ], + "settings": { + "terminal.integrated.shell.linux": "/bin/bash", + "files.eol": "\n", + "editor.tabSize": 2, + "editor.formatOnPaste": false, + "editor.formatOnSave": true, + "editor.formatOnType": true, + "[typescript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "files.trimTrailingWhitespace": true + } +} diff --git a/.gitignore b/.gitignore index af590a8ade..74fe1c8f92 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,6 @@ yarn-error.log #asdf .tool-versions + +# Home Assistant config +config \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json index d23faf6995..c6868baeb0 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -37,6 +37,37 @@ "instanceLimit": 1 } }, + { + "label": "Develop Supervisor panel", + "type": "gulp", + "task": "develop-hassio", + "problemMatcher": { + "owner": "ha-build", + "source": "ha-build", + "fileLocation": "absolute", + "severity": "error", + "pattern": [ + { + "regexp": "(SyntaxError): (.+): (.+) \\((\\d+):(\\d+)\\)", + "severity": 1, + "file": 2, + "message": 3, + "line": 4, + "column": 5 + } + ], + "background": { + "activeOnStart": true, + "beginsPattern": "Changes detected. Starting compilation", + "endsPattern": "Build done @" + } + }, + "isBackground": true, + "group": "build", + "runOptions": { + "instanceLimit": 1 + } + }, { "label": "Develop Gallery", "type": "gulp", @@ -133,5 +164,45 @@ "instanceLimit": 1 } }, + { + "label": "Run HA Core in devcontainer", + "type": "shell", + "command": "script/core", + "isBackground": true, + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": [], + "runOptions": { + "instanceLimit": 1 + } + }, + { + "label": "Run HA Core for Supervisor in devcontainer", + "type": "shell", + "command": "HASSIO=${input:supervisorHost} HASSIO_TOKEN=${input:supervisorToken} script/core", + "isBackground": true, + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": [], + "runOptions": { + "instanceLimit": 1 + } + } + ], + "inputs": [ + { + "id": "supervisorHost", + "type": "promptString", + "description": "The IP of the Supervisor host running the Remote API proxy add-on" + }, + { + "id": "supervisorToken", + "type": "promptString", + "description": "The token for the Remote API proxy add-on" + } ] } diff --git a/script/core b/script/core new file mode 100755 index 0000000000..7f45620af3 --- /dev/null +++ b/script/core @@ -0,0 +1,55 @@ +#!/bin/sh +# Helper to start Home Assistant Core inside the devcontainer + +# Stop on errors +set -e + +if [ -z "${DEVCONTAINER}" ]; then + echo "This task should only run inside a devcontainer, for local install HA Core in a venv." + exit 1 +fi + +if [ ! -z "${CODESPACES}" ]; then + WORKSPACE="/root/workspace/frontend" +else + WORKSPACE="/workspaces/frontend" +fi + +if [ -z $(which hass) ]; then + echo "Installing Home Asstant core from dev." + python3 -m pip install --upgrade \ + colorlog \ + git+git://github.com/home-assistant/home-assistant.git@dev +fi + +if [ ! -d "${WORKSPACE}/config" ]; then + echo "Creating default configuration." + mkdir -p "${WORKSPACE}/config"; + hass --script ensure_config -c config + echo "demo: + +logger: + default: info + logs: + homeassistant.components.frontend: debug +" >> "${WORKSPACE}/config/configuration.yaml" + + if [ ! -z "${HASSIO}" ]; then + echo " +# frontend: +# development_repo: ${WORKSPACE} + +hassio: + development_repo: ${WORKSPACE}" >> "${WORKSPACE}/config/configuration.yaml" + else + echo " +frontend: + development_repo: ${WORKSPACE} + +# hassio: +# development_repo: ${WORKSPACE}" >> "${WORKSPACE}/config/configuration.yaml" + fi + +fi + +hass -c "${WORKSPACE}/config" From bf7424a67cb21f6fbf2567fba61e6a0d1bcf762c Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Tue, 17 Nov 2020 00:32:25 +0000 Subject: [PATCH 16/90] [ci skip] Translation update --- translations/frontend/el.json | 153 ++++++++++++++++++++++++++---- translations/frontend/es-419.json | 148 +++++++++++++++++++++++++++-- translations/frontend/ja.json | 2 +- translations/frontend/pl.json | 2 + translations/frontend/pt.json | 80 +++++++++++++++- translations/frontend/sl.json | 53 +++++++---- 6 files changed, 386 insertions(+), 52 deletions(-) diff --git a/translations/frontend/el.json b/translations/frontend/el.json index e7b661bc19..c33719be6c 100644 --- a/translations/frontend/el.json +++ b/translations/frontend/el.json @@ -511,16 +511,23 @@ "continue": "Συνέχεια", "copied": "Αντιγράφηκε", "delete": "Διαγραφή", + "disable": "Απενεργοποίηση", + "enable": "Ενεργοποίηση", "error_required": "Υποχρεωτικό", + "leave": "Αποχώρηση", "loading": "Φόρτωση", "menu": "Μενού", "next": "Επόμενο", "no": "Όχι", + "not_now": "Όχι τώρα", "overflow_menu": "Μενού υπερχείλισης", "previous": "Προηγούμενο", "refresh": "Ανανέωση", + "remove": "Αφαίρεση", + "rename": "Μετονομασία", "save": "Αποθήκευση", "skip": "Παράλειψη", + "stay": "Παραμονή", "successfully_deleted": "Η διαγραφή ολοκληρώθηκε με επιτυχία", "successfully_saved": "Αποθηκεύτηκε με επιτυχία", "undo": "Αναίρεση", @@ -624,7 +631,7 @@ "season": "Σεζόν", "track": "Κομμάτι", "tv_show": "Τηλεοπτική εκπομπή", - "url": "Διεύθυνση Url", + "url": "URL", "video": "Βίντεο" }, "content-type": { @@ -721,8 +728,10 @@ "confirm_delete": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν την καταχώριση;", "delete": "Διαγραφή", "enabled_cause": "Απενεργοποιήθηκε από {cause}.", + "enabled_delay_confirm": "Τα ενεργοποιημένα στοιχεία θα προστεθούν στο Home Assistant σε {delay} δευτερόλεπτα", "enabled_description": "Οι απενεργοποιημένες οντότητες δεν θα προστεθούν στον Home Assistant.", "enabled_label": "Ενεργοποίηση οντότητας", + "enabled_restart_confirm": "Επανεκκινήστε το Home Assistant για να ολοκληρώσετε την ενεργοποίηση των στοιχείων", "entity_id": "Αναγνωριστικό οντότητας", "icon": "Εικονίδιο", "icon_error": "Το εικονίδιο πρέπει να είναι στη μορφή 'πρόθεμα:όνομα_εικόνας', για παράδειγμα: 'mdi:home'", @@ -795,6 +804,13 @@ }, "more_info_control": { "controls": "Έλεγχοι", + "cover": { + "close_cover": "Κλείσιμο", + "close_tile_cover": "Κλείσιμο καλύμματος", + "open_cover": "Άνοιγμα", + "open_tilt_cover": "Άνοιγμα καλύμματος", + "stop_cover": "Το κάλυμμα να παραμένει σταθερό" + }, "details": "Λεπτομέρειες", "dismiss": "Κλείσιμο διαλόγου.", "edit": "Επεξεργασία οντότητας", @@ -858,6 +874,28 @@ }, "quick-bar": { "commands": { + "navigation": { + "areas": "Περιοχές", + "automation": "Αυτοματισμοί", + "core": "Γενικά", + "customize": "Μορφοποιήσεις", + "devices": "Συσκευές", + "entities": "Στοιχεία", + "helpers": "Βοηθήματα", + "info": "Πληροφορίες", + "integrations": "Ενσωματώσεις", + "logs": "Συμβάντα", + "lovelace": "Διαχειριστικά Lovelace", + "navigate_to": "Μεταβείτε στο {panel}", + "navigate_to_config": "Μεταβείτε στη διαμόρφωση του {panel}", + "person": "Άνθρωποι", + "scene": "Σκηνές", + "script": "Scripts", + "server_control": "Στοιχεία ελέγχου Server", + "tags": "Ετικέτες", + "users": "Χρήστες", + "zone": "Ζώνες" + }, "reload": { "automation": "Επαναφόρτωση αυτοματισμών", "command_line": "Επαναφόρτωση οντοτήτων γραμμής εντολών", @@ -1421,7 +1459,7 @@ "will_be_auto_renewed": "Θα ανανεωθεί αυτόματα" }, "dialog_cloudhook": { - "available_at": "Το webhook είναι διαθέσιμο στον ακόλουθο σύνδεσμο:", + "available_at": "Το webhook είναι διαθέσιμο στον ακόλουθο σύνδεσμο URL:", "close": "Κλείστε", "confirm_disable": "Είστε σίγουροι ότι θέλετε να απενεργοποιήσετε αυτό το webhook;", "copied_to_clipboard": "Αντιγράφτηκε στο πρόχειρο", @@ -1627,12 +1665,12 @@ "disable_selected": { "button": "Απενεργοποίηση επιλεγμένων", "confirm_text": "Οι απενεργοποιημένες οντότητες δεν θα προστεθούν στον Home Assistant", - "confirm_title": "Θέλετε να απενεργοποιήσετε {number} οντότητες;" + "confirm_title": "Θέλετε να απενεργοποιήσετε {number} {number, plural,\n one {στοιχείο}\n other {στοιχεία}\n};" }, "enable_selected": { "button": "Ενεργοποίηση επιλεγμένων", "confirm_text": "Αυτό θα τα καταστήσει ξανά διαθέσιμα στο Home Assistant, εάν είναι τώρα απενεργοποιημένα.", - "confirm_title": "Θέλετε να ενεργοποιήσετε {number} οντότητες;" + "confirm_title": "Θέλετε να ενεργοποιήσετε {number} {number, plural,\n one {στοιχείο}\n other {στοιχεία}\n};" }, "filter": { "filter": "Φίλτρο", @@ -1654,9 +1692,9 @@ "remove_selected": { "button": "Αφαίρεση επιλεγμένων", "confirm_partly_text": "Μπορείτε να αφαιρέσετε μόνο {removable} από τις επιλεγμένες {selected} οντότητες. Οι οντότητες μπορούν να καταργηθούν μόνο όταν η ενοποίηση δεν παρέχει πλέον τις οντότητες. Μερικές φορές πρέπει να κάνετε επανεκκίνηση του Home Assistant για να μπορέσετε να καταργήσετε τις οντότητες μιας καταργημένης ενοποίησης. Είστε βέβαιοι ότι θέλετε να καταργήσετε τις αφαιρούμενες οντότητες;", - "confirm_partly_title": "Μόνο {number} επιλεγμένες οντότητες μπορούν να καταργηθούν.", + "confirm_partly_title": "Μόνο {number} {number, plural,\n one {επιλεγμένο στοιχείο μπορεί να αφαιρεθεί}\n other {επιλεγμένα στοιχεία μπορούν να αφαιρεθούν}\n}.", "confirm_text": "Θα πρέπει να τα αφαιρέσετε από το Lovelace config και τους αυτοματισμούς σας εάν περιέχουν αυτές τις οντότητες.", - "confirm_title": "θέλετε να αφαιρέσετε {number} οντότητες;" + "confirm_title": "Θέλετε να αφαιρέσετε {number} {number, plural,\n one {στοιχείο}\n other {στοιχεία}\n};" }, "search": "Οντότητες αναζήτησης", "selected": "Επιλέχθηκαν {number} ", @@ -1705,6 +1743,8 @@ "info": { "built_using": "Κατασκευάστηκε με χρήση", "caption": "Πληροφορίες", + "copy_github": "Για το GitHub", + "copy_raw": "Μη επεξεργασμένο κείμενο", "custom_uis": "Προσαρμοσμένα περιβάλλοντα χρήστη:", "description": "Δείτε πληροφορίες σχετικά με την εγκατάσταση του Home Assistant", "developed_by": "Αναπτύχθηκε από ένα μάτσο απίθανων ανθρώπων.", @@ -1720,6 +1760,42 @@ "server": "Διακομιστής", "source": "Πηγή", "system_health_error": "Το στοιχείο Υγεία Συστήματος δεν έχει φορτωθεί. Προσθέστε 'system_health:' στη ρύθμιση παραμέτρων configuration.yaml", + "system_health": { + "checks": { + "cloud": { + "alexa_enabled": "Alexa Ενεργή", + "can_reach_cert_server": "Προσέγγιση διακομιστή πιστοποιητικών", + "can_reach_cloud": "Προσέγγιση Home Assistant Cloud", + "can_reach_cloud_auth": "Προσέγγιση διακομιστή ελέγχου ταυτότητας", + "google_enabled": "Google Ενεργή", + "logged_in": "Συνδεδεμένοι", + "relayer_connected": "Συνδεδεμένος αναμεταδότης", + "remote_connected": "Απομακρυσμένη λειτουργία Συνδεδεμένη", + "remote_enabled": "Απομακρυσμένη λειτουργία Ενεργή", + "subscription_expiration": "Λήξη συνδρομής" + }, + "homeassistant": { + "arch": "Αρχιτεκτονική CPU", + "dev": "Ανάπτυξη", + "docker": "Docker", + "hassio": "HassOS", + "installation_type": "Τύπος εγκατάστασης", + "os_name": "Όνομα λειτουργικού συστήματος", + "os_version": "Έκδοση λειτουργικού συστήματος", + "python_version": "Έκδοση Python", + "timezone": "Ζώνη ώρας", + "version": "Έκδοση", + "virtualenv": "Εικονικό περιβάλλον" + }, + "lovelace": { + "dashboards": "Πίνακες ελέγχου", + "mode": "Λειτουργία", + "resources": "Πόροι" + } + }, + "manage": "Διαχείριση", + "more_info": "Περισσότερες πληροφορίες" + }, "title": "Πληροφορίες" }, "integration_panel_move": { @@ -1845,7 +1921,7 @@ "title": "Τίτλος", "title_required": "Απαιτείται τίτλος.", "update": "Ενημέρωση", - "url": "Διεύθυνση url", + "url": "URL", "url_error_msg": "Η διεύθυνση URL πρέπει να περιέχει ένα - και δεν μπορεί να περιέχει κενά ή ειδικούς χαρακτήρες, εκτός από _ και -" }, "picker": { @@ -1873,7 +1949,7 @@ "new_resource": "Προσθέστε νέο πόρο", "type": "Τύπος πόρου", "update": "Ενημέρωση", - "url": "Διεύθυνση Url", + "url": "URL", "url_error_msg": "Η διεύθυνση URL είναι υποχρεωτικό πεδίο", "warning_header": "Προσέξτε!", "warning_text": "Η προσθήκη πόρων μπορεί να είναι επικίνδυνη, βεβαιωθείτε ότι γνωρίζετε την προέλευση των πόρων και ότι τους εμπιστεύεστε. Οι κακοί πόροι θα μπορούσαν να βλάψουν σοβαρά το σύστημά σας." @@ -1882,11 +1958,11 @@ "add_resource": "Προσθήκη πόρου", "headers": { "type": "Τύπος", - "url": "Διεύθυνση Url" + "url": "URL" }, "no_resources": "Δεν υπάρχουν πόροι" }, - "refresh_body": "Πρέπει να ανανεώσετε τη σελίδα για να ολοκληρώσετε την κατάργηση, θέλετε να ανανεώσετε τώρα;", + "refresh_body": "Πρέπει να ανανεώσετε τη σελίδα για να ολοκληρώσετε την αφαίρεση. Ανανέωση τώρα;", "refresh_header": "Θέλετε να ανανεώσετε;", "types": { "css": "Stylesheet", @@ -2136,7 +2212,9 @@ "sequence_sentence": "Η ακολουθία των ενεργειών αυτού του σεναρίου." }, "picker": { - "add_script": "Δημιουργήστε νέο σενάριο", + "add_script": "Δημιουργήστε νέο script", + "duplicate": "Κλονοποίηση", + "duplicate_script": "Κλονοποίηση Script", "edit_script": "Επεξεργασία σεναρίου", "header": "Πρόγραμμα επεξεργασίας σεναρίων", "headers": { @@ -2173,7 +2251,7 @@ "input_text": "Επαναφόρτωση κειμένων εισόδου", "introduction": "Ορισμένα τμήματα του Home Assistant μπορούν να επαναφορτωθούν χωρίς να απαιτείται επανεκκίνηση. Πατώντας \"επαναφόρτωση\" θα ξεφορτωθεί η τρέχουσα παραμετροποίηση YAML και θα φορτωθεί η νέα.", "min_max": "Επαναφόρτωση οντοτήτων ελάχιστων / μέγιστων", - "mqtt": "Επανάληψη φόρτωσης μη αυτόματα ρυθμισμένων οντοτήτων mqtt", + "mqtt": "Επαναφόρτωση χειροκίνητων στοιχείων MQTT", "person": "Επαναφόρτωση ατόμων", "ping": "Επαναφόρτωση οντοτήτων δυαδικών αισθητήρων ping", "reload": "Επαναφόρτωση {domain}", @@ -2181,7 +2259,7 @@ "rpi_gpio": "Επαναφόρτωση οντοτήτων Raspberry Pi GPIO", "scene": "Επαναφόρτωση σκηνών", "script": "Επαναφόρτωση σεναρίων", - "smtp": "Επανάληψη φόρτωσης υπηρεσιών ειδοποίησης smtp", + "smtp": "Επαναφόρτωση υπηρεσιών ειδοποίησης SMTP", "statistics": "Επαναφόρτωση οντοτήτων στατιστικών", "telegram": "Επαναφόρτωση υπηρεσιών ειδοποίησης telegram", "template": "Επαναφόρτωση οντοτήτων προτύπου", @@ -2210,6 +2288,8 @@ "add_tag": "Προσθήκη ετικέτας", "automation_title": "Η ετικέτα {name} σαρώθηκε", "caption": "Ετικέτες", + "confirm_remove": "Είστε βέβαιοι ότι θέλετε να καταργήσετε την ετικέτα {tag} ;", + "confirm_remove_title": "Κατάργηση ετικέτας;", "create_automation": "Δημιουργία αυτοματοποίησης με ετικέτα", "description": "Διαχείριση ετικετών", "detail": { @@ -2269,6 +2349,7 @@ "update_user": "Ενημέρωση" }, "picker": { + "add_user": "Προσθήκη χρήστη", "headers": { "group": "Ομάδα", "name": "Ονομασία", @@ -2549,6 +2630,8 @@ "filter_attributes": "Φιλτράρισμα χαρακτηριστικών", "filter_entities": "Φιλτράρισμα οντοτήτων", "filter_states": "Φιλτράρισμα καταστάσεων", + "last_changed": "Τελευταία αλλαγή", + "last_updated": "Τελευταία αναβάθμιση", "more_info": "Περισσότερες πληροφορίες", "no_entities": "Δεν υπάρχουν οντότητες", "set_state": "Ορίστε την κατάσταση", @@ -2635,7 +2718,7 @@ } }, "changed_toast": { - "message": "Η παραμετροποίηση του Lovelace για αυτή την επισκόπηση έχει επικαιροποιηθεί, θέλεις να κάνεις ανανέωση για να δεις τις αλλαγές;", + "message": "Οι ρυθμίσεις του Lovelace UI για αυτόν τον πίνακα ελέγχου έχουν επικαιροποιηθεί. Θέλεις να κάνεις ανανέωση για να δεις τις αλλαγές;", "refresh": "Ανανέωση" }, "editor": { @@ -2647,11 +2730,11 @@ "navigate": "Πλοήγηση", "none": "Καμία ενέργεια", "toggle": "Εναλλαγή", - "url": "Διεύθυνση Url" + "url": "URL" }, "editor_service_data": "Τα δεδομένα υπηρεσίας μπορούν να εισαχθούν μόνο στον επεξεργαστή κώδικα", "navigation_path": "Διαδρομή πλοήγησης", - "url_path": "Διαδρομή διεύθυνσης URL" + "url_path": "Διαδρομή URL" }, "card": { "alarm-panel": { @@ -2769,7 +2852,7 @@ "theme": "Θέμα", "title": "Τίτλος", "unit": "Μονάδα", - "url": "Διεύθυνση url" + "url": "URL" }, "glance": { "columns": "Στήλες", @@ -2800,6 +2883,10 @@ "description": "Η κάρτα \"Φως\" σας επιτρέπει να αλλάξετε τη φωτεινότητα του φωτός.", "name": "Φως" }, + "logbook": { + "description": "Η κάρτα Συμβάντων εμφανίζει μια λίστα γεγονότων για διάφορα στοιχεία.", + "name": "Κάρτα Συμβάντων" + }, "map": { "dark_mode": "Σκοτεινή λειτουργία;", "default_zoom": "Προεπιλεγμένο ζουμ", @@ -2872,11 +2959,18 @@ "entity": "Οντότητα", "no_description": "Δεν υπάρχει διαθέσιμη περιγραφή" }, + "common": { + "add": "Προσθήκη", + "clear": "Καθαρισμός", + "edit": "Επεξεργασία", + "none": "Κανένας" + }, "edit_badges": { "panel_mode": "Αυτά τα σήματα δεν θα εμφανιστούν, επειδή αυτή η προβολή βρίσκεται σε \"Λειτουργία πίνακα\"." }, "edit_card": { "add": "Προσθήκη κάρτας", + "clear": "Καθαρισμός", "confirm_cancel": "Είστε βέβαιοι ότι θέλετε να ακυρώσετε;", "delete": "Διαγραφή κάρτας", "duplicate": "Διπλότυπη κάρτα", @@ -2917,6 +3011,22 @@ } }, "header": "Επεξεργασία περιβάλλοντος χρήστη", + "header-footer": { + "choose_header_footer": "Επιλογή {type}", + "footer": "Υποσέλιδο", + "header": "Κεφαλίδα", + "types": { + "buttons": { + "name": "Κουμπιά" + }, + "graph": { + "name": "Γράφημα" + }, + "picture": { + "name": "Εικόνα" + } + } + }, "menu": { "open": "Ανοίξτε το μενού Lovelace", "raw_editor": "Πρόγραμμα επεξεργασίας ρύθμισης παραμέτρων raw" @@ -2961,6 +3071,13 @@ "dashboard_label": "Πίνακας Επισκόπησης", "header": "Επιλέξτε μια προβολή" }, + "sub-element-editor": { + "types": { + "footer": "Πρόγραμμα επεξεργασίας υποσέλιδου", + "header": "Επεξεργασία κεφαλίδας", + "row": "Πρόγραμμα επεξεργασίας Σειράς Στοιχείου" + } + }, "suggest_card": { "add": "Προσθήκη στο Lovelace UI", "create_own": "Επιλέξτε άλλη κάρτα", @@ -2985,7 +3102,7 @@ }, "reload_lovelace": "Επαναφόρτωση Lovelace", "reload_resources": { - "refresh_body": "Πρέπει να ανανεώσετε τη σελίδα για να ολοκληρώσετε την επαναφόρτωση, θέλετε να την ανανεώσετε τώρα;", + "refresh_body": "Πρέπει να ανανεώσετε τη σελίδα για να ολοκληρώσετε την επαναφόρτωση. Ανανέωση τώρα;", "refresh_header": "Θέλετε να ανανεώσετε;" }, "unused_entities": { diff --git a/translations/frontend/es-419.json b/translations/frontend/es-419.json index f86239d011..3e1fbbf299 100644 --- a/translations/frontend/es-419.json +++ b/translations/frontend/es-419.json @@ -508,15 +508,22 @@ "close": "Cerrar", "continue": "Continuar", "delete": "Eliminar", + "disable": "Deshabilitar", + "enable": "Habilitar", "error_required": "Requerido", + "leave": "Salir", "loading": "Cargando", "menu": "Menú", "next": "Siguiente", "no": "No", + "not_now": "Ahora no", "overflow_menu": "Menú de desbordamiento", "previous": "Anterior", "refresh": "Actualizar", + "remove": "Eliminar", + "rename": "Renombrar", "save": "Guardar", + "stay": "Permanecer", "successfully_deleted": "Eliminado exitosamente", "successfully_saved": "Guardado correctamente", "undo": "Deshacer", @@ -568,7 +575,11 @@ "no_history_found": "No se encontró historial de estado." }, "logbook": { - "entries_not_found": "No se encontraron entradas en el libro de registro." + "entries_not_found": "No se encontraron entradas en el libro de registro.", + "messages": { + "was_at_state": "estaba en {state}", + "was_locked": "fue cerrado" + } }, "media-browser": { "audio_not_supported": "Su navegador no soporta el elemento de audio.", @@ -664,8 +675,10 @@ "confirm_delete": "¿Está seguro de que desea eliminar esta entrada?", "delete": "Eliminar", "enabled_cause": "Deshabilitado por {cause}.", + "enabled_delay_confirm": "Las entidades habilitadas se agregarán a Home Assistant en {delay} segundos", "enabled_description": "Las entidades deshabilitadas no serán agregadas a Home Assistant.", "enabled_label": "Habilitar entidad", + "enabled_restart_confirm": "Reinicie Home Assistant para terminar de habilitar las entidades", "entity_id": "Identificación de la entidad", "icon": "Sobrescribir icono", "icon_error": "Los iconos deben estar en el formato 'prefijo:nombre del icono', por ejemplo, 'mdi: home'", @@ -685,6 +698,13 @@ "ok": "De acuerdo" }, "helper_settings": { + "counter": { + "initial": "Valor inicial", + "maximum": "Valor máximo", + "minimum": "Valor mínimo", + "restore": "Restaurar el último valor conocido cuando se inicia Home Assistant", + "step": "Número de incremento" + }, "generic": { "icon": "Ícono", "name": "Nombre" @@ -720,6 +740,9 @@ }, "platform_not_loaded": "La integración {platform} no está cargada. Añádela a su archivo de configuración agregando 'default_config:' o ''{platform}:''.", "required_error_msg": "Este campo es requerido", + "timer": { + "duration": "Duración" + }, "yaml_not_editable": "La configuración de esta entidad no se puede editar desde la interfaz de usuario. Solo las entidades configuradas desde la interfaz de usuario se pueden configurar desde la interfaz de usuario." }, "image_cropper": { @@ -843,6 +866,7 @@ "notification_drawer": { "click_to_configure": "Haga clic en el botón para configurar {entity}.", "close": "Cerrar", + "dismiss_all": "Descartar todo", "empty": "Sin Notificaciones", "title": "Notificaciones" }, @@ -1161,6 +1185,16 @@ "only_editable": "Solo las automatizaciones definidas en automations.yaml son editables.", "pick_automation": "Elija la automatización a editar", "show_info_automation": "Mostrar información acerca de la automatización" + }, + "thingtalk": { + "link_devices": { + "header": "¡Excelente! Ahora necesitamos vincular algunos dispositivos" + }, + "task_selection": { + "error_unsupported": "No pudimos crear una automatización para eso (¿aún?).", + "for_example": "Por ejemplo:", + "language_note": "Nota: Solo se admite el inglés por ahora." + } } }, "cloud": { @@ -1373,6 +1407,7 @@ "different_include": "Posiblemente a través de un dominio, un globo o una inclusión diferente.", "pick_attribute": "Elija un atributo para sobrescribir", "picker": { + "documentation": "Documentación de personalización", "entity": "Entidad", "header": "Personalizaciones", "introduction": "Ajustar los atributos por entidad. Las personalizaciones agregadas/editadas tendrán efecto inmediatamente. Las personalizaciones eliminadas entrarán en vigor cuando se actualice la entidad." @@ -1387,18 +1422,23 @@ "add_prompt": "Aún no se ha agregado ningún {name} con este dispositivo. Puede agregar uno haciendo clic en el botón + de arriba.", "automation": { "actions": { - "caption": "Cuando algo se desencadena..." + "caption": "Cuando algo se desencadena...", + "no_actions": "Sin acciones", + "unknown_action": "Acción desconocida" }, "automations": "Automatizaciones", "conditions": { - "caption": "Sólo hacer algo si..." + "caption": "Sólo hacer algo si...", + "no_conditions": "Sin condiciones", + "unknown_condition": "Condición desconocida" }, "create": "Crear automatización con dispositivo", "no_automations": "Sin automatizaciones", "no_device_automations": "No hay automatizaciones disponibles para este dispositivo.", "triggers": { "caption": "Haz algo cuando ..." - } + }, + "unknown_automation": "Automatización desconocida" }, "cant_edit": "Solo puede editar elementos que se crean en la interfaz de usuario.", "caption": "Dispositivos", @@ -1516,16 +1556,20 @@ "no_helpers": "¡Parece que todavía no tiene auxiliares!" }, "types": { + "counter": "Contador", "input_boolean": "Alternar", "input_datetime": "Fecha y/o hora", "input_number": "Número", "input_select": "Desplegable", - "input_text": "Texto" + "input_text": "Texto", + "timer": "Temporizador" } }, "info": { "built_using": "Construido usando", "caption": "Información", + "copy_github": "Para GitHub", + "copy_raw": "Texto sin formato", "custom_uis": "Interfaces de usuario personalizadas:", "description": "Información sobre la instalación de Home Assistant", "developed_by": "Desarrollado por un grupo de personas increíbles.", @@ -1541,6 +1585,35 @@ "server": "servidor", "source": "Fuente:", "system_health_error": "El componente de mantenimiento del sistema no está cargado. Agregue 'system_health:' a configuration.yaml", + "system_health": { + "checks": { + "cloud": { + "alexa_enabled": "Alexa habilitada", + "google_enabled": "Google habilitado", + "logged_in": "Conectado", + "remote_connected": "Remoto conectado", + "remote_enabled": "Remoto habilitado", + "subscription_expiration": "Vencimiento de la suscripción" + }, + "homeassistant": { + "arch": "Arquitectura de CPU", + "dev": "Desarrollo", + "docker": "Docker", + "hassio": "HassOS", + "installation_type": "Tipo de instalación", + "os_name": "Nombre del sistema operativo", + "os_version": "Versión del sistema operativo", + "python_version": "Versión de Python", + "version": "Versión" + }, + "lovelace": { + "mode": "Modo", + "resources": "Recursos" + } + }, + "manage": "Administrar", + "more_info": "más información" + }, "title": "Información" }, "integration_panel_move": { @@ -1796,7 +1869,8 @@ }, "select_instance": { "header": "Seleccione una instancia OpenZWave", - "introduction": "Tiene más de una instancia de OpenZWave en ejecución. ¿Qué instancia te gustaría gestionar?" + "introduction": "Tiene más de una instancia de OpenZWave en ejecución. ¿Qué instancia te gustaría gestionar?", + "none_found": "No pudimos encontrar una instancia de OpenZWave. Si cree que esto es incorrecto, verifique sus configuraciones de OpenZWave y MQTT y asegúrese de que Home Assistant pueda comunicarse con su corredor de MQTT." } }, "person": { @@ -1807,6 +1881,7 @@ "create_person": "Crear persona", "description": "Gestione las personas que rastrea Home Assistant.", "detail": { + "allow_login": "Permitir que la persona inicie sesión", "confirm_delete_user": "¿Está seguro de que desea eliminar la cuenta de usuario de {name} ? La persona ya no podrá iniciar sesión, pero aún puede rastrear al usuario.", "create": "Crear", "delete": "Eliminar", @@ -1823,8 +1898,10 @@ "update": "Actualizar" }, "introduction": "Aquí puede definir cada persona de interés en Home Assistant.", + "learn_more": "Más información sobre las personas", "no_persons_created_yet": "Parece que todavía no has creado ninguna persona.", "note_about_persons_configured_in_yaml": "Nota: las personas configuradas a través de configuration.yaml no se pueden editar a través de la interfaz de usuario.", + "person_not_found": "No pudimos encontrar a la persona que intentaba editar.", "person_not_found_title": "Persona no encontrada" }, "scene": { @@ -1901,6 +1978,7 @@ "restart": "Reiniciar", "single": "Individual (predeterminado)" }, + "save_script": "Guardar script", "sequence": "Secuencia", "sequence_sentence": "La secuencia de acciones de este script." }, @@ -1914,6 +1992,7 @@ "introduction": "El editor de scripts le permite crear y editar scripts. Por favor, siga el siguiente enlace para leer las instrucciones para asegurarse de que ha configurado Home Assistant correctamente.", "learn_more": "Aprenda más sobre los scripts", "no_scripts": "No pudimos encontrar ningún script editable", + "run_script": "Ejecutar script", "show_info": "Mostrar información sobre el script", "trigger_script": "Desencadenar script" } @@ -1966,9 +2045,12 @@ "add_tag": "Añadir etiqueta", "automation_title": "La etiqueta {name} ha sido escaneada", "caption": "Etiquetas", + "confirm_remove": "¿Está seguro de que desea eliminar la etiqueta {tag}?", + "confirm_remove_title": "¿Eliminar etiqueta?", "create_automation": "Crea automatización con etiqueta", "description": "Gestionar etiquetas", "detail": { + "companion_apps": "aplicaciones complementarias", "create": "Crear", "create_and_write": "Crear y escribir", "delete": "Eliminar", @@ -1977,13 +2059,15 @@ "new_tag": "Nueva etiqueta", "tag_id": "ID de etiqueta", "tag_id_placeholder": "Autogenerado cuando se deja vacío", - "update": "Actualizar" + "update": "Actualizar", + "usage": "Una etiqueta puede activar una automatización cuando se escanea, puede usar etiquetas NFC, códigos QR o cualquier otro tipo de etiqueta. Utilice nuestro {companion_link} para escribir esta etiqueta en una etiqueta NFC programable o cree un código QR a continuación." }, "edit": "Editar", "headers": { "last_scanned": "Último escaneado", "name": "Nombre" }, + "learn_more": "Más información sobre las etiquetas", "never_scanned": "Nunca escaneado", "no_tags": "Sin etiquetas", "write": "Escribir" @@ -2019,6 +2103,7 @@ "update_user": "Actualizar" }, "picker": { + "add_user": "Agregar usuario", "headers": { "group": "Grupo", "name": "Nombre", @@ -2386,6 +2471,14 @@ "refresh": "Actualizar" }, "editor": { + "action-editor": { + "actions": { + "more-info": "Más información", + "navigate": "Navegar", + "none": "Sin acción", + "url": "URL" + } + }, "card": { "alarm-panel": { "available_states": "Estados disponibles", @@ -2414,6 +2507,12 @@ "entities": { "description": "La tarjeta de entidades es el tipo de tarjeta más común. Agrupa elementos en listas.", "name": "Entidades", + "secondary_info_values": { + "brightness": "Brillo", + "last-changed": "Última modificación", + "none": "Sin información secundaria", + "position": "Posición" + }, "show_header_toggle": "¿Mostrar alternancia de encabezado?", "toggle": "Alternar entidades." }, @@ -2539,7 +2638,7 @@ "shopping-list": { "description": "La tarjeta Lista de Compras le permite agregar, editar, marcar y borrar artículos de su lista.", "integration_not_loaded": "Esta tarjeta requiere que se configure la integración `shopping_list`.", - "name": "Lista de la compra" + "name": "Lista de compras" }, "thermostat": { "description": "La tarjeta del termostato le da el control de su entidad climática. Permitiéndole cambiar la temperatura y el modo de la entidad.", @@ -2563,11 +2662,18 @@ "entity": "Entidad", "no_description": "No hay descripción disponible." }, + "common": { + "add": "Agregar", + "clear": "Limpiar", + "edit": "Editar", + "none": "Ninguno" + }, "edit_badges": { "panel_mode": "Estas insignias no se mostrarán porque esta vista está en \"Modo Panel\"." }, "edit_card": { "add": "Agregar tarjeta", + "clear": "Limpiar", "confirm_cancel": "¿Está seguro de que desea cancelar?", "delete": "Eliminar tarjeta", "duplicate": "Tarjeta duplicada", @@ -2606,6 +2712,21 @@ } }, "header": "Editar interfaz de usuario", + "header-footer": { + "footer": "Pie de página", + "header": "Encabezado", + "types": { + "buttons": { + "name": "Botones" + }, + "graph": { + "name": "Gráfico" + }, + "picture": { + "name": "Imagen" + } + } + }, "menu": { "open": "Abre el menú de la interfaz de usuario de Lovelace", "raw_editor": "Editor de configuración en texto" @@ -2643,6 +2764,11 @@ "yaml_control": "Para tomar el control en modo YAML, cree un archivo YAML con el nombre que especificó en su configuración para este tablero, o el valor predeterminado 'ui-lovelace.yaml'.", "yaml_mode": "Está utilizando el modo YAML para este panel, lo que significa que no puede cambiar su configuración de Lovelace desde la interfaz de usuario. Si desea administrar este panel de control desde la interfaz de usuario, elimine 'mode: yaml' de su configuración de Lovelace en 'configuration.yaml.'." }, + "sub-element-editor": { + "types": { + "header": "Editor de encabezado" + } + }, "suggest_card": { "add": "Agregar a Lovelace UI", "create_own": "Elegir una tarjeta diferente", @@ -2859,6 +2985,9 @@ "more_integrations": "Más" }, "intro": "¿Estás listo para despertar tu hogar, reclamar tu privacidad y unirte a una comunidad mundial de experimentadores?", + "restore": { + "in_progress": "Restauración en progreso" + }, "user": { "create_account": "Crear una cuenta", "data": { @@ -2977,6 +3106,9 @@ "header": "Vibrar" } }, + "shopping_list": { + "start_conversation": "Iniciar conversación" + }, "shopping-list": { "add_item": "Agregar elemento", "clear_completed": "Borrar completados", diff --git a/translations/frontend/ja.json b/translations/frontend/ja.json index 4b2c061e08..a890976e00 100644 --- a/translations/frontend/ja.json +++ b/translations/frontend/ja.json @@ -2957,7 +2957,7 @@ "clear": "削除", "confirm_cancel": "キャンセルしてもよいですか?", "delete": "カードを削除", - "duplicate": "重複するカード", + "duplicate": "カードの複製", "edit": "編集", "header": "カード設定", "move": "ビューに移動", diff --git a/translations/frontend/pl.json b/translations/frontend/pl.json index 611856ac66..0aa4658071 100644 --- a/translations/frontend/pl.json +++ b/translations/frontend/pl.json @@ -1743,6 +1743,8 @@ "info": { "built_using": "Zbudowany przy użyciu", "caption": "Informacje", + "copy_github": "Dla GitHuba", + "copy_raw": "Tekst", "custom_uis": "Niestandardowe interfejsy użytkownika:", "description": "Informacje o instalacji Home Assistant", "developed_by": "Opracowany przez grono wspaniałych ludzi.", diff --git a/translations/frontend/pt.json b/translations/frontend/pt.json index 67ce007196..2436d8b26c 100644 --- a/translations/frontend/pt.json +++ b/translations/frontend/pt.json @@ -730,6 +730,7 @@ "enabled_cause": "Desativado por {cause}.", "enabled_description": "Entidades desativadas não serão adicionadas ao Home Assistant.", "enabled_label": "Ativar entidade", + "enabled_restart_confirm": "Reinicie o Home Assistant para ativar as entidades", "entity_id": "Identificação da entidade", "icon": "Substituição do ícone", "icon_error": "Os ícones devem estar no formato 'prefixo:nome do ícone', por exemplo 'mdi:home'.", @@ -750,6 +751,12 @@ "ok": "OK" }, "helper_settings": { + "counter": { + "initial": "Valor inicial", + "maximum": "Valor máximo", + "minimum": "Valor mínimo", + "step": "Tamanho do passo" + }, "generic": { "icon": "Ícone", "name": "Nome" @@ -785,6 +792,9 @@ }, "platform_not_loaded": "A integração {platform} não foi carregada. Por favor, adicione ao ficheiro configuration.yaml, 'default_config:' ou ''{platform}:''.", "required_error_msg": "Este campo é obrigatório", + "timer": { + "duration": "Duração" + }, "yaml_not_editable": "As configurações desta entidade não podem ser editadas a partir do IU. Apenas as entidades adiccionadas a partir da IU são configuráveis a partir da IU." }, "image_cropper": { @@ -792,6 +802,10 @@ }, "more_info_control": { "controls": "Controlos", + "cover": { + "close_cover": "Fechar a capa", + "open_cover": "Abrir capa" + }, "details": "Detalhes", "dismiss": "Descartar diálogo", "edit": "Editar entidade", @@ -855,6 +869,28 @@ }, "quick-bar": { "commands": { + "navigation": { + "areas": "Áreas", + "automation": "Automação", + "core": "Geral", + "customize": "Personalização", + "devices": "Dispositivos", + "entities": "Entidades", + "helpers": "Auxiliares", + "info": "Informação", + "integrations": "Integrações", + "logs": "Logs", + "lovelace": "Painéis Lovelace", + "navigate_to": "Navegar até {panel}", + "navigate_to_config": "Navegar para a configuração {painel}", + "person": "Pessoas", + "scene": "Cenários", + "script": "Script", + "server_control": "Controlo do servidor", + "tags": "Etiquetas", + "users": "Utilizadores", + "zone": "Zonas" + }, "reload": { "automation": "Recarregar automações", "command_line": "Recarregar entidades de linha de comando", @@ -889,6 +925,7 @@ "zone": "Recarregar zonas" }, "server_control": { + "perform_action": "Servidor de {action}", "restart": "Recomeçar", "stop": "Parar" } @@ -949,6 +986,7 @@ "notification_drawer": { "click_to_configure": "Clique no botão para configurar {entity}", "close": "Fechar", + "dismiss_all": "Dispensar todos", "empty": "Sem Notificações", "title": "Notificações" }, @@ -1159,6 +1197,7 @@ }, "unsupported_condition": "Condição não suportada: {condition}" }, + "copy_to_clipboard": "Copiar para a Área de Transferência", "default_name": "Nova Automação", "description": { "label": "Descrição", @@ -1208,6 +1247,7 @@ }, "event": { "context_user_pick": "Selecionar o utilizador", + "context_user_picked": "Evento do utilizador", "event_data": "Dados do evento", "event_type": "Tipo de evento", "label": "Evento" @@ -1307,7 +1347,11 @@ }, "thingtalk": { "create": "Criar automação", + "link_devices": { + "header": "Ótimo! Agora precisamos conectar alguns dispositivos" + }, "task_selection": { + "error_empty": "Entre um comando ou salte este passo.", "for_example": "Por exemplo:", "header": "Criar uma nova automação", "language_note": "Nota: Por enquanto, apenas o inglês é suportado." @@ -1525,6 +1569,7 @@ "different_include": "Possivelmente através de um domínio, um glob ou um include diferente.", "pick_attribute": "Escolha um atributo para substituir.", "picker": { + "documentation": "Documentação de configuração", "entity": "Entidade", "header": "Personalizações", "introduction": "Ajustar atributos por entidade. Personalizações acrescentadas/editadas terão efeitos imediatos. Remoção de personalizações terão efeito quando a entidade for atualizada." @@ -1539,18 +1584,23 @@ "add_prompt": "Nenhum {name} foi adicionado a usar este dispositivo ainda. Podes adicionar um clicando no botão + acima.", "automation": { "actions": { - "caption": "Quando alguma coisa é despoletada..." + "caption": "Quando alguma coisa é despoletada...", + "no_actions": "Nenhuma ação", + "unknown_action": "Ação desconhecida" }, "automations": "Automações", "conditions": { - "caption": "Só fazer alguma coisa se..." + "caption": "Só fazer alguma coisa se...", + "no_conditions": "Sem condições", + "unknown_condition": "Condição desconhecida" }, "create": "Criar automação com dispositivo", "no_automations": "Sem automações", "no_device_automations": "Não há automações disponíveis para este dispositivo.", "triggers": { "caption": "Fazer alguma coisa quando..." - } + }, + "unknown_automation": "Automação desconhecida" }, "cant_edit": "Só pode editar itens que são criados na IU.", "caption": "Dispositivos", @@ -1612,6 +1662,8 @@ }, "filter": { "filter": "Filtro", + "hidden_entities": "{number} {number, plural,\n one {entidade}\n other {entidades}\n} escondidas", + "show_all": "Mostrar tudo", "show_disabled": "Mostrar entidades desativadas", "show_readonly": "Mostrar entidades somente de leitura.", "show_unavailable": "Mostrar entidades indisponíveis" @@ -1667,16 +1719,19 @@ "no_helpers": "Parece que ainda não tem áreas!" }, "types": { + "counter": "Contador", "input_boolean": "Interruptor", "input_datetime": "Data e/ou hora", "input_number": "Número", "input_select": "Lista de selecção", - "input_text": "Texto" + "input_text": "Texto", + "timer": "Temporizador" } }, "info": { "built_using": "Construído com", "caption": "Informação", + "copy_github": "Para GitHub", "custom_uis": "IUs personalizados:", "description": "Ver informações sobre a instalação do Home Assistant", "developed_by": "Desenvolvido por um punhado de pessoas incríveis.", @@ -1696,6 +1751,9 @@ "checks": { "cloud": { "alexa_enabled": "Alexa ativa", + "can_reach_cert_server": "Ligar ao Servidor de Certificados", + "can_reach_cloud": "Ligar ao Home Assistant Cloud", + "can_reach_cloud_auth": "Ligar ao servidor de autenticação", "google_enabled": "Google ativo", "logged_in": "Ligado em", "remote_connected": "Ligado remotamente", @@ -1922,6 +1980,7 @@ "network": "Rede", "node_id": "ID de nó", "ozw_instance": "Instância OpenZWave", + "wakeup_instructions": "Instruções ao acordar", "zwave": "Z-Wave" }, "device_info": { @@ -2040,6 +2099,7 @@ "update": "Atualizar" }, "introduction": "Aqui pode definir cada pessoa de interesse no Home Assistant.", + "learn_more": "Saiba mais sobre pessoas", "no_persons_created_yet": "Parece que você ainda não criou nenhuma pessoa.", "note_about_persons_configured_in_yaml": "Nota: pessoas configuradas via configuration.yaml não podem ser editadas via UI.", "person_not_found": "Não conseguimos encontrar a pessoa que estavas a tentar editar.", @@ -2260,6 +2320,7 @@ "update_user": "Atualizar" }, "picker": { + "add_user": "Adicionar Utilizador", "headers": { "group": "Grupo", "name": "Nome", @@ -2540,6 +2601,8 @@ "filter_attributes": "Filtrar atributos", "filter_entities": "Filtrar entidades", "filter_states": "Filtrar estados", + "last_changed": "Última modificação", + "last_updated": "Última atualização", "more_info": "Mais informações", "no_entities": "Sem entidades", "set_state": "Definir Estado", @@ -2766,6 +2829,9 @@ "description": "O cartão Glance é útil para agrupar vários sensores numa visão geral compacta.", "name": "Relance" }, + "grid": { + "name": "Grelha" + }, "history-graph": { "description": "O cartão Gráfico de histórico permite exibir um gráfico para cada uma das entidades listadas.", "name": "Gráfico de histórico" @@ -2864,6 +2930,9 @@ "edit": "Editar", "none": "Nenhum" }, + "edit_badges": { + "panel_mode": "Estes crachás não serão exibidos porque esta vista está em \"Modo Painel\"." + }, "edit_card": { "add": "Adicionar Cartão", "clear": "Limpar", @@ -3287,7 +3356,8 @@ }, "push_notifications": { "add_device_prompt": { - "input_label": "Nome do dispositivo" + "input_label": "Nome do dispositivo", + "title": "Como se deve chamar este dispositivo?" }, "description": "Enviar notificações para este dispositivo.", "error_load_platform": "Configurar notify.html5.", diff --git a/translations/frontend/sl.json b/translations/frontend/sl.json index 7ec05352e6..17566cec6f 100644 --- a/translations/frontend/sl.json +++ b/translations/frontend/sl.json @@ -676,11 +676,11 @@ }, "relative_time": { "duration": { - "day": "{count} {count, plural,\none {Dan}\nother {Dni}\n}", - "hour": "{count} {count, plural,\n one {Ura}\n other {Ur}\n}", + "day": "{count} {count, plural,\n one {dan}\n other {dni}\n}", + "hour": "{count} {count, plural,\n one {ura}\n two {uri}\n three {ure}\n four {ure}\n other {ur}\n}", "minute": "{count} {count, plural,\n one {minuta}\n other {minut}\n}", "second": "{count} {count, plural,\none {sekunda}\nother {sekund}\n}", - "week": "{count} {count, plural,\none {Teden}\nother {Tednov}\n}" + "week": "{count} {count, plural,\none {Teden}\ntwo {Tedna}\nthree {Tedne}\nfour {Tedne}\nother {Tednov}\n}" }, "future": "Čez {time}", "future_duration": { @@ -977,10 +977,10 @@ } }, "duration": { - "day": "{count} {count, plural,\none {Dan}\nother {Dni}\n}", - "hour": "{count} {count, plural,\n one {Ura}\n other {Ur}\n}", - "minute": "{count} {count, plural,\n one {Minuta}\n other {Minut}\n}", - "second": "{count} {count, plural,\none {Sekunda}\nother {Sekund}\n}", + "day": "{count} {count, plural,\none {dan}\nother {dni}\n}", + "hour": "{count} {count, plural,\n one {ura}\n two {uri}\n three {ure}\n four {ure}\n other {ur}\n}", + "minute": "{count} {count, plural,\n one {minuta}\n two {minuti}\n three {minute}\n four {minute}\n other {minut}\n}", + "second": "{count} {count, plural,\none {sekunda}\ntwo {sekundi}\nthree {sekunde}\nfour {sekunde}\nother {sekund}\n}", "week": "{count} {count, plural,\none {Teden}\nother {Tednov}\n}" }, "login-form": { @@ -1251,7 +1251,7 @@ "trigger": "Sprožilec" }, "event": { - "context_user_pick": "Dodaj uporabnika", + "context_user_pick": "Izberite uporabnika", "context_user_picked": "Dogodek uporabnikove sprožitve", "context_users": "Omeji na dogodke, ki jih sproži", "event_data": "Podatki o dogodku", @@ -1665,12 +1665,12 @@ "disable_selected": { "button": "Onemogoči izbrane", "confirm_text": "Onemogočene entitete ne bodo dodane v Home Assistant.", - "confirm_title": "Ali želite onemogočiti {number} entitet?" + "confirm_title": "Ali želite odstraniti {number} {number, plural,\n one {entiteto}\n two {entiteti}\n other {entitete}\n}?" }, "enable_selected": { "button": "Omogoči izbrane", "confirm_text": "Naprave bodo znova na voljo v Home Assistant-u, če so zdaj onemogočene.", - "confirm_title": "Ali želite omogočiti {number} entiteto/i/e?" + "confirm_title": "Ali želite omogočiti {number} {number, plural,\n one {entiteto}\n two {entiteti}\n other {entitete}\n}?" }, "filter": { "filter": "Filter", @@ -1692,9 +1692,9 @@ "remove_selected": { "button": "Odstrani izbrane", "confirm_partly_text": "Lahko odstranite le {removable} izbranih {selected} entitet. Entitete je mogoče odstraniti le, če integracija ne zagotavlja več entitet. Včasih morate znova zagnati Home Assistant, preden lahko odstranite entitete odstranjene integracije. Ali ste prepričani, da želite odstraniti odstranljive entitete?", - "confirm_partly_title": "Odstranjene so lahko le izbrane {number} entitete.", + "confirm_partly_title": "Samo {number} {number, plural,\n one {izbrana entiteta}\n two {izbrani entiteti}\n tree {izbrane entitete}\n four {izbrane entitete}\n other {izbranih entitet}\n} je lahko odstranjenih.", "confirm_text": "Če vsebujejo te entitete, bi jih morali odstraniti iz vašega Lovelace config-a in avtomatizacije.", - "confirm_title": "Ali želite odstraniti {number} entiteto-i/e?" + "confirm_title": "Ali želite odstraniti {number} {number, plural,\n one {entiteto}\n two {entiteti}\n other {entitete}\n}?" }, "search": "Iskanje entitet", "selected": "{številka} izbrana/ih", @@ -1950,7 +1950,7 @@ "type": "Vrsta vira", "update": "Posodobi", "url": "URL", - "url_error_msg": "Url je obvezno polje", + "url_error_msg": "URL je obvezno polje", "warning_header": "Bodite previdni!", "warning_text": "Dodajanje virov je lahko nevarno, prepričajte se, da poznate vir vira in jim zaupate. Slabi viri lahko resno škodijo vašemu sistemu." }, @@ -1962,7 +1962,7 @@ }, "no_resources": "Brez virov" }, - "refresh_body": "Če želite dokončati odstranitev, morate osvežiti stran, ali jo želite zdaj osvežiti?", + "refresh_body": "Če želite dokončati odstranitev, morate osvežiti stran. Jo morda želite osvežiti zdaj?", "refresh_header": "Ali želite osvežiti?", "types": { "css": "Slogovna stran", @@ -2015,6 +2015,8 @@ "network_status": { "details": { "driverallnodesqueried": "Poizvedena so bila vsa vozlišča", + "driverallnodesqueriedsomedead": "Poizvedena so bila vsa vozlišča. Nekatera vozlišča so bila najdena mrtva.", + "driverawakenodesqueries": "Poizvedena so bila vsa budna vozlišča", "driverfailed": "Povezava s krmilnikom Z-Wave ni uspela", "driverready": "Inicializacija krmilnika Z-Wave", "driverremoved": "Gonilnik je odstranjen", @@ -2038,22 +2040,29 @@ "node_config": { "header": "Konfiguracija vozlišča", "help_source": "Opisi konfiguracijskih parametrov in besedilo pomoči zagotavlja projekt OpenZWave.", - "introduction": "Upravljajte različne konfiguracijske parametre za vozlišče Z-Wave." + "introduction": "Upravljajte različne konfiguracijske parametre za vozlišče Z-Wave.", + "wakeup_help": "Vozlišča, ki jih napajajo baterije morajo biti budna, da lahko spreminjate njihovo konfiguracijo. Če vozlišče ni budno, bo OpenZWave poskusil posodobiti konfiguracijo vozlišča naslednjič, ko se zbudi, kar pa bi lahko bilo več ur (ali dni) kasneje. Sledite tem korakom, da zbudite napravo:" }, "node_metadata": { "product_manual": "Priročnik za izdelek" }, "node_query_stages": { + "associations": "Osveževanje pridružitvenih skupin in članstev", + "cacheload": "Nalaganje informacij iz datotek predpomnilnika OpenZWave. Vozlišča na bateriji bodo ostala na tej stopnji, dokler se vozlišče ne zbudi.", "complete": "Postopek intervjuja je končan", "configuration": "Pridobitev konfiguracijskih vrednosti iz vozlišča", "dynamic": "Pridobivanje pogosto spreminjajočih se vrednosti iz vozlišča", + "instances": "Pridobivanje podatkov o tem, katere instance ali kanale naprava podpira", "manufacturerspecific1": "Pridobivanje identifikacijskih kod proizvajalca in izdelka iz vozlišča", "manufacturerspecific2": "Pridobivanje dodatnih identifikacijskih kod proizvajalca in izdelka iz vozlišča", + "neighbors": "Pridobivanje seznama sosedov", "nodeinfo": "Pridobivanje podprtih razredov ukazov iz vozlišča", "nodeplusinfo": "Pridobivanje informacij o Z-Wave + iz vozlišča", "probe": "Preverjanje, ali je vozlišče budno / živo", "protocolinfo": "Pridobivanje osnovnih zmožnosti Z-Wave tega vozlišča od krmilnika", "session": "Pridobitev redko spreminjajočih se vrednosti iz vozlišča", + "static": "Pridobivanje statičnih vrednosti iz naprave.", + "versions": "Pridobivanje informacij o različicah vdelane programske opreme in o ukaznih razredov", "wakeup": "Nastavljanje podpore za vrste in sporočila za prebujanje" }, "node": { @@ -2065,12 +2074,14 @@ "id": "ID", "manufacturer": "Proizvajalec", "model": "Model", + "query_stage": "Stopnja poizvedbe", "zwave_plus": "Z-Wave Plus" }, "refresh_node": { "battery_note": "Če vozlišče napaja baterijo, se pred nadaljevanjem prepričajte, da ga zbudite", "button": "Osveži vozlišče", "complete": "Osveževanje vozlišča je končano", + "description": "To bo OpenZWave-u sporočilo, naj znova vzpostavi komunikacijo s vozliščem in posodobi njegove ukazne razrede, zmožnosti in vrednosti vozlišča.", "node_status": "Stanje vozlišča", "refreshing_description": "Osveževanje informacij o vozlišču ...", "start_refresh_button": "Začni osveževanje", @@ -2080,7 +2091,9 @@ "wakeup_instructions_source": "Navodila za prebujanje so pridobljena iz podatkovne zbirke naprav OpenZWave." }, "select_instance": { - "header": "Izberite OpenZWave instanco" + "header": "Izberite OpenZWave instanco", + "introduction": "Izvaja se več kot ena OpenZWave instanca. S katero instanco bi radi upravljali?", + "none_found": "OpenZWave instance ni bilo mogoče najti. Če menite, da je prišlo do napake, preverite vašo OpenZWave in MQTT konfiguracijo in zagotovite, da Home Assistant lahko komunicira z vašim MQTT posrednikom." }, "services": { "add_node": "Dodaj vozlišče", @@ -2238,7 +2251,7 @@ "input_text": "Ponovno naloži vhodna besedila", "introduction": "Nekateri deli programa Home Assistant se lahko naložijo brez ponovnega zagona. S ponovnim nalaganjem se trenutna konfiguracija YAML zamenja in naloži nova.", "min_max": "Znova naloži entitete min/max", - "mqtt": "Ročno osveži konfigurirane entitete MQTT", + "mqtt": "Znova naložite ročno konfigurirane entitete MQTT", "person": "Ponovno naloži osebe", "ping": "Znova naloži entitete binarnega senzorja PING", "reload": "Znova naloži {domain}", @@ -2705,7 +2718,7 @@ } }, "changed_toast": { - "message": "Nastavitve uporabniškega vmesnika Lovelace za to nadzorno ploščo so bile posodobljene, če želite videti spremembe jo morate osvežiti.", + "message": "Nastavitve uporabniškega vmesnika Lovelace za to nadzorno ploščo so bile posodobljene. Če želite videti spremembe, jo osvežite.", "refresh": "Osveži" }, "editor": { @@ -2721,7 +2734,7 @@ }, "editor_service_data": "Podatke o storitvah lahko vnesete samo v urejevalniku kode", "navigation_path": "Navigacijska pot", - "url_path": "Url pot" + "url_path": "Pot URL-ja" }, "card": { "alarm-panel": { @@ -3089,7 +3102,7 @@ }, "reload_lovelace": "Ponovno naloži uporabniški vmesnik", "reload_resources": { - "refresh_body": "Če želite dokončati ponovno nalaganje, morate osvežiti stran, ali jo želite zdaj osvežiti?", + "refresh_body": "Če želite dokončati ponovno nalaganje, morate osvežiti stran. Ali jo želite zdaj osvežiti?", "refresh_header": "Ali želite osvežiti?" }, "unused_entities": { From 7d3acc747dedf2d5409f322c40d7d428a1ee875e Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 17 Nov 2020 09:40:35 +0100 Subject: [PATCH 17/90] Guard passing invalid tag to customElements.whenDefined (#7696) --- .../create-element/create-element-base.ts | 36 ++++++++++++------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/src/panels/lovelace/create-element/create-element-base.ts b/src/panels/lovelace/create-element/create-element-base.ts index 5c35c44a0a..a3c700d28b 100644 --- a/src/panels/lovelace/create-element/create-element-base.ts +++ b/src/panels/lovelace/create-element/create-element-base.ts @@ -104,6 +104,10 @@ const _customCreate = ( `Custom element doesn't exist: ${tag}.`, config ); + // Custom elements are required to have a - in the name + if (!tag.includes("-")) { + return element; + } element.style.display = "None"; const timer = window.setTimeout(() => { element.style.display = ""; @@ -244,20 +248,26 @@ export const getLovelaceElementClass = async < if (customTag) { const customCls = customElements.get(customTag); - return ( - customCls || - new Promise((resolve, reject) => { - // We will give custom components up to TIMEOUT seconds to get defined - setTimeout( - () => reject(new Error(`Custom element not found: ${customTag}`)), - TIMEOUT - ); + if (customCls) { + return customCls; + } - customElements - .whenDefined(customTag) - .then(() => resolve(customElements.get(customTag))); - }) - ); + // Custom elements are required to have a - in the name + if (!customTag.includes("-")) { + throw new Error(`Custom element not found: ${customTag}`); + } + + return new Promise((resolve, reject) => { + // We will give custom components up to TIMEOUT seconds to get defined + setTimeout( + () => reject(new Error(`Custom element not found: ${customTag}`)), + TIMEOUT + ); + + customElements + .whenDefined(customTag) + .then(() => resolve(customElements.get(customTag))); + }); } const tag = `hui-${type}-${tagSuffix}`; From 473e381d756ce11b1842901dc04d72bf55719e98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Lov=C3=A9n?= Date: Tue, 17 Nov 2020 09:43:25 +0100 Subject: [PATCH 18/90] Fix date picker row alignment (#7704) --- src/components/ha-date-input.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/components/ha-date-input.ts b/src/components/ha-date-input.ts index bdccf06cb3..131e7ced25 100644 --- a/src/components/ha-date-input.ts +++ b/src/components/ha-date-input.ts @@ -2,6 +2,22 @@ import "@vaadin/vaadin-date-picker/theme/material/vaadin-date-picker"; const VaadinDatePicker = customElements.get("vaadin-date-picker"); +const documentContainer = document.createElement("template"); +documentContainer.setAttribute("style", "display: none;"); +documentContainer.innerHTML = ` + + + +`; +document.head.appendChild(documentContainer.content); + export class HaDateInput extends VaadinDatePicker { constructor() { super(); From af1518e924a556ee3aadf48cc10c1eb73dbab8a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Tue, 17 Nov 2020 14:33:13 +0100 Subject: [PATCH 19/90] Use stepid title if present for progress flow (#7710) --- src/dialogs/config-flow/show-dialog-config-flow.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/dialogs/config-flow/show-dialog-config-flow.ts b/src/dialogs/config-flow/show-dialog-config-flow.ts index a42663ea6b..452d83cb22 100644 --- a/src/dialogs/config-flow/show-dialog-config-flow.ts +++ b/src/dialogs/config-flow/show-dialog-config-flow.ts @@ -162,7 +162,11 @@ export const showConfigFlowDialog = ( }, renderShowFormProgressHeader(hass, step) { - return hass.localize(`component.${step.handler}.title`); + return ( + hass.localize( + `component.${step.handler}.config.step.${step.step_id}.title` + ) || hass.localize(`component.${step.handler}.title`) + ); }, renderShowFormProgressDescription(hass, step) { From 8fd1f35c59b52ffd5e5a94499d5f9e3f2d3132be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Tue, 17 Nov 2020 15:12:45 +0100 Subject: [PATCH 20/90] Move data_entry_flow_progressed event subscriber (#7700) --- .../config-flow/dialog-data-entry-flow.ts | 18 ++++++++++++++- src/dialogs/config-flow/step-flow-external.ts | 18 +-------------- src/dialogs/config-flow/step-flow-progress.ts | 22 +------------------ 3 files changed, 19 insertions(+), 39 deletions(-) diff --git a/src/dialogs/config-flow/dialog-data-entry-flow.ts b/src/dialogs/config-flow/dialog-data-entry-flow.ts index 2b5660bf89..fc7102cc71 100644 --- a/src/dialogs/config-flow/dialog-data-entry-flow.ts +++ b/src/dialogs/config-flow/dialog-data-entry-flow.ts @@ -22,7 +22,10 @@ import { AreaRegistryEntry, subscribeAreaRegistry, } from "../../data/area_registry"; -import type { DataEntryFlowStep } from "../../data/data_entry_flow"; +import type { + DataEntryFlowProgressedEvent, + DataEntryFlowStep, +} from "../../data/data_entry_flow"; import { DeviceRegistryEntry, subscribeDeviceRegistry, @@ -224,6 +227,19 @@ class DataEntryFlowDialog extends LitElement { protected firstUpdated(changedProps: PropertyValues) { super.firstUpdated(changedProps); + this.hass.connection.subscribeEvents( + async (ev) => { + if (ev.data.flow_id !== this._step?.flow_id) { + return; + } + const step = await this._params!.flowConfig.fetchFlow( + this.hass, + this._step?.flow_id + ); + this._processStep(step); + }, + "data_entry_flow_progressed" + ); this.addEventListener("flow-update", (ev) => { const { step, stepPromise } = (ev as any).detail; this._processStep(step || stepPromise); diff --git a/src/dialogs/config-flow/step-flow-external.ts b/src/dialogs/config-flow/step-flow-external.ts index 757399763d..70ecda2f32 100644 --- a/src/dialogs/config-flow/step-flow-external.ts +++ b/src/dialogs/config-flow/step-flow-external.ts @@ -8,11 +8,7 @@ import { property, TemplateResult, } from "lit-element"; -import { fireEvent } from "../../common/dom/fire_event"; -import { - DataEntryFlowProgressedEvent, - DataEntryFlowStepExternal, -} from "../../data/data_entry_flow"; +import { DataEntryFlowStepExternal } from "../../data/data_entry_flow"; import { HomeAssistant } from "../../types"; import { FlowConfig } from "./show-dialog-data-entry-flow"; import { configFlowContentStyles } from "./styles"; @@ -51,18 +47,6 @@ class StepFlowExternal extends LitElement { protected firstUpdated(changedProps) { super.firstUpdated(changedProps); - this.hass.connection.subscribeEvents( - async (ev) => { - if (ev.data.flow_id !== this.step.flow_id) { - return; - } - - fireEvent(this, "flow-update", { - stepPromise: this.flowConfig.fetchFlow(this.hass, this.step.flow_id), - }); - }, - "data_entry_flow_progressed" - ); window.open(this.step.url); } diff --git a/src/dialogs/config-flow/step-flow-progress.ts b/src/dialogs/config-flow/step-flow-progress.ts index 57ba59560c..fc12f9b5c5 100644 --- a/src/dialogs/config-flow/step-flow-progress.ts +++ b/src/dialogs/config-flow/step-flow-progress.ts @@ -8,12 +8,8 @@ import { property, TemplateResult, } from "lit-element"; -import { fireEvent } from "../../common/dom/fire_event"; import "../../components/ha-circular-progress"; -import { - DataEntryFlowProgressedEvent, - DataEntryFlowStepProgress, -} from "../../data/data_entry_flow"; +import { DataEntryFlowStepProgress } from "../../data/data_entry_flow"; import { HomeAssistant } from "../../types"; import { FlowConfig } from "./show-dialog-data-entry-flow"; import { configFlowContentStyles } from "./styles"; @@ -43,22 +39,6 @@ class StepFlowProgress extends LitElement { `; } - protected firstUpdated(changedProps) { - super.firstUpdated(changedProps); - this.hass.connection.subscribeEvents( - async (ev) => { - if (ev.data.flow_id !== this.step.flow_id) { - return; - } - - fireEvent(this, "flow-update", { - stepPromise: this.flowConfig.fetchFlow(this.hass, this.step.flow_id), - }); - }, - "data_entry_flow_progressed" - ); - } - static get styles(): CSSResult[] { return [ configFlowContentStyles, From 530f494df8eb07c54f931fec289e6f67f3387277 Mon Sep 17 00:00:00 2001 From: Philip Allgaier Date: Tue, 17 Nov 2020 15:46:00 +0100 Subject: [PATCH 21/90] Improve gallery hui-light-card (#7684) --- gallery/src/demos/demo-hui-light-card.ts | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/gallery/src/demos/demo-hui-light-card.ts b/gallery/src/demos/demo-hui-light-card.ts index 552bb2b0df..97808f930a 100644 --- a/gallery/src/demos/demo-hui-light-card.ts +++ b/gallery/src/demos/demo-hui-light-card.ts @@ -8,29 +8,43 @@ import "../components/demo-cards"; const ENTITIES = [ getEntity("light", "bed_light", "on", { friendly_name: "Bed Light", - brightness: 130, + brightness: 255, }), - getEntity("light", "dim", "off", { + getEntity("light", "dim_on", "on", { + friendly_name: "Dining Room", + supported_features: 1, + brightness: 100, + }), + getEntity("light", "dim_off", "off", { + friendly_name: "Dining Room", supported_features: 1, }), getEntity("light", "unavailable", "unavailable", { + friendly_name: "Lost Light", supported_features: 1, }), ]; const CONFIGS = [ { - heading: "Basic example", + heading: "Switchable Light", config: ` - type: light entity: light.bed_light `, }, { - heading: "Dim", + heading: "Dimmable Light On", config: ` - type: light - entity: light.dim + entity: light.dim_on + `, + }, + { + heading: "Dimmable Light Off", + config: ` +- type: light + entity: light.dim_off `, }, { From 7c492338a235dd1bf6d219b48b4a7273a88043b6 Mon Sep 17 00:00:00 2001 From: Philip Allgaier Date: Tue, 17 Nov 2020 15:46:33 +0100 Subject: [PATCH 22/90] Improve gallery hui-gauge-card (#7682) --- gallery/src/demos/demo-hui-gauge-card.ts | 45 ++++++++++++++++++------ 1 file changed, 34 insertions(+), 11 deletions(-) diff --git a/gallery/src/demos/demo-hui-gauge-card.ts b/gallery/src/demos/demo-hui-gauge-card.ts index 5dd0cf582b..1704d31f6e 100644 --- a/gallery/src/demos/demo-hui-gauge-card.ts +++ b/gallery/src/demos/demo-hui-gauge-card.ts @@ -7,6 +7,8 @@ import "../components/demo-cards"; const ENTITIES = [ getEntity("sensor", "brightness", "12", {}), + getEntity("sensor", "brightness_medium", "53", {}), + getEntity("sensor", "brightness_high", "87", {}), getEntity("plant", "bonsai", "ok", {}), getEntity("sensor", "not_working", "unavailable", {}), getEntity("sensor", "outside_humidity", "54", { @@ -21,16 +23,10 @@ const CONFIGS = [ { heading: "Basic example", config: ` -- type: gauge - entity: sensor.brightness - `, - }, - { - heading: "With title", - config: ` - type: gauge title: Humidity entity: sensor.outside_humidity + name: Outside Humidity `, }, { @@ -39,6 +35,7 @@ const CONFIGS = [ - type: gauge entity: sensor.outside_temperature unit_of_measurement: C + name: Outside Temperature `, }, { @@ -46,19 +43,45 @@ const CONFIGS = [ config: ` - type: gauge entity: sensor.brightness + name: Brightness Low severity: - red: 32 + red: 75 green: 0 - yellow: 23 + yellow: 50 `, }, { - heading: "Setting Min and Max Values", + heading: "Setting Severity Levels", + config: ` +- type: gauge + entity: sensor.brightness_medium + name: Brightness Medium + severity: + red: 75 + green: 0 + yellow: 50 + `, + }, + { + heading: "Setting Severity Levels", + config: ` +- type: gauge + entity: sensor.brightness_high + name: Brightness High + severity: + red: 75 + green: 0 + yellow: 50 + `, + }, + { + heading: "Setting Min (0) and Max (15) Values", config: ` - type: gauge entity: sensor.brightness + name: Brightness min: 0 - max: 38 + max: 15 `, }, { From 90f7dba793d0918ea234a75c4912eb30f1db3d03 Mon Sep 17 00:00:00 2001 From: Philip Allgaier Date: Tue, 17 Nov 2020 15:48:54 +0100 Subject: [PATCH 23/90] Use proper night time icon consistently for sun integration (#7681) --- src/common/entity/domain_icon.ts | 5 +++++ src/components/entity/ha-state-label-badge.ts | 5 +---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/common/entity/domain_icon.ts b/src/common/entity/domain_icon.ts index e555b0e286..836c5024dc 100644 --- a/src/common/entity/domain_icon.ts +++ b/src/common/entity/domain_icon.ts @@ -77,6 +77,11 @@ export const domainIcon = ( return "hass:calendar"; } break; + + case "sun": + return stateObj?.state === "above_horizon" + ? FIXED_DOMAIN_ICONS[domain] + : "hass:weather-night"; } if (domain in FIXED_DOMAIN_ICONS) { diff --git a/src/components/entity/ha-state-label-badge.ts b/src/components/entity/ha-state-label-badge.ts index b38259b210..61d68fc1c1 100644 --- a/src/components/entity/ha-state-label-badge.ts +++ b/src/components/entity/ha-state-label-badge.ts @@ -154,11 +154,8 @@ export class HaStateLabelBadge extends LitElement { case "device_tracker": case "updater": case "person": - return stateIcon(state); case "sun": - return state.state === "above_horizon" - ? domainIcon(domain) - : "hass:brightness-3"; + return stateIcon(state); case "timer": return state.state === "active" ? "hass:timer-outline" From 4c6f9f0dd8772b5be9108bdc38096c79ef1e8044 Mon Sep 17 00:00:00 2001 From: Philip Allgaier Date: Tue, 17 Nov 2020 15:51:18 +0100 Subject: [PATCH 24/90] Fix empty entity pickers for "Time" trigger and condition (#7689) --- .../automation/condition/types/ha-automation-condition-time.ts | 1 + .../automation/trigger/types/ha-automation-trigger-time.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/src/panels/config/automation/condition/types/ha-automation-condition-time.ts b/src/panels/config/automation/condition/types/ha-automation-condition-time.ts index f9398b197d..0180a7494f 100644 --- a/src/panels/config/automation/condition/types/ha-automation-condition-time.ts +++ b/src/panels/config/automation/condition/types/ha-automation-condition-time.ts @@ -94,6 +94,7 @@ export class HaTimeCondition extends LitElement implements ConditionElement { .value=${after?.startsWith("input_datetime.") ? after : ""} @value-changed=${this._valueChanged} .hass=${this.hass} + allow-custom-entity >` : html`` : html` Date: Tue, 17 Nov 2020 16:08:47 +0100 Subject: [PATCH 25/90] Display entity ID for read-only entities (#7690) --- src/panels/config/entities/dialog-entity-editor.ts | 2 ++ src/translations/en.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/panels/config/entities/dialog-entity-editor.ts b/src/panels/config/entities/dialog-entity-editor.ts index c12c79d28e..441edbfa98 100644 --- a/src/panels/config/entities/dialog-entity-editor.ts +++ b/src/panels/config/entities/dialog-entity-editor.ts @@ -173,6 +173,8 @@ export class DialogEntityEditor extends LitElement {
${this.hass.localize( "ui.dialogs.entity_registry.no_unique_id", + "entity_id", + this._params!.entity_id, "faq_link", html` Date: Tue, 17 Nov 2020 16:14:37 +0100 Subject: [PATCH 26/90] Allow dismissing (#7712) --- .gitignore | 2 +- .../config/dashboard/ha-config-dashboard.ts | 52 ++++++++++++++++--- 2 files changed, 47 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 74fe1c8f92..317cc85ab2 100644 --- a/.gitignore +++ b/.gitignore @@ -37,4 +37,4 @@ yarn-error.log .tool-versions # Home Assistant config -config \ No newline at end of file +/config diff --git a/src/panels/config/dashboard/ha-config-dashboard.ts b/src/panels/config/dashboard/ha-config-dashboard.ts index f16118a47d..9ef4aa5b67 100644 --- a/src/panels/config/dashboard/ha-config-dashboard.ts +++ b/src/panels/config/dashboard/ha-config-dashboard.ts @@ -13,6 +13,7 @@ import { import { isComponentLoaded } from "../../../common/config/is_component_loaded"; import "../../../components/ha-card"; import "../../../components/ha-icon-next"; +import "../../../components/ha-svg-icon"; import "../../../components/ha-menu-button"; import { CloudStatus } from "../../../data/cloud"; import { haStyle } from "../../../resources/styles"; @@ -20,7 +21,8 @@ import { HomeAssistant } from "../../../types"; import "../ha-config-section"; import { configSections } from "../ha-panel-config"; import "./ha-config-navigation"; -import { mdiCloudLock } from "@mdi/js"; +import { mdiClose, mdiCloudLock } from "@mdi/js"; +import { showConfirmationDialog } from "../../../dialogs/generic/show-dialog-box"; const CONF_HAPPENING = new Date() < new Date("2020-12-13T23:00:00Z"); @@ -69,17 +71,22 @@ class HaConfigDashboard extends LitElement { ` : ""} - ${CONF_HAPPENING + ${CONF_HAPPENING && !localStorage.dismissConf2020 ? html` - + -
+
+ + + ` : ""} ${Object.values(configSections).map( @@ -157,6 +164,33 @@ class HaConfigDashboard extends LitElement { `; } + private async _dismissConference() { + if ( + await showConfirmationDialog(this, { + title: "Home Assistant Conference", + text: html` + If you've + bought your ticket + or have + subscribed to the livestream, you might want to dismiss this banner. Do you want to continue? + `, + }) + ) { + localStorage.dismissConf2020 = "1"; + this.requestUpdate(); + } + } + static get styles(): CSSResultArray { return [ haStyle, @@ -196,6 +230,12 @@ class HaConfigDashboard extends LitElement { align-items: center; color: white; } + .conf-card ha-svg-icon { + position: absolute; + bottom: -4px; + left: -4px; + color: #a2cdf3; + } .promo-advanced { text-align: center; color: var(--secondary-text-color); From 7499892bc2551ab98c8fb48e973cf406c3302e5b Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 17 Nov 2020 22:00:28 +0100 Subject: [PATCH 27/90] Don't support safari 10 in minifaction for latest support (#7719) --- build-scripts/bundle.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-scripts/bundle.js b/build-scripts/bundle.js index 41f60aa66d..7012ad37f6 100644 --- a/build-scripts/bundle.js +++ b/build-scripts/bundle.js @@ -44,7 +44,7 @@ module.exports.definedVars = ({ isProdBuild, latestBuild, defineOverlay }) => ({ }); module.exports.terserOptions = (latestBuild) => ({ - safari10: true, + safari10: !latestBuild, ecma: latestBuild ? undefined : 5, output: { comments: false }, }); From 394d5528562ec1e9f649cf8e5968a7d1eb9120f1 Mon Sep 17 00:00:00 2001 From: Josh McCarty Date: Tue, 17 Nov 2020 14:29:20 -0700 Subject: [PATCH 28/90] Use ha-dialog for dialog-system-log-details, add close icon button (#7513) --- .../config/logs/dialog-system-log-detail.ts | 64 +++++++++---------- 1 file changed, 30 insertions(+), 34 deletions(-) diff --git a/src/panels/config/logs/dialog-system-log-detail.ts b/src/panels/config/logs/dialog-system-log-detail.ts index 34d0cfcd1a..320657f8c4 100644 --- a/src/panels/config/logs/dialog-system-log-detail.ts +++ b/src/panels/config/logs/dialog-system-log-detail.ts @@ -1,6 +1,6 @@ +import "../../../components/ha-header-bar"; import "@material/mwc-icon-button/mwc-icon-button"; -import { mdiContentCopy } from "@mdi/js"; -import "@polymer/paper-dialog-scrollable/paper-dialog-scrollable"; +import { mdiContentCopy, mdiClose } from "@mdi/js"; import "@polymer/paper-tooltip/paper-tooltip"; import type { PaperTooltipElement } from "@polymer/paper-tooltip/paper-tooltip"; import { @@ -14,7 +14,7 @@ import { TemplateResult, } from "lit-element"; import { fireEvent } from "../../../common/dom/fire_event"; -import "../../../components/dialog/ha-paper-dialog"; +import "../../../components/ha-dialog"; import "../../../components/ha-svg-icon"; import { domainToName, @@ -23,7 +23,6 @@ import { IntegrationManifest, } from "../../../data/integration"; import { getLoggedErrorIntegration } from "../../../data/system_log"; -import type { PolymerChangedEvent } from "../../../polymer-types"; import { haStyleDialog } from "../../../resources/styles"; import type { HomeAssistant } from "../../../types"; import type { SystemLogDetailDialogParams } from "./show-dialog-system-log-detail"; @@ -36,7 +35,7 @@ class DialogSystemLogDetail extends LitElement { @internalProperty() private _manifest?: IntegrationManifest; - @query("paper-tooltip", true) private _toolTip?: PaperTooltipElement; + @query("paper-tooltip") private _toolTip?: PaperTooltipElement; public async showDialog(params: SystemLogDetailDialogParams): Promise { this._params = params; @@ -69,23 +68,23 @@ class DialogSystemLogDetail extends LitElement { const integration = getLoggedErrorIntegration(item); return html` - -
-

+ + + + + + ${this.hass.localize( "ui.panel.config.logs.details", "level", item.level )} -

- + + ${this.hass.localize("ui.common.copied")} -
- + +

Logger: ${item.name}
Source: ${item.source.join(":")} @@ -150,8 +149,8 @@ class DialogSystemLogDetail extends LitElement { ` : item.message[0]} ${item.exception ? html`

${item.exception}
` : html``} - - +
+ `; } @@ -163,15 +162,9 @@ class DialogSystemLogDetail extends LitElement { } } - private _openedChanged(ev: PolymerChangedEvent): void { - if (!(ev.detail as any).value) { - this.closeDialog(); - } - } - private _copyLog(): void { const copyElement = this.shadowRoot?.querySelector( - "paper-dialog-scrollable" + ".contents" ) as HTMLElement; const selection = window.getSelection()!; @@ -192,9 +185,6 @@ class DialogSystemLogDetail extends LitElement { return [ haStyleDialog, css` - ha-paper-dialog { - direction: ltr; - } a { color: var(--primary-color); } @@ -205,13 +195,19 @@ class DialogSystemLogDetail extends LitElement { margin-bottom: 0; font-family: var(--code-font-family, monospace); } - .heading { - display: flex; - align-items: center; - justify-content: space-between; + + ha-header-bar { + --mdc-theme-on-primary: var(--primary-text-color); + --mdc-theme-primary: var(--mdc-theme-surface); + flex-shrink: 0; + border-bottom: 1px solid + var(--mdc-dialog-scroll-divider-color, rgba(0, 0, 0, 0.12)); } - .heading ha-svg-icon { - cursor: pointer; + + @media all and (min-width: 451px) and (min-height: 501px) { + ha-dialog { + --mdc-dialog-max-width: 90vw; + } } `, ]; From 33183cc59546d1fcad31fbea30a5ec8ed76ee16c Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Wed, 18 Nov 2020 00:32:28 +0000 Subject: [PATCH 29/90] [ci skip] Translation update --- translations/frontend/af.json | 2 +- translations/frontend/de.json | 4 +- translations/frontend/en.json | 2 +- translations/frontend/es-419.json | 141 ++++++++++++++++++++++++++++-- translations/frontend/fr.json | 103 ++++++++++++++++++++++ translations/frontend/pt-BR.json | 132 ++++++++++++++++++++++++++-- translations/frontend/ru.json | 4 +- 7 files changed, 369 insertions(+), 19 deletions(-) diff --git a/translations/frontend/af.json b/translations/frontend/af.json index 8ed62c5993..0ceb975671 100644 --- a/translations/frontend/af.json +++ b/translations/frontend/af.json @@ -1091,7 +1091,7 @@ "confirm_delete_ignore": "Dit sal die integrasie weer in u ontdekte integrasies laat verskyn wanneer dit ontdek word. Dit kan herbegin of 'n geruime tyd neem.", "confirm_delete_ignore_title": "Hou op om {name} ignoreer?", "confirm_ignore": "Is u seker dat u nie hierdie integrasie wil instel nie? U kan dit ongedaan maak deur op die 'Wys geïgnoreerde integrasies' in die oorloopmenu regs bo te klik.", - "confirm_ignore_title": "Ignoreer ontdekking van {naam}?", + "confirm_ignore_title": "Ignoreer ontdekking van {name}?", "hide_ignored": "Verberg geïgnoreerde integrasies", "ignore": "Ignoreer", "ignored": "Geïgnoreer", diff --git a/translations/frontend/de.json b/translations/frontend/de.json index 5adabae758..f56a508f03 100644 --- a/translations/frontend/de.json +++ b/translations/frontend/de.json @@ -806,7 +806,8 @@ "controls": "Steuerelemente", "cover": { "close_cover": "Abdeckung schließen", - "open_cover": "Abdeckung öffnen" + "open_cover": "Abdeckung öffnen", + "stop_cover": "Abdeckung anhalten" }, "details": "Details", "dismiss": "Dialog ausblenden", @@ -882,6 +883,7 @@ "info": "Info", "integrations": "Integrationen", "logs": "Logs", + "lovelace": "Lovelace Dashboards", "navigate_to": "Navigiere zu {panel}", "navigate_to_config": "Navigiere zur {panel} Konfiguration", "person": "Personen", diff --git a/translations/frontend/en.json b/translations/frontend/en.json index d0563e02a2..e965bcae41 100644 --- a/translations/frontend/en.json +++ b/translations/frontend/en.json @@ -741,7 +741,7 @@ "update": "Update" }, "faq": "documentation", - "no_unique_id": "This entity does not have a unique ID, therefore its settings cannot be managed from the UI. See the {faq_link} for more detail.", + "no_unique_id": "This entity (\"{entity_id}\") does not have a unique ID, therefore its settings cannot be managed from the UI. See the {faq_link} for more detail.", "related": "Related", "settings": "Settings" }, diff --git a/translations/frontend/es-419.json b/translations/frontend/es-419.json index 3e1fbbf299..303a74b2ec 100644 --- a/translations/frontend/es-419.json +++ b/translations/frontend/es-419.json @@ -496,9 +496,11 @@ "wnw": "ONO", "wsw": "OSO" }, + "day": "Día", "forecast": "Pronóstico", "high": "Alto", - "low": "Bajo" + "low": "Bajo", + "night": "Noche" } }, "common": { @@ -507,6 +509,7 @@ "cancel": "Cancelar", "close": "Cerrar", "continue": "Continuar", + "copied": "Copiado", "delete": "Eliminar", "disable": "Deshabilitar", "enable": "Habilitar", @@ -523,6 +526,7 @@ "remove": "Eliminar", "rename": "Renombrar", "save": "Guardar", + "skip": "Saltar", "stay": "Permanecer", "successfully_deleted": "Eliminado exitosamente", "successfully_saved": "Guardado correctamente", @@ -577,6 +581,7 @@ "logbook": { "entries_not_found": "No se encontraron entradas en el libro de registro.", "messages": { + "became_unavailable": "dejó de estar disponible", "was_at_state": "estaba en {state}", "was_locked": "fue cerrado" } @@ -614,15 +619,19 @@ "playlist": "Lista de reproducción", "server": "Servidor" }, + "documentation": "documentación", "media_browsing_error": "Error de navegación de medios", "media_not_supported": "El Reproductor multimedia no es compatible con este tipo de medios", "media_player": "Reproductor multimedia", "media-player-browser": "Navegador del reproductor multimedia", "no_items": "No hay elementos", + "no_local_media_found": "No se encontraron medios locales", + "no_media_folder": "Parece que aún no ha creado un directorio multimedia.", "pick": "Elegir", "pick-media": "Elija medios", "play": "Reproducir", "play-media": "Reproducir medios", + "setup_local_help": "Consulte la {documentation} sobre cómo configurar medios locales.", "video_not_supported": "Su navegador no soporta el elemento de vídeo.", "web-browser": "Navegador web" }, @@ -656,6 +665,11 @@ }, "service-picker": { "service": "Servicio" + }, + "user-picker": { + "add_user": "Agregar usuario", + "no_user": "Sin usuario", + "remove_user": "Quitar usuario" } }, "dialogs": { @@ -666,6 +680,7 @@ "update": "Actualizar" }, "domain_toggler": { + "reset_entities": "Restablecer entidades", "title": "Alternar dominios" }, "entity_registry": { @@ -687,6 +702,7 @@ "unavailable": "Esta entidad no está disponible actualmente.", "update": "Actualizar" }, + "faq": "documentación", "no_unique_id": "Esta entidad no tiene un identificador única, por lo tanto, su configuración no se puede administrar desde la interfaz de usuario.", "related": "Relacionado", "settings": "Configuraciones" @@ -754,6 +770,7 @@ "dismiss": "Descartar diálogo", "edit": "Editar entidad", "history": "Historial", + "last_updated": "Última actualización", "person": { "create_zone": "Crear zona desde ubicación actual" }, @@ -810,6 +827,14 @@ } }, "quick-bar": { + "commands": { + "navigation": { + "navigate_to": "Navegar a {panel}" + }, + "server_control": { + "perform_action": "{action} Servidor" + } + }, "filter_placeholder": "Filtro de entidad" }, "voice_command": { @@ -872,6 +897,7 @@ }, "notification_toast": { "connection_lost": "Conexión perdida. Reconectando...", + "dismiss": "Descartar", "service_call_failed": "Error al llamar al servicio {service} .", "started": "¡Home Assistant ha iniciado!", "starting": "Home Assistant está iniciando, no todo estará disponible hasta que termine.", @@ -932,6 +958,12 @@ "name": "Acción", "type_select": "Tipo de acción", "type": { + "choose": { + "add_option": "Agregar opción", + "conditions": "Condiciones", + "remove_option": "Eliminar opción", + "sequence": "Acciones" + }, "condition": { "label": "Condición" }, @@ -951,6 +983,19 @@ "label": "Disparar evento", "service_data": "Datos" }, + "repeat": { + "label": "Repetir", + "sequence": "Acciones", + "type_select": "Tipo de repetición", + "type": { + "until": { + "label": "Hasta" + }, + "while": { + "label": "Mientras" + } + } + }, "scene": { "label": "Activar escena" }, @@ -1030,7 +1075,16 @@ "before": "Antes de", "label": "Hora", "type_input": "Valor de un auxiliar de tipo fecha/tiempo", - "type_value": "Tiempo corregido" + "type_value": "Tiempo corregido", + "weekdays": { + "fri": "Viernes", + "mon": "Lunes", + "sat": "Sábado", + "sun": "Domingo", + "thu": "Jueves", + "tue": "Martes", + "wed": "Miércoles" + } }, "zone": { "entity": "Entidad con ubicación", @@ -1089,6 +1143,7 @@ "trigger": "Desencadenar" }, "event": { + "context_user_pick": "Seleccionar usuario", "event_data": "Datos del evento", "event_type": "Tipo de evento", "label": "Evento:" @@ -1271,6 +1326,7 @@ "exposed": "{selected} expuesto", "exposed_entities": "Entidades expuestas", "follow_domain": "Seguir dominio", + "manage_domains": "Administrar dominios", "not_exposed": "{selected} no expuesto", "not_exposed_entities": "Entidades no expuestas", "title": "Alexa" @@ -1642,6 +1698,7 @@ "no_device": "Entidades sin dispositivos", "no_devices": "Esta integración no tiene dispositivos.", "options": "Opciones", + "reload": "Recargar", "rename": "Renombrar", "restart_confirm": "Reinicie Home Assistant para terminar de eliminar esta integración.", "services": "{count} {count, plural,\n one {service}\n other {services}\n}", @@ -1810,6 +1867,9 @@ }, "navigation": { "network": "Red", + "node": { + "config": "Configuración" + }, "nodes": "Nodos", "select_instance": "Seleccione la instancia" }, @@ -1835,12 +1895,23 @@ }, "network": { "header": "Gestión de red", - "introduction": "Gestione las funciones de toda la red." + "introduction": "Gestione las funciones de toda la red.", + "node_count": "{count} nodos" + }, + "node_config": { + "header": "Configuración del nodo", + "help_source": "Las descripciones de los parámetros de configuración y el texto de ayuda son proporcionados por el proyecto OpenZWave.", + "introduction": "Administre los diferentes parámetros de configuración para un nodo Z-Wave.", + "wakeup_help": "Los nodos alimentados por batería deben estar activos para cambiar su configuración. Si el nodo no está activo, OpenZWave intentará actualizar la configuración del nodo la próxima vez que se active, lo que podría ser varias horas (o días) más tarde. Siga estos pasos para reactivar su dispositivo:" + }, + "node_metadata": { + "product_manual": "Manual del producto" }, "node_query_stages": { "complete": "El proceso de consulta está completo", "configuration": "Obteniendo los valores de configuración del nodo", - "dynamic": "Obteniendo los valores que cambian con frecuencia del nodo" + "dynamic": "Obteniendo los valores que cambian con frecuencia del nodo", + "session": "Obteniendo valores que cambian con poca frecuencia del nodo" }, "node": { "button": "Detalles del nodo", @@ -1871,6 +1942,11 @@ "header": "Seleccione una instancia OpenZWave", "introduction": "Tiene más de una instancia de OpenZWave en ejecución. ¿Qué instancia te gustaría gestionar?", "none_found": "No pudimos encontrar una instancia de OpenZWave. Si cree que esto es incorrecto, verifique sus configuraciones de OpenZWave y MQTT y asegúrese de que Home Assistant pueda comunicarse con su corredor de MQTT." + }, + "services": { + "add_node": "Agregar nodo", + "cancel_command": "Cancelar comando", + "remove_node": "Quitar nodo" } }, "person": { @@ -1984,6 +2060,7 @@ }, "picker": { "add_script": "Agregar script", + "duplicate_script": "Duplicar script", "edit_script": "Editar script", "header": "Editor de scripts", "headers": { @@ -2006,6 +2083,7 @@ "core": "Recargar ubicación y personalizaciones", "group": "Recargar grupos, entidades grupales, y servicios de notificación", "heading": "Recarga de configuración YAML", + "homekit": "Recargar HomeKit", "input_boolean": "Recargar controles booleanos", "input_datetime": "Recargar controles de fechas", "input_number": "Recargar controles numéricos", @@ -2078,6 +2156,8 @@ "create": "Crear", "name": "Nombre", "password": "Contraseña", + "password_confirm": "Confirmar contraseña", + "password_not_match": "Las contraseñas no coinciden", "username": "Nombre de usuario" }, "caption": "Usuarios", @@ -2094,6 +2174,7 @@ "group": "Grupo", "id": "Identificación", "name": "Nombre", + "new_password": "Nueva contraseña", "owner": "Propietario", "password_changed": "La contraseña se cambió con éxito", "system_generated": "Generado por el sistema", @@ -2400,7 +2481,9 @@ "jinja_documentation": "Documentación de plantillas Jinja2", "listeners": "Esta plantilla escucha los eventos de los siguientes cambios de estado:", "no_listeners": "Esta plantilla no escucha ningún evento de cambio de estado y no se actualizará automáticamente.", + "result_type": "Tipo de resultado", "template_extensions": "Extensiones de plantilla de Home Assistant", + "time": "Esta plantilla se actualiza al comienzo de cada minuto.", "title": "Plantilla", "unknown_error_template": "Error desconocido al mostrar la plantilla" } @@ -2473,11 +2556,16 @@ "editor": { "action-editor": { "actions": { + "call-service": "Llamar al Servicio", + "default_action": "Acción predeterminada", "more-info": "Más información", "navigate": "Navegar", "none": "Sin acción", "url": "URL" - } + }, + "editor_service_data": "Los datos de servicio solo se pueden ingresar en el editor de código", + "navigation_path": "Ruta de navegación", + "url_path": "Ruta URL" }, "card": { "alarm-panel": { @@ -2489,6 +2577,16 @@ "description": "La tarjeta Botón le permite agregar botones para realizar tareas.", "name": "Botón" }, + "calendar": { + "calendar_entities": "Entidades del calendario", + "inital_view": "Vista inicial", + "name": "Calendario", + "views": { + "dayGridDay": "Día", + "dayGridMonth": "Mes", + "listWeek": "Lista" + } + }, "conditional": { "card": "Tarjeta", "change_type": "Cambiar tipo", @@ -2506,6 +2604,18 @@ }, "entities": { "description": "La tarjeta de entidades es el tipo de tarjeta más común. Agrupa elementos en listas.", + "edit_special_row": "Vea los detalles de esta fila haciendo clic en el botón editar", + "entity_row": { + "attribute": "Atributo", + "button": "Botón", + "buttons": "Botones", + "call-service": "Llamar al Servicio", + "cast": "Emitir", + "conditional": "Condicional", + "divider": "Divisor", + "section": "Sección", + "weblink": "Enlace web" + }, "name": "Entidades", "secondary_info_values": { "brightness": "Brillo", @@ -2514,6 +2624,7 @@ "position": "Posición" }, "show_header_toggle": "¿Mostrar alternancia de encabezado?", + "special_row": "fila especial", "toggle": "Alternar entidades." }, "entity-filter": { @@ -2560,6 +2671,7 @@ "show_name": "¿Mostrar nombre?", "show_state": "¿Mostrar estado?", "state": "Estado", + "state_color": "¿Iconos de colores según el estado?", "tap_action": "Acción de toque", "theme": "Tema", "title": "Título", @@ -2571,6 +2683,10 @@ "description": "La tarjeta Vista es útil para agrupar múltiples sensores en una descripción compacta.", "name": "Glance" }, + "grid": { + "description": "La tarjeta Cuadrícula le permite mostrar varias tarjetas en una cuadrícula.", + "name": "Cuadrícula" + }, "history-graph": { "description": "La tarjeta Gráfico de historial le permite mostrar un gráfico para cada una de las entidades enumeradas.", "name": "Gráfico histórico" @@ -2633,7 +2749,8 @@ "description": "La tarjeta Sensor le ofrece una visión general rápida del estado de sus sensores con un gráfico opcional para visualizar los cambios a lo largo del tiempo.", "graph_detail": "Detalle del gráfico", "graph_type": "Tipo de gráfico", - "name": "Sensor" + "name": "Sensor", + "show_more_detail": "Mostrar más detalles" }, "shopping-list": { "description": "La tarjeta Lista de Compras le permite agregar, editar, marcar y borrar artículos de su lista.", @@ -2766,6 +2883,7 @@ }, "sub-element-editor": { "types": { + "footer": "Editor de pie de página", "header": "Editor de encabezado" } }, @@ -2788,7 +2906,8 @@ "exit_edit_mode": "Salir del modo de edición de la interfaz de usuario", "help": "Ayuda", "refresh": "Refrescar", - "reload_resources": "Recargar recursos" + "reload_resources": "Recargar recursos", + "start_conversation": "Iniciar conversación" }, "reload_lovelace": "Recargar UI", "reload_resources": { @@ -3029,6 +3148,10 @@ "dropdown_label": "Tablero", "header": "Tablero" }, + "enable_shortcuts": { + "description": "Habilite o deshabilite los atajos de teclado para realizar varias acciones en la interfaz de usuario.", + "header": "Métodos abreviados de teclado" + }, "force_narrow": { "description": "Esto ocultará la barra lateral de forma predeterminada, similar a la experiencia móvil.", "header": "Ocultar siempre la barra lateral" @@ -3073,6 +3196,10 @@ "header": "Módulos de autenticación multifactor" }, "push_notifications": { + "add_device_prompt": { + "input_label": "Nombre del dispositivo", + "title": "¿Cómo debería llamarse este dispositivo?" + }, "description": "Enviar notificaciones a este dispositivo.", "error_load_platform": "Configurar notify.html5.", "error_use_https": "Requiere SSL habilitado para la interfaz.", diff --git a/translations/frontend/fr.json b/translations/frontend/fr.json index 7fd28dc739..dfd0b17426 100644 --- a/translations/frontend/fr.json +++ b/translations/frontend/fr.json @@ -511,16 +511,23 @@ "continue": "Continuer", "copied": "Copié", "delete": "Supprimer", + "disable": "Désactiver", + "enable": "Activer", "error_required": "Obligatoire", + "leave": "Quitter", "loading": "Chargement", "menu": "Menu", "next": "Suivant", "no": "Non", + "not_now": "Pas maintenant", "overflow_menu": "Menu de débordement", "previous": "Précédent", "refresh": "Rafraîchir", + "remove": "Supprimer", + "rename": "Renommer", "save": "Enregistrer", "skip": "Passer", + "stay": "Rester", "successfully_deleted": "Supprimé avec succès", "successfully_saved": "Enregistré avec succès", "undo": "Annuler", @@ -721,8 +728,10 @@ "confirm_delete": "Voulez-vous vraiment supprimer cette entrée ?", "delete": "Supprimer", "enabled_cause": "Désactivé par {cause} .", + "enabled_delay_confirm": "Les entités activées seront ajoutées à Home Assistant dans {delay} secondes", "enabled_description": "Les entités désactivées ne seront pas ajoutées à Home Assistant.", "enabled_label": "Activer l'entité", + "enabled_restart_confirm": "Redémarrez Home Assistant pour terminer l'activation des entités", "entity_id": "ID d'entité", "icon": "Icône", "icon_error": "Les icônes doivent être au format «préfixe: iconname», par exemple «mdi: home»", @@ -795,6 +804,11 @@ }, "more_info_control": { "controls": "Contrôles", + "cover": { + "close_cover": "Fermer le volet", + "open_cover": "Ouvrir le volet", + "stop_cover": "Arrêter le mouvement du volet" + }, "details": "Détails", "dismiss": "Fermer la fenêtre de dialogue", "edit": "Modifier l'entité", @@ -858,6 +872,25 @@ }, "quick-bar": { "commands": { + "navigation": { + "areas": "Zones", + "automation": "Automatisations", + "core": "Général", + "customize": "Customisations", + "devices": "Appareils", + "entities": "Entités", + "integrations": "Intégrations", + "logs": "Journaux", + "navigate_to": "Naviguer vers {panel}", + "navigate_to_config": "Naviguer à la configuration de {panel}", + "person": "Personnes", + "scene": "Scènes", + "script": "Scripts", + "server_control": "Contrôle du serveur", + "tags": "Balises", + "users": "Utilisateurs", + "zone": "Zones" + }, "reload": { "automation": "Recharger les automatisations", "command_line": "Recharger les entités de ligne de commande", @@ -1705,6 +1738,8 @@ "info": { "built_using": "Construit en utilisant", "caption": "Info", + "copy_github": "Pour Github", + "copy_raw": "Texte brut", "custom_uis": "Interfaces utilisateur personnalisées :", "description": "Informations sur votre installation Home Assistant", "developed_by": "Développé par un groupe de personnes formidables.", @@ -1720,6 +1755,35 @@ "server": "serveur", "source": "Source:", "system_health_error": "Le composant System Health n'est pas chargé. Ajouter 'system_health:' à configuration.yaml", + "system_health": { + "checks": { + "cloud": { + "alexa_enabled": "Alexa activée", + "google_enabled": "Google activé", + "logged_in": "Connecté", + "subscription_expiration": "Expiration de l'abonnement" + }, + "homeassistant": { + "arch": "Architecture du processeur", + "dev": "Développement", + "docker": "Docker", + "hassio": "HassOS", + "installation_type": "Type d'installation", + "os_name": "Nom du système d'exploitation", + "os_version": "Version du système d'exploitation", + "python_version": "Version de Python", + "timezone": "Fuseau horaire", + "version": "Version", + "virtualenv": "Environnement virtuel" + }, + "lovelace": { + "mode": "Mode", + "resources": "Ressources" + } + }, + "manage": "Gérer", + "more_info": "plus d'infos" + }, "title": "Info" }, "integration_panel_move": { @@ -2137,6 +2201,8 @@ }, "picker": { "add_script": "Ajouter un script", + "duplicate": "Dupliquer", + "duplicate_script": "Dupliquer le script", "edit_script": "Éditer le script", "header": "Éditeur de script", "headers": { @@ -2210,6 +2276,8 @@ "add_tag": "Ajouter une balise", "automation_title": "La balise {name} est analysée", "caption": "Balises", + "confirm_remove": "Voulez-vous vraiment supprimer la balise {tag} ?", + "confirm_remove_title": "Supprimer la balise ?", "create_automation": "Créer une automatisation avec une balise", "description": "Gérer les balises", "detail": { @@ -2269,6 +2337,7 @@ "update_user": "Mise à jour" }, "picker": { + "add_user": "Ajouter un utilisateur", "headers": { "group": "Groupe", "name": "Nom", @@ -2549,6 +2618,7 @@ "filter_attributes": "Filtrer les attributs", "filter_entities": "Filtrer les entités", "filter_states": "Filtrer les états", + "last_updated": "Dernière mise à jour", "more_info": "Plus d’infos", "no_entities": "Aucune entité", "set_state": "Définir l'état", @@ -2800,6 +2870,9 @@ "description": "La carte Lumière vous permet de modifier la luminosité de la lumière.", "name": "Lumière" }, + "logbook": { + "name": "Journal" + }, "map": { "dark_mode": "Mode sombre ?", "default_zoom": "Zoom par défaut", @@ -2872,11 +2945,18 @@ "entity": "Entité", "no_description": "Aucune description disponible." }, + "common": { + "add": "Ajouter", + "clear": "Effacer", + "edit": "Modifier", + "none": "Aucun" + }, "edit_badges": { "panel_mode": "Ces badges ne seront pas affichés car cette vue est en \"Mode Panneau\"." }, "edit_card": { "add": "Ajouter une action", + "clear": "Effacer", "confirm_cancel": "Êtes-vous sûr de vouloir annuler ?", "delete": "Supprimer la carte", "duplicate": "Dupliquer la carte", @@ -2917,6 +2997,22 @@ } }, "header": "Modifier l'interface utilisateur", + "header-footer": { + "choose_header_footer": "Choisissez un {type}", + "footer": "Pied de page", + "header": "En-tête", + "types": { + "buttons": { + "name": "Boutons" + }, + "graph": { + "name": "Graphique" + }, + "picture": { + "name": "Image" + } + } + }, "menu": { "open": "Ouvrir le menu Lovelace UI", "raw_editor": "Éditeur de configuration" @@ -2961,6 +3057,13 @@ "dashboard_label": "Tableau de bord", "header": "Choisissez une vue" }, + "sub-element-editor": { + "types": { + "footer": "Modifier le pied de page", + "header": "Modifier l'en-tête", + "row": "Modifier à l'aide de l'éditeur de code" + } + }, "suggest_card": { "add": "Ajouter à Lovelace UI", "create_own": "Choisissez une autre carte", diff --git a/translations/frontend/pt-BR.json b/translations/frontend/pt-BR.json index c90e5764f1..d723e3cfc0 100644 --- a/translations/frontend/pt-BR.json +++ b/translations/frontend/pt-BR.json @@ -510,15 +510,22 @@ "continue": "Continuar", "copied": "Copiado", "delete": "Eliminar", + "disable": "Desabilitar", + "enable": "Habilitar", "error_required": "Obrigatório", + "leave": "Sair", "loading": "Carregando", "menu": "Menu", "next": "Próximo", "no": "Não", + "not_now": "Agora não", "overflow_menu": "Menu expansível", "previous": "Anterior", "refresh": "Atualizar", + "remove": "Remover", + "rename": "Renomear", "save": "Salvar", + "skip": "Ignorar", "successfully_deleted": "Eliminado com sucesso", "successfully_saved": "Salvo com sucesso", "undo": "Desfazer", @@ -582,8 +589,10 @@ "was_disconnected": "foi desconectado", "was_locked": "foi trancada", "was_opened": "foi aberto", + "was_plugged_in": "foi conectado", "was_safe": "estava seguro", "was_unlocked": "foi destrancada", + "was_unplugged": "foi desconectado", "was_unsafe": "estava inseguro" } }, @@ -605,7 +614,7 @@ "playlist": "Lista de reprodução", "podcast": "Podcast", "season": "Temporada", - "url": "Url", + "url": "URL", "video": "Vídeo" }, "content-type": { @@ -654,6 +663,10 @@ }, "service-picker": { "service": "Serviço" + }, + "user-picker": { + "add_user": "Adicionar Usuário", + "remove_user": "Remover usuário" } }, "dialogs": { @@ -685,7 +698,7 @@ "update": "Atualizar" }, "faq": "documentação", - "no_unique_id": "Essa entidade não possui um ID exclusivo; portanto, suas configurações não podem ser gerenciadas a partir da interface do usuário.", + "no_unique_id": "Essa entidade não possui um ID único; portanto suas configurações não podem ser gerenciadas a partir da interface do usuário. Consulte o {faq_link} para mais detalhes.", "related": "Relacionado", "settings": "Configurações" }, @@ -731,6 +744,9 @@ }, "platform_not_loaded": "A integração {platform} não está carregada. Por favor adicione-a em sua configuração adicionando 'default_config:' ou ''{platform}:''.", "required_error_msg": "Este campo é obrigatório", + "timer": { + "duration": "Duração" + }, "yaml_not_editable": "As configurações desta entidade não podem ser editadas a partir da interface do usuário. Somente entidades configuradas a partir da interface do usuário são configuráveis a partir da interface do usuário." }, "image_cropper": { @@ -742,6 +758,7 @@ "dismiss": "Dispensar diálogo", "edit": "Editar entidade", "history": "Histórico", + "last_changed": "Última alteração", "last_updated": "Última atualização", "person": { "create_zone": "Criar zona a partir da localização atual" @@ -799,6 +816,36 @@ } }, "quick-bar": { + "commands": { + "navigation": { + "areas": "Áreas", + "automation": "Automações", + "core": "Geral", + "customize": "Customizações", + "devices": "Dispositivos", + "entities": "Entidades", + "info": "Informações", + "integrations": "Integrações", + "person": "Pessoas", + "scene": "Cenas", + "server_control": "Controles do Servidor", + "users": "Usuários", + "zone": "Zonas" + }, + "reload": { + "automation": "Recarregar automações", + "group": "Recarregar grupos, grupos de entidades e serviços de notificação", + "homekit": "Recarregar HomeKit", + "person": "Recarregar pessoas", + "reload": "Recarregar {domain}", + "scene": "Recarregar cenas", + "zone": "Recarregar zonas" + }, + "server_control": { + "restart": "Reiniciar", + "stop": "Parar" + } + }, "filter_placeholder": "Filtro de Entidades" }, "voice_command": { @@ -860,6 +907,7 @@ }, "notification_toast": { "connection_lost": "Conexão perdida. Reconectando…", + "dismiss": "Dispensar", "service_call_failed": "Falha ao chamar o serviço {service}.", "started": "O Home Assistant foi iniciado!", "starting": "O Home Assistant está iniciando, algumas funcionalidades podem estar indisponíveis até que esteja iniciado.", @@ -1105,6 +1153,7 @@ "trigger": "Gatilho" }, "event": { + "context_user_pick": "Selecione o usuário", "event_data": "Dados de evento", "event_type": "Tipo de evento", "label": "Evento" @@ -1200,6 +1249,14 @@ "only_editable": "Apenas as automaçãos definidas em automatis.yaml são editáveis.", "pick_automation": "Escolha uma automação para editar", "show_info_automation": "Mostrar informações sobre automação" + }, + "thingtalk": { + "create": "Criar automação", + "task_selection": { + "for_example": "Por exemplo:", + "header": "Criar nova automação", + "language_note": "Nota: Por enquanto, apenas o Inglês é suportado." + } } }, "cloud": { @@ -1495,6 +1552,7 @@ }, "filter": { "filter": "Filtro", + "show_all": "Mostrar tudo", "show_disabled": "Mostrar entidades desativadas", "show_readonly": "Mostrar entidades somente de leitura", "show_unavailable": "Mostrar entidades indisponíveis" @@ -1533,7 +1591,7 @@ "header": "Configurar o Home Assistant", "helpers": { "caption": "Ajudantes", - "description": "Elementos que podem ajudar a construir automações.", + "description": "Gerencie elementos que ajudam a construir automações", "dialog": { "add_helper": "Adicionar ajudante", "add_platform": "Adicionar {platform}", @@ -1550,6 +1608,7 @@ "no_helpers": "Parece que você ainda não tem ajudantes!" }, "types": { + "counter": "Contador", "input_boolean": "Alternar", "input_datetime": "Data e/ou hora", "input_number": "Número", @@ -1561,7 +1620,7 @@ "built_using": "Construído usando", "caption": "Informações", "custom_uis": "UIs personalizadas:", - "description": "Informações sobre a instalação do Home Assistant", + "description": "Ver informações sobre a instalação do Home Assistant", "developed_by": "Desenvolvido por um monte de pessoas incríveis.", "documentation": "Documentação", "frontend": "frontend-ui", @@ -1575,6 +1634,25 @@ "server": "servidor", "source": "Código fonte:", "system_health_error": "O componente System Health não foi carregado. Adicione 'system_health:' ao configuration.yaml", + "system_health": { + "checks": { + "homeassistant": { + "arch": "Arquitetura da CPU", + "docker": "Docker", + "hassio": "HassOS", + "installation_type": "Tipo de Instalação", + "os_name": "Nome do Sistema Operacional", + "os_version": "Versão do Sistema Operacional", + "timezone": "Fuso horário", + "version": "Versão" + }, + "lovelace": { + "mode": "Modo", + "resources": "Recursos" + } + }, + "more_info": "Mais Informações" + }, "title": "Info" }, "integration_panel_move": { @@ -1815,6 +1893,7 @@ }, "services": { "add_node": "Adicionar Nó", + "cancel_command": "Cancelar Comando", "remove_node": "Remover Nó" } }, @@ -1928,6 +2007,8 @@ }, "picker": { "add_script": "Adicionar script", + "duplicate": "Duplicar", + "duplicate_script": "Duplicar script", "edit_script": "Editar script", "header": "Editor de Scripts", "headers": { @@ -1953,7 +2034,7 @@ "filter": "Recarregar entidades de filtro", "generic": "Recarregar entidades genéricas de câmeras IP", "generic_thermostat": "Recarregar entidades genéricas do termostato", - "group": "Recarregar os grupos", + "group": "Recarregar os grupos, grupos de entidades e serviços de notificação", "heading": "Recarregando a configuração YAML", "homekit": "Recarregar Homekit", "input_boolean": "Recarregar entradas de booleanos", @@ -2050,6 +2131,7 @@ "update_user": "Atualizar" }, "picker": { + "add_user": "Adicionar Usuário", "headers": { "group": "Grupo", "name": "Nome", @@ -2174,7 +2256,7 @@ "create": "Criar", "delete": "Excluir", "icon": "Ícone", - "icon_error_msg": "O ícone deve estar no formato prefixo:nomedoícone, por exemplo: mdi:home", + "icon_error_msg": "O ícone deve estar no formato \"prefixo:nomedoícone\", por exemplo: \"mdi:home\"", "latitude": "Latitude", "longitude": "Longitude", "name": "Nome", @@ -2330,6 +2412,8 @@ "filter_attributes": "Filtro de atributos", "filter_entities": "Filtro de entidades", "filter_states": "Filtro de estados", + "last_changed": "Última alteração", + "last_updated": "Última atualização", "more_info": "Mais informações", "no_entities": "Nenhuma entidade", "set_state": "Definir Estado", @@ -2340,6 +2424,7 @@ "templates": { "description": "Os templates são renderizados usando o Jinja2 com algumas extensões específicas do Home Assistant.", "editor": "Editor de templates", + "entity": "Entidade", "jinja_documentation": "Documentação do template Jinja2", "template_extensions": "Extensões de template do Home Assistant", "title": "Modelo", @@ -2422,7 +2507,7 @@ "toggle": "Alternar", "url": "URL" }, - "url_path": "Caminho de Url" + "url_path": "Caminho de URL" }, "card": { "alarm-panel": { @@ -2473,7 +2558,9 @@ "secondary_info_values": { "brightness": "Brilho", "entity-id": "ID da entidade", + "last-changed": "Última alteração", "last-triggered": "Último Disparo", + "none": "Sem informações secundárias", "position": "Posição", "tilt-position": "Posição de inclinação" }, @@ -2628,8 +2715,15 @@ "entity": "Entidade", "no_description": "Nenhuma descrição disponível" }, + "common": { + "add": "Adicionar", + "clear": "Limpar", + "edit": "Editar", + "none": "Nenhum" + }, "edit_card": { "add": "Adicionar Cartão", + "clear": "Limpar", "confirm_cancel": "Tem certeza de que deseja cancelar?", "delete": "Excluir Cartão", "duplicate": "Duplicar", @@ -2667,6 +2761,21 @@ } }, "header": "Editar “interface” do usuário", + "header-footer": { + "footer": "Rodapé", + "header": "Cabeçalho", + "types": { + "buttons": { + "name": "Botões" + }, + "graph": { + "name": "Gráfico" + }, + "picture": { + "name": "Imagem" + } + } + }, "menu": { "open": "Abra o menu da Interface Lovelace", "raw_editor": "Editor de configuração RAW" @@ -2711,6 +2820,12 @@ "dashboard_label": "Painel de controle", "header": "Selecione uma tela" }, + "sub-element-editor": { + "types": { + "footer": "Editor de Rodapé", + "header": "Editor de Cabeçalho" + } + }, "suggest_card": { "add": "Adicionar a UI do Lovelace", "create_own": "Escolha cartão diferente", @@ -2972,6 +3087,9 @@ "dropdown_label": "Painel de controle", "header": "Painel de controle" }, + "enable_shortcuts": { + "header": "Atalhos de Teclado" + }, "force_narrow": { "description": "Isto irá ocultar a barra lateral por padrão, semelhante à experiência móvel.", "header": "Sempre ocultar a barra lateral" diff --git a/translations/frontend/ru.json b/translations/frontend/ru.json index c5ae1a29a4..c8fbf28b4a 100644 --- a/translations/frontend/ru.json +++ b/translations/frontend/ru.json @@ -594,13 +594,13 @@ "was_at_home": "дома", "was_at_state": "{state}", "was_away": "не дома", - "was_closed": "закрывается", + "was_closed": "Закрыто", "was_connected": "подключается", "was_disconnected": "отключается", "was_locked": "блокируется", "was_low": "регистрирует низкий заряд", "was_normal": "регистрирует нормальный заряд", - "was_opened": "открывается", + "was_opened": "Открыто", "was_plugged_in": "подключается", "was_safe": "регистрирует безопасность", "was_unlocked": "разблокируется", From 62e9792c39b93f942f4bc1b4c6fa6a9b19405ab5 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 18 Nov 2020 08:44:45 +0000 Subject: [PATCH 30/90] Add note about building the frontend --- build-scripts/README.md | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 build-scripts/README.md diff --git a/build-scripts/README.md b/build-scripts/README.md new file mode 100644 index 0000000000..afdf7a15b2 --- /dev/null +++ b/build-scripts/README.md @@ -0,0 +1,39 @@ +# Bundling Home Assistant Frontend + +The Home Assistant build pipeline contains various steps to prepare a build. + +- Generating icon files to be included +- Generating translation files to be included +- Converting TypeScript, CSS and JSON files to JavaScript +- Bundling +- Minifying the files +- Generating the HTML entrypoint files +- Generating the service worker +- Compressing the files + +## Converting files responsibilities + +Currently in Home Assistant we use a bundler to convert TypeScript, CSS and JSON files to JavaScript files that the browser understands. + +We currently rely on Webpack but also have experimental Rollup support. Both of these programs bundle the converted files in both production and development. + +For development, bundling is optional. We just want to get the right files in the browser. + +Responsibilities of the converter during development: + +- Convert TypeScript to JavaScript +- Convert CSS to JavaScript that sets the content as the default export +- Convert JSON to JavaScript that sets the content as the default export +- Make sure import, dynamic import and web worker references work + - Add extensions where missing + - Resolve absolute package imports +- Filter out specific imports/packages +- Replace constants with values + +In production, the following responsibilities are added: + +- Minify HTML +- Bundle multiple imports so that the browser can fetch less files +- Generate a second version that is ES5 compatible + +Configuration for all these steps are specified in [bundle.js](bundle.js). From 4005bc89857d776a00dd5ff3e91613e534f8d8aa Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 18 Nov 2020 08:46:42 +0000 Subject: [PATCH 31/90] Clarify title --- build-scripts/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-scripts/README.md b/build-scripts/README.md index afdf7a15b2..0a6963f7e9 100644 --- a/build-scripts/README.md +++ b/build-scripts/README.md @@ -11,7 +11,7 @@ The Home Assistant build pipeline contains various steps to prepare a build. - Generating the service worker - Compressing the files -## Converting files responsibilities +## Converting files Currently in Home Assistant we use a bundler to convert TypeScript, CSS and JSON files to JavaScript files that the browser understands. From 3aff4c96c4ae8efb25d0f8bde1b03df59fd7caf9 Mon Sep 17 00:00:00 2001 From: Philip Allgaier Date: Wed, 18 Nov 2020 10:39:35 +0100 Subject: [PATCH 32/90] Add Georgian language (Kartuli) (#7721) --- src/translations/translationMetadata.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/translations/translationMetadata.json b/src/translations/translationMetadata.json index f631219f2f..80d5db1223 100644 --- a/src/translations/translationMetadata.json +++ b/src/translations/translationMetadata.json @@ -98,6 +98,9 @@ "ja": { "nativeName": "日本語" }, + "ka": { + "nativeName": "Kartuli" + }, "ko": { "nativeName": "한국어" }, From 4973d8f629c3619f7e113b6fb6888aaf3027ede6 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 18 Nov 2020 12:19:59 +0100 Subject: [PATCH 33/90] WIP initial Blueprint UI (#7695) * WIP initial Blueprint UI * Review comments * localize --- src/components/ha-blueprint-picker.ts | 119 ++++++ src/data/automation.ts | 15 +- src/data/blueprint.ts | 54 +++ .../automation/blueprint-automation-editor.ts | 306 +++++++++++++++ .../automation/dialog-new-automation.ts | 175 +++++++++ .../config/automation/ha-automation-editor.ts | 309 ++-------------- .../config/automation/ha-automation-picker.ts | 26 +- .../automation/manual-automation-editor.ts | 349 ++++++++++++++++++ .../automation/show-dialog-new-automation.ts | 12 + .../automation/thingtalk/dialog-thingtalk.ts | 14 +- .../{ => thingtalk}/show-dialog-thingtalk.ts | 9 +- .../blueprint/dialog-import-blueprint.ts | 186 ++++++++++ .../config/blueprint/ha-blueprint-overview.ts | 212 +++++++++++ .../config/blueprint/ha-config-blueprint.ts | 76 ++++ .../blueprint/show-dialog-import-blueprint.ts | 17 + src/panels/config/ha-panel-config.ts | 16 + src/translations/en.json | 51 +++ 17 files changed, 1645 insertions(+), 301 deletions(-) create mode 100644 src/components/ha-blueprint-picker.ts create mode 100644 src/data/blueprint.ts create mode 100644 src/panels/config/automation/blueprint-automation-editor.ts create mode 100644 src/panels/config/automation/dialog-new-automation.ts create mode 100644 src/panels/config/automation/manual-automation-editor.ts create mode 100644 src/panels/config/automation/show-dialog-new-automation.ts rename src/panels/config/automation/{ => thingtalk}/show-dialog-thingtalk.ts (65%) create mode 100644 src/panels/config/blueprint/dialog-import-blueprint.ts create mode 100644 src/panels/config/blueprint/ha-blueprint-overview.ts create mode 100644 src/panels/config/blueprint/ha-config-blueprint.ts create mode 100644 src/panels/config/blueprint/show-dialog-import-blueprint.ts diff --git a/src/components/ha-blueprint-picker.ts b/src/components/ha-blueprint-picker.ts new file mode 100644 index 0000000000..e5ee91fb9d --- /dev/null +++ b/src/components/ha-blueprint-picker.ts @@ -0,0 +1,119 @@ +import "@polymer/paper-dropdown-menu/paper-dropdown-menu-light"; +import "@polymer/paper-item/paper-item"; +import "@polymer/paper-listbox/paper-listbox"; +import { + css, + CSSResult, + customElement, + html, + LitElement, + property, + TemplateResult, +} from "lit-element"; +import memoizeOne from "memoize-one"; +import { fireEvent } from "../common/dom/fire_event"; +import { compare } from "../common/string/compare"; +import { Blueprints, fetchBlueprints } from "../data/blueprint"; +import { HomeAssistant } from "../types"; + +@customElement("ha-blueprint-picker") +class HaBluePrintPicker extends LitElement { + public hass?: HomeAssistant; + + @property() public label?: string; + + @property() public value = ""; + + @property() public domain = "automation"; + + @property() public blueprints?: Blueprints; + + @property({ type: Boolean }) public disabled = false; + + private _processedBlueprints = memoizeOne((blueprints?: Blueprints) => { + if (!blueprints) { + return []; + } + const result = Object.entries(blueprints).map(([path, blueprint]) => ({ + ...blueprint.metadata, + path, + })); + return result.sort((a, b) => compare(a.name, b.name)); + }); + + protected render(): TemplateResult { + if (!this.hass) { + return html``; + } + return html` + + + + ${this.hass.localize( + "ui.components.blueprint-picker.select_blueprint" + )} + + ${this._processedBlueprints(this.blueprints).map( + (blueprint) => html` + + ${blueprint.name} + + ` + )} + + + `; + } + + protected firstUpdated(changedProps) { + super.firstUpdated(changedProps); + if (this.blueprints === undefined) { + fetchBlueprints(this.hass!, this.domain).then((blueprints) => { + this.blueprints = blueprints; + }); + } + } + + private _blueprintChanged(ev) { + const newValue = ev.detail.item.dataset.blueprintPath; + + if (newValue !== this.value) { + this.value = ev.detail.value; + setTimeout(() => { + fireEvent(this, "value-changed", { value: newValue }); + fireEvent(this, "change"); + }, 0); + } + } + + static get styles(): CSSResult { + return css` + :host { + display: inline-block; + } + paper-dropdown-menu-light { + width: 100%; + min-width: 200px; + display: block; + } + paper-listbox { + min-width: 200px; + } + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + "ha-blueprint-picker": HaBluePrintPicker; + } +} diff --git a/src/data/automation.ts b/src/data/automation.ts index bb35448575..88ee3f847c 100644 --- a/src/data/automation.ts +++ b/src/data/automation.ts @@ -4,6 +4,7 @@ import { } from "home-assistant-js-websocket"; import { navigate } from "../common/navigate"; import { Context, HomeAssistant } from "../types"; +import { BlueprintInput } from "./blueprint"; import { DeviceCondition, DeviceTrigger } from "./device_automation"; import { Action } from "./script"; @@ -14,10 +15,14 @@ export interface AutomationEntity extends HassEntityBase { }; } -export interface AutomationConfig { +export type AutomationConfig = + | ManualAutomationConfig + | BlueprintAutomationConfig; + +export interface ManualAutomationConfig { id?: string; - alias: string; - description: string; + alias?: string; + description?: string; trigger: Trigger[]; condition?: Condition[]; action: Action[]; @@ -25,6 +30,10 @@ export interface AutomationConfig { max?: number; } +export interface BlueprintAutomationConfig extends ManualAutomationConfig { + use_blueprint: { path: string; input?: BlueprintInput }; +} + export interface ForDict { hours?: number | string; minutes?: number | string; diff --git a/src/data/blueprint.ts b/src/data/blueprint.ts new file mode 100644 index 0000000000..b2dd307592 --- /dev/null +++ b/src/data/blueprint.ts @@ -0,0 +1,54 @@ +import { HomeAssistant } from "../types"; + +export type Blueprints = Record; + +export interface Blueprint { + metadata: BlueprintMetaData; +} + +export interface BlueprintMetaData { + domain: string; + name: string; + input: BlueprintInput; +} + +export type BlueprintInput = Record; + +export interface BlueprintImportResult { + url: string; + suggested_filename: string; + raw_data: string; + blueprint: Blueprint; +} + +export const fetchBlueprints = (hass: HomeAssistant, domain: string) => + hass.callWS({ type: "blueprint/list", domain }); + +export const importBlueprint = (hass: HomeAssistant, url: string) => + hass.callWS({ type: "blueprint/import", url }); + +export const saveBlueprint = ( + hass: HomeAssistant, + domain: string, + path: string, + yaml: string, + source_url?: string +) => + hass.callWS({ + type: "blueprint/save", + domain, + path, + yaml, + source_url, + }); + +export const deleteBlueprint = ( + hass: HomeAssistant, + domain: string, + path: string +) => + hass.callWS({ + type: "blueprint/delete", + domain, + path, + }); diff --git a/src/panels/config/automation/blueprint-automation-editor.ts b/src/panels/config/automation/blueprint-automation-editor.ts new file mode 100644 index 0000000000..78bcf332fd --- /dev/null +++ b/src/panels/config/automation/blueprint-automation-editor.ts @@ -0,0 +1,306 @@ +import { + css, + CSSResult, + customElement, + internalProperty, + LitElement, + property, +} from "lit-element"; +import { html } from "lit-html"; +import { + BlueprintAutomationConfig, + triggerAutomation, +} from "../../../data/automation"; +import { HomeAssistant } from "../../../types"; +import "../ha-config-section"; +import "../../../components/ha-card"; +import "@polymer/paper-input/paper-textarea"; +import "@polymer/paper-dropdown-menu/paper-dropdown-menu-light"; +import "../../../components/entity/ha-entity-toggle"; +import "@material/mwc-button/mwc-button"; +import "./trigger/ha-automation-trigger"; +import "./condition/ha-automation-condition"; +import "./action/ha-automation-action"; +import { fireEvent } from "../../../common/dom/fire_event"; +import { haStyle } from "../../../resources/styles"; +import { HassEntity } from "home-assistant-js-websocket"; +import { navigate } from "../../../common/navigate"; +import { + Blueprint, + Blueprints, + fetchBlueprints, +} from "../../../data/blueprint"; +import "../../../components/ha-blueprint-picker"; +import "../../../components/ha-circular-progress"; + +@customElement("blueprint-automation-editor") +export class HaBlueprintAutomationEditor extends LitElement { + @property({ attribute: false }) public hass!: HomeAssistant; + + @property() public isWide!: boolean; + + @property() public narrow!: boolean; + + @property() public config!: BlueprintAutomationConfig; + + @property() public stateObj?: HassEntity; + + @internalProperty() private _blueprints?: Blueprints; + + protected firstUpdated(changedProps) { + super.firstUpdated(changedProps); + this._getBlueprints(); + } + + private get _blueprint(): Blueprint | undefined { + if (!this._blueprints) { + return undefined; + } + return this._blueprints[this.config.use_blueprint.path]; + } + + protected render() { + const blueprint = this._blueprint; + return html` + ${!this.narrow + ? html` ${this.config.alias} ` + : ""} + + ${this.hass.localize( + "ui.panel.config.automation.editor.introduction" + )} + + +
+ + + +
+ ${this.stateObj + ? html` +
+
+ + ${this.hass.localize( + "ui.panel.config.automation.editor.enable_disable" + )} +
+ + ${this.hass.localize("ui.card.automation.trigger")} + +
+ ` + : ""} +
+
+ + + ${this.hass.localize( + "ui.panel.config.automation.editor.blueprint.header" + )} + +
+
+ ${this._blueprints + ? Object.keys(this._blueprints).length + ? html` + + ` + : this.hass.localize( + "ui.panel.config.automation.editor.blueprint.no_blueprints" + ) + : html``} + + ${this.hass.localize( + "ui.panel.config.automation.editor.blueprint.manage_blueprints" + )} + +
+ ${this.config.use_blueprint.path + ? blueprint?.metadata?.input && + Object.keys(blueprint.metadata.input).length + ? html`

+ ${this.hass.localize( + "ui.panel.config.automation.editor.blueprint.inputs" + )} +

+ ${Object.entries(blueprint.metadata.input).map( + ([key, value]) => + html`
+ ${value?.description} + +
` + )}` + : this.hass.localize( + "ui.panel.config.automation.editor.blueprint.no_inputs" + ) + : ""} +
+
+
`; + } + + private async _getBlueprints() { + this._blueprints = await fetchBlueprints(this.hass, "automation"); + } + + private _excuteAutomation(ev: Event) { + triggerAutomation(this.hass, (ev.target as any).stateObj.entity_id); + } + + private _blueprintChanged(ev) { + ev.stopPropagation(); + if (this.config.use_blueprint.path === ev.detail.value) { + return; + } + fireEvent(this, "value-changed", { + value: { + ...this.config!, + use_blueprint: { + path: ev.detail.value, + }, + }, + }); + } + + private _inputChanged(ev) { + ev.stopPropagation(); + const target = ev.target as any; + const key = target.key; + const value = target.value; + if ( + (this.config.use_blueprint.input && + this.config.use_blueprint.input[key] === value) || + (!this.config.use_blueprint.input && value === "") + ) { + return; + } + fireEvent(this, "value-changed", { + value: { + ...this.config!, + use_blueprint: { + ...this.config.use_blueprint, + input: { ...this.config.use_blueprint.input, [key]: value }, + }, + }, + }); + } + + private _valueChanged(ev: CustomEvent) { + ev.stopPropagation(); + const target = ev.target as any; + const name = target.name; + if (!name) { + return; + } + let newVal = ev.detail.value; + if (target.type === "number") { + newVal = Number(newVal); + } + if ((this.config![name] || "") === newVal) { + return; + } + fireEvent(this, "value-changed", { + value: { ...this.config!, [name]: newVal }, + }); + } + + private _navigateBlueprints() { + navigate(this, "/config/blueprint"); + } + + static get styles(): CSSResult[] { + return [ + haStyle, + css` + ha-card { + overflow: hidden; + } + .errors { + padding: 20px; + font-weight: bold; + color: var(--error-color); + } + .content { + padding-bottom: 20px; + } + .blueprint-picker-container { + display: flex; + align-items: center; + justify-content: space-between; + } + h3 { + margin-top: 16px; + } + span[slot="introduction"] a { + color: var(--primary-color); + } + p { + margin-bottom: 0; + } + ha-entity-toggle { + margin-right: 8px; + } + mwc-fab { + position: relative; + bottom: calc(-80px - env(safe-area-inset-bottom)); + transition: bottom 0.3s; + } + mwc-fab.dirty { + bottom: 0; + } + .selected_menu_item { + color: var(--primary-color); + } + li[role="separator"] { + border-bottom-color: var(--divider-color); + } + `, + ]; + } +} + +declare global { + interface HTMLElementTagNameMap { + "blueprint-automation-editor": HaBlueprintAutomationEditor; + } +} diff --git a/src/panels/config/automation/dialog-new-automation.ts b/src/panels/config/automation/dialog-new-automation.ts new file mode 100644 index 0000000000..cf9a5c965d --- /dev/null +++ b/src/panels/config/automation/dialog-new-automation.ts @@ -0,0 +1,175 @@ +import "@material/mwc-button"; +import "../../../components/ha-circular-progress"; +import { + css, + CSSResult, + customElement, + html, + LitElement, + property, + internalProperty, + TemplateResult, +} from "lit-element"; +import "../../../components/ha-dialog"; +import { haStyle, haStyleDialog } from "../../../resources/styles"; +import type { HomeAssistant } from "../../../types"; +import { fireEvent } from "../../../common/dom/fire_event"; +import { isComponentLoaded } from "../../../common/config/is_component_loaded"; +import { + AutomationConfig, + showAutomationEditor, +} from "../../../data/automation"; +import { showThingtalkDialog } from "./thingtalk/show-dialog-thingtalk"; +import "../../../components/ha-card"; +import "../../../components/ha-blueprint-picker"; + +@customElement("ha-dialog-new-automation") +class DialogNewAutomation extends LitElement { + @property({ attribute: false }) public hass!: HomeAssistant; + + @internalProperty() private _opened = false; + + public showDialog(): void { + this._opened = true; + } + + public closeDialog(): void { + this._opened = false; + fireEvent(this, "dialog-closed", { dialog: this.localName }); + } + + protected render(): TemplateResult { + if (!this._opened) { + return html``; + } + return html` + +
+ ${this.hass.localize("ui.panel.config.automation.dialog_new.how")} +
+ ${isComponentLoaded(this.hass, "cloud") + ? html` +
+

+ ${this.hass.localize( + "ui.panel.config.automation.dialog_new.thingtalk.header" + )} +

+ ${this.hass.localize( + "ui.panel.config.automation.dialog_new.thingtalk.intro" + )} +
+ + ${this.hass.localize( + "ui.panel.config.automation.dialog_new.thingtalk.create" + )} +
+
+
` + : html``} + ${isComponentLoaded(this.hass, "blueprint") + ? html` +
+

+ ${this.hass.localize( + "ui.panel.config.automation.dialog_new.blueprint.use_blueprint" + )} +

+ +
+
` + : html``} +
+
+ + ${this.hass.localize( + "ui.panel.config.automation.dialog_new.start_empty" + )} + +
+ `; + } + + private _thingTalk() { + this.closeDialog(); + showThingtalkDialog(this, { + callback: (config: Partial | undefined) => + showAutomationEditor(this, config), + input: this.shadowRoot!.querySelector("paper-input")!.value as string, + }); + } + + private _blueprintPicked(ev: CustomEvent) { + showAutomationEditor(this, { use_blueprint: { path: ev.detail.value } }); + this.closeDialog(); + } + + private _blank() { + showAutomationEditor(this); + this.closeDialog(); + } + + static get styles(): CSSResult[] { + return [ + haStyle, + haStyleDialog, + css` + .container { + display: flex; + } + ha-card { + width: calc(50% - 8px); + margin: 4px; + } + ha-card div { + height: 100%; + display: flex; + flex-direction: column; + justify-content: space-between; + } + ha-card { + box-sizing: border-box; + padding: 8px; + } + ha-blueprint-picker { + width: 100%; + } + .side-by-side { + display: flex; + flex-direction: row; + align-items: flex-end; + } + @media all and (max-width: 500px) { + .container { + flex-direction: column; + } + ha-card { + width: 100%; + } + } + `, + ]; + } +} + +declare global { + interface HTMLElementTagNameMap { + "ha-dialog-new-automation": DialogNewAutomation; + } +} diff --git a/src/panels/config/automation/ha-automation-editor.ts b/src/panels/config/automation/ha-automation-editor.ts index 47d8160e86..e6b785e01f 100644 --- a/src/panels/config/automation/ha-automation-editor.ts +++ b/src/panels/config/automation/ha-automation-editor.ts @@ -12,7 +12,6 @@ import "@polymer/paper-dropdown-menu/paper-dropdown-menu-light"; import "@polymer/paper-input/paper-textarea"; import "@material/mwc-list/mwc-list-item"; import { ActionDetail } from "@material/mwc-list/mwc-list-foundation"; -import { PaperListboxElement } from "@polymer/paper-listbox"; import { css, CSSResult, @@ -36,14 +35,11 @@ import type { HaYamlEditor } from "../../../components/ha-yaml-editor"; import { AutomationConfig, AutomationEntity, - Condition, deleteAutomation, getAutomationEditorInitData, showAutomationEditor, - Trigger, triggerAutomation, } from "../../../data/automation"; -import { Action } from "../../../data/script"; import { showAlertDialog, showConfirmationDialog, @@ -53,7 +49,6 @@ import "../../../layouts/hass-tabs-subpage"; import { KeyboardShortcutMixin } from "../../../mixins/keyboard-shortcut-mixin"; import { haStyle } from "../../../resources/styles"; import { HomeAssistant, Route } from "../../../types"; -import { documentationUrl } from "../../../util/documentation-url"; import "../ha-config-section"; import { configSections } from "../ha-panel-config"; import "./action/ha-automation-action"; @@ -61,11 +56,13 @@ import { HaDeviceAction } from "./action/types/ha-automation-action-device_id"; import "./condition/ha-automation-condition"; import "./trigger/ha-automation-trigger"; import { HaDeviceTrigger } from "./trigger/types/ha-automation-trigger-device"; - -const MODES = ["single", "restart", "queued", "parallel"]; -const MODES_MAX = ["queued", "parallel"]; +import "./manual-automation-editor"; +import "./blueprint-automation-editor"; declare global { + interface HTMLElementTagNameMap { + "ha-automation-editor": HaAutomationEditor; + } // for fire event interface HASSDomEvents { "ui-mode-not-available": Error; @@ -193,6 +190,7 @@ export class HaAutomationEditor extends KeyboardShortcutMixin(LitElement) { + ${this._config ? html` ${this.narrow @@ -204,217 +202,19 @@ export class HaAutomationEditor extends KeyboardShortcutMixin(LitElement) { : ""} ${this._mode === "gui" ? html` - - ${!this.narrow - ? html` - ${this._config.alias} - ` - : ""} - - ${this.hass.localize( - "ui.panel.config.automation.editor.introduction" - )} - - -
- - - -

- ${this.hass.localize( - "ui.panel.config.automation.editor.modes.description", - "documentation_link", - html`${this.hass.localize( - "ui.panel.config.automation.editor.modes.documentation" - )}` - )} -

- - - ${MODES.map( - (mode) => html` - - ${this.hass.localize( - `ui.panel.config.automation.editor.modes.${mode}` - ) || mode} - - ` - )} - - - ${this._config.mode && - MODES_MAX.includes(this._config.mode) - ? html` - ` - : html``} -
- ${stateObj - ? html` -
-
- - ${this.hass.localize( - "ui.panel.config.automation.editor.enable_disable" - )} -
- - ${this.hass.localize( - "ui.card.automation.trigger" - )} - -
- ` - : ""} -
-
- - - - ${this.hass.localize( - "ui.panel.config.automation.editor.triggers.header" - )} - - -

- ${this.hass.localize( - "ui.panel.config.automation.editor.triggers.introduction" - )} -

- - ${this.hass.localize( - "ui.panel.config.automation.editor.triggers.learn_more" - )} - -
- -
- - - - ${this.hass.localize( - "ui.panel.config.automation.editor.conditions.header" - )} - - -

- ${this.hass.localize( - "ui.panel.config.automation.editor.conditions.introduction" - )} -

- - ${this.hass.localize( - "ui.panel.config.automation.editor.conditions.learn_more" - )} - -
- -
- - - - ${this.hass.localize( - "ui.panel.config.automation.editor.actions.header" - )} - - -

- ${this.hass.localize( - "ui.panel.config.automation.editor.actions.introduction" - )} -

- - ${this.hass.localize( - "ui.panel.config.automation.editor.actions.learn_more" - )} - -
- -
+ ${"use_blueprint" in this._config + ? html`` + : html``} ` : this._mode === "yaml" ? html` @@ -531,17 +331,25 @@ export class HaAutomationEditor extends KeyboardShortcutMixin(LitElement) { if (changedProps.has("automationId") && !this.automationId && this.hass) { const initData = getAutomationEditorInitData(); - this._dirty = !!initData; - this._config = { + let baseConfig: Partial = { alias: this.hass.localize( "ui.panel.config.automation.editor.default_name" ), description: "", - trigger: [{ platform: "device", ...HaDeviceTrigger.defaultConfig }], - condition: [], - action: [{ ...HaDeviceAction.defaultConfig }], - ...initData, }; + if (!initData || !("use_blueprint" in initData)) { + baseConfig = { + ...baseConfig, + mode: "single", + trigger: [{ platform: "device", ...HaDeviceTrigger.defaultConfig }], + condition: [], + action: [{ ...HaDeviceAction.defaultConfig }], + }; + } + this._config = { + ...baseConfig, + ...initData, + } as AutomationConfig; } if ( @@ -560,58 +368,11 @@ export class HaAutomationEditor extends KeyboardShortcutMixin(LitElement) { this._entityId = automation?.entity_id; } - private _modeChanged(ev: CustomEvent) { - const mode = ((ev.target as PaperListboxElement)?.selectedItem as any) - ?.mode; - - if (mode === this._config!.mode) { - return; - } - - this._config = { ...this._config!, mode }; - if (!MODES_MAX.includes(mode)) { - delete this._config.max; - } - this._dirty = true; - } - - private _valueChanged(ev: CustomEvent) { + private _valueChanged(ev: CustomEvent<{ value: AutomationConfig }>) { ev.stopPropagation(); - const target = ev.target as any; - const name = target.name; - if (!name) { - return; - } - let newVal = ev.detail.value; - if (target.type === "number") { - newVal = Number(newVal); - } - if ((this._config![name] || "") === newVal) { - return; - } - this._config = { ...this._config!, [name]: newVal }; + this._config = ev.detail.value; this._dirty = true; - } - - private _triggerChanged(ev: CustomEvent): void { - this._config = { ...this._config!, trigger: ev.detail.value as Trigger[] }; this._errors = undefined; - this._dirty = true; - } - - private _conditionChanged(ev: CustomEvent): void { - this._config = { - ...this._config!, - condition: ev.detail.value as Condition[], - }; - this._errors = undefined; - this._dirty = true; - } - - private _actionChanged(ev: CustomEvent): void { - this._config = { ...this._config!, action: ev.detail.value as Action[] }; - this._errors = undefined; - this._dirty = true; } private _excuteAutomation(ev: Event) { diff --git a/src/panels/config/automation/ha-automation-picker.ts b/src/panels/config/automation/ha-automation-picker.ts index 9c4acf92cc..1b72642178 100644 --- a/src/panels/config/automation/ha-automation-picker.ts +++ b/src/panels/config/automation/ha-automation-picker.ts @@ -12,7 +12,6 @@ import { } from "lit-element"; import { ifDefined } from "lit-html/directives/if-defined"; import memoizeOne from "memoize-one"; -import { isComponentLoaded } from "../../../common/config/is_component_loaded"; import { formatDateTime } from "../../../common/datetime/format_date_time"; import { fireEvent } from "../../../common/dom/fire_event"; import { computeStateName } from "../../../common/entity/compute_state_name"; @@ -20,19 +19,16 @@ import { DataTableColumnContainer } from "../../../components/data-table/ha-data import { showAlertDialog } from "../../../dialogs/generic/show-dialog-box"; import "../../../components/entity/ha-entity-toggle"; import "../../../components/ha-svg-icon"; -import { - AutomationConfig, - AutomationEntity, - showAutomationEditor, - triggerAutomation, -} from "../../../data/automation"; +import { AutomationEntity, triggerAutomation } from "../../../data/automation"; import { UNAVAILABLE_STATES } from "../../../data/entity"; import "../../../layouts/hass-tabs-subpage-data-table"; import { haStyle } from "../../../resources/styles"; import { HomeAssistant, Route } from "../../../types"; import { configSections } from "../ha-panel-config"; -import { showThingtalkDialog } from "./show-dialog-thingtalk"; import { documentationUrl } from "../../../util/documentation-url"; +import { showNewAutomationDialog } from "./show-dialog-new-automation"; +import { navigate } from "../../../common/navigate"; +import { isComponentLoaded } from "../../../common/config/is_component_loaded"; @customElement("ha-automation-picker") class HaAutomationPicker extends LitElement { @@ -220,14 +216,14 @@ class HaAutomationPicker extends LitElement { } private _createNew() { - if (!isComponentLoaded(this.hass, "cloud")) { - showAutomationEditor(this); - return; + if ( + isComponentLoaded(this.hass, "cloud") || + isComponentLoaded(this.hass, "blueprint") + ) { + showNewAutomationDialog(this); + } else { + navigate(this, "/config/automation/edit/new"); } - showThingtalkDialog(this, { - callback: (config: Partial | undefined) => - showAutomationEditor(this, config), - }); } static get styles(): CSSResult { diff --git a/src/panels/config/automation/manual-automation-editor.ts b/src/panels/config/automation/manual-automation-editor.ts new file mode 100644 index 0000000000..addd7f25f2 --- /dev/null +++ b/src/panels/config/automation/manual-automation-editor.ts @@ -0,0 +1,349 @@ +import { + css, + CSSResult, + customElement, + LitElement, + property, +} from "lit-element"; +import { html } from "lit-html"; +import { + Condition, + ManualAutomationConfig, + Trigger, + triggerAutomation, +} from "../../../data/automation"; +import { Action, MODES, MODES_MAX } from "../../../data/script"; +import { HomeAssistant } from "../../../types"; +import { documentationUrl } from "../../../util/documentation-url"; +import "../ha-config-section"; +import "../../../components/ha-card"; +import "@polymer/paper-input/paper-textarea"; +import "@polymer/paper-dropdown-menu/paper-dropdown-menu-light"; +import "../../../components/entity/ha-entity-toggle"; +import "@material/mwc-button/mwc-button"; +import "./trigger/ha-automation-trigger"; +import "./condition/ha-automation-condition"; +import "./action/ha-automation-action"; +import { fireEvent } from "../../../common/dom/fire_event"; +import { PaperListboxElement } from "@polymer/paper-listbox"; +import { haStyle } from "../../../resources/styles"; +import { HassEntity } from "home-assistant-js-websocket"; + +@customElement("manual-automation-editor") +export class HaManualAutomationEditor extends LitElement { + @property({ attribute: false }) public hass!: HomeAssistant; + + @property() public isWide!: boolean; + + @property() public narrow!: boolean; + + @property() public config!: ManualAutomationConfig; + + @property() public stateObj?: HassEntity; + + protected render() { + return html` + ${!this.narrow + ? html` ${this.config.alias} ` + : ""} + + ${this.hass.localize( + "ui.panel.config.automation.editor.introduction" + )} + + +
+ + + +

+ ${this.hass.localize( + "ui.panel.config.automation.editor.modes.description", + "documentation_link", + html`${this.hass.localize( + "ui.panel.config.automation.editor.modes.documentation" + )}` + )} +

+ + + ${MODES.map( + (mode) => html` + + ${this.hass.localize( + `ui.panel.config.automation.editor.modes.${mode}` + ) || mode} + + ` + )} + + + ${this.config.mode && MODES_MAX.includes(this.config.mode) + ? html` + ` + : html``} +
+ ${this.stateObj + ? html` +
+
+ + ${this.hass.localize( + "ui.panel.config.automation.editor.enable_disable" + )} +
+ + ${this.hass.localize("ui.card.automation.trigger")} + +
+ ` + : ""} +
+
+ + + + ${this.hass.localize( + "ui.panel.config.automation.editor.triggers.header" + )} + + +

+ ${this.hass.localize( + "ui.panel.config.automation.editor.triggers.introduction" + )} +

+ + ${this.hass.localize( + "ui.panel.config.automation.editor.triggers.learn_more" + )} + +
+ +
+ + + + ${this.hass.localize( + "ui.panel.config.automation.editor.conditions.header" + )} + + +

+ ${this.hass.localize( + "ui.panel.config.automation.editor.conditions.introduction" + )} +

+ + ${this.hass.localize( + "ui.panel.config.automation.editor.conditions.learn_more" + )} + +
+ +
+ + + + ${this.hass.localize( + "ui.panel.config.automation.editor.actions.header" + )} + + +

+ ${this.hass.localize( + "ui.panel.config.automation.editor.actions.introduction" + )} +

+ + ${this.hass.localize( + "ui.panel.config.automation.editor.actions.learn_more" + )} + +
+ +
`; + } + + private _excuteAutomation(ev: Event) { + triggerAutomation(this.hass, (ev.target as any).stateObj.entity_id); + } + + private _valueChanged(ev: CustomEvent) { + ev.stopPropagation(); + const target = ev.target as any; + const name = target.name; + if (!name) { + return; + } + let newVal = ev.detail.value; + if (target.type === "number") { + newVal = Number(newVal); + } + if ((this.config![name] || "") === newVal) { + return; + } + fireEvent(this, "value-changed", { + value: { ...this.config!, [name]: newVal }, + }); + } + + private _modeChanged(ev: CustomEvent) { + const mode = ((ev.target as PaperListboxElement)?.selectedItem as any) + ?.mode; + + if (mode === this.config!.mode) { + return; + } + fireEvent(this, "value-changed", { + value: { + ...this.config!, + mode, + max: !MODES_MAX.includes(mode) ? undefined : this.config.max, + }, + }); + } + + private _triggerChanged(ev: CustomEvent): void { + fireEvent(this, "value-changed", { + value: { ...this.config!, trigger: ev.detail.value as Trigger[] }, + }); + } + + private _conditionChanged(ev: CustomEvent): void { + fireEvent(this, "value-changed", { + value: { + ...this.config!, + condition: ev.detail.value as Condition[], + }, + }); + } + + private _actionChanged(ev: CustomEvent): void { + fireEvent(this, "value-changed", { + value: { ...this.config!, action: ev.detail.value as Action[] }, + }); + } + + static get styles(): CSSResult[] { + return [ + haStyle, + css` + ha-card { + overflow: hidden; + } + .errors { + padding: 20px; + font-weight: bold; + color: var(--error-color); + } + .content { + padding-bottom: 20px; + } + span[slot="introduction"] a { + color: var(--primary-color); + } + p { + margin-bottom: 0; + } + ha-entity-toggle { + margin-right: 8px; + } + mwc-fab { + position: relative; + bottom: calc(-80px - env(safe-area-inset-bottom)); + transition: bottom 0.3s; + } + mwc-fab.dirty { + bottom: 0; + } + .selected_menu_item { + color: var(--primary-color); + } + li[role="separator"] { + border-bottom-color: var(--divider-color); + } + `, + ]; + } +} + +declare global { + interface HTMLElementTagNameMap { + "manual-automation-editor": HaManualAutomationEditor; + } +} diff --git a/src/panels/config/automation/show-dialog-new-automation.ts b/src/panels/config/automation/show-dialog-new-automation.ts new file mode 100644 index 0000000000..6d39eab972 --- /dev/null +++ b/src/panels/config/automation/show-dialog-new-automation.ts @@ -0,0 +1,12 @@ +import { fireEvent } from "../../../common/dom/fire_event"; + +export const loadNewAutomationDialog = () => + import(/* webpackChunkName: "thingtalk-dialog" */ "./dialog-new-automation"); + +export const showNewAutomationDialog = (element: HTMLElement): void => { + fireEvent(element, "show-dialog", { + dialogTag: "ha-dialog-new-automation", + dialogImport: loadNewAutomationDialog, + dialogParams: {}, + }); +}; diff --git a/src/panels/config/automation/thingtalk/dialog-thingtalk.ts b/src/panels/config/automation/thingtalk/dialog-thingtalk.ts index 6659c03ac8..1e19024d0b 100644 --- a/src/panels/config/automation/thingtalk/dialog-thingtalk.ts +++ b/src/panels/config/automation/thingtalk/dialog-thingtalk.ts @@ -20,7 +20,7 @@ import { convertThingTalk } from "../../../../data/cloud"; import type { PolymerChangedEvent } from "../../../../polymer-types"; import { haStyle, haStyleDialog } from "../../../../resources/styles"; import type { HomeAssistant } from "../../../../types"; -import type { ThingtalkDialogParams } from "../show-dialog-thingtalk"; +import type { ThingtalkDialogParams } from "./show-dialog-thingtalk"; import "./ha-thingtalk-placeholders"; import type { PlaceholderValues } from "./ha-thingtalk-placeholders"; @@ -50,16 +50,21 @@ class DialogThingtalk extends LitElement { @internalProperty() private _placeholders?: PlaceholderContainer; - @query("#input", true) private _input?: PaperInputElement; + @query("#input") private _input?: PaperInputElement; - private _value!: string; + private _value?: string; private _config!: Partial; - public showDialog(params: ThingtalkDialogParams): void { + public async showDialog(params: ThingtalkDialogParams): Promise { this._params = params; this._error = undefined; this._opened = true; + if (params.input) { + this._value = params.input; + await this.updateComplete; + this._generate(); + } } protected render(): TemplateResult { @@ -126,6 +131,7 @@ class DialogThingtalk extends LitElement { diff --git a/src/panels/config/automation/show-dialog-thingtalk.ts b/src/panels/config/automation/thingtalk/show-dialog-thingtalk.ts similarity index 65% rename from src/panels/config/automation/show-dialog-thingtalk.ts rename to src/panels/config/automation/thingtalk/show-dialog-thingtalk.ts index 1c051a3bec..4452cae671 100644 --- a/src/panels/config/automation/show-dialog-thingtalk.ts +++ b/src/panels/config/automation/thingtalk/show-dialog-thingtalk.ts @@ -1,14 +1,13 @@ -import { fireEvent } from "../../../common/dom/fire_event"; -import { AutomationConfig } from "../../../data/automation"; +import { fireEvent } from "../../../../common/dom/fire_event"; +import { AutomationConfig } from "../../../../data/automation"; export interface ThingtalkDialogParams { callback: (config: Partial | undefined) => void; + input?: string; } export const loadThingtalkDialog = () => - import( - /* webpackChunkName: "thingtalk-dialog" */ "./thingtalk/dialog-thingtalk" - ); + import(/* webpackChunkName: "thingtalk-dialog" */ "./dialog-thingtalk"); export const showThingtalkDialog = ( element: HTMLElement, diff --git a/src/panels/config/blueprint/dialog-import-blueprint.ts b/src/panels/config/blueprint/dialog-import-blueprint.ts new file mode 100644 index 0000000000..cc257b8179 --- /dev/null +++ b/src/panels/config/blueprint/dialog-import-blueprint.ts @@ -0,0 +1,186 @@ +import "@material/mwc-button"; +import "@polymer/paper-dialog-scrollable/paper-dialog-scrollable"; +import "@polymer/paper-input/paper-input"; +import type { PaperInputElement } from "@polymer/paper-input/paper-input"; +import "../../../components/ha-circular-progress"; +import { + css, + CSSResult, + customElement, + html, + LitElement, + property, + internalProperty, + query, + TemplateResult, +} from "lit-element"; +import "../../../components/ha-dialog"; +import { haStyleDialog } from "../../../resources/styles"; +import type { HomeAssistant } from "../../../types"; +import { fireEvent } from "../../../common/dom/fire_event"; +import { + BlueprintImportResult, + importBlueprint, + saveBlueprint, +} from "../../../data/blueprint"; + +@customElement("ha-dialog-import-blueprint") +class DialogImportBlueprint extends LitElement { + @property({ attribute: false }) public hass!: HomeAssistant; + + @internalProperty() private _params?; + + @internalProperty() private _importing = false; + + @internalProperty() private _saving = false; + + @internalProperty() private _error?: string; + + @internalProperty() private _result?: BlueprintImportResult; + + @query("#input") private _input?: PaperInputElement; + + public showDialog(params): void { + this._params = params; + this._error = undefined; + } + + public closeDialog(): void { + this._error = undefined; + this._result = undefined; + this._params = undefined; + fireEvent(this, "dialog-closed", { dialog: this.localName }); + } + + protected render(): TemplateResult { + if (!this._params) { + return html``; + } + return html` + +
+ ${this._error ? html`
${this._error}
` : ""} + ${this._result + ? html`${this.hass.localize( + "ui.panel.config.blueprint.add.import", + "name", + "domain", + html`${this._result.blueprint.metadata.name}`, + this._result.blueprint.metadata.domain + )} + +
${this._result.raw_data}
` + : html`${this.hass.localize( + "ui.panel.config.blueprint.add.import_introduction" + )}`} +
+ ${!this._result + ? html` + ${this._importing + ? html`` + : ""} + ${this.hass.localize("ui.panel.config.blueprint.add.import_btn")} + ` + : html` + ${this.hass.localize("ui.common.cancel")} + + + ${this._saving + ? html`` + : ""} + ${this.hass.localize("ui.panel.config.blueprint.add.save_btn")} + `} +
+ `; + } + + private async _import() { + this._importing = true; + this._error = undefined; + try { + const url = this._input?.value; + if (!url) { + this._error = this.hass.localize( + "ui.panel.config.blueprint.add.error_no_url" + ); + return; + } + this._result = await importBlueprint(this.hass, url); + } catch (e) { + this._error = e.message; + } finally { + this._importing = false; + } + } + + private async _save() { + this._saving = true; + try { + const filename = this._input?.value; + if (!filename) { + return; + } + await saveBlueprint( + this.hass, + this._result!.blueprint.metadata.domain, + filename, + this._result!.raw_data, + this._result!.url + ); + this._params.importedCallback(); + this.closeDialog(); + } catch (e) { + this._error = e.message; + } finally { + this._saving = false; + } + } + + static get styles(): CSSResult[] { + return [haStyleDialog, css``]; + } +} + +declare global { + interface HTMLElementTagNameMap { + "ha-dialog-import-blueprint": DialogImportBlueprint; + } +} diff --git a/src/panels/config/blueprint/ha-blueprint-overview.ts b/src/panels/config/blueprint/ha-blueprint-overview.ts new file mode 100644 index 0000000000..73d97fb8c4 --- /dev/null +++ b/src/panels/config/blueprint/ha-blueprint-overview.ts @@ -0,0 +1,212 @@ +import "@material/mwc-fab"; +import "@material/mwc-icon-button"; +import { mdiPlus, mdiHelpCircle, mdiDelete } from "@mdi/js"; +import "@polymer/paper-tooltip/paper-tooltip"; +import { + CSSResult, + customElement, + html, + LitElement, + property, + TemplateResult, +} from "lit-element"; +import memoizeOne from "memoize-one"; +import { DataTableColumnContainer } from "../../../components/data-table/ha-data-table"; +import { + showAlertDialog, + showConfirmationDialog, +} from "../../../dialogs/generic/show-dialog-box"; +import "../../../components/entity/ha-entity-toggle"; +import "../../../components/ha-svg-icon"; +import "../../../layouts/hass-tabs-subpage-data-table"; +import { haStyle } from "../../../resources/styles"; +import { HomeAssistant, Route } from "../../../types"; +import { configSections } from "../ha-panel-config"; +import { documentationUrl } from "../../../util/documentation-url"; +import { + BlueprintMetaData, + Blueprints, + deleteBlueprint, +} from "../../../data/blueprint"; +import { showAddBlueprintDialog } from "./show-dialog-import-blueprint"; +import { showAutomationEditor } from "../../../data/automation"; +import { fireEvent } from "../../../common/dom/fire_event"; + +interface BlueprintMetaDataPath extends BlueprintMetaData { + path: string; +} + +const createNewFunctions = { + automation: ( + context: HaBlueprintOverview, + blueprintMeta: BlueprintMetaDataPath + ) => { + showAutomationEditor(context, { + alias: blueprintMeta.name, + use_blueprint: { path: blueprintMeta.path }, + }); + }, +}; + +@customElement("ha-blueprint-overview") +class HaBlueprintOverview extends LitElement { + @property({ attribute: false }) public hass!: HomeAssistant; + + @property({ type: Boolean }) public isWide!: boolean; + + @property({ type: Boolean }) public narrow!: boolean; + + @property() public route!: Route; + + @property() public blueprints!: Blueprints; + + private _processedBlueprints = memoizeOne((blueprints: Blueprints) => { + const result = Object.entries(blueprints).map(([path, blueprint]) => ({ + ...blueprint.metadata, + path, + })); + return result; + }); + + private _columns = memoizeOne( + (_language): DataTableColumnContainer => { + const columns: DataTableColumnContainer = { + name: { + title: this.hass.localize( + "ui.panel.config.blueprint.overview.headers.name" + ), + sortable: true, + filterable: true, + direction: "asc", + grows: true, + }, + }; + columns.domain = { + title: "Domain", + sortable: true, + filterable: true, + direction: "asc", + width: "20%", + }; + columns.path = { + title: "Path", + sortable: true, + filterable: true, + direction: "asc", + width: "20%", + }; + columns.create = { + title: "", + type: "icon-button", + template: (_, blueprint) => html` this._createNew(ev)} + >`, + }; + columns.delete = { + title: "", + type: "icon-button", + template: (_, blueprint) => html` this._delete(ev)} + >`, + }; + return columns; + } + ); + + protected render(): TemplateResult { + return html` + + + + + + + + + `; + } + + private _showHelp() { + showAlertDialog(this, { + title: this.hass.localize("ui.panel.config.blueprint.caption"), + text: html` + ${this.hass.localize("ui.panel.config.blueprint.overview.introduction")} +

+ + ${this.hass.localize( + "ui.panel.config.blueprint.overview.learn_more" + )} + +

+ `, + }); + } + + private _addBlueprint() { + showAddBlueprintDialog(this, { importedCallback: () => this._reload() }); + } + + private _reload() { + fireEvent(this, "reload-blueprints"); + } + + private _createNew(ev) { + const blueprint = ev.currentTarget.blueprint as BlueprintMetaDataPath; + createNewFunctions[blueprint.domain](this, blueprint); + } + + private async _delete(ev) { + const blueprint = ev.currentTarget.blueprint; + if ( + !(await showConfirmationDialog(this, { + title: this.hass.localize( + "ui.panel.config.blueprint.overview.confirm_delete_header" + ), + text: this.hass.localize( + "ui.panel.config.blueprint.overview.confirm_delete_text" + ), + })) + ) { + return; + } + await deleteBlueprint(this.hass, blueprint.domain, blueprint.path); + fireEvent(this, "reload-blueprints"); + } + + static get styles(): CSSResult { + return haStyle; + } +} + +declare global { + interface HTMLElementTagNameMap { + "ha-blueprint-overview": HaBlueprintOverview; + } +} diff --git a/src/panels/config/blueprint/ha-config-blueprint.ts b/src/panels/config/blueprint/ha-config-blueprint.ts new file mode 100644 index 0000000000..12e3bbc35f --- /dev/null +++ b/src/panels/config/blueprint/ha-config-blueprint.ts @@ -0,0 +1,76 @@ +import { customElement, property, PropertyValues } from "lit-element"; +import { + HassRouterPage, + RouterOptions, +} from "../../../layouts/hass-router-page"; +import "./ha-blueprint-overview"; +import { HomeAssistant } from "../../../types"; +import { Blueprints, fetchBlueprints } from "../../../data/blueprint"; + +declare global { + // for fire event + interface HASSDomEvents { + "reload-blueprints": undefined; + } +} + +@customElement("ha-config-blueprint") +class HaConfigBlueprint extends HassRouterPage { + @property({ attribute: false }) public hass!: HomeAssistant; + + @property() public narrow!: boolean; + + @property() public isWide!: boolean; + + @property() public showAdvanced!: boolean; + + @property() public blueprints: Blueprints = {}; + + protected routerOptions: RouterOptions = { + defaultPage: "dashboard", + routes: { + dashboard: { + tag: "ha-blueprint-overview", + cache: true, + }, + edit: { + tag: "ha-blueprint-editor", + }, + }, + }; + + private async _getBlueprints() { + this.blueprints = await fetchBlueprints(this.hass, "automation"); + } + + protected firstUpdated(changedProps) { + super.firstUpdated(changedProps); + this.addEventListener("reload-blueprints", () => { + this._getBlueprints(); + }); + this._getBlueprints(); + } + + protected updatePageEl(pageEl, changedProps: PropertyValues) { + pageEl.hass = this.hass; + pageEl.narrow = this.narrow; + pageEl.isWide = this.isWide; + pageEl.route = this.routeTail; + pageEl.showAdvanced = this.showAdvanced; + pageEl.blueprints = this.blueprints; + + if ( + (!changedProps || changedProps.has("route")) && + this._currentPage === "edit" + ) { + const blueprintId = this.routeTail.path.substr(1); + pageEl.blueprintId = blueprintId === "new" ? null : blueprintId; + } + } +} + +declare global { + interface HTMLElementTagNameMap { + "ha-config-blueprint": HaConfigBlueprint; + } +} diff --git a/src/panels/config/blueprint/show-dialog-import-blueprint.ts b/src/panels/config/blueprint/show-dialog-import-blueprint.ts new file mode 100644 index 0000000000..0fec45cf4c --- /dev/null +++ b/src/panels/config/blueprint/show-dialog-import-blueprint.ts @@ -0,0 +1,17 @@ +import { fireEvent } from "../../../common/dom/fire_event"; + +export const loadImportBlueprintDialog = () => + import( + /* webpackChunkName: "add-blueprint-dialog" */ "./dialog-import-blueprint" + ); + +export const showAddBlueprintDialog = ( + element: HTMLElement, + dialogParams +): void => { + fireEvent(element, "show-dialog", { + dialogTag: "ha-dialog-import-blueprint", + dialogImport: loadImportBlueprintDialog, + dialogParams, + }); +}; diff --git a/src/panels/config/ha-panel-config.ts b/src/panels/config/ha-panel-config.ts index 457f9bf1c8..b57805382e 100644 --- a/src/panels/config/ha-panel-config.ts +++ b/src/panels/config/ha-panel-config.ts @@ -33,6 +33,7 @@ import { mdiMathLog, mdiPencil, mdiNfcVariant, + mdiPaletteSwatch, } from "@mdi/js"; declare global { @@ -74,6 +75,12 @@ export const configSections: { [name: string]: PageNavigation[] } = { }, ], automation: [ + { + component: "blueprint", + path: "/config/blueprint", + translationKey: "ui.panel.config.blueprint.caption", + iconPath: mdiPaletteSwatch, + }, { component: "automation", path: "/config/automation", @@ -92,6 +99,8 @@ export const configSections: { [name: string]: PageNavigation[] } = { translationKey: "ui.panel.config.script.caption", iconPath: mdiScriptText, }, + ], + helpers: [ { component: "helpers", path: "/config/helpers", @@ -206,6 +215,13 @@ class HaPanelConfig extends HassRouterPage { /* webpackChunkName: "panel-config-automation" */ "./automation/ha-config-automation" ), }, + blueprint: { + tag: "ha-config-blueprint", + load: () => + import( + /* webpackChunkName: "panel-config-blueprint" */ "./blueprint/ha-config-blueprint" + ), + }, tags: { tag: "ha-config-tags", load: () => diff --git a/src/translations/en.json b/src/translations/en.json index ab628679f5..b70531caf7 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -339,6 +339,11 @@ "add_user": "Add user", "remove_user": "Remove user" }, + "blueprint-picker": { + "select_blueprint": "Select a Blueprint", + "add_user": "Add user", + "remove_user": "Remove user" + }, "device-picker": { "clear": "Clear", "toggle": "Toggle", @@ -1110,6 +1115,19 @@ "name": "Name" } }, + "dialog_new": { + "header": "Create a new automation", + "how": "How do you want to create your new automation?", + + "blueprint": { "use_blueprint": "Use a blueprint" }, + "thingtalk": { + "header": "Describe the automation you want to create", + "intro": "And we will try to create it for you. For example: Turn the lights off when I leave.", + "input_label": "What should this automation do?", + "create": "Create" + }, + "start_empty": "Start with an empty automation" + }, "editor": { "enable_disable": "Enable/Disable automation", "introduction": "Use automations to bring your home alive.", @@ -1125,6 +1143,14 @@ "label": "Description", "placeholder": "Optional description" }, + "blueprint": { + "header": "Blueprint", + "blueprint_to_use": "Blueprint to use", + "no_blueprints": "You don't have any blueprints", + "manage_blueprints": "Manage Blueprints", + "inputs": "Inputs", + "no_inputs": "This blueprint doesn't have any inputs." + }, "modes": { "label": "Mode", "description": "The mode controls what happens when the automation is triggered while the actions are still running from a previous trigger. Check the {documentation_link} for more info.", @@ -1414,6 +1440,31 @@ } } }, + "blueprint": { + "caption": "Blueprints", + "description": "Manage blueprints", + "overview": { + "header": "Blueprint Editor", + "introduction": "The blueprint editor allows you to create and edit blueprints.", + "learn_more": "Learn more about blueprints", + "headers": { + "name": "Name" + }, + "confirm_delete_header": "Delete this Blueprint?", + "confirm_delete_text": "Are you sure you want to delete this Blueprint" + }, + "add": { + "header": "Add new blueprint", + "import_header": "Import {name} ({domain})", + "import_introduction": "You can import Blueprints of other users from Github and the community forums. Enter the url of the Blueprint below.", + "url": "Url of the blueprint", + "importing": "Importing blueprint...", + "import_btn": "Import blueprint", + "saving": "Saving blueprint...", + "save_btn": "Save blueprint", + "error_no_url": "Please enter the url of the blueprint." + } + }, "script": { "caption": "Scripts", "description": "Manage scripts", From c1ba8ba6b805b8b060d8f422a9ec22a70624f248 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Thu, 19 Nov 2020 00:32:32 +0000 Subject: [PATCH 34/90] [ci skip] Translation update --- translations/frontend/ca.json | 36 ++++++++++----------- translations/frontend/cs.json | 2 +- translations/frontend/de.json | 6 ++-- translations/frontend/en.json | 52 ++++++++++++++++++++++++++++++ translations/frontend/es-419.json | 6 +++- translations/frontend/es.json | 2 +- translations/frontend/et.json | 8 ++--- translations/frontend/nb.json | 2 +- translations/frontend/nl.json | 2 +- translations/frontend/pl.json | 2 +- translations/frontend/pt.json | 2 +- translations/frontend/ru.json | 2 +- translations/frontend/sl.json | 2 +- translations/frontend/zh-Hans.json | 2 +- translations/frontend/zh-Hant.json | 2 +- 15 files changed, 92 insertions(+), 36 deletions(-) diff --git a/translations/frontend/ca.json b/translations/frontend/ca.json index 7406ddaeb7..cdc03b398d 100644 --- a/translations/frontend/ca.json +++ b/translations/frontend/ca.json @@ -206,7 +206,7 @@ "fan_only": "Només ventilador", "heat": "Escalfar", "heat_cool": "Escalfar/Refredar", - "off": "Apagat" + "off": "Desactivat" }, "configurator": { "configure": "Configurar", @@ -229,8 +229,8 @@ "not_home": "Fora" }, "fan": { - "off": "Apagat", - "on": "Engegat" + "off": "Desactivat", + "on": "Activat" }, "group": { "closed": "Tancat", @@ -262,7 +262,7 @@ "media_player": { "idle": "Inactiu", "off": "Desactivat", - "on": "Encès", + "on": "Activat", "paused": "Pausat", "playing": "Reproduint", "standby": "En espera" @@ -275,8 +275,8 @@ "problem": "Problema" }, "remote": { - "off": "Apagat", - "on": "Encès" + "off": "Desactivat", + "on": "Activat" }, "scene": { "scening": "Escena activa" @@ -294,7 +294,7 @@ "below_horizon": "Sota l'horitzó" }, "switch": { - "off": "Apagat", + "off": "Desactivat", "on": "Activat" }, "timer": { @@ -307,8 +307,8 @@ "docked": "Aparcat", "error": "Error", "idle": "Inactiu", - "off": "Apagat", - "on": "Encès", + "off": "Desactivat", + "on": "Activat", "paused": "Pausat", "returning": "Retornant a la base" }, @@ -694,11 +694,11 @@ "never": "Mai", "past": "Fa {time}", "past_duration": { - "day": "Fa {count} {count, plural,\n one {dia}\n other {dies}\n}", - "hour": "Fa {count} {count, plural,\n one {hora}\n other {hores}\n}", - "minute": "Fa {count} {count, plural,\n one {minut}\n other {minuts}\n}", - "second": "Fa {count} {count, plural,\n one {segon}\n other {segons}\n}", - "week": "Fa {count} {count, plural,\n one {setmana}\n other {setmanes}\n}" + "day": "fa {count} {count, plural,\n one {dia}\n other {dies}\n}", + "hour": "fa {count} {count, plural,\n one {hora}\n other {hores}\n}", + "minute": "fa {count} {count, plural,\n one {minut}\n other {minuts}\n}", + "second": "fa {count} {count, plural,\n one {segon}\n other {segons}\n}", + "week": "fa {count} {count, plural,\n one {setmana}\n other {setmanes}\n}" } }, "service-picker": { @@ -741,7 +741,7 @@ "update": "Actualitza" }, "faq": "documentació", - "no_unique_id": "Aquesta entitat no té un ID únic, per tant, la seva configuració no pot ser gestionada des de la interfície d'usuari. Consulta {faq_link} per a més detalls.", + "no_unique_id": "Aquesta entitat (\"{entity_id}\") no té un ID únic, per tant, la seva configuració no pot ser gestionada des de la interfície d'usuari. Consulta les {faq_link} per a més detalls.", "related": "Relacionat", "settings": "Configuració" }, @@ -1875,7 +1875,7 @@ "none_found": "No s'han trobat integracions", "none_found_detail": "Ajusta els paràmetres de cerca.", "note_about_integrations": "Encara no es poden configurar totes les integracions a través de la UI.", - "note_about_website_reference": "N'hi ha més disponibles al ", + "note_about_website_reference": "En pots trobar més al ", "reconfigure": "Reconfigura", "rename_dialog": "Edita el nom de l'entrada de configuració", "rename_input_label": "Nom de l'entrada", @@ -3370,7 +3370,7 @@ "description": "Crea tokens d'autenticació d'accés de llarga durada per permetre als teus programes/scripts interactuar amb la instància de Home Assistant. Cada token és vàlid durant deu anys després de la seva creació. Els següents tokens d'autenticació d'accés de llarga durada estan actius actualment.", "empty_state": "Encara no tens tokens d'autenticació d'accés de llarga durada.", "header": "Tokens d'autenticació d'accés de llarga durada", - "last_used": "Darrer ús el {date} des de {location}", + "last_used": "Darrer ús {date} des de {location}", "learn_auth_requests": "Aprèn a fer sol·licituds autenticades.", "name": "Nom", "not_used": "Mai no s'ha utilitzat", @@ -3409,7 +3409,7 @@ "delete_failed": "No s'ha pogut eliminar el token d'autenticació d'actualització.", "description": "Cada token d'autenticació d'actualització representa un inici de sessió diferent. Els tokens d'autenticació d'actualització s'eliminaran automàticament quan tanquis la sessió. A sota hi ha una llista de tokens d'autenticació d'actualització que estan actius actualment al teu compte.", "header": "Refresca els tokens d'autenticació", - "last_used": "Darrer ús el {date} des de {location}", + "last_used": "Darrer ús {date} des de {location}", "not_used": "Mai no s'ha utilitzat", "token_title": "Token d'actualització de {clientId}" }, diff --git a/translations/frontend/cs.json b/translations/frontend/cs.json index b8c72d0336..f181e55837 100644 --- a/translations/frontend/cs.json +++ b/translations/frontend/cs.json @@ -741,7 +741,7 @@ "update": "Aktualizovat" }, "faq": "dokumentace", - "no_unique_id": "Tato entita nemá jedinečné ID, proto její nastavení nelze spravovat z uživatelského rozhraní. Další podrobnosti naleznete na stránce {faq_link}.", + "no_unique_id": "Tato entita (\"{entity_id}\") nemá jedinečné ID, proto její nastavení nelze spravovat z uživatelského rozhraní. Další podrobnosti naleznete na stránce {faq_link}.", "related": "Související", "settings": "Nastavení" }, diff --git a/translations/frontend/de.json b/translations/frontend/de.json index f56a508f03..2cb7dca751 100644 --- a/translations/frontend/de.json +++ b/translations/frontend/de.json @@ -741,7 +741,7 @@ "update": "Aktualisieren" }, "faq": "Dokumentation", - "no_unique_id": "Diese Entität hat keine eindeutige ID, daher können die Einstellungen nicht über die UI verwaltet werden. Schauen Sie in der {faq_link} nach für mehr Details.", + "no_unique_id": "Diese Entität (\"{entity_id}\") hat keine eindeutige ID, daher können die Einstellungen nicht über die UI verwaltet werden. Schaue in der {faq_link} nach für mehr Details.", "related": "Verwandte", "settings": "Einstellungen" }, @@ -1663,7 +1663,7 @@ "disable_selected": { "button": "Ausgewählte deaktivieren", "confirm_text": "Deaktivierte Entitäten werden zu Home Assistant nicht hinzugefügt.", - "confirm_title": "Möchtest du {number} {number, plural,\n one {{entity}}\n other {{entities}}\n} deaktivieren?" + "confirm_title": "Möchtest du {number} {number, plural,\n one {Entität}\n other {Entitäten}\n} deaktivieren?" }, "enable_selected": { "button": "Ausgewählte aktivieren", @@ -1692,7 +1692,7 @@ "confirm_partly_text": "Du kannst nur {removable} der ausgewählten {selected} Entitäten entfernen. Entitäten können nur entfernt werden, wenn die Integration die Entitäten nicht mehr bereitstellt. Manchmal musst du Home Assistant neu starten, bevor du die Entitäten einer entfernten Integration entfernen kannst. Möchtest du die entfernbaren Entitäten wirklich entfernen?", "confirm_partly_title": "Es können nur {number} ausgewählte Objekte entfernt werden.", "confirm_text": "Du solltest sie aus deiner Lovelace-Konfiguration und deinen Automatisierungen entfernen, wenn sie diese Entitäten enthalten.", - "confirm_title": "Möchtest du {number} {number, plural,\n one {{entity}}\n other {{entities}}\n} entfernen?" + "confirm_title": "Möchtest du {number} {number, plural,\n one {Entität}\n other {Entitäten}\n} entfernen?" }, "search": "Entitäten suchen", "selected": "{number} ausgewählt", diff --git a/translations/frontend/en.json b/translations/frontend/en.json index e965bcae41..3fe052e20f 100644 --- a/translations/frontend/en.json +++ b/translations/frontend/en.json @@ -547,6 +547,11 @@ "clear": "Clear", "show_areas": "Show areas" }, + "blueprint-picker": { + "add_user": "Add user", + "remove_user": "Remove user", + "select_blueprint": "Select a Blueprint" + }, "data-table": { "no-data": "No data", "search": "Search" @@ -1046,6 +1051,20 @@ "automation": { "caption": "Automations", "description": "Manage automations", + "dialog_new": { + "blueprint": { + "use_blueprint": "Use a blueprint" + }, + "header": "Create a new automation", + "how": "How do you want to create your new automation?", + "start_empty": "Start with an empty automation", + "thingtalk": { + "create": "Create", + "header": "Describe the automation you want to create", + "input_label": "What should this automation do?", + "intro": "And we will try to create it for you. For example: Turn the lights off when I leave." + } + }, "editor": { "actions": { "add": "Add action", @@ -1126,6 +1145,14 @@ "unsupported_action": "No UI support for action: {action}" }, "alias": "Name", + "blueprint": { + "blueprint_to_use": "Blueprint to use", + "header": "Blueprint", + "inputs": "Inputs", + "manage_blueprints": "Manage Blueprints", + "no_blueprints": "You don't have any blueprints", + "no_inputs": "This blueprint doesn't have any inputs." + }, "conditions": { "add": "Add condition", "delete": "Delete", @@ -1368,6 +1395,31 @@ } } }, + "blueprint": { + "add": { + "error_no_url": "Please enter the url of the blueprint.", + "header": "Add new blueprint", + "import_btn": "Import blueprint", + "import_header": "Import {name} ({domain})", + "import_introduction": "You can import Blueprints of other users from Github and the community forums. Enter the url of the Blueprint below.", + "importing": "Importing blueprint...", + "save_btn": "Save blueprint", + "saving": "Saving blueprint...", + "url": "Url of the blueprint" + }, + "caption": "Blueprints", + "description": "Manage blueprints", + "overview": { + "confirm_delete_header": "Delete this Blueprint?", + "confirm_delete_text": "Are you sure you want to delete this Blueprint", + "header": "Blueprint Editor", + "headers": { + "name": "Name" + }, + "introduction": "The blueprint editor allows you to create and edit blueprints.", + "learn_more": "Learn more about blueprints" + } + }, "cloud": { "account": { "alexa": { diff --git a/translations/frontend/es-419.json b/translations/frontend/es-419.json index 303a74b2ec..bb9561fabb 100644 --- a/translations/frontend/es-419.json +++ b/translations/frontend/es-419.json @@ -1660,7 +1660,9 @@ "os_name": "Nombre del sistema operativo", "os_version": "Versión del sistema operativo", "python_version": "Versión de Python", - "version": "Versión" + "timezone": "Zona horaria", + "version": "Versión", + "virtualenv": "Ambiente virtual" }, "lovelace": { "mode": "Modo", @@ -2060,6 +2062,7 @@ }, "picker": { "add_script": "Agregar script", + "duplicate": "Duplicado", "duplicate_script": "Duplicar script", "edit_script": "Editar script", "header": "Editor de scripts", @@ -2620,6 +2623,7 @@ "secondary_info_values": { "brightness": "Brillo", "last-changed": "Última modificación", + "last-updated": "Última actualización", "none": "Sin información secundaria", "position": "Posición" }, diff --git a/translations/frontend/es.json b/translations/frontend/es.json index cbd264cb42..7a741847ce 100644 --- a/translations/frontend/es.json +++ b/translations/frontend/es.json @@ -741,7 +741,7 @@ "update": "Actualizar" }, "faq": "documentación", - "no_unique_id": "Esta entidad no tiene una ID única, por lo que su configuración no se puede administrar desde la IU. Consulta {faq_link} para más detalles.", + "no_unique_id": "Esta entidad (\"{entity_id}\") no tiene un ID único, por lo tanto, su configuración no se puede administrar desde la IU. Consulta el {faq_link} para obtener más detalles.", "related": "Relacionado", "settings": "Configuración" }, diff --git a/translations/frontend/et.json b/translations/frontend/et.json index 64b4edbaa4..92dec515ae 100644 --- a/translations/frontend/et.json +++ b/translations/frontend/et.json @@ -741,7 +741,7 @@ "update": "Uuenda" }, "faq": "dokumentatsioon", - "no_unique_id": "Sellel olemil puudub unikaalne ID-d. Seetõttu ei saa selle seadeid kasutajaliidesest hallata. Lisainfot vaata {faq_link}.", + "no_unique_id": "Olemil (\"{entity_id}\") puudub unikaalne ID-d. Seetõttu ei saa selle seadeid kasutajaliidesest hallata. Lisainfot vaata {faq_link}.", "related": "Seotud", "settings": "Seaded" }, @@ -927,7 +927,7 @@ "template": "Taaslae mallisisestused", "trend": "Taaslae trendide olemid", "universal": "Taaslae meediumimängija olemid", - "zone": "Tasslae tsoonid" + "zone": "Taaslae tsoonid" }, "server_control": { "perform_action": "{action} server", @@ -1364,7 +1364,7 @@ "for_example": "Näiteks:", "header": "Loo uus automatiseering", "introduction": "Sisesta allpool, mida see automaatiseering peaks tegema, ja proovime selle teisendada Home Assistanti automaatiseeringuks.", - "language_note": "Märkus. Praegu toetatakse ainult inglise keelt." + "language_note": "Märkus: praegu toetatakse ainult inglise keelt." } } }, @@ -2795,7 +2795,7 @@ "last-changed": "Viimati muudetud", "last-triggered": "Viimati vallandunud", "last-updated": "Viimati uuendatud", - "none": "Teisene teave puudub", + "none": "Lisateave puudub", "position": "Asend", "tilt-position": "Kalle" }, diff --git a/translations/frontend/nb.json b/translations/frontend/nb.json index 349155a18b..656839535c 100644 --- a/translations/frontend/nb.json +++ b/translations/frontend/nb.json @@ -741,7 +741,7 @@ "update": "Oppdater" }, "faq": "dokumentasjon", - "no_unique_id": "Denne enheten har ikke en unik ID, og innstillingene kan derfor ikke administreres fra brukergrensesnittet. Se {faq_link} for mer informasjon.", + "no_unique_id": "Denne enheten ({entity_id}) har ikke en unik ID, derfor kan ikke innstillingene administreres fra brukergrensesnittet. Se {faq_link} hvis du vil ha mer informasjon.", "related": "Relaterte", "settings": "Innstillinger" }, diff --git a/translations/frontend/nl.json b/translations/frontend/nl.json index 9cd321e2c6..504b90378a 100644 --- a/translations/frontend/nl.json +++ b/translations/frontend/nl.json @@ -741,7 +741,7 @@ "update": "Bijwerken" }, "faq": "documentatie", - "no_unique_id": "Deze entiteit heeft geen unieke ID, daarom kunnen de instellingen niet worden beheerd vanuit de gebruikersinterface. Zie de {faq_link} voor meer details", + "no_unique_id": "Deze entiteit (\" {entity_id} \") heeft geen unieke ID, daarom kunnen de instellingen ervan niet worden beheerd vanuit de gebruikersinterface. Zie de {faq_link} voor meer details.", "related": "Gerelateerd", "settings": "instellingen" }, diff --git a/translations/frontend/pl.json b/translations/frontend/pl.json index 0aa4658071..0dd8f1ffd3 100644 --- a/translations/frontend/pl.json +++ b/translations/frontend/pl.json @@ -741,7 +741,7 @@ "update": "Aktualizuj" }, "faq": "dokumentacja", - "no_unique_id": "Ta encja nie ma unikalnego identyfikatora, dlatego z poziomu interfejsu użytkownika nie można zarządzać jej ustawieniami. Więcej szczegółów znajdziesz w {faq_link}.", + "no_unique_id": "Encja \"{entity_id}\" nie ma unikalnego identyfikatora, dlatego z poziomu interfejsu użytkownika nie można zarządzać jej ustawieniami. Więcej szczegółów znajdziesz w {faq_link}.", "related": "Powiązane", "settings": "Ustawienia" }, diff --git a/translations/frontend/pt.json b/translations/frontend/pt.json index 2436d8b26c..88b8f450cb 100644 --- a/translations/frontend/pt.json +++ b/translations/frontend/pt.json @@ -692,7 +692,7 @@ }, "just_now": "Agora mesmo", "never": "Nunca", - "past": "{time} atrás", + "past": "Há {time} atrás", "past_duration": { "day": "{count} {count, plural,\n one {dia}\n other {dias}\n} atrás", "hour": "{count} {count, plural,\n one {hora}\n other {horas}\n} atrás", diff --git a/translations/frontend/ru.json b/translations/frontend/ru.json index c8fbf28b4a..66a027a555 100644 --- a/translations/frontend/ru.json +++ b/translations/frontend/ru.json @@ -741,7 +741,7 @@ "update": "Обновить" }, "faq": "документацией", - "no_unique_id": "У этого объекта нет уникального идентификатора, поэтому его настройками нельзя управлять из пользовательского интерфейса. Ознакомьтесь с {faq_link} для получения более подробной информации.", + "no_unique_id": "У этого объекта (\"{entity_id}\") нет уникального идентификатора, поэтому его настройками нельзя управлять из пользовательского интерфейса. Ознакомьтесь с {faq_link} для получения более подробной информации.", "related": "Зависимости", "settings": "Настройки" }, diff --git a/translations/frontend/sl.json b/translations/frontend/sl.json index 17566cec6f..5facaef4bb 100644 --- a/translations/frontend/sl.json +++ b/translations/frontend/sl.json @@ -741,7 +741,7 @@ "update": "Posodobi" }, "faq": "dokumentacija", - "no_unique_id": "Ta entiteta nima enoličnega ID-ja, zato njenih nastavitev ni mogoče upravljati iz uporabniškega vmesnika. Za več podrobnosti glejte {faq_link} .", + "no_unique_id": "Ta entiteta (\"{entity_id}\") nima enoličnega ID-ja, zato njenih nastavitev ni mogoče upravljati iz uporabniškega vmesnika. Za več podrobnosti glejte {faq_link} .", "related": "Povezano", "settings": "Nastavitve" }, diff --git a/translations/frontend/zh-Hans.json b/translations/frontend/zh-Hans.json index 9c3099d8cb..d094fdf1ef 100644 --- a/translations/frontend/zh-Hans.json +++ b/translations/frontend/zh-Hans.json @@ -741,7 +741,7 @@ "update": "更新" }, "faq": "文档", - "no_unique_id": "该实体没有唯一的 ID,因此无法由 UI 管理其设置。请参阅 {faq_link} 以详细了解。", + "no_unique_id": "该实体 (\"{entity_id}\") 没有唯一的 ID,因此无法由 UI 管理其设置。请参阅 {faq_link} 以详细了解。", "related": "关联", "settings": "设置" }, diff --git a/translations/frontend/zh-Hant.json b/translations/frontend/zh-Hant.json index bf70be9f6f..3fda53bc48 100644 --- a/translations/frontend/zh-Hant.json +++ b/translations/frontend/zh-Hant.json @@ -741,7 +741,7 @@ "update": "更新" }, "faq": "相關文件", - "no_unique_id": "此實體不包含唯一 ID、因此無法由 UI 進行管理設定。請參閱{faq_link}以獲得更詳細資訊。", + "no_unique_id": "此實體(\"{entity_id}\")不包含唯一 ID、因此無法由 UI 進行管理設定。請參閱{faq_link}以獲得更詳細資訊。", "related": "相關", "settings": "設定" }, From 1289bd03b2117b0830aae686851ee472bf3f43ed Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Thu, 19 Nov 2020 10:46:52 +0100 Subject: [PATCH 35/90] Remove conference banner (#7731) --- public/static/images/conference.png | Bin 30783 -> 0 bytes .../config/dashboard/ha-config-dashboard.ts | 72 +----------------- 2 files changed, 1 insertion(+), 71 deletions(-) delete mode 100644 public/static/images/conference.png diff --git a/public/static/images/conference.png b/public/static/images/conference.png deleted file mode 100644 index 591028a8b797de46919228bbeb093b67c75f2152..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30783 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 ` : ""} - ${CONF_HAPPENING && !localStorage.dismissConf2020 - ? html` - - - -
-
- -
- ` - : ""} ${Object.values(configSections).map( (section) => html` @@ -164,33 +143,6 @@ class HaConfigDashboard extends LitElement { `; } - private async _dismissConference() { - if ( - await showConfirmationDialog(this, { - title: "Home Assistant Conference", - text: html` - If you've - bought your ticket - or have - subscribed to the livestream, you might want to dismiss this banner. Do you want to continue? - `, - }) - ) { - localStorage.dismissConf2020 = "1"; - this.requestUpdate(); - } - } - static get styles(): CSSResultArray { return [ haStyle, @@ -214,28 +166,6 @@ class HaConfigDashboard extends LitElement { text-decoration: none; color: var(--primary-text-color); } - .conf-card { - position: relative; - } - .conf-card img { - display: block; - width: 100%; - } - .conf-card .carrot { - position: absolute; - top: 0; - right: 16px; - bottom: 0; - display: flex; - align-items: center; - color: white; - } - .conf-card ha-svg-icon { - position: absolute; - bottom: -4px; - left: -4px; - color: #a2cdf3; - } .promo-advanced { text-align: center; color: var(--secondary-text-color); From 45721eb4feed3ca15fed9af83be3734218a232fb Mon Sep 17 00:00:00 2001 From: Philip Allgaier Date: Thu, 19 Nov 2020 22:48:34 +0100 Subject: [PATCH 36/90] Adjust FAB for blueprint overview + align translations (#7730) --- src/panels/config/blueprint/ha-blueprint-overview.ts | 3 ++- src/translations/en.json | 11 ++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/panels/config/blueprint/ha-blueprint-overview.ts b/src/panels/config/blueprint/ha-blueprint-overview.ts index 73d97fb8c4..31c39498ad 100644 --- a/src/panels/config/blueprint/ha-blueprint-overview.ts +++ b/src/panels/config/blueprint/ha-blueprint-overview.ts @@ -138,9 +138,10 @@ class HaBlueprintOverview extends LitElement { diff --git a/src/translations/en.json b/src/translations/en.json index b70531caf7..5d1bb38663 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1450,19 +1450,20 @@ "headers": { "name": "Name" }, - "confirm_delete_header": "Delete this Blueprint?", - "confirm_delete_text": "Are you sure you want to delete this Blueprint" + "confirm_delete_header": "Delete this blueprint?", + "confirm_delete_text": "Are you sure you want to delete this blueprint", + "add_blueprint": "Add blueprint" }, "add": { "header": "Add new blueprint", "import_header": "Import {name} ({domain})", - "import_introduction": "You can import Blueprints of other users from Github and the community forums. Enter the url of the Blueprint below.", - "url": "Url of the blueprint", + "import_introduction": "You can import blueprints of other users from Github and the community forums. Enter the URL of the blueprint below.", + "url": "URL of the blueprint", "importing": "Importing blueprint...", "import_btn": "Import blueprint", "saving": "Saving blueprint...", "save_btn": "Save blueprint", - "error_no_url": "Please enter the url of the blueprint." + "error_no_url": "Please enter the URL of the blueprint." } }, "script": { From 0b896ddfb17e04fbbe1541f0757d768c1af3288c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Thu, 19 Nov 2020 22:49:29 +0100 Subject: [PATCH 37/90] Check snapshot size before upload (#7733) --- hassio/src/components/hassio-upload-snapshot.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/hassio/src/components/hassio-upload-snapshot.ts b/hassio/src/components/hassio-upload-snapshot.ts index 5740e0621e..834281d911 100644 --- a/hassio/src/components/hassio-upload-snapshot.ts +++ b/hassio/src/components/hassio-upload-snapshot.ts @@ -27,6 +27,8 @@ declare global { } } +const MAX_FILE_SIZE = 1 * 1024 * 1024 * 1024; // 1GB + @customElement("hassio-upload-snapshot") export class HassioUploadSnapshot extends LitElement { public hass!: HomeAssistant; @@ -51,6 +53,20 @@ export class HassioUploadSnapshot extends LitElement { private async _uploadFile(ev) { const file = ev.detail.files[0]; + if (file.size > MAX_FILE_SIZE) { + showAlertDialog(this, { + title: "Snapshot file is too big", + text: html`The maximum allowed filesize is 1GB.
+ Have a look here on how to restore it.`, + confirmText: "ok", + }); + return; + } + if (!["application/x-tar"].includes(file.type)) { showAlertDialog(this, { title: "Unsupported file format", From c409ba149dbd6314f584daa7caed659a5d3ed26a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Thu, 19 Nov 2020 22:51:29 +0100 Subject: [PATCH 38/90] Supervisor network changes (#7676) --- .../dialogs/network/dialog-hassio-network.ts | 470 ++++++++++++++---- hassio/src/system/hassio-host-info.ts | 8 +- src/data/hassio/network.ts | 66 ++- 3 files changed, 428 insertions(+), 116 deletions(-) diff --git a/hassio/src/dialogs/network/dialog-hassio-network.ts b/hassio/src/dialogs/network/dialog-hassio-network.ts index 8569b8bc60..c019bc0032 100644 --- a/hassio/src/dialogs/network/dialog-hassio-network.ts +++ b/hassio/src/dialogs/network/dialog-hassio-network.ts @@ -1,5 +1,7 @@ import "@material/mwc-button/mwc-button"; import "@material/mwc-icon-button"; +import "@material/mwc-list/mwc-list"; +import "@material/mwc-list/mwc-list-item"; import "@material/mwc-tab"; import "@material/mwc-tab-bar"; import { mdiClose } from "@mdi/js"; @@ -16,18 +18,22 @@ import { } from "lit-element"; import { cache } from "lit-html/directives/cache"; import { fireEvent } from "../../../../src/common/dom/fire_event"; +import "../../../../src/components/ha-chips"; import "../../../../src/components/ha-circular-progress"; import "../../../../src/components/ha-dialog"; +import "../../../../src/components/ha-expansion-panel"; import "../../../../src/components/ha-formfield"; import "../../../../src/components/ha-header-bar"; import "../../../../src/components/ha-radio"; -import type { HaRadio } from "../../../../src/components/ha-radio"; import "../../../../src/components/ha-related-items"; import "../../../../src/components/ha-svg-icon"; import { extractApiErrorMessage } from "../../../../src/data/hassio/common"; import { + AccessPoints, + accesspointScan, NetworkInterface, updateNetworkInterface, + WifiConfiguration, } from "../../../../src/data/hassio/network"; import { showAlertDialog, @@ -38,54 +44,51 @@ import { haStyleDialog } from "../../../../src/resources/styles"; import type { HomeAssistant } from "../../../../src/types"; import { HassioNetworkDialogParams } from "./show-dialog-network"; +const IP_VERSIONS = ["ipv4", "ipv6"]; + @customElement("dialog-hassio-network") export class DialogHassioNetwork extends LitElement implements HassDialog { @property({ attribute: false }) public hass!: HomeAssistant; - @internalProperty() private _prosessing = false; - - @internalProperty() private _params?: HassioNetworkDialogParams; - - @internalProperty() private _network!: { - interface: string; - data: NetworkInterface; - }[]; + @internalProperty() private _accessPoints?: AccessPoints; @internalProperty() private _curTabIndex = 0; - @internalProperty() private _device?: { - interface: string; - data: NetworkInterface; - }; - @internalProperty() private _dirty = false; + @internalProperty() private _interface?: NetworkInterface; + + @internalProperty() private _interfaces!: NetworkInterface[]; + + @internalProperty() private _params?: HassioNetworkDialogParams; + + @internalProperty() private _processing = false; + + @internalProperty() private _scanning = false; + + @internalProperty() private _wifiConfiguration?: WifiConfiguration; + public async showDialog(params: HassioNetworkDialogParams): Promise { this._params = params; this._dirty = false; this._curTabIndex = 0; - this._network = Object.keys(params.network?.interfaces) - .map((device) => ({ - interface: device, - data: params.network.interfaces[device], - })) - .sort((a, b) => { - return a.data.primary > b.data.primary ? -1 : 1; - }); - this._device = this._network[this._curTabIndex]; - this._device.data.nameservers = String(this._device.data.nameservers); + this._interfaces = params.network.interfaces.sort((a, b) => { + return a.primary > b.primary ? -1 : 1; + }); + this._interface = { ...this._interfaces[this._curTabIndex] }; + await this.updateComplete; } public closeDialog(): void { this._params = undefined; - this._prosessing = false; + this._processing = false; fireEvent(this, "dialog-closed", { dialog: this.localName }); } protected render(): TemplateResult { - if (!this._params || !this._network) { + if (!this._params || !this._interface) { return html``; } @@ -107,11 +110,11 @@ export class DialogHassioNetwork extends LitElement - ${this._network.length > 1 + ${this._interfaces.length > 1 ? html` ${this._network.map( + >${this._interfaces.map( (device) => html` - - - - - - - - - ${this._device!.data.method !== "dhcp" - ? html` - - - NB!: If you are changing IP or gateway addresses, you might lose - the connection.` + ${IP_VERSIONS.map((version) => + this._interface![version] ? this._renderIPConfiguration(version) : "" + )} + ${this._interface?.type === "wireless" + ? html` + + Wi-Fi + ${this._interface?.wifi?.ssid + ? html`

Connected to: ${this._interface?.wifi?.ssid}

` + : ""} + + ${this._scanning + ? html` + ` + : "Scan for accesspoints"} + + ${this._accessPoints && + this._accessPoints.accesspoints && + this._accessPoints.accesspoints.length !== 0 + ? html` + + ${this._accessPoints.accesspoints + .filter((ap) => ap.ssid) + .map( + (ap) => + html` + + ${ap.ssid} + + ${ap.mac} - Strength: ${ap.signal} + + + ` + )} + + ` + : ""} + ${this._wifiConfiguration + ? html` +
+ + + + + + + + + + + + +
+ ${this._wifiConfiguration.auth === "wpa-psk" || + this._wifiConfiguration.auth === "wep" + ? html` + + + ` + : ""} + ` + : ""} +
+ ` + : ""} + ${this._dirty + ? html`
+ If you are changing the Wi-Fi, IP or gateway addresses, you might + lose the connection! +
` : ""}
- - ${this._prosessing - ? html`` - : "Update"} + + ${this._processing + ? html` + ` + : "Save"}
`; } - private async _updateNetwork() { - this._prosessing = true; - let options: Partial = { - method: this._device!.data.method, - }; - if (options.method !== "dhcp") { - options = { - ...options, - address: this._device!.data.ip_address, - gateway: this._device!.data.gateway, - dns: String(this._device!.data.nameservers).split(","), - }; + private _selectAP(event) { + this._wifiConfiguration = event.currentTarget.ap; + this._dirty = true; + } + + private async _scanForAP() { + if (!this._interface) { + return; } + this._scanning = true; try { - await updateNetworkInterface(this.hass, this._device!.interface, options); + this._accessPoints = await accesspointScan( + this.hass, + this._interface.interface + ); + } catch (err) { + showAlertDialog(this, { + title: "Failed to scan for accesspoints", + text: extractApiErrorMessage(err), + }); + } finally { + this._scanning = false; + } + } + + private _renderIPConfiguration(version: string) { + return html` + + IPv${version.charAt(version.length - 1)} +
+ + + + + + + + + + + + +
+ ${this._interface![version].method === "static" + ? html` + + + + + + + ` + : ""} +
+ `; + } + + _toArray(data: string | string[]): string[] { + if (Array.isArray(data)) { + if (data && typeof data[0] === "string") { + data = data[0]; + } + } + if (!data) { + return []; + } + if (typeof data === "string") { + return data.replace(/ /g, "").split(","); + } + return data; + } + + _toString(data: string | string[]): string { + if (!data) { + return ""; + } + if (Array.isArray(data)) { + return data.join(", "); + } + return data; + } + + private async _updateNetwork() { + this._processing = true; + let interfaceOptions: Partial = {}; + + IP_VERSIONS.forEach((version) => { + interfaceOptions[version] = { + method: this._interface![version]?.method || "auto", + }; + if (this._interface![version]?.method === "static") { + interfaceOptions[version] = { + ...interfaceOptions[version], + address: this._toArray(this._interface![version]?.address), + gateway: this._interface![version]?.gateway, + nameservers: this._toArray(this._interface![version]?.nameservers), + }; + } + if (this._wifiConfiguration) { + interfaceOptions = { + ...interfaceOptions, + enabled: true, + wifi: { + ssid: this._wifiConfiguration.ssid, + mode: this._wifiConfiguration.mode, + auth: this._wifiConfiguration.auth || "open", + }, + }; + if (interfaceOptions.wifi!.auth !== "open") { + interfaceOptions.wifi = { + ...interfaceOptions.wifi, + psk: this._wifiConfiguration.psk, + }; + } + } + }); + + try { + await updateNetworkInterface( + this.hass, + this._interface!.interface, + interfaceOptions + ); } catch (err) { showAlertDialog(this, { title: "Failed to change network settings", text: extractApiErrorMessage(err), }); - this._prosessing = false; + this._processing = false; return; } this._params?.loadData(); @@ -219,40 +437,73 @@ export class DialogHassioNetwork extends LitElement dismissText: "no", }); if (!confirm) { - this.requestUpdate("_device"); + this.requestUpdate("_interface"); return; } } this._curTabIndex = ev.detail.index; - this._device = this._network[ev.detail.index]; - this._device.data.nameservers = String(this._device.data.nameservers); + this._interface = { ...this._interfaces[ev.detail.index] }; } private _handleRadioValueChanged(ev: CustomEvent): void { - const value = (ev.target as HaRadio).value as "dhcp" | "static"; + const value = (ev.target as any).value as "disabled" | "auto" | "static"; + const version = (ev.target as any).version as "ipv4" | "ipv6"; - if (!value || !this._device || this._device!.data.method === value) { + if ( + !value || + !this._interface || + this._interface[version]!.method === value + ) { return; } - this._dirty = true; - this._device!.data.method = value; - this.requestUpdate("_device"); + this._interface[version]!.method = value; + this.requestUpdate("_interface"); + } + + private _handleRadioValueChangedAp(ev: CustomEvent): void { + const value = ((ev.target as any).value as string) as + | "open" + | "wep" + | "wpa-psk"; + this._wifiConfiguration!.auth = value; + this._dirty = true; + this.requestUpdate("_wifiConfiguration"); } private _handleInputValueChanged(ev: CustomEvent): void { const value: string | null | undefined = (ev.target as PaperInputElement) .value; + const version = (ev.target as any).version as "ipv4" | "ipv6"; const id = (ev.target as PaperInputElement).id; - if (!value || !this._device || this._device.data[id] === value) { + if ( + !value || + !this._interface || + this._toString(this._interface[version]![id]) === this._toString(value) + ) { return; } this._dirty = true; + this._interface[version]![id] = value; + } - this._device.data[id] = value; + private _handleInputValueChangedWifi(ev: CustomEvent): void { + const value: string | null | undefined = (ev.target as PaperInputElement) + .value; + const id = (ev.target as PaperInputElement).id; + + if ( + !value || + !this._wifiConfiguration || + this._wifiConfiguration![id] === value + ) { + return; + } + this._dirty = true; + this._wifiConfiguration![id] = value; } static get styles(): CSSResult[] { @@ -299,12 +550,16 @@ export class DialogHassioNetwork extends LitElement --mdc-theme-primary: var(--error-color); } + mwc-button.scan { + margin-left: 8px; + } + :host([rtl]) app-toolbar { direction: rtl; text-align: right; } .container { - padding: 20px 24px; + padding: 0 8px 4px; } .form { margin-bottom: 53px; @@ -322,6 +577,23 @@ export class DialogHassioNetwork extends LitElement padding-bottom: max(env(safe-area-inset-bottom), 8px); background-color: var(--mdc-theme-surface, #fff); } + .warning { + color: var(--error-color); + --primary-color: var(--error-color); + } + div.warning { + margin: 12px 4px -12px; + } + + ha-expansion-panel { + margin: 4px 0; + } + paper-input { + padding: 0 14px; + } + mwc-list-item { + --mdc-list-side-padding: 10px; + } `, ]; } diff --git a/hassio/src/system/hassio-host-info.ts b/hassio/src/system/hassio-host-info.ts index 5a2c5776bc..0f96ae0ace 100644 --- a/hassio/src/system/hassio-host-info.ts +++ b/hassio/src/system/hassio-host-info.ts @@ -53,7 +53,7 @@ import { hassioStyle } from "../resources/hassio-style"; class HassioHostInfo extends LitElement { @property({ attribute: false }) public hass!: HomeAssistant; - @property() public hostInfo!: HassioHostInfoType; + @property({ attribute: false }) public hostInfo!: HassioHostInfoType; @property({ attribute: false }) public hassioInfo!: HassioInfo; @@ -193,12 +193,10 @@ class HassioHostInfo extends LitElement { } private _primaryIpAddress = memoizeOne((network_info: NetworkInfo) => { - if (!network_info) { + if (!network_info || !network_info.interfaces) { return ""; } - return Object.keys(network_info?.interfaces) - .map((device) => network_info.interfaces[device]) - .find((device) => device.primary)?.ip_address; + return network_info.interfaces.find((a) => a.primary)?.ipv4?.address![0]; }); private async _handleMenuAction(ev: CustomEvent) { diff --git a/src/data/hassio/network.ts b/src/data/hassio/network.ts index 5e2e7c20e1..542ee25d95 100644 --- a/src/data/hassio/network.ts +++ b/src/data/hassio/network.ts @@ -1,24 +1,54 @@ import { HomeAssistant } from "../../types"; import { hassioApiResultExtractor, HassioResponse } from "./common"; -export interface NetworkInterface { +interface IpConfiguration { + address: string[]; gateway: string; - id: string; - ip_address: string; - address?: string; - method: "static" | "dhcp"; - nameservers: string[] | string; - dns?: string[]; - primary: boolean; - type: string; + method: "disabled" | "static" | "auto"; + nameservers: string[]; } -export interface NetworkInterfaces { - [key: string]: NetworkInterface; +export interface NetworkInterface { + primary: boolean; + privacy: boolean; + interface: string; + enabled: boolean; + ipv4?: Partial; + ipv6?: Partial; + type: "ethernet" | "wireless" | "vlan"; + wifi?: Partial; +} + +interface DockerNetwork { + address: string; + dns: string; + gateway: string; + interface: string; +} + +interface AccessPoint { + mode: "infrastructure" | "mesh" | "adhoc" | "ap"; + ssid: string; + mac: string; + frequency: number; + signal: number; +} + +export interface AccessPoints { + accesspoints: AccessPoint[]; +} + +export interface WifiConfiguration { + mode: "infrastructure" | "mesh" | "adhoc" | "ap"; + auth: "open" | "wep" | "wpa-psk"; + ssid: string; + signal: number; + psk?: string; } export interface NetworkInfo { - interfaces: NetworkInterfaces; + interfaces: NetworkInterface[]; + docker: DockerNetwork; } export const fetchNetworkInfo = async (hass: HomeAssistant) => { @@ -41,3 +71,15 @@ export const updateNetworkInterface = async ( options ); }; + +export const accesspointScan = async ( + hass: HomeAssistant, + network_interface: string +) => { + return hassioApiResultExtractor( + await hass.callApi>( + "GET", + `hassio/network/interface/${network_interface}/accesspoints` + ) + ); +}; From 0c197558a1046f6107f6b30febd4a7152d77812a Mon Sep 17 00:00:00 2001 From: Philip Allgaier Date: Thu, 19 Nov 2020 22:53:21 +0100 Subject: [PATCH 39/90] Close notification drawer when last entry is dismissed (#7724) --- src/dialogs/notifications/notification-drawer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dialogs/notifications/notification-drawer.js b/src/dialogs/notifications/notification-drawer.js index cc3dc592e3..d15ac99857 100644 --- a/src/dialogs/notifications/notification-drawer.js +++ b/src/dialogs/notifications/notification-drawer.js @@ -164,7 +164,7 @@ export class HuiNotificationDrawer extends EventsMixin( if ( this.open && oldNotifications.length > 0 && - !newNotifications.length === 0 + newNotifications.length === 0 ) { this.open = false; } From ff9840c8ef676eacc5dfb45cfa3bb9c2f4c01067 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Lov=C3=A9n?= Date: Thu, 19 Nov 2020 23:06:06 +0100 Subject: [PATCH 40/90] Use mwc-tabs in conditional card editor (#7716) --- .../hui-conditional-card-editor.ts | 37 +++++++++---------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/src/panels/lovelace/editor/config-elements/hui-conditional-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-conditional-card-editor.ts index 71bae401ee..be9b8e943b 100644 --- a/src/panels/lovelace/editor/config-elements/hui-conditional-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-conditional-card-editor.ts @@ -1,5 +1,6 @@ -import "@polymer/paper-tabs"; -import "@polymer/paper-tabs/paper-tab"; +import "@material/mwc-tab-bar/mwc-tab-bar"; +import "@material/mwc-tab/mwc-tab"; +import type { MDCTabBarActivatedEvent } from "@material/tab-bar"; import { css, CSSResultArray, @@ -70,21 +71,21 @@ export class HuiConditionalCardEditor extends LitElement } return html` - - ${this.hass!.localize( + - ${this.hass!.localize( + )} + > + - + )} + > + ${this._cardTab ? html`
@@ -192,8 +193,8 @@ export class HuiConditionalCardEditor extends LitElement `; } - private _selectTab(ev: Event): void { - this._cardTab = parseInt((ev.target! as any).selected!, 10) === 1; + private _selectTab(ev: MDCTabBarActivatedEvent): void { + this._cardTab = ev.detail.index === 1; } private _toggleMode(): void { @@ -301,9 +302,7 @@ export class HuiConditionalCardEditor extends LitElement return [ configElementStyle, css` - paper-tabs { - --paper-tabs-selection-bar-color: var(--primary-color); - --paper-tab-ink: var(--primary-color); + mwc-tab-bar { border-bottom: 1px solid var(--divider-color); } .conditions { From 46f55895301d37cd8e7b54404f37940b8b52468e Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Fri, 20 Nov 2020 00:32:27 +0000 Subject: [PATCH 41/90] [ci skip] Translation update --- translations/frontend/ca.json | 54 +++++++++++++++++++++- translations/frontend/cs.json | 28 +++++++++++ translations/frontend/de.json | 4 ++ translations/frontend/en.json | 11 +++-- translations/frontend/es.json | 52 +++++++++++++++++++++ translations/frontend/et.json | 52 +++++++++++++++++++++ translations/frontend/fr.json | 58 ++++++++++++++++++++++- translations/frontend/is.json | 62 +++++++++++++++++++++++++ translations/frontend/it.json | 74 +++++++++++++++++++++++++----- translations/frontend/ja.json | 34 +++++++++++++- translations/frontend/ko.json | 54 ++++++++++++++++++++++ translations/frontend/nb.json | 42 +++++++++++++++++ translations/frontend/nl.json | 52 +++++++++++++++++++++ translations/frontend/pl.json | 30 ++++++++++++ translations/frontend/pt.json | 16 +++---- translations/frontend/ru.json | 7 +++ translations/frontend/sl.json | 52 +++++++++++++++++++++ translations/frontend/zh-Hans.json | 62 +++++++++++++++++++++++-- translations/frontend/zh-Hant.json | 52 +++++++++++++++++++++ 19 files changed, 762 insertions(+), 34 deletions(-) diff --git a/translations/frontend/ca.json b/translations/frontend/ca.json index cdc03b398d..8dc9b501f4 100644 --- a/translations/frontend/ca.json +++ b/translations/frontend/ca.json @@ -547,6 +547,11 @@ "clear": "Esborra", "show_areas": "Mostra àrees" }, + "blueprint-picker": { + "add_user": "Afegeix usuari", + "remove_user": "Elimina usuari", + "select_blueprint": "Selecciona un plànol" + }, "data-table": { "no-data": "No hi ha dades", "search": "Cerca" @@ -1046,6 +1051,20 @@ "automation": { "caption": "Automatització", "description": "Gestiona les automatitzacions", + "dialog_new": { + "blueprint": { + "use_blueprint": "Utilitza un plànol" + }, + "header": "Creació d'una nova automatització", + "how": "Com vols crear la nova automatització?", + "start_empty": "Comença amb una automatització buida", + "thingtalk": { + "create": "Crea", + "header": "Descriu l'automatització que vols crear", + "input_label": "Què vols que faci aquesta automatització?", + "intro": "I intentarem crear-la per tu. Per exemple: \"Turn the light on when I leave\"." + } + }, "editor": { "actions": { "add": "Afegir acció", @@ -1126,6 +1145,14 @@ "unsupported_action": "La UI no és compatible amb l'acció: {action}" }, "alias": "Nom", + "blueprint": { + "blueprint_to_use": "Plànol a utilitzar", + "header": "Plànol", + "inputs": "Entrades", + "manage_blueprints": "Gestiona els plànols", + "no_blueprints": "No tens plànols", + "no_inputs": "Aquest plànol no té entrades." + }, "conditions": { "add": "Afegir condició", "delete": "Elimina", @@ -1362,12 +1389,37 @@ "error_empty": "Introdueix alguna ordre o prem a omet.", "error_unsupported": "No hem pogut crear una automatització per a això (encara?).", "for_example": "Per exemple:", - "header": "Crea una nova automatització", + "header": "Creació d'una nova automatització", "introduction": "Escriu a continuació el que hauria de fer l'automatització i intentarem convertir-ho en una automatització de Home Assistant.", "language_note": "Nota: ara per are només s'admet en anglès" } } }, + "blueprint": { + "add": { + "error_no_url": "Introdueix l'URL del plànol.", + "header": "Afegiu plànol nou", + "import_btn": "Importa plànol", + "import_header": "Importa {name} ({domain})", + "import_introduction": "Pots importar plànols d'altres usuaris des de Github i fòrums de la comunitat. Introdueix, a sota, l'URL del plànol.", + "importing": "Important plànol", + "save_btn": "Desa plànol", + "saving": "Desant plànol...", + "url": "URL del plànol" + }, + "caption": "Plànols", + "description": "Gestiona els plànols", + "overview": { + "confirm_delete_header": "Eliminar aquest plànol?", + "confirm_delete_text": "Segur que vols eliminar aquest plànol?", + "header": "Editor de plànols", + "headers": { + "name": "Nom" + }, + "introduction": "L'editor de plànols et permet crear i editar plànols.", + "learn_more": "Més informació sobre els plànols" + } + }, "cloud": { "account": { "alexa": { diff --git a/translations/frontend/cs.json b/translations/frontend/cs.json index f181e55837..2d340958f3 100644 --- a/translations/frontend/cs.json +++ b/translations/frontend/cs.json @@ -547,6 +547,10 @@ "clear": "Vymazat", "show_areas": "Zobrazit oblasti" }, + "blueprint-picker": { + "add_user": "Přidat uživatele", + "remove_user": "Odebrat uživatele" + }, "data-table": { "no-data": "Žádná data", "search": "Hledat" @@ -1046,6 +1050,17 @@ "automation": { "caption": "Automatizace", "description": "Správa automatizací", + "dialog_new": { + "header": "Vytvoření automatizace", + "how": "Jak chcete vytvořit svou novou automatizaci?", + "start_empty": "Začněte s prázdnou automatizací", + "thingtalk": { + "create": "Vytvořit", + "header": "Popište automatizaci, kterou chcete vytvořit", + "input_label": "Co by měla tato automatizace dělat?", + "intro": "A pokusíme se ji pro vás vytvořit. Například: Po odchodu zhasnout světla." + } + }, "editor": { "actions": { "add": "Přidat akci", @@ -1126,6 +1141,9 @@ "unsupported_action": "Akce {action} není podporována v uživatelském rozhraní" }, "alias": "Název", + "blueprint": { + "inputs": "Vstupy" + }, "conditions": { "add": "Přidat podmínku", "delete": "Smazat", @@ -1368,6 +1386,16 @@ } } }, + "blueprint": { + "add": { + "import_header": "Importovat {name} ({domain})" + }, + "overview": { + "headers": { + "name": "Jméno" + } + } + }, "cloud": { "account": { "alexa": { diff --git a/translations/frontend/de.json b/translations/frontend/de.json index 2cb7dca751..78c373c11c 100644 --- a/translations/frontend/de.json +++ b/translations/frontend/de.json @@ -547,6 +547,10 @@ "clear": "Löschen", "show_areas": "Bereiche anzeigen" }, + "blueprint-picker": { + "add_user": "Benutzer hinzufügen", + "remove_user": "Benutzer entfernen" + }, "data-table": { "no-data": "Keine Daten", "search": "Suche" diff --git a/translations/frontend/en.json b/translations/frontend/en.json index 3fe052e20f..19c6cfaa96 100644 --- a/translations/frontend/en.json +++ b/translations/frontend/en.json @@ -1397,21 +1397,22 @@ }, "blueprint": { "add": { - "error_no_url": "Please enter the url of the blueprint.", + "error_no_url": "Please enter the URL of the blueprint.", "header": "Add new blueprint", "import_btn": "Import blueprint", "import_header": "Import {name} ({domain})", - "import_introduction": "You can import Blueprints of other users from Github and the community forums. Enter the url of the Blueprint below.", + "import_introduction": "You can import blueprints of other users from Github and the community forums. Enter the URL of the blueprint below.", "importing": "Importing blueprint...", "save_btn": "Save blueprint", "saving": "Saving blueprint...", - "url": "Url of the blueprint" + "url": "URL of the blueprint" }, "caption": "Blueprints", "description": "Manage blueprints", "overview": { - "confirm_delete_header": "Delete this Blueprint?", - "confirm_delete_text": "Are you sure you want to delete this Blueprint", + "add_blueprint": "Add blueprint", + "confirm_delete_header": "Delete this blueprint?", + "confirm_delete_text": "Are you sure you want to delete this blueprint", "header": "Blueprint Editor", "headers": { "name": "Name" diff --git a/translations/frontend/es.json b/translations/frontend/es.json index 7a741847ce..fd0c9c83da 100644 --- a/translations/frontend/es.json +++ b/translations/frontend/es.json @@ -547,6 +547,11 @@ "clear": "Limpiar", "show_areas": "Mostrar áreas" }, + "blueprint-picker": { + "add_user": "Añadir usuario", + "remove_user": "Eliminar usuario", + "select_blueprint": "Selecciona un plano" + }, "data-table": { "no-data": "Sin datos", "search": "Buscar" @@ -1046,6 +1051,20 @@ "automation": { "caption": "Automatizaciones", "description": "Administra las automatizaciones", + "dialog_new": { + "blueprint": { + "use_blueprint": "Usa un plano" + }, + "header": "Crear una nueva automatización", + "how": "¿Cómo quieres crear tu nueva automatización?", + "start_empty": "Empezar con una automatización vacía", + "thingtalk": { + "create": "Crear", + "header": "Describe la automatización que quieres crear", + "input_label": "¿Qué debería hacer esta automatización?", + "intro": "E intentaremos crearla para ti. Por ejemplo: Apaga las luces cuando me vaya." + } + }, "editor": { "actions": { "add": "Añadir acción", @@ -1126,6 +1145,14 @@ "unsupported_action": "No hay soporte en la IU para la acción: {action}" }, "alias": "Nombre", + "blueprint": { + "blueprint_to_use": "Plano a utilizar", + "header": "Plano", + "inputs": "Entradas", + "manage_blueprints": "Administrar planos", + "no_blueprints": "No tienes ningún plano", + "no_inputs": "Este plano no tiene ninguna entrada." + }, "conditions": { "add": "Añadir condición", "delete": "Eliminar", @@ -1368,6 +1395,31 @@ } } }, + "blueprint": { + "add": { + "error_no_url": "Por favor, introduce la URL del plano.", + "header": "Añadir nuevo plano", + "import_btn": "Importar plano", + "import_header": "Importar {name} ({domain})", + "import_introduction": "Puedes importar planos de otros usuarios desde Github y los foros de la comunidad. Introduce la URL del plano a continuación.", + "importing": "Importando plano...", + "save_btn": "Guardar plano", + "saving": "Guardando plano...", + "url": "URL del plano" + }, + "caption": "Planos", + "description": "Administrar planos", + "overview": { + "confirm_delete_header": "¿Eliminar este plano?", + "confirm_delete_text": "¿Estás seguro de que quieres borrar este plano?", + "header": "Editor de planos", + "headers": { + "name": "Nombre" + }, + "introduction": "El editor de planos te permite crear y editar planos.", + "learn_more": "Más información sobre planos" + } + }, "cloud": { "account": { "alexa": { diff --git a/translations/frontend/et.json b/translations/frontend/et.json index 92dec515ae..60cd35142f 100644 --- a/translations/frontend/et.json +++ b/translations/frontend/et.json @@ -547,6 +547,11 @@ "clear": "Puhasta", "show_areas": "Näita alasid" }, + "blueprint-picker": { + "add_user": "Lisa kasutaja", + "remove_user": "Kustuta kasutaja", + "select_blueprint": "Kavandi valimine" + }, "data-table": { "no-data": "Andmeid pole", "search": "Otsing" @@ -1046,6 +1051,20 @@ "automation": { "caption": "Automatiseeringud", "description": "Loo ja redigeeri automatiseeringuid", + "dialog_new": { + "blueprint": { + "use_blueprint": "Kasuta kavandit" + }, + "header": "Loo uus automatiseering", + "how": "Kuidas soovid luua oma uue automaatiseeringu?", + "start_empty": "Loo tühi automaatiseering", + "thingtalk": { + "create": "Loo", + "header": "Kirjelda automatiseeringut mida soovid luua", + "input_label": "Mida peaks see automatiseering tegema?", + "intro": "Me püüame selle Sulle luua. Näiteks: lülita tuled välja kui ma lahkun." + } + }, "editor": { "actions": { "add": "Lisa toiming", @@ -1126,6 +1145,14 @@ "unsupported_action": "Kasutajaliides ei toeta tegevust: {action}" }, "alias": "Nimi", + "blueprint": { + "blueprint_to_use": "Kasutatav kavand", + "header": "", + "inputs": "Sisendid", + "manage_blueprints": "Kavandite haldamine", + "no_blueprints": "Kavandid puuduvad", + "no_inputs": "Sellel kavandil puuduvad sisendid." + }, "conditions": { "add": "Lisa tingimus", "delete": "Kustuta", @@ -1368,6 +1395,31 @@ } } }, + "blueprint": { + "add": { + "error_no_url": "Sisesta kavandi URL.", + "header": "Uue kavandi lisamine", + "import_btn": "Impordi kavand", + "import_header": "Impordi {name} ( {domain} )", + "import_introduction": "Teiste kasutajate kavandeid saad importida Githubist ja kogukonna foorumitest. Sisesta alloleva kavandi URL.", + "importing": "Kavandi importimine ...", + "save_btn": "Salvesta kavand", + "saving": "Kavandi salvestamine ...", + "url": "Kavandi URL" + }, + "caption": "", + "description": "Kavandite haldamine", + "overview": { + "confirm_delete_header": "Kas kustutada see kavand?", + "confirm_delete_text": "Kas soovid kindlasti selle kavandi kustutada?", + "header": "Kavandi redaktor", + "headers": { + "name": "Nimi" + }, + "introduction": "Kavandite redaktor võimaldab luua ja muuta kavandeid.", + "learn_more": "Lisateave kavandite kohta" + } + }, "cloud": { "account": { "alexa": { diff --git a/translations/frontend/fr.json b/translations/frontend/fr.json index dfd0b17426..dadfdfb93e 100644 --- a/translations/frontend/fr.json +++ b/translations/frontend/fr.json @@ -547,6 +547,11 @@ "clear": "Effacer", "show_areas": "Afficher les pièces" }, + "blueprint-picker": { + "add_user": "Ajouter un utilisateur", + "remove_user": "Supprimer l'utilisateur", + "select_blueprint": "Sélectionnez un plan" + }, "data-table": { "no-data": "Pas de données", "search": "Chercher" @@ -685,7 +690,7 @@ "future": "Dans {time}", "future_duration": { "day": "Dans {count} {count, plural,\n one {day}\n other {days}\n}", - "hour": "Dans {count} {count, plural,\n one {hour}\n other {hours}\n}", + "hour": "Dans {count} {count, plural,\n one {heure}\n other {heures}\n}", "minute": "Dans {count} {count, plural,\n one {minute}\n other {minutes}\n}", "second": "Dans {count} {count, plural,\n one {second}\n other {seconds}\n}", "week": "Dans {count} {count, plural,\n one {week}\n other {weeks}\n}" @@ -695,7 +700,7 @@ "past": "Il y a {time}", "past_duration": { "day": "Il y a {count} {count, plural,\n one {day}\n other {days}\n}", - "hour": "Il y a {count} {count, plural,\n one {hour}\n other {hours}\n}", + "hour": "Il y a {count} {count, plural,\n one {heure}\n other {heures}\n}", "minute": "Il y a {count} {count, plural,\n one {minute}\n other {minutes}\n}", "second": "Il y a {count} {count, plural,\n one {second}\n other {seconds}\n}", "week": "Il y a {count} {count, plural,\n one {week}\n other {weeks}\n}" @@ -1041,6 +1046,20 @@ "automation": { "caption": "Automatisations", "description": "Créer et modifier des automatisations", + "dialog_new": { + "blueprint": { + "use_blueprint": "Utiliser un plan" + }, + "header": "Créer une nouvelle automatisation", + "how": "Comment souhaitez-vous créer votre nouvelle automatisation?", + "start_empty": "Commencer par une automatisation vide", + "thingtalk": { + "create": "Créer", + "header": "Décrivez l'automatisation que vous souhaitez créer", + "input_label": "Que devrait faire cette automatisation ?", + "intro": "Et nous essaierons de le créer pour vous. Par exemple: éteignez les lumières lorsque je pars." + } + }, "editor": { "actions": { "add": "Ajouter une action", @@ -1121,6 +1140,14 @@ "unsupported_action": "Pas d'interface utilisateur pour l'action : {action}" }, "alias": "Nom", + "blueprint": { + "blueprint_to_use": "Plan à utiliser", + "header": "Plan", + "inputs": "Entrées", + "manage_blueprints": "Gérer les plans", + "no_blueprints": "Vous n'avez pas de plans", + "no_inputs": "Ce plan n'a aucune entrée." + }, "conditions": { "add": "Ajouter une condition", "delete": "Supprimer", @@ -1363,6 +1390,31 @@ } } }, + "blueprint": { + "add": { + "error_no_url": "Veuillez entrer l'adresse internet du plan", + "header": "Ajouter un nouveau plan", + "import_btn": "Importer un plan", + "import_header": "Import {nom} ( {domaine} )", + "import_introduction": "Vous pouvez importer les plans d'autres utilisateurs de Github et des forums de la communauté. Entrez l'url du plan ci-dessous.", + "importing": "Importation du plan ...", + "save_btn": "Sauver le plan", + "saving": "Enregistrement du plan ...", + "url": "URL du plan" + }, + "caption": "Plans", + "description": "Gérer les plans", + "overview": { + "confirm_delete_header": "Supprimer ce plan ?", + "confirm_delete_text": "Êtes-vous sûr de vouloir supprimer ce plan", + "header": "Éditeur de plans", + "headers": { + "name": "Nom" + }, + "introduction": "L’éditeur de plans vous permet de créer et de modifier des plans.", + "learn_more": "En savoir plus sur les plans" + } + }, "cloud": { "account": { "alexa": { @@ -2618,6 +2670,7 @@ "filter_attributes": "Filtrer les attributs", "filter_entities": "Filtrer les entités", "filter_states": "Filtrer les états", + "last_changed": "Dernier changement", "last_updated": "Dernière mise à jour", "more_info": "Plus d’infos", "no_entities": "Aucune entité", @@ -2871,6 +2924,7 @@ "name": "Lumière" }, "logbook": { + "description": "La fiche du journal de bord présente une liste d'événements pour les entités.", "name": "Journal" }, "map": { diff --git a/translations/frontend/is.json b/translations/frontend/is.json index 38c7e22a1d..b9f039f33d 100644 --- a/translations/frontend/is.json +++ b/translations/frontend/is.json @@ -480,6 +480,7 @@ "previous": "Fyrri", "refresh": "Endurnýja", "save": "Vista", + "skip": "Sleppa", "undo": "Afturkalla", "yes": "Já" }, @@ -494,6 +495,10 @@ "clear": "Hreinsa", "show_areas": "Birta svæði" }, + "blueprint-picker": { + "add_user": "Bæta við notanda", + "remove_user": "Fjarlægja notanda" + }, "data-table": { "search": "Leita" }, @@ -605,6 +610,7 @@ "more_info_control": { "edit": "Breyta einingu", "history": "Saga", + "last_changed": "Síðast breytt", "restored": { "confirm_remove_title": "Fjarlægja einingu?", "remove_action": "Fjarlægja einingu" @@ -641,6 +647,26 @@ "header": "Valkostir" } }, + "quick-bar": { + "commands": { + "navigation": { + "automation": "Sjálfvirkni", + "core": "Almennt", + "devices": "Tæki", + "entities": "Einingar", + "helpers": "Hjálp", + "info": "Upplýsingar", + "integrations": "Samþættingar", + "lovelace": "Skjáborð", + "person": "Persónur", + "scene": "Senur", + "script": "Skriftur", + "tags": "Strikamerki", + "users": "Notendur", + "zone": "Svæði" + } + } + }, "voice_command": { "error": "Úbbs, villa kom upp", "found": "Ég fann eftirfarandi fyrir þig:", @@ -721,6 +747,14 @@ "automation": { "caption": "Sjálfvirkni", "description": "Stofna og breyta sjálfvirkni", + "dialog_new": { + "how": "Hvernig viltu búa til nýju sjálfvirknina?", + "thingtalk": { + "create": "Stofna", + "header": "Lýstu sjálfvirkninni sem þú vilt búa til", + "input_label": "Hvað ætti þessi sjálfvirkni að gera?" + } + }, "editor": { "actions": { "add": "Bæta við aðgerð", @@ -961,6 +995,21 @@ "only_editable": "Eingöngu er hægt að breyta sjálfvirkni sem skilgreind er í automations.yaml", "pick_automation": "Veldu sjálfvirkni sem á að breyta", "show_info_automation": "Sýna upplýsingar um sjálfvirkni" + }, + "thingtalk": { + "create": "Búa til sjálfvirkni", + "task_selection": { + "for_example": "Til dæmis:", + "header": "Búa til nýja sjálfvirkni", + "language_note": "Athugið: Aðeins enska er studd í bili." + } + } + }, + "blueprint": { + "overview": { + "headers": { + "name": "Nafn" + } } }, "cloud": { @@ -1476,6 +1525,7 @@ "update_user": "Uppfæra" }, "picker": { + "add_user": "Bæta við notanda", "headers": { "group": "Hópur", "name": "Nafn", @@ -1614,6 +1664,8 @@ "states": { "current_entities": "Tiltækar einingar", "entity": "Eining", + "last_changed": "Síðast breytt", + "last_updated": "Síðast uppfært", "more_info": "Frekari upplýsingar", "no_entities": "Engar einingar", "set_state": "Setja stöðu", @@ -1758,6 +1810,9 @@ "light": { "name": "Ljós" }, + "logbook": { + "name": "Skráningarsaga" + }, "map": { "dark_mode": "Dökkur hamur?", "default_zoom": "Sjálfgefinn aðdráttur", @@ -1799,6 +1854,7 @@ }, "edit_card": { "add": "Bæta við spjaldi", + "clear": "Tæma", "confirm_cancel": "Ertu viss um að þú viljir hætta við?", "delete": "Eyða", "edit": "Breyta", @@ -1824,6 +1880,9 @@ "tab_visibility": "Sýnileiki" }, "header": "Breyta notendaviðmóti", + "header-footer": { + "header": "Haus" + }, "menu": { "raw_editor": "Ritill fyrir hráar stillingar" }, @@ -2138,6 +2197,9 @@ "header": "Titra" } }, + "shopping_list": { + "start_conversation": "Hefja samtal" + }, "shopping-list": { "add_item": "Bæta við hlut", "clear_completed": "Hreinsa lokið", diff --git a/translations/frontend/it.json b/translations/frontend/it.json index a3bcd625e8..32bb84945a 100644 --- a/translations/frontend/it.json +++ b/translations/frontend/it.json @@ -213,9 +213,9 @@ "configured": "Configurato" }, "cover": { - "closed": "Chiuso", + "closed": "Chiusa", "closing": "In chiusura", - "open": "Aperto", + "open": "Aperta", "opening": "In apertura", "stopped": "Arrestato" }, @@ -233,7 +233,7 @@ "on": "Acceso" }, "group": { - "closed": "Chiuso", + "closed": "Chiusi", "closing": "Chiusura", "home": "A casa", "locked": "Bloccato", @@ -241,7 +241,7 @@ "off": "Spento", "ok": "OK", "on": "Acceso", - "open": "Aperto", + "open": "Aperti", "opening": "Apertura", "problem": "Problema", "stopped": "Fermato", @@ -392,7 +392,7 @@ } }, "cover": { - "position": "Posizione", + "position": "Apertura", "tilt_position": "Inclinazione" }, "fan": { @@ -547,6 +547,11 @@ "clear": "Cancella", "show_areas": "Mostra le aree" }, + "blueprint-picker": { + "add_user": "Aggiungi utente", + "remove_user": "Rimuovi utente", + "select_blueprint": "Seleziona un progetto" + }, "data-table": { "no-data": "Nessun dato", "search": "Ricerca" @@ -741,7 +746,7 @@ "update": "Aggiorna" }, "faq": "documentazione", - "no_unique_id": "Questa entità non ha un ID univoco, pertanto le sue impostazioni non possono essere gestite dall'Interfaccia Utente. Vedere {faq_link} per maggiori dettagli.", + "no_unique_id": "Questa entità (\"{entity_id}\") non ha un ID univoco, pertanto le sue impostazioni non possono essere gestite dall'Interfaccia Utente. Vedere {faq_link} per maggiori dettagli.", "related": "Relazionato", "settings": "Impostazioni" }, @@ -805,11 +810,11 @@ "more_info_control": { "controls": "Controlli", "cover": { - "close_cover": "Chiudere gli scuri", - "close_tile_cover": "Chiudere l'inclinazione della copertura", - "open_cover": "Aprire gli scuri", - "open_tilt_cover": "Aprire l'inclinazione della copertura", - "stop_cover": "Fermare il movimento della copertura" + "close_cover": "Chiudere la serranda", + "close_tile_cover": "Chiudere l'inclinazione della serranda", + "open_cover": "Aprire la serranda", + "open_tilt_cover": "Aprire l'inclinazione della serranda", + "stop_cover": "Fermare il movimento della serranda" }, "details": "Dettagli", "dismiss": "Chiudi finestra di dialogo", @@ -1046,6 +1051,20 @@ "automation": { "caption": "Automazioni", "description": "Gestisci le automazioni", + "dialog_new": { + "blueprint": { + "use_blueprint": "Usa un progetto" + }, + "header": "Crea una nuova automazione", + "how": "Come vuoi creare la tua nuova automazione?", + "start_empty": "Inizia con un'automazione vuota", + "thingtalk": { + "create": "Crea", + "header": "Descrivi l'automazione che vuoi creare", + "input_label": "Cosa dovrebbe fare questa automazione?", + "intro": "E proveremo a crearlo per te. Ad esempio: spegni le luci quando esco." + } + }, "editor": { "actions": { "add": "Aggiungi azione", @@ -1126,6 +1145,14 @@ "unsupported_action": "Nessun supporto dell'Interfaccia Utente per l'azione: {action}" }, "alias": "Nome", + "blueprint": { + "blueprint_to_use": "Progetto da utilizzare", + "header": "Progetto", + "inputs": "Ingressi", + "manage_blueprints": "Gestisci progetti", + "no_blueprints": "Non hai progetti", + "no_inputs": "Questo progetto non ha ingressi." + }, "conditions": { "add": "Aggiungi condizione", "delete": "Elimina", @@ -1368,6 +1395,31 @@ } } }, + "blueprint": { + "add": { + "error_no_url": "Inserisci l'URL del progetto.", + "header": "Aggiungi un nuovo progetto", + "import_btn": "Importa progetto", + "import_header": "Importa {name} ({domain})", + "import_introduction": "Puoi importare progetti di altri utenti da Github e dai forum della comunità. Immettere l'URL del progetto di seguito.", + "importing": "Importazione del progetto in corso ...", + "save_btn": "Salva progetto", + "saving": "Salvataggio del progetto in corso ...", + "url": "URL del progetto" + }, + "caption": "Progetti", + "description": "Gestisci i progetti", + "overview": { + "confirm_delete_header": "Eliminare questo progetto?", + "confirm_delete_text": "Sei sicuro di voler eliminare questo progetto?", + "header": "Editor del progetto", + "headers": { + "name": "Nome" + }, + "introduction": "L'editor del progetto consente di creare e modificare i progetti.", + "learn_more": "Per saperne di più sui progetti" + } + }, "cloud": { "account": { "alexa": { diff --git a/translations/frontend/ja.json b/translations/frontend/ja.json index a890976e00..caea7344f8 100644 --- a/translations/frontend/ja.json +++ b/translations/frontend/ja.json @@ -533,6 +533,11 @@ "clear": "消去", "show_areas": "エリアを表示" }, + "blueprint-picker": { + "add_user": "ユーザーの追加", + "remove_user": "ユーザーの削除", + "select_blueprint": "設計図の選択" + }, "data-table": { "no-data": "データなし", "search": "検索" @@ -983,7 +988,7 @@ }, "notification_toast": { "connection_lost": "切断されました。再接続中...", - "dismiss": "退出", + "dismiss": "閉じる", "service_call_failed": "サービス{service}の呼び出しに失敗しました。", "started": "ホームアシスタントが開始されました!", "starting": "Home Assistantが起動中です。終了するまですべてが利用できるわけではありません。", @@ -1032,6 +1037,20 @@ "automation": { "caption": "オートメーション", "description": "オートメーションの作成と編集", + "dialog_new": { + "blueprint": { + "use_blueprint": "設計図を使用する" + }, + "header": "新しいオートメーションを作成する", + "how": "新しい自動化をどのように作成しますか?", + "start_empty": "空の自動化から始める", + "thingtalk": { + "create": "作成", + "header": "作成するオートメーションの説明", + "input_label": "この自動化は何をすべきでしょうか?", + "intro": "そして、私たちはあなたのためにそれを作成しようとします。例: 私が去るときにライトを消す。" + } + }, "editor": { "actions": { "add": "アクションを追加", @@ -1112,6 +1131,12 @@ "unsupported_action": "未サポートのアクション:{action}" }, "alias": "名前", + "blueprint": { + "blueprint_to_use": "使用する設計図", + "header": "設計図", + "manage_blueprints": "設計図の管理", + "no_blueprints": "設計図はありません" + }, "conditions": { "add": "条件を追加", "delete": "削除", @@ -1354,6 +1379,11 @@ } } }, + "blueprint": { + "add": { + "error_no_url": "設計図のURLを入力してください。" + } + }, "cloud": { "account": { "alexa": { @@ -1482,7 +1512,7 @@ "login": { "alert_email_confirm_necessary": "ログインする前にメールアドレスを確認する必要があります。", "alert_password_change_required": "ログインする前にパスワードを変更する必要があります。", - "dismiss": "退出させる", + "dismiss": "閉じる", "email": "Eメール", "email_error_msg": "無効な電子メール", "forgot_password": "パスワードをお忘れですか?", diff --git a/translations/frontend/ko.json b/translations/frontend/ko.json index c8f388fa15..b9ed4235c9 100644 --- a/translations/frontend/ko.json +++ b/translations/frontend/ko.json @@ -804,6 +804,59 @@ }, "quick-bar": { "commands": { + "navigation": { + "areas": "영역", + "automation": "자동화", + "core": "일반", + "customize": "사용자화", + "devices": "기기", + "entities": "구성요소", + "helpers": "도우미", + "info": "정보", + "integrations": "통합 구성요소", + "logs": "로그", + "lovelace": "Lovelace 대시보드", + "person": "구성원", + "scene": "씬", + "script": "스크립트", + "server_control": "서버 제어", + "tags": "태그", + "users": "사용자", + "zone": "지역" + }, + "reload": { + "automation": "자동화 다시 읽어오기", + "command_line": "명령줄 구성요소 다시 읽어오기", + "core": "위치 및 사용자화 다시 읽어오기", + "filesize": "파일 크기 구성요소 다시 읽어오기", + "filter": "필터 구성요소 다시 읽어오기", + "generic": "일반 IP 카메라 구성요소 다시 읽어오기", + "generic_thermostat": "일반 온도 조절기 구성요소 다시 읽어오기", + "group": "그룹, 그룹 구성요소 및 알림 서비스 다시 읽어오기", + "history_stats": "기록 통계 구성요소 다시 읽어오기", + "homekit": "HomeKit 다시 읽어오기", + "input_boolean": "논리입력 다시 읽어오기", + "input_datetime": "날짜 / 시간입력 다시 읽어오기", + "input_number": "숫자입력 다시 읽어오기", + "input_select": "선택입력 다시 읽어오기", + "input_text": "문자입력 다시 읽어오기", + "min_max": "최소/최대 구성요소 다시 읽어오기", + "mqtt": "MQTT 구성요소 다시 읽어오기", + "person": "구성원 다시 읽어오기", + "ping": "ping 이진 센서 구성요소 다시 읽어오기", + "reload": "{domain} 다시 읽어오기", + "rest": "REST 구성요소 및 알림 서비스 다시 읽어오기", + "rpi_gpio": "Raspberry Pi GPIO 구성요소 다시 읽어오기", + "scene": "씬 다시 읽어오기", + "script": "스크립트 다시 읽어오기", + "smtp": "SMTP 알림 서비스 다시 읽어오기", + "statistics": "통계 구성요소 다시 읽어오기", + "telegram": "Telegram 알림 서비스 다시 읽어오기", + "template": "템플릿 구성요소 다시 읽어오기", + "trend": "추세 구성요소 다시 읽어오기", + "universal": "범용 미디어 플레이어 구성요소 다시 읽어오기", + "zone": "지역 다시 읽어오기" + }, "server_control": { "perform_action": "서버 {action}", "restart": "재시작", @@ -1995,6 +2048,7 @@ }, "picker": { "add_script": "스크립트 추가", + "duplicate": "복제", "edit_script": "스크립트 편집", "header": "스크립트 편집기", "headers": { diff --git a/translations/frontend/nb.json b/translations/frontend/nb.json index 656839535c..3213f162bf 100644 --- a/translations/frontend/nb.json +++ b/translations/frontend/nb.json @@ -1046,6 +1046,15 @@ "automation": { "caption": "Automasjoner", "description": "Administrer automasjoner", + "dialog_new": { + "start_empty": "Start med en tom automatisering", + "thingtalk": { + "create": "Opprett", + "header": "Beskriv automatiseringen du vil opprette", + "input_label": "Hva skal denne automatiseringen gjøre?", + "intro": "Og vi vil prøve å skape det for deg. For eksempel: Slå av lysene når jeg drar." + } + }, "editor": { "actions": { "add": "Legg til handling", @@ -1126,6 +1135,14 @@ "unsupported_action": "Ingen brukergrensesnitt for handling: {action}" }, "alias": "Navn", + "blueprint": { + "blueprint_to_use": "Blueprint å bruke", + "header": "Blueprint", + "inputs": "Innganger", + "manage_blueprints": "Administrer Blueprints", + "no_blueprints": "Du har ingen blueprints", + "no_inputs": "Denne blueprint har ingen innganger." + }, "conditions": { "add": "Legg til betingelse", "delete": "Slett", @@ -1368,6 +1385,31 @@ } } }, + "blueprint": { + "add": { + "error_no_url": "Vennligst skriv inn url til blueprint.", + "header": "Legg til ny blueprint", + "import_btn": "Importer blueprint", + "import_header": "Importer {name} ({domene})", + "import_introduction": "Du kan importere Blueprints av andre brukere fra Github og fellesskapsforaene. Skriv inn nettadressen til Blueprint nedenfor.", + "importing": "Importerer blueprint...", + "save_btn": "Lagre blueprint", + "saving": "Lagrer blueprint...", + "url": "Url-adressen til blueprint" + }, + "caption": "Blueprints", + "description": "Administrer blueprints", + "overview": { + "confirm_delete_header": "Slette denne blueprint?", + "confirm_delete_text": "Er du sikker på at du vil slette denne Blueprint", + "header": "Blueprint Editor", + "headers": { + "name": "Navn" + }, + "introduction": "Med blueprint editor kan du opprette og redigere blueprints.", + "learn_more": "Lær mer om blueprint" + } + }, "cloud": { "account": { "alexa": { diff --git a/translations/frontend/nl.json b/translations/frontend/nl.json index 504b90378a..60887b19fc 100644 --- a/translations/frontend/nl.json +++ b/translations/frontend/nl.json @@ -547,6 +547,11 @@ "clear": "Wis", "show_areas": "Toon gebieden" }, + "blueprint-picker": { + "add_user": "Gebruiker toevoegen", + "remove_user": "Gebruiker verwijderen", + "select_blueprint": "Selecteer een blauwdruk" + }, "data-table": { "no-data": "Geen gegevens", "search": "Zoek" @@ -1046,6 +1051,20 @@ "automation": { "caption": "Automatiseringen", "description": "Het maken en bewerken van automatiseringen", + "dialog_new": { + "blueprint": { + "use_blueprint": "Gebruik een blauwdruk" + }, + "header": "Een nieuwe automatisering maken", + "how": "Hoe wilt u uw nieuwe automatisering creëren?", + "start_empty": "Begin met een lege automatisering", + "thingtalk": { + "create": "Creëer", + "header": "Beschrijf de automatisering die u wilt creëren", + "input_label": "Wat moet deze automatisering doen?", + "intro": "En we zullen proberen het voor je te maken. Bijvoorbeeld: doe de lichten uit als ik wegga." + } + }, "editor": { "actions": { "add": "Actie toevoegen", @@ -1126,6 +1145,14 @@ "unsupported_action": "Geen UI-ondersteuning voor actie: {action}" }, "alias": "Naam", + "blueprint": { + "blueprint_to_use": "Blauwdruk om te gebruiken", + "header": "Blauwdruk", + "inputs": "Ingangen", + "manage_blueprints": "Beheer blauwdrukken", + "no_blueprints": "Je hebt geen blauwdrukken", + "no_inputs": "Deze blauwdruk heeft geen invoer." + }, "conditions": { "add": "Voorwaarde toevoegen", "delete": "Verwijderen", @@ -1368,6 +1395,31 @@ } } }, + "blueprint": { + "add": { + "error_no_url": "Voer de URL van de blauwdruk in.", + "header": "Voeg een nieuwe blauwdruk toe", + "import_btn": "Blauwdruk importeren", + "import_header": "Importeer {name} ( {domain} )", + "import_introduction": "U kunt blauwdrukken van andere gebruikers importeren vanuit Github en de communityforums. Voer de URL van de blauwdruk hieronder in.", + "importing": "Blauwdruk importeren ...", + "save_btn": "Bewaar blauwdruk", + "saving": "Blauwdruk opslaan ...", + "url": "URL van de blauwdruk" + }, + "caption": "Blauwdrukken", + "description": "Beheer blauwdrukken", + "overview": { + "confirm_delete_header": "Deze blauwdruk verwijderen?", + "confirm_delete_text": "Weet u zeker dat u deze blauwdruk wilt verwijderen?", + "header": "Blauwdrukeditor", + "headers": { + "name": "Naam" + }, + "introduction": "Met de blauwdrukeditor kunt u blauwdrukken maken en bewerken.", + "learn_more": "Meer informatie over blauwdrukken" + } + }, "cloud": { "account": { "alexa": { diff --git a/translations/frontend/pl.json b/translations/frontend/pl.json index 0dd8f1ffd3..3b5a8c99ab 100644 --- a/translations/frontend/pl.json +++ b/translations/frontend/pl.json @@ -547,6 +547,11 @@ "clear": "Wyczyść", "show_areas": "Pokaż obszary" }, + "blueprint-picker": { + "add_user": "Dodaj użytkownika", + "remove_user": "Usuń użytkownika", + "select_blueprint": "Wybierz schemat" + }, "data-table": { "no-data": "Brak danych", "search": "Szukaj" @@ -1046,6 +1051,20 @@ "automation": { "caption": "Automatyzacje", "description": "Zarządzaj automatyzacjami", + "dialog_new": { + "blueprint": { + "use_blueprint": "Użyj schematu" + }, + "header": "Utwórz nową automatyzację", + "how": "Jak chcesz utworzyć nową automatyzację?", + "start_empty": "Zacznij od pustej automatyzacji", + "thingtalk": { + "create": "Utwórz", + "header": "Opisz automatyzację, którą chcesz utworzyć", + "input_label": "Co powinna zrobić ta automatyzacja?", + "intro": "A my postaramy się ją dla Ciebie utworzyć. Na przykład: Wyłącz światła, kiedy wyjdę." + } + }, "editor": { "actions": { "add": "Dodaj akcję", @@ -1126,6 +1145,14 @@ "unsupported_action": "Brak w interfejsie użytkownika wsparcia dla akcji: {action}" }, "alias": "Nazwa", + "blueprint": { + "blueprint_to_use": "Wybierz schemat", + "header": "Schemat", + "inputs": "Dane wejściowe", + "manage_blueprints": "Zarządzaj schematami", + "no_blueprints": "Nie masz żadnych schematów", + "no_inputs": "Ten schemat nie ma żadnych danych wejściowych" + }, "conditions": { "add": "Dodaj warunek", "delete": "Usuń", @@ -1368,6 +1395,9 @@ } } }, + "blueprint": { + "caption": "Schematy" + }, "cloud": { "account": { "alexa": { diff --git a/translations/frontend/pt.json b/translations/frontend/pt.json index 88b8f450cb..26c9d57269 100644 --- a/translations/frontend/pt.json +++ b/translations/frontend/pt.json @@ -631,7 +631,7 @@ "season": "Temporada", "track": "Faixa", "tv_show": "Programa de TV", - "url": "Url", + "url": "URL", "video": "Vídeo" }, "content-type": { @@ -916,7 +916,7 @@ "rpi_gpio": "Recarregar entidades Raspberry Pi GPIO", "scene": "Recarregar cenas", "script": "Recarregar scripts", - "smtp": "Recarregar serviços de notificação de smtp", + "smtp": "Recarregar serviços de notificação de SMTP", "statistics": "Recarregar entidades estatísticas", "telegram": "Recarregar os serviços de notificação do Telegram", "template": "Recarregar entidades modelo", @@ -1680,7 +1680,7 @@ "remove_selected": { "button": "Remover selecionado", "confirm_partly_text": "Você pode remover apenas {removable} das {selected} entidades selecionadas. As entidades só podem ser removidas quando a integração deixar de suportá-las. Por vezes é necessário reiniciar o Home Assistant antes de poder remover as entidades de uma integração removida. Tem a certeza de que deseja remover as entidades removíveis?", - "confirm_partly_title": "Somente {número} entidades selecionadas podem ser removidas.", + "confirm_partly_title": "Apenas {number} {number, plural,\n uma {selected entity} pode ser removida \n outras {selected entities} podem ser removidas \n}.", "confirm_text": "Deve remover da configuração do Lovelace e das automações se contêm estas entidades", "confirm_title": "Deseja remover {number} entidades?" }, @@ -2231,7 +2231,7 @@ "rpi_gpio": "Recarregar entidades Raspberry Pi GPIO", "scene": "Recarregar cenas", "script": "Recarregar scripts", - "smtp": "Recarregar serviços de notificação de smtp", + "smtp": "Recarregar serviços de notificação de SMTP", "statistics": "Recarregar entidades estatísticas", "telegram": "Recarregar os serviços de notificação do Telegram", "template": "Recarregar entidades modelo", @@ -2618,7 +2618,7 @@ "entity": "Entidade", "jinja_documentation": "Documentação do template Jinja2", "listeners": "Este modelo ouve os seguintes eventos de mudança de estado:", - "no_listeners": "Este modelo não ouve nenhum evento alterado pelo estado e não será atualizado automaticamente.", + "no_listeners": "Este modelo não monitoriza nenhum evento e não será atualizado automaticamente.", "reset": "Redefinir para modelo de demonstração", "result_type": "Tipo de resultado", "template_extensions": "Extensões de templates do Home Assistant", @@ -2700,11 +2700,11 @@ "navigate": "Navegar", "none": "Nenhuma Ação", "toggle": "Alternar", - "url": "Url" + "url": "URL" }, "editor_service_data": "Os dados de serviço só podem ser inseridos no editor de código", "navigation_path": "URL de navegação", - "url_path": "URL" + "url_path": "Endereço URL" }, "card": { "alarm-panel": { @@ -2745,7 +2745,7 @@ }, "entities": { "description": "O cartão de entidades é o tipo mais comum de cartão. Ele agrupa itens em listas.", - "edit_special_row": "Editar linha usando o editor de código", + "edit_special_row": "Visualize os detalhes desta linha pressionando o botão editar", "entity_row_editor": "Editor de Linha de Entidade", "entity_row": { "attribute": "Atributo", diff --git a/translations/frontend/ru.json b/translations/frontend/ru.json index 66a027a555..03e55ea318 100644 --- a/translations/frontend/ru.json +++ b/translations/frontend/ru.json @@ -547,6 +547,10 @@ "clear": "Очистить", "show_areas": "Показать помещения" }, + "blueprint-picker": { + "add_user": "Добавить пользователя", + "remove_user": "Удалить пользователя" + }, "data-table": { "no-data": "Нет данных", "search": "Поиск" @@ -1039,6 +1043,9 @@ "automation": { "caption": "Автоматизация", "description": "Управление правилами автоматизации", + "dialog_new": { + "header": "Новая автоматизация" + }, "editor": { "actions": { "add": "Добавить действие", diff --git a/translations/frontend/sl.json b/translations/frontend/sl.json index 5facaef4bb..fc130123a0 100644 --- a/translations/frontend/sl.json +++ b/translations/frontend/sl.json @@ -547,6 +547,11 @@ "clear": "Počisti", "show_areas": "Pokaži cone" }, + "blueprint-picker": { + "add_user": "Dodaj uporabnika", + "remove_user": "Odstrani uporabnika", + "select_blueprint": "Izberite načrt" + }, "data-table": { "no-data": "Ni podatkov", "search": "Iskanje" @@ -1046,6 +1051,20 @@ "automation": { "caption": "Avtomatizacije", "description": "Upravljanje avtomatizacij", + "dialog_new": { + "blueprint": { + "use_blueprint": "Uporabite načrt" + }, + "header": "Ustvarite novo avtomatizacijo", + "how": "Kako želite ustvariti svojo novo avtomatizacijo?", + "start_empty": "Začnite s prazno avtomatizacijo", + "thingtalk": { + "create": "Ustvari", + "header": "Opišite avtomatizacijo, ki jo želite ustvariti", + "input_label": "Kaj naj ta avtomatizacija počne?", + "intro": "In poskusili ga bomo ustvariti za vas. Na primer: ugasni luči, ko odidem." + } + }, "editor": { "actions": { "add": "Dodaj akcijo", @@ -1126,6 +1145,14 @@ "unsupported_action": "Ni podpore za UI za dejanje: {action}" }, "alias": "Ime", + "blueprint": { + "blueprint_to_use": "Načrt za uporabo", + "header": "Načrt", + "inputs": "Vhodi", + "manage_blueprints": "Upravljanje načrtov", + "no_blueprints": "Nimate nobenih načrtov", + "no_inputs": "Ta načrt nima nobenih vnosov." + }, "conditions": { "add": "Dodaj pogoj", "delete": "Izbriši", @@ -1368,6 +1395,31 @@ } } }, + "blueprint": { + "add": { + "error_no_url": "Prosimo, vnesite urnik od načrta.", + "header": "Dodajte nov načrt", + "import_btn": "Uvozi načrt", + "import_header": "Uvozi {name} ({domain})", + "import_introduction": "Načrte lahko uvozite od uporabnikov iz Github-a in iz forumov. Spodaj vnesite URL načrta.", + "importing": "Uvažanje načrta ...", + "save_btn": "Shrani načrt", + "saving": "Shranjevanje načrta ...", + "url": "URL načrta" + }, + "caption": "Načrti", + "description": "Upravljanje načrtov", + "overview": { + "confirm_delete_header": "Želite izbrisati ta načrt?", + "confirm_delete_text": "Ali ste prepričani, da želite izbrisati ta načrt", + "header": "Urejevalnik načrtov", + "headers": { + "name": "Ime" + }, + "introduction": "Urejevalnik načrtov vam omogoča ustvarjanje in urejanje načrtov.", + "learn_more": "Preberite več o načrtih" + } + }, "cloud": { "account": { "alexa": { diff --git a/translations/frontend/zh-Hans.json b/translations/frontend/zh-Hans.json index d094fdf1ef..988ff5528c 100644 --- a/translations/frontend/zh-Hans.json +++ b/translations/frontend/zh-Hans.json @@ -547,6 +547,11 @@ "clear": "清除", "show_areas": "显示区域" }, + "blueprint-picker": { + "add_user": "添加用户", + "remove_user": "删除用户", + "select_blueprint": "选择蓝图" + }, "data-table": { "no-data": "没有数据", "search": "搜索" @@ -886,8 +891,8 @@ "integrations": "集成", "logs": "日志", "lovelace": "Lovelace 仪表盘", - "navigate_to": "导航到{panel}", - "navigate_to_config": "导航到{panel}配置", + "navigate_to": "转到 {panel}", + "navigate_to_config": "转到{panel}配置", "person": "人员", "scene": "场景", "script": "脚本", @@ -1039,13 +1044,27 @@ "header": "区域注册表", "integrations_page": "集成页面", "introduction": "区域用于组织设备所在的位置。此信息将用于 Home Assistant 的各个地方,以帮助您组织界面、权限和与其他系统的集成。", - "introduction2": "要将设备置入某个区域,请使用下面的链接导航到集成页面,然后点击一个已配置的集成以进入设备卡片。", + "introduction2": "要将设备置入某个区域,请使用下面的链接转到集成页面,然后点击一个已配置的集成以进入设备卡片。", "no_areas": "您还没有建立区域。" } }, "automation": { "caption": "自动化", "description": "管理自动化", + "dialog_new": { + "blueprint": { + "use_blueprint": "使用蓝图" + }, + "header": "创建新的自动化", + "how": "您想如何创建新的自动化?", + "start_empty": "从空的自动化开始", + "thingtalk": { + "create": "创建", + "header": "请描述您想创建的自动化", + "input_label": "这个自动化是做什么的?", + "intro": "我们会尝试为您创建。例如:Turn the lights off when I leave." + } + }, "editor": { "actions": { "add": "添加动作", @@ -1126,6 +1145,14 @@ "unsupported_action": "图形界面暂不支持操作:{action}" }, "alias": "名称", + "blueprint": { + "blueprint_to_use": "要使用的蓝图", + "header": "蓝图", + "inputs": "输入", + "manage_blueprints": "管理蓝图", + "no_blueprints": "您还没有蓝图。", + "no_inputs": "该蓝图没有任何输入。" + }, "conditions": { "add": "添加环境条件", "delete": "删除", @@ -1368,6 +1395,31 @@ } } }, + "blueprint": { + "add": { + "error_no_url": "请输入蓝图的网址。", + "header": "添加新的蓝图", + "import_btn": "导入蓝图", + "import_header": "导入 {name} ({domain})", + "import_introduction": "您可以从 Github 和社区论坛导入其他用户的蓝图。请在下方输入 蓝图的网址。", + "importing": "正在导入蓝图...", + "save_btn": "保存蓝图", + "saving": "正在保存蓝图...", + "url": "蓝图 URL" + }, + "caption": "蓝图", + "description": "管理蓝图", + "overview": { + "confirm_delete_header": "删除此蓝图?", + "confirm_delete_text": "您确定要删除此蓝图吗?", + "header": "蓝图编辑器", + "headers": { + "name": "名称" + }, + "introduction": "蓝图编辑器用于创建和编辑蓝图。", + "learn_more": "详细了解蓝图" + } + }, "cloud": { "account": { "alexa": { @@ -2698,7 +2750,7 @@ "call_service": "调用服务{name}", "hold": "按住:", "more_info": "显示更多信息: {name}", - "navigate_to": "导航到{location}", + "navigate_to": "转到 {location}", "tap": "点击:", "toggle": "切换{name}", "url": "打开窗口前往 {url_path}" @@ -2727,7 +2779,7 @@ "call-service": "调用服务", "default_action": "默认动作", "more-info": "更多信息", - "navigate": "导航", + "navigate": "前往", "none": "没有动作", "toggle": "切换", "url": "网址" diff --git a/translations/frontend/zh-Hant.json b/translations/frontend/zh-Hant.json index 3fda53bc48..deef42ed47 100644 --- a/translations/frontend/zh-Hant.json +++ b/translations/frontend/zh-Hant.json @@ -547,6 +547,11 @@ "clear": "未觸發", "show_areas": "顯示分區" }, + "blueprint-picker": { + "add_user": "新增用戶", + "remove_user": "移除用戶", + "select_blueprint": "選擇 Blueprint" + }, "data-table": { "no-data": "沒有資料", "search": "搜尋" @@ -1046,6 +1051,20 @@ "automation": { "caption": "自動化", "description": "管理自動化", + "dialog_new": { + "blueprint": { + "use_blueprint": "使用 Blueprint" + }, + "header": "新增自動化", + "how": "要怎麼新增自動化?", + "start_empty": "以空白自動化開始", + "thingtalk": { + "create": "新增", + "header": "敘述新增自動化的用途", + "input_label": "自動化的用途是?", + "intro": "系統將嘗試為您新增自動化。例如:我離開的時候,關燈。" + } + }, "editor": { "actions": { "add": "新增一個動作", @@ -1126,6 +1145,14 @@ "unsupported_action": "UI 介面不支援觸發動作:{action}" }, "alias": "名稱", + "blueprint": { + "blueprint_to_use": "欲使用之 Blueprint", + "header": "Blueprint", + "inputs": "輸入", + "manage_blueprints": "管理 Blueprint", + "no_blueprints": "目前沒有任何 Blueprint", + "no_inputs": "Blueprint 未包含任何輸入。" + }, "conditions": { "add": "新增一個判斷式", "delete": "刪除", @@ -1368,6 +1395,31 @@ } } }, + "blueprint": { + "add": { + "error_no_url": "請輸入 Blueprint 之 URL。", + "header": "新增 Blueprint", + "import_btn": "匯入 Blueprint", + "import_header": "匯入 {name} ({domain})", + "import_introduction": "可以自 Github 及社群論壇匯入其他使用者的 Blueprint。於下方輸入 Blueprint 之URL。", + "importing": "正在匯入 Blueprint...", + "save_btn": "儲存 Blueprint", + "saving": "正在儲存 Blueprint...", + "url": "Blueprint 之 URL" + }, + "caption": "Blueprint", + "description": "管理 Blueprint", + "overview": { + "confirm_delete_header": "刪除此 Blueprint?", + "confirm_delete_text": "確定要刪除此 Blueprint", + "header": "Blueprint 編輯器", + "headers": { + "name": "名稱" + }, + "introduction": "Blueprint 編輯器可允許新增與編輯 Blueprint。", + "learn_more": "詳細了解 Blueprint" + } + }, "cloud": { "account": { "alexa": { From f835810f0a20c9a470169ca15239a1b138861ce7 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Fri, 20 Nov 2020 13:26:03 +0100 Subject: [PATCH 42/90] Add entity and device selectors (#7735) --- src/components/device/ha-device-picker.ts | 20 ++++- src/components/ha-blueprint-picker.ts | 12 +-- .../ha-selector/ha-selector-device.ts | 81 +++++++++++++++++++ .../ha-selector/ha-selector-entity.ts | 75 +++++++++++++++++ src/components/ha-selector/ha-selector.ts | 48 +++++++++++ src/data/blueprint.ts | 12 ++- src/data/entity_registry.ts | 2 +- src/data/selector.ts | 16 ++++ .../automation/blueprint-automation-editor.ts | 40 ++++++--- .../config/blueprint/ha-blueprint-overview.ts | 45 +++++++---- 10 files changed, 314 insertions(+), 37 deletions(-) create mode 100644 src/components/ha-selector/ha-selector-device.ts create mode 100644 src/components/ha-selector/ha-selector-entity.ts create mode 100644 src/components/ha-selector/ha-selector.ts create mode 100644 src/data/selector.ts diff --git a/src/components/device/ha-device-picker.ts b/src/components/device/ha-device-picker.ts index 4b5e60f936..bc43292268 100644 --- a/src/components/device/ha-device-picker.ts +++ b/src/components/device/ha-device-picker.ts @@ -42,6 +42,10 @@ interface Device { id: string; } +export type HaDevicePickerDeviceFilterFunc = ( + device: DeviceRegistryEntry +) => boolean; + const rowRenderer = (root: HTMLElement, _owner, model: { item: Device }) => { if (!root.firstElementChild) { root.innerHTML = ` @@ -102,6 +106,8 @@ export class HaDevicePicker extends SubscribeMixin(LitElement) { @property({ type: Array, attribute: "include-device-classes" }) public includeDeviceClasses?: string[]; + @property() public deviceFilter?: HaDevicePickerDeviceFilterFunc; + @property({ type: Boolean }) private _opened?: boolean; @@ -112,7 +118,8 @@ export class HaDevicePicker extends SubscribeMixin(LitElement) { entities: EntityRegistryEntry[], includeDomains: this["includeDomains"], excludeDomains: this["excludeDomains"], - includeDeviceClasses: this["includeDeviceClasses"] + includeDeviceClasses: this["includeDeviceClasses"], + deviceFilter: this["deviceFilter"] ): Device[] => { if (!devices.length) { return []; @@ -180,6 +187,14 @@ export class HaDevicePicker extends SubscribeMixin(LitElement) { }); } + if (deviceFilter) { + inputDevices = inputDevices.filter( + (device) => + // We always want to include the device of the current value + device.id === this.value || deviceFilter!(device) + ); + } + const outputDevices = inputDevices.map((device) => { return { id: device.id, @@ -224,7 +239,8 @@ export class HaDevicePicker extends SubscribeMixin(LitElement) { this.entities, this.includeDomains, this.excludeDomains, - this.includeDeviceClasses + this.includeDeviceClasses, + this.deviceFilter ); return html` ({ - ...blueprint.metadata, - path, - })); + const result = Object.entries(blueprints) + .filter(([_path, blueprint]) => !("error" in blueprint)) + .map(([path, blueprint]) => ({ + ...(blueprint as Blueprint).metadata, + path, + })); return result.sort((a, b) => compare(a.name, b.name)); }); diff --git a/src/components/ha-selector/ha-selector-device.ts b/src/components/ha-selector/ha-selector-device.ts new file mode 100644 index 0000000000..dbad6a4171 --- /dev/null +++ b/src/components/ha-selector/ha-selector-device.ts @@ -0,0 +1,81 @@ +import { + customElement, + html, + internalProperty, + LitElement, + property, +} from "lit-element"; +import { HomeAssistant } from "../../types"; +import "../device/ha-device-picker"; +import { DeviceRegistryEntry } from "../../data/device_registry"; +import { ConfigEntry, getConfigEntries } from "../../data/config_entries"; +import { DeviceSelector } from "../../data/selector"; + +@customElement("ha-selector-device") +export class HaDeviceSelector extends LitElement { + @property() public hass!: HomeAssistant; + + @property() public selector!: DeviceSelector; + + @property() public value?: any; + + @property() public label?: string; + + @internalProperty() public _configEntries?: ConfigEntry[]; + + protected updated(changedProperties) { + if (changedProperties.has("selector")) { + const oldSelector = changedProperties.get("selector"); + if (oldSelector !== this.selector && this.selector.device.integration) { + this._loadConfigEntries(); + } + } + } + + protected render() { + return html` this._filterDevices(device)} + allow-custom-entity + >`; + } + + private _filterDevices(device: DeviceRegistryEntry): boolean { + if ( + this.selector.device.manufacturer && + device.manufacturer !== this.selector.device.manufacturer + ) { + return false; + } + if ( + this.selector.device.model && + device.model !== this.selector.device.model + ) { + return false; + } + if (this.selector.device.integration) { + if ( + !this._configEntries?.some((entry) => + device.config_entries.includes(entry.entry_id) + ) + ) { + return false; + } + } + return true; + } + + private async _loadConfigEntries() { + this._configEntries = (await getConfigEntries(this.hass)).filter( + (entry) => entry.domain === this.selector.device.integration + ); + } +} + +declare global { + interface HTMLElementTagNameMap { + "ha-selector-device": HaDeviceSelector; + } +} diff --git a/src/components/ha-selector/ha-selector-entity.ts b/src/components/ha-selector/ha-selector-entity.ts new file mode 100644 index 0000000000..be4bfda550 --- /dev/null +++ b/src/components/ha-selector/ha-selector-entity.ts @@ -0,0 +1,75 @@ +import { + customElement, + html, + internalProperty, + LitElement, + property, +} from "lit-element"; +import { HomeAssistant } from "../../types"; +import "../entity/ha-entity-picker"; +import { HassEntity, UnsubscribeFunc } from "home-assistant-js-websocket"; +import { computeStateDomain } from "../../common/entity/compute_state_domain"; +import { subscribeEntityRegistry } from "../../data/entity_registry"; +import { SubscribeMixin } from "../../mixins/subscribe-mixin"; +import { EntitySelector } from "../../data/selector"; + +@customElement("ha-selector-entity") +export class HaEntitySelector extends SubscribeMixin(LitElement) { + @property() public hass!: HomeAssistant; + + @property() public selector!: EntitySelector; + + @internalProperty() private _entities?: Record; + + @property() public value?: any; + + @property() public label?: string; + + protected render() { + return html` this._filterEntities(entity)} + allow-custom-entity + >`; + } + + public hassSubscribe(): UnsubscribeFunc[] { + return [ + subscribeEntityRegistry(this.hass.connection!, (entities) => { + const entityLookup = {}; + for (const confEnt of entities) { + if (!confEnt.platform) { + continue; + } + entityLookup[confEnt.entity_id] = confEnt.platform; + } + this._entities = entityLookup; + }), + ]; + } + + private _filterEntities(entity: HassEntity): boolean { + if (this.selector.entity.domain) { + if (computeStateDomain(entity) !== this.selector.entity.domain) { + return false; + } + } + if (this.selector.entity.integration) { + if ( + !this._entities || + this._entities[entity.entity_id] !== this.selector.entity.integration + ) { + return false; + } + } + return true; + } +} + +declare global { + interface HTMLElementTagNameMap { + "ha-selector-entity": HaEntitySelector; + } +} diff --git a/src/components/ha-selector/ha-selector.ts b/src/components/ha-selector/ha-selector.ts new file mode 100644 index 0000000000..9e80292de2 --- /dev/null +++ b/src/components/ha-selector/ha-selector.ts @@ -0,0 +1,48 @@ +import { customElement, html, LitElement, property } from "lit-element"; +import { dynamicElement } from "../../common/dom/dynamic-element-directive"; +import { HomeAssistant } from "../../types"; + +import "./ha-selector-entity"; +import "./ha-selector-device"; +import { Selector } from "../../data/selector"; + +@customElement("ha-selector") +export class HaSelector extends LitElement { + @property() public hass!: HomeAssistant; + + @property() public selector!: Selector; + + @property() public value?: any; + + @property() public label?: string; + + public focus() { + const input = this.shadowRoot!.getElementById("selector"); + if (!input) { + return; + } + (input as HTMLElement).focus(); + } + + private get _type() { + return Object.keys(this.selector)[0]; + } + + protected render() { + return html` + ${dynamicElement(`ha-selector-${this._type}`, { + hass: this.hass, + selector: this.selector, + value: this.value, + label: this.label, + id: "selector", + })} + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + "ha-selector": HaSelector; + } +} diff --git a/src/data/blueprint.ts b/src/data/blueprint.ts index b2dd307592..5381d7ff47 100644 --- a/src/data/blueprint.ts +++ b/src/data/blueprint.ts @@ -1,7 +1,9 @@ import { HomeAssistant } from "../types"; +import { Selector } from "./selector"; -export type Blueprints = Record; +export type Blueprints = Record; +export type BlueprintOrError = Blueprint | { error: string }; export interface Blueprint { metadata: BlueprintMetaData; } @@ -9,10 +11,14 @@ export interface Blueprint { export interface BlueprintMetaData { domain: string; name: string; - input: BlueprintInput; + input: Record; } -export type BlueprintInput = Record; +export interface BlueprintInput { + name?: string; + description?: string; + selector?: Selector; +} export interface BlueprintImportResult { url: string; diff --git a/src/data/entity_registry.ts b/src/data/entity_registry.ts index 98ff504f22..179a41b496 100644 --- a/src/data/entity_registry.ts +++ b/src/data/entity_registry.ts @@ -94,7 +94,7 @@ export const removeEntityRegistryEntry = ( entity_id: entityId, }); -const fetchEntityRegistry = (conn) => +export const fetchEntityRegistry = (conn) => conn.sendMessagePromise({ type: "config/entity_registry/list", }); diff --git a/src/data/selector.ts b/src/data/selector.ts new file mode 100644 index 0000000000..f002adaa88 --- /dev/null +++ b/src/data/selector.ts @@ -0,0 +1,16 @@ +export type Selector = EntitySelector | DeviceSelector; + +export interface EntitySelector { + entity: { + integration?: string; + domain?: string; + }; +} + +export interface DeviceSelector { + device: { + integration?: string; + manufacturer?: string; + model?: string; + }; +} diff --git a/src/panels/config/automation/blueprint-automation-editor.ts b/src/panels/config/automation/blueprint-automation-editor.ts index 78bcf332fd..7b8103e904 100644 --- a/src/panels/config/automation/blueprint-automation-editor.ts +++ b/src/panels/config/automation/blueprint-automation-editor.ts @@ -26,12 +26,13 @@ import { haStyle } from "../../../resources/styles"; import { HassEntity } from "home-assistant-js-websocket"; import { navigate } from "../../../common/navigate"; import { - Blueprint, + BlueprintOrError, Blueprints, fetchBlueprints, } from "../../../data/blueprint"; import "../../../components/ha-blueprint-picker"; import "../../../components/ha-circular-progress"; +import "../../../components/ha-selector/ha-selector"; @customElement("blueprint-automation-editor") export class HaBlueprintAutomationEditor extends LitElement { @@ -52,7 +53,7 @@ export class HaBlueprintAutomationEditor extends LitElement { this._getBlueprints(); } - private get _blueprint(): Blueprint | undefined { + private get _blueprint(): BlueprintOrError | undefined { if (!this._blueprints) { return undefined; } @@ -149,9 +150,14 @@ export class HaBlueprintAutomationEditor extends LitElement { )}
+ ${this.config.use_blueprint.path - ? blueprint?.metadata?.input && - Object.keys(blueprint.metadata.input).length + ? blueprint && "error" in blueprint + ? html`

+ There is an error in this Blueprint: ${blueprint.error} +

` + : blueprint?.metadata?.input && + Object.keys(blueprint.metadata.input).length ? html`

${this.hass.localize( "ui.panel.config.automation.editor.blueprint.inputs" @@ -161,13 +167,23 @@ export class HaBlueprintAutomationEditor extends LitElement { ([key, value]) => html`
${value?.description} - + ${value?.selector + ? html`` + : html``}
` )}` : this.hass.localize( @@ -206,7 +222,7 @@ export class HaBlueprintAutomationEditor extends LitElement { ev.stopPropagation(); const target = ev.target as any; const key = target.key; - const value = target.value; + const value = ev.detail.value; if ( (this.config.use_blueprint.input && this.config.use_blueprint.input[key] === value) || diff --git a/src/panels/config/blueprint/ha-blueprint-overview.ts b/src/panels/config/blueprint/ha-blueprint-overview.ts index 31c39498ad..d3874bf8f3 100644 --- a/src/panels/config/blueprint/ha-blueprint-overview.ts +++ b/src/panels/config/blueprint/ha-blueprint-overview.ts @@ -34,6 +34,7 @@ import { fireEvent } from "../../../common/dom/fire_event"; interface BlueprintMetaDataPath extends BlueprintMetaData { path: string; + error: boolean; } const createNewFunctions = { @@ -61,10 +62,20 @@ class HaBlueprintOverview extends LitElement { @property() public blueprints!: Blueprints; private _processedBlueprints = memoizeOne((blueprints: Blueprints) => { - const result = Object.entries(blueprints).map(([path, blueprint]) => ({ - ...blueprint.metadata, - path, - })); + const result = Object.entries(blueprints).map(([path, blueprint]) => { + if ("error" in blueprint) { + return { + name: blueprint.error, + error: true, + path, + }; + } + return { + ...blueprint.metadata, + error: false, + path, + }; + }); return result; }); @@ -98,20 +109,26 @@ class HaBlueprintOverview extends LitElement { columns.create = { title: "", type: "icon-button", - template: (_, blueprint) => html` this._createNew(ev)} - >`, + template: (_, blueprint: any) => + blueprint.error + ? "" + : html` this._createNew(ev)} + >`, }; columns.delete = { title: "", type: "icon-button", - template: (_, blueprint) => html` this._delete(ev)} - >`, + template: (_, blueprint: any) => + blueprint.error + ? "" + : html` this._delete(ev)} + >`, }; return columns; } From 97023921b8faad66ff7309bd90a1bbb067435b12 Mon Sep 17 00:00:00 2001 From: Patrick Decat Date: Fri, 20 Nov 2020 15:10:25 +0100 Subject: [PATCH 43/90] Add missing "gate" cover device_class (#7744) --- src/util/hass-attributes-util.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/util/hass-attributes-util.ts b/src/util/hass-attributes-util.ts index 51efbbe295..f26384786a 100644 --- a/src/util/hass-attributes-util.ts +++ b/src/util/hass-attributes-util.ts @@ -32,6 +32,7 @@ const hassAttributeUtil = { "damper", "door", "garage", + "gate", "shade", "shutter", "window", From 38ba85e89db34edc7b39e8ad8cc6e69c95a2e572 Mon Sep 17 00:00:00 2001 From: Philip Allgaier Date: Fri, 20 Nov 2020 15:13:19 +0100 Subject: [PATCH 44/90] Make gallery config visible in dark mode + fix config alignment (#7741) --- gallery/src/components/demo-card.js | 5 +- gallery/src/components/demo-more-info.js | 5 +- gallery/src/ha-gallery.js | 128 +++++++++++++---------- 3 files changed, 76 insertions(+), 62 deletions(-) diff --git a/gallery/src/components/demo-card.js b/gallery/src/components/demo-card.js index 6a88200a6c..04be1de04c 100644 --- a/gallery/src/components/demo-card.js +++ b/gallery/src/components/demo-card.js @@ -21,15 +21,16 @@ class DemoCard extends PolymerElement { } pre { width: 400px; - margin: 16px; + margin: 0 16px; overflow: auto; + color: var(--primary-text-color); } @media only screen and (max-width: 800px) { .root { flex-direction: column; } pre { - margin-left: 0; + margin: 16px 0; } } diff --git a/gallery/src/components/demo-more-info.js b/gallery/src/components/demo-more-info.js index 0805e77c37..77e8161f6c 100644 --- a/gallery/src/components/demo-more-info.js +++ b/gallery/src/components/demo-more-info.js @@ -26,8 +26,9 @@ class DemoMoreInfo extends PolymerElement { pre { width: 400px; - margin: 16px; + margin: 0 16px; overflow: auto; + color: var(--primary-text-color); } @media only screen and (max-width: 800px) { @@ -35,7 +36,7 @@ class DemoMoreInfo extends PolymerElement { flex-direction: column; } pre { - margin-left: 0; + margin: 16px 0; } } diff --git a/gallery/src/ha-gallery.js b/gallery/src/ha-gallery.js index a464deb51f..779790b632 100644 --- a/gallery/src/ha-gallery.js +++ b/gallery/src/ha-gallery.js @@ -20,48 +20,47 @@ class HaGallery extends PolymerElement { static get template() { return html` @@ -70,32 +69,42 @@ class HaGallery extends PolymerElement { -
[[_withDefault(_demo, "Home Assistant Gallery")]]
+
+ [[_withDefault(_demo, "Home Assistant Gallery")]] +
-
-
-