From 544832756d167faed760f6c451b6febd209ad2e3 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Sun, 14 Jun 2020 00:32:29 +0000 Subject: [PATCH 01/30] [ci skip] Translation update --- translations/frontend/ca.json | 28 ++++++++++++++++---------- translations/frontend/de.json | 19 +++++++++++++----- translations/frontend/fr.json | 20 +++++++++++++------ translations/frontend/ko.json | 14 ++++++++++--- translations/frontend/pl.json | 23 ++++++++++++++++++++- translations/frontend/ru.json | 12 +++++++++-- translations/frontend/sv.json | 32 ++++++++++++++++++++++-------- translations/frontend/zh-Hant.json | 14 ++++++++++--- 8 files changed, 124 insertions(+), 38 deletions(-) diff --git a/translations/frontend/ca.json b/translations/frontend/ca.json index e9639977d4..82ab650b24 100644 --- a/translations/frontend/ca.json +++ b/translations/frontend/ca.json @@ -483,7 +483,7 @@ "menu": "Menú", "next": "Següent", "no": "No", - "overflow_menu": "Menú de desbordament", + "overflow_menu": "Menú desbordament", "previous": "Anterior", "refresh": "Actualitza", "save": "Desa", @@ -694,10 +694,10 @@ }, "zha_device_info": { "buttons": { - "add": "Afegir dispositius", + "add": "Afegeix dispositius a través d'aquest dispositiu", "reconfigure": "Reconfigurar dispositiu", "remove": "Eliminar dispositiu", - "zigbee_information": "Informació Zigbee" + "zigbee_information": "Signatura Zigbee del dispositiu" }, "confirmations": { "remove": "Estàs segur que vols eliminar el dispositiu?" @@ -717,7 +717,7 @@ "unknown": "Desconeguda", "zha_device_card": { "area_picker_label": "Àrea", - "device_name_placeholder": "Nom donat per l'usuari", + "device_name_placeholder": "Canvia el nom del dispositiu", "update_name_button": "Actualitzar Nom" } } @@ -1375,7 +1375,7 @@ "built_using": "Creat utilitzant", "caption": "Informació", "custom_uis": "Interfícies d'usuari personalitzades:", - "description": "Informació sobre la instal·lació de Home Assistant", + "description": "Informació de la instal·lació de Home Assistant", "developed_by": "Desenvolupat per un munt de gent fantàstica.", "documentation": "Documentació", "frontend": "frontend-ui", @@ -1660,11 +1660,11 @@ "core": "Actualitza ubicació i personalitzacions", "group": "Actualitza grups", "heading": "Tornant a carregar la configuració", - "input_boolean": "Torna a carregar booleans d’entrada", - "input_datetime": "Torna a carregar les hores de la data d'entrada", - "input_number": "Recarregar números d'entrada", - "input_select": "Actualitza l'entrada selecciona", - "input_text": "Recarregar textos d'entrada", + "input_boolean": "Actualitza entrades booleanes", + "input_datetime": "Actualitza entrades de data i hora", + "input_number": "Actualitza entrades numèriques", + "input_select": "Actualitza entrades de selecció", + "input_text": "Actualitza entrades de text", "introduction": "Algunes parts de Home Assistant es poden actualitzar sense necessitat reiniciar-lo. Si prems actualitza s'esborrarà la configuració YAML actual i se'n carregarà la nova.", "person": "Actualitza persones", "scene": "Actualitza escenes", @@ -1728,8 +1728,11 @@ }, "zha": { "add_device_page": { + "discovered_text": "Els dispositius apareixeran aquí un cop descoberts.", "discovery_text": "Els dispositius descoberts apareixeran aquí. Segueix les instruccions del/s teu/s dispositiu/s i posa el dispositiu/s en mode d'emparellament.", "header": "Domòtica amb Zigbee - Afegir dispositius", + "no_devices_found": "No s'han trobat dispositius, assegura't que estiguin en mode vinculació i manten-los desperts mentre estiguin intentant ser descoberts.", + "pairing_mode": "Assegura't que els dispositiu estiguin en mode vinculació. Consulta les instruccions del dispositiu per saber com fer-ho.", "search_again": "Torna a cercar", "spinner": "S'estan cercant dispositius ZHA Zigbee..." }, @@ -1737,6 +1740,7 @@ "caption": "Afegeix dispositius", "description": "Afegeix dispositius a la xarxa Zigbee" }, + "button": "Configura", "caption": "ZHA", "cluster_attributes": { "attributes_of_cluster": "Atributs del clúster seleccionat", @@ -1815,6 +1819,9 @@ "header": "Gestió de la xarxa", "introduction": "Comandes que afecten tota la xarxa" }, + "network": { + "caption": "Xarxa" + }, "node_management": { "header": "Gestió del dispositiu", "help_node_dropdown": "Selecciona un dispositiu per visualitzar-ne les opcions (per dispositiu).", @@ -1854,6 +1861,7 @@ "no_zones_created_yet": "Sembla que encara no has creat cap zona." }, "zwave": { + "button": "Configura", "caption": "Z-Wave", "common": { "index": "Índex", diff --git a/translations/frontend/de.json b/translations/frontend/de.json index d3888be2aa..1df2ac3dba 100644 --- a/translations/frontend/de.json +++ b/translations/frontend/de.json @@ -693,10 +693,10 @@ }, "zha_device_info": { "buttons": { - "add": "Geräte hinzufügen", + "add": "Geräte über dieses Gerät hinzufügen", "reconfigure": "Gerät neu konfigurieren", "remove": "Gerät entfernen", - "zigbee_information": "ZigBee-Informationen" + "zigbee_information": "ZigBee-Gerätesignatur" }, "confirmations": { "remove": "Möchtest du das Gerät wirklich entfernen?" @@ -716,7 +716,7 @@ "unknown": "Unbekannt", "zha_device_card": { "area_picker_label": "Bereich", - "device_name_placeholder": "Benutzerdefinierter Name", + "device_name_placeholder": "Gerätename ändern", "update_name_button": "Aktualisierung Name" } } @@ -1722,8 +1722,11 @@ }, "zha": { "add_device_page": { + "discovered_text": "Geräte werden hier angezeigt sobald sie erkannt worden sind.", "discovery_text": "Erkannte Geräte werden hier angezeigt. Befolgen Sie die Anweisungen für Ihr Gerät und versetzen Sie das Gerät in den Pairing-Modus.", "header": "Zigbee Home Automation - Geräte hinzufügen", + "no_devices_found": "Es wurde keine Geräte erkannt, stelle sicher das sie sich im Pairing Modus befinden und halte sie Aktiv solange die Erkennung läuft,", + "pairing_mode": "Stellen Sie sicher, dass sich Ihre Geräte im Pairing-Modus befinden. Überprüfen Sie dazu die Anweisungen Ihres Geräts.", "search_again": "Erneut suchen", "spinner": "Suche nach ZHA Zigbee Geräten..." }, @@ -1731,6 +1734,7 @@ "caption": "Geräte hinzufügen", "description": "Gerät dem Zigbee-Netzwerk hinzufügen." }, + "button": "Konfigurieren", "caption": "ZHA", "cluster_attributes": { "attributes_of_cluster": "Attribute des ausgewählten Clusters", @@ -1809,6 +1813,9 @@ "header": "Netzwerkverwaltung", "introduction": "Befehle, die das gesamte Netzwerk betreffen" }, + "network": { + "caption": "Netzwerk" + }, "node_management": { "header": "Geräteverwaltung", "help_node_dropdown": "Wähle ein Gerät aus, um die Geräteoptionen anzuzeigen.", @@ -1848,6 +1855,7 @@ "no_zones_created_yet": "Es sieht so aus, als hättest Du noch keine Zonen erstellt." }, "zwave": { + "button": "Konfigurieren", "caption": "Z-Wave", "common": { "index": "Index", @@ -1905,7 +1913,8 @@ "header": "OZW Log", "introduction": "Schauen Sie das Protokoll an. 0 ist das Minimum (lädt das gesamte Protokoll) und 1000 ist das Maximum. Beim Laden wird ein statisches Protokoll angezeigt und das Ende wird automatisch mit der zuletzt angegebenen Anzahl von Zeilen des Protokolls aktualisiert.", "last_log_lines": "Anzahl der letzten Logzeilen", - "load": "Laden" + "load": "Laden", + "tail": "Ende" }, "services": { "add_node": "Knoten hinzufügen", @@ -2352,7 +2361,7 @@ "entity_non_numeric": "Die Entität ist nicht-numerisch: {entity}", "entity_not_found": "Entität nicht verfügbar: {entity}", "entity_unavailable": "{entity} ist derzeit nicht verfügbar", - "starting": "Home Assistant beginnt, vielleicht ist noch nicht alles verfügbar" + "starting": "Home Assistant startet gerade, eventuell ist noch nicht alles verfügbar" } }, "mailbox": { diff --git a/translations/frontend/fr.json b/translations/frontend/fr.json index 3c1a91add7..0f347f9f84 100644 --- a/translations/frontend/fr.json +++ b/translations/frontend/fr.json @@ -308,12 +308,12 @@ "lightning-rainy": "Orage / Pluie", "partlycloudy": "Partiellement nuageux", "pouring": "Averses", - "rainy": "Pluie", - "snowy": "Neige", - "snowy-rainy": "Neige / Pluie", - "sunny": "Soleil", - "windy": "Vent", - "windy-variant": "Vent" + "rainy": "Pluvieux", + "snowy": "Neigeux", + "snowy-rainy": "Neigeux, pluvieux", + "sunny": "Ensoleillé", + "windy": "Venteux", + "windy-variant": "Venteux" }, "zwave": { "default": { @@ -1728,8 +1728,11 @@ }, "zha": { "add_device_page": { + "discovered_text": "Les appareils s'afficheront ici une fois découverts.", "discovery_text": "Les appareils découverts apparaîtront ici. Suivez les instructions pour votre / vos appareil(s) et placez-le(s) en mode de couplage.", "header": "Zigbee Home Automation - Ajout de périphériques", + "no_devices_found": "Aucun appareil n'a été trouvé, assurez-vous qu'ils sont en mode d'appairage et gardez-les éveillés pendant que la découverte est en cours", + "pairing_mode": "Assurez-vous que vos appareils sont en mode d'appairage. Consultez les instructions de votre appareil pour savoir comment procéder.", "search_again": "Rechercher à nouveau", "spinner": "Recherche de périphériques ZHA Zigbee ..." }, @@ -1737,6 +1740,7 @@ "caption": "Ajouter des appareils", "description": "Ajouter des appareils au réseau Zigbee" }, + "button": "Configurer", "caption": "ZHA", "cluster_attributes": { "attributes_of_cluster": "Attributs du cluster sélectionné", @@ -1815,6 +1819,9 @@ "header": "Gestion du réseau", "introduction": "Commandes qui affectent l'ensemble du réseau" }, + "network": { + "caption": "Réseau" + }, "node_management": { "header": "Gestion des appareils", "help_node_dropdown": "Sélectionnez un périphérique pour afficher les options par périphérique.", @@ -1854,6 +1861,7 @@ "no_zones_created_yet": "Il semble que vous n'ayez pas encore créé de zones." }, "zwave": { + "button": "Configurer", "caption": "Z-Wave", "common": { "index": "Index", diff --git a/translations/frontend/ko.json b/translations/frontend/ko.json index ffb4a9299c..6637d720b1 100644 --- a/translations/frontend/ko.json +++ b/translations/frontend/ko.json @@ -694,10 +694,10 @@ }, "zha_device_info": { "buttons": { - "add": "기기 추가", + "add": "이 기기를 통해 기기 추가", "reconfigure": "기기 재설정", "remove": "기기 제거", - "zigbee_information": "Zigbee 정보" + "zigbee_information": "Zigbee 기기 서명" }, "confirmations": { "remove": "이 기기를 제거하시겠습니까?" @@ -717,7 +717,7 @@ "unknown": "알 수 없슴", "zha_device_card": { "area_picker_label": "영역", - "device_name_placeholder": "사용자 지정 이름", + "device_name_placeholder": "기기 이름 변경", "update_name_button": "이름 업데이트" } } @@ -1728,8 +1728,11 @@ }, "zha": { "add_device_page": { + "discovered_text": "기기가 발견되면 여기에 표시됩니다.", "discovery_text": "발견된 기기가 여기에 표시됩니다. 기기의 설명서를 참고하여 기기를 페어링 모드로 설정해주세요.", "header": "Zigbee Home Automation - 기기 추가", + "no_devices_found": "발견된 기기가 없습니다. 기기를 검색하는 동안 기기가 페어링 모드 상태이고 절전모드가 해제되어있는지 확인해주세요.", + "pairing_mode": "기기가 페어링 모드인지 확인해주세요. 기기의 페어링 모드 설정 방법은 기기의 설명서를 참조해주세요.", "search_again": "다시 검색", "spinner": "ZHA Zigbee 기기를 찾고있습니다..." }, @@ -1737,6 +1740,7 @@ "caption": "기기 추가", "description": "Zigbee 네트워크에 기기를 추가합니다" }, + "button": "설정", "caption": "ZHA", "cluster_attributes": { "attributes_of_cluster": "선택된 클러스터의 속성", @@ -1815,6 +1819,9 @@ "header": "네트워크 관리", "introduction": "전체 네트워크에 영향을 미치는 명령" }, + "network": { + "caption": "네트워크" + }, "node_management": { "header": "기기 관리", "help_node_dropdown": "기기별 옵션을 보려면 기기를 선택해주세요.", @@ -1854,6 +1861,7 @@ "no_zones_created_yet": "아직 설정한 지역이 없는 것 같습니다." }, "zwave": { + "button": "설정", "caption": "Z-Wave", "common": { "index": "색인", diff --git a/translations/frontend/pl.json b/translations/frontend/pl.json index 7bd461cc15..ed29cd2644 100644 --- a/translations/frontend/pl.json +++ b/translations/frontend/pl.json @@ -195,7 +195,7 @@ "off": "wyłączony" }, "configurator": { - "configure": "Skonfiguruj", + "configure": "Konfiguruj", "configured": "skonfigurowany" }, "cover": { @@ -480,8 +480,10 @@ "delete": "Usuń", "error_required": "To pole jest wymagane", "loading": "Ładowanie", + "menu": "Menu", "next": "Dalej", "no": "Nie", + "overflow_menu": "Menu", "previous": "Poprzedni", "refresh": "Odśwież", "save": "Zapisz", @@ -911,6 +913,8 @@ "introduction": "Użyj automatyzacji, aby ożywić swój dom", "load_error_not_editable": "Tylko automatyzacje zdefiniowane w pliku automations.yaml są edytowalne.", "load_error_unknown": "Wystąpił błąd podczas ładowania automatyzacji ({err_no}).", + "move_down": "Przesuń w dół", + "move_up": "Przesuń w górę", "save": "Zapisz", "triggers": { "add": "Dodaj wyzwalacz", @@ -1369,7 +1373,9 @@ }, "info": { "built_using": "Zbudowany przy użyciu", + "caption": "Informacje", "custom_uis": "Niestandardowe interfejsy użytkownika:", + "description": "Informacje o instalacji Home Assistanta", "developed_by": "Opracowany przez grono wspaniałych ludzi.", "documentation": "Dokumentacja", "frontend": "frontend-ui", @@ -1457,7 +1463,9 @@ }, "introduction": "Tutaj możesz skonfigurować Home Assistanta i jego komponenty. Nie wszystkie opcje można konfigurować z interfejsu użytkownika, ale pracujemy nad tym.", "logs": { + "caption": "Logi", "clear": "Wyczyść", + "description": "Wyświetlanie logów Home Assistanta", "details": "Szczegóły loga ({level})", "load_full_log": "Załaduj cały log Home Assistanta", "loading_log": "Ładowanie loga błędów…", @@ -1652,6 +1660,11 @@ "core": "Lokalizacja i dostosowywanie", "group": "Grupy", "heading": "Ponowne wczytanie konfiguracji", + "input_boolean": "Pomocnicy typu przełącznik", + "input_datetime": "Wczytaj", + "input_number": "Pomocnicy typu numer", + "input_select": "Pomocnicy typu pole wyboru", + "input_text": "Pomocnicy typu tekst", "introduction": "Niektóre fragmenty konfiguracji można przeładować bez ponownego uruchamiania. Poniższe przyciski pozwalają na ponowne wczytanie konfiguracji.", "person": "Osoby", "scene": "Sceny", @@ -1715,8 +1728,11 @@ }, "zha": { "add_device_page": { + "discovered_text": "Urządzenia pojawią się tutaj, jak tylko zostaną wykryte.", "discovery_text": "Wykryte urządzenia pojawią się tutaj. Postępuj zgodnie z instrukcjami dla urządzeń, by wprowadzić je w tryb parowania.", "header": "Zigbee Home Automation - dodaj urządzenia", + "no_devices_found": "Nie znaleziono urządzeń, upewnij się, że są w trybie parowania i nie są w trybie uśpienia podczas wykrywania.", + "pairing_mode": "Upewnij się, że urządzenie jest w trybie parowania. Zapoznaj się z instrukcją obsługi urządzenia, by dowiedzieć się, jak to zrobić.", "search_again": "Szukaj ponownie", "spinner": "Wyszukiwanie urządzeń ZHA Zigbee..." }, @@ -1724,6 +1740,7 @@ "caption": "Dodaj urządzenia", "description": "Dodaj urządzenia do sieci Zigbee" }, + "button": "Konfiguruj", "caption": "ZHA", "cluster_attributes": { "attributes_of_cluster": "Atrybuty wybranego klastra", @@ -1802,6 +1819,9 @@ "header": "Zarządzanie siecią", "introduction": "Polecenia, które wpływają na całą sieć" }, + "network": { + "caption": "Sieć" + }, "node_management": { "header": "Zarządzanie urządzeniami", "help_node_dropdown": "Wybierz urządzenie, aby wyświetlić jego opcje.", @@ -1841,6 +1861,7 @@ "no_zones_created_yet": "Wygląda na to, że nie utworzyłeś jeszcze żadnych stref." }, "zwave": { + "button": "Konfiguruj", "caption": "Z-Wave", "common": { "index": "Indeks", diff --git a/translations/frontend/ru.json b/translations/frontend/ru.json index 5786d3205b..de84616e68 100644 --- a/translations/frontend/ru.json +++ b/translations/frontend/ru.json @@ -694,10 +694,10 @@ }, "zha_device_info": { "buttons": { - "add": "Добавить устройства", + "add": "Добавить устройства через это устройство", "reconfigure": "Перенастроить устройство", "remove": "Удалить устройство", - "zigbee_information": "Информация о Zigbee" + "zigbee_information": "Подпись устройства Zigbee" }, "confirmations": { "remove": "Вы уверены, что хотите удалить это устройство?" @@ -1728,8 +1728,11 @@ }, "zha": { "add_device_page": { + "discovered_text": "Устройства появятся здесь, когда будут обнаружены.", "discovery_text": "Здесь будут отображаться обнаруженные устройства. Следуйте инструкциям для Вашего устройства, чтобы включить режим сопряжения.", "header": "Zigbee Home Automation", + "no_devices_found": "Устройства не найдены, убедитесь, что они находятся в режиме сопряжения, и держите их активными во время обнаружения.", + "pairing_mode": "Убедитесь, что подключаемые устройства находятся в режиме сопряжения. Чтобы узнать, как активировать режим сопряжения, ознакомьтесь с инструкциями для Вашего устройства.", "search_again": "Повторный поиск", "spinner": "Поиск Zigbee устройств..." }, @@ -1737,6 +1740,7 @@ "caption": "Добавить устройства", "description": "Добавить устройства в сеть Zigbee" }, + "button": "Настроить", "caption": "Zigbee Home Automation", "cluster_attributes": { "attributes_of_cluster": "Атрибуты выбранного кластера", @@ -1815,6 +1819,9 @@ "header": "Управление сетью", "introduction": "Команды, которые влияют на всю сеть" }, + "network": { + "caption": "Сеть" + }, "node_management": { "header": "Управление устройством", "help_node_dropdown": "Выберите устройство для просмотра индивидуальных параметров.", @@ -1854,6 +1861,7 @@ "no_zones_created_yet": "У Вас еще нет добавленных зон." }, "zwave": { + "button": "Настроить", "caption": "Z-Wave", "common": { "index": "Индекс", diff --git a/translations/frontend/sv.json b/translations/frontend/sv.json index 10d8332153..c4c592d00f 100644 --- a/translations/frontend/sv.json +++ b/translations/frontend/sv.json @@ -694,7 +694,7 @@ }, "zha_device_info": { "buttons": { - "add": "Lägg till enheter", + "add": "Lägg till enheter via den här enheten", "reconfigure": "Konfigurera om enheten", "remove": "Ta bort enhet", "zigbee_information": "Zigbee-information" @@ -717,7 +717,7 @@ "unknown": "Okänd", "zha_device_card": { "area_picker_label": "Område", - "device_name_placeholder": "Användarnamn", + "device_name_placeholder": "Ändra enhetsnamn", "update_name_button": "Uppdatera namn" } } @@ -744,7 +744,7 @@ "connection_lost": "Anslutning tappad. Ansluter igen...", "service_call_failed": "Misslyckades med att anropa tjänsten {service}.", "started": "Home Assistant har startat!", - "starting": "Home Assistant startar, allt är inte tillgängligt tills uppstarten är klar.", + "starting": "Home Assistant startar, allt är inte tillgängligt förrän uppstarten är klar.", "triggered": "Utlöst {name}" }, "panel": { @@ -1013,7 +1013,7 @@ "picker": { "add_automation": "Lägg till automatisering", "delete_automation": "Radera automation", - "delete_confirm": "Är du säker på att du vill radera denna automatiseringen?", + "delete_confirm": "Är du säker på att du vill radera denna automatisering?", "edit_automation": "Redigera automation", "header": "Automatiseringseditor", "headers": { @@ -1373,7 +1373,9 @@ }, "info": { "built_using": "Byggt med", + "caption": "Info", "custom_uis": "Anpassade användargränssnitt:", + "description": "Info om din Home Assistant installation", "developed_by": "Utvecklad av ett gäng grymma människor.", "documentation": "Dokumentation", "frontend": "frontend-UI", @@ -1461,7 +1463,9 @@ }, "introduction": "Här går det att konfigurera dina komponenter och Home Assistant. Det är inte möjligt att ställa in allt från användargränssnittet ännu, men vi jobbar på det.", "logs": { + "caption": "Loggar", "clear": "Rensa", + "description": "Visa Home Assistant loggarna", "details": "Logginformation ({level})", "load_full_log": "Ladda hela Home Assistant-loggen", "loading_log": "Läser in fellogg ...", @@ -1656,7 +1660,11 @@ "core": "Ladda om plats & anpassningar", "group": "Ladda om grupper", "heading": "YAML-konfiguration laddas om", + "input_boolean": "Ladda om inmatning av booleska värden", "input_datetime": "Ladda om inmatningsdatum/tid", + "input_number": "Ladda om inmatningsnummer", + "input_select": "Ladda om inmatningsväljare", + "input_text": "Ladda om inmatningstext", "introduction": "Vissa delar av Home Assistant kan laddas om utan att en omstart krävs. Att trycka på \"ladda om\" innebär att den nuvarande konfiguration inaktiveras och den nya laddas.", "person": "Ladda om personer", "scene": "Ladda om scenarier", @@ -1716,12 +1724,15 @@ "system": "System" } }, - "users_privileges_note": "Denna användaren är under konstruktion. Denna använder kommer inte kunna administrera instansen via användargränssnittet. Vi granskar fortfarande alla API-slutpunkter för att försäkra att de korrekt begränsar åtkomst till administratörer." + "users_privileges_note": "Användar gruppen är under konstruktion. Användaren kommer inte att kunna administrera instansen via användargränssnittet. Vi granskar fortfarande alla API-slutpunkter för att försäkra att de korrekt begränsar åtkomst till endast administratörer." }, "zha": { "add_device_page": { + "discovered_text": "Enheterna kommer att dyka upp här när de upptäckts.", "discovery_text": "Upptäckta enheter kommer dyka upp här. Följ instruktionerna för dina enheter och sätt dem i parningsläge.", "header": "Zigbee Home Automation - Lägg till enheter", + "no_devices_found": "Inga enheter hittade, se till att dom är i parningsläge och håll dom aktiva medans sökning sker.", + "pairing_mode": "Se till att dina enheter är i parningsläge. Kontrollera instruktionerna för din enhet om hur du gör det.", "search_again": "Sök Igen", "spinner": "Söker efter ZHA Zigbee-enheter ..." }, @@ -1729,6 +1740,7 @@ "caption": "Lägg till enheter", "description": "Lägg till enheter till Zigbee-nätverket" }, + "button": "Konfigurera", "caption": "ZHA", "cluster_attributes": { "attributes_of_cluster": "Attribut för det valda klustret", @@ -1807,6 +1819,9 @@ "header": "Nätverkshantering", "introduction": "Kommandon som påverkar hela nätverket" }, + "network": { + "caption": "Nätverk" + }, "node_management": { "header": "Enhetshantering", "help_node_dropdown": "Välj en enhet för att visa alternativ per enhet.", @@ -1846,6 +1861,7 @@ "no_zones_created_yet": "Det verkar som om du inte har skapat några zoner ännu." }, "zwave": { + "button": "Konfigurera", "caption": "Z-Wave", "common": { "index": "Index", @@ -1886,7 +1902,7 @@ "group": "Grupp", "header": "Z-Wave nodhantering", "introduction": "Kör Z-Wave-kommandon som påverkar en enda nod. Välj en nod för att se en lista över tillgängliga kommandon.", - "max_associations": "Max antal assosiationer:", + "max_associations": "Max antal associationer:", "node_group_associations": "Nodgruppsassociationer", "node_protection": "Nodskydd", "node_to_control": "Nod att styra", @@ -1911,7 +1927,7 @@ "add_node_secure": "Lägg till nod med säkerhet", "cancel_command": "Avbryt kommandot", "heal_network": "Reparera nätverk", - "heal_node": "Läka nod", + "heal_node": "Läke nod", "node_info": "Nodinformation", "print_node": "Skriv ut nod", "refresh_entity": "Uppdatera entitet", @@ -2351,7 +2367,7 @@ "entity_non_numeric": "Enheten är icke-numerisk: {entity}", "entity_not_found": "Enheten är ej tillgänglig: {entity}", "entity_unavailable": "{entity} är otillgänglig", - "starting": "Home Assistant startar, allt är kanske är tillgängligt ännu" + "starting": "Home Assistant startar, allt är kanske inte tillgängligt ännu" } }, "mailbox": { diff --git a/translations/frontend/zh-Hant.json b/translations/frontend/zh-Hant.json index 385567cb26..18810e1969 100644 --- a/translations/frontend/zh-Hant.json +++ b/translations/frontend/zh-Hant.json @@ -694,10 +694,10 @@ }, "zha_device_info": { "buttons": { - "add": "新增設備", + "add": "透過此設備新增設備", "reconfigure": "重新設定設備", "remove": "移除設備", - "zigbee_information": "Zigbee 資訊" + "zigbee_information": "Zigbee 設備簽章" }, "confirmations": { "remove": "確定要移除此設備?" @@ -717,7 +717,7 @@ "unknown": "未知", "zha_device_card": { "area_picker_label": "分區", - "device_name_placeholder": "設備命名", + "device_name_placeholder": "變更設備名稱", "update_name_button": "更新名稱" } } @@ -1728,8 +1728,11 @@ }, "zha": { "add_device_page": { + "discovered_text": "於探索到設備後將顯示於此處。", "discovery_text": "所發現的設備將會顯示於此。跟隨設備的指示並將其設定為配對模式。", "header": "Zigbee 家庭自動化 - 新增設備", + "no_devices_found": "找不到設備,請確定設備處於配對模式、並於探索時保成喚醒狀態。", + "pairing_mode": "請確定設備處於配對模式中,參閱設備的手冊以了解如何進行操作。", "search_again": "再次搜尋", "spinner": "正在搜尋 ZHA Zigbee 設備..." }, @@ -1737,6 +1740,7 @@ "caption": "新增設備", "description": "新增設備至 Zigbee 網路" }, + "button": "設定", "caption": "ZHA", "cluster_attributes": { "attributes_of_cluster": "獲取所選叢集屬性。", @@ -1815,6 +1819,9 @@ "header": "網路管理", "introduction": "命令影響整個網路" }, + "network": { + "caption": "網路" + }, "node_management": { "header": "設備管理", "help_node_dropdown": "選擇設備以檢視該設備選項。", @@ -1854,6 +1861,7 @@ "no_zones_created_yet": "看起來您還沒有新增任何區域。" }, "zwave": { + "button": "設定", "caption": "Z-Wave", "common": { "index": "指數", From c51c80bf477ac5cb2d7560b99698fd5ad80e1968 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Mon, 15 Jun 2020 00:32:32 +0000 Subject: [PATCH 02/30] [ci skip] Translation update --- translations/frontend/es.json | 5 +++++ translations/frontend/fr.json | 4 ++-- translations/frontend/zh-Hans.json | 14 +++++++++++--- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/translations/frontend/es.json b/translations/frontend/es.json index 17e21f29e6..5759c4c1dd 100644 --- a/translations/frontend/es.json +++ b/translations/frontend/es.json @@ -1737,6 +1737,7 @@ "caption": "Añadir dispositivos", "description": "Añadir dispositivos a la red Zigbee" }, + "button": "Configurar", "caption": "ZHA", "cluster_attributes": { "attributes_of_cluster": "Atributos del clúster seleccionado", @@ -1815,6 +1816,9 @@ "header": "Administración de la red", "introduction": "Comandos que afectan a toda la red." }, + "network": { + "caption": "Red" + }, "node_management": { "header": "Administración de dispositivos", "help_node_dropdown": "Selecciona un dispositivo para ver las opciones por dispositivo.", @@ -1854,6 +1858,7 @@ "no_zones_created_yet": "Parece que aún no has creado ninguna zona." }, "zwave": { + "button": "Configurar", "caption": "Z-Wave", "common": { "index": "Índice", diff --git a/translations/frontend/fr.json b/translations/frontend/fr.json index 0f347f9f84..1290d30875 100644 --- a/translations/frontend/fr.json +++ b/translations/frontend/fr.json @@ -1657,7 +1657,7 @@ "section": { "reloading": { "automation": "Recharger les automatisations", - "core": "Recharger l'emplacement et les personnalisations", + "core": "Recharger les emplacements et personnalisations", "group": "Recharger les groupes", "heading": "Rechargement de la configuration", "input_boolean": "Recharger les booléens d'entrée", @@ -2342,7 +2342,7 @@ "refresh": "Actualiser", "reload_resources": "Recharger les ressources" }, - "reload_lovelace": "Recharger Lovelace UI", + "reload_lovelace": "Recharger UI", "reload_resources": { "refresh_body": "Vous devez actualiser la page pour terminer le rechargement, voulez-vous actualiser maintenant?", "refresh_header": "Voulez-vous vous rafraîchir ?" diff --git a/translations/frontend/zh-Hans.json b/translations/frontend/zh-Hans.json index 9a14d4687f..887e2dde88 100644 --- a/translations/frontend/zh-Hans.json +++ b/translations/frontend/zh-Hans.json @@ -694,10 +694,10 @@ }, "zha_device_info": { "buttons": { - "add": "添加设备", + "add": "通过此设备添加设备", "reconfigure": "重新配置设备", "remove": "删除设备", - "zigbee_information": "Zigbee 信息" + "zigbee_information": "Zigbee 设备签名" }, "confirmations": { "remove": "您确定要删除此设备吗?" @@ -717,7 +717,7 @@ "unknown": "未知", "zha_device_card": { "area_picker_label": "区域", - "device_name_placeholder": "用户指定的名称", + "device_name_placeholder": "更改设备名称", "update_name_button": "更新名称" } } @@ -1728,8 +1728,11 @@ }, "zha": { "add_device_page": { + "discovered_text": "发现的设备会立即显示在这里。", "discovery_text": "发现的设备将显示在此处。按照设备的说明进行操作,并将设备置于配对模式。", "header": "Zigbee 家庭自动化 - 添加设备", + "no_devices_found": "未发现设备。请确保设备处于配对模式,并且在搜索设备时保持唤醒。", + "pairing_mode": "请确保您的设备处于配对模式。有关如何进入配对模式,请查阅设备说明书。", "search_again": "再次搜索", "spinner": "正在寻找ZHA Zigbee设备......" }, @@ -1737,6 +1740,7 @@ "caption": "添加设备", "description": "将设备添加到Zigbee网络" }, + "button": "配置", "caption": "ZHA", "cluster_attributes": { "attributes_of_cluster": "所选集群的属性", @@ -1815,6 +1819,9 @@ "header": "网络管理", "introduction": "影响整个网络的命令" }, + "network": { + "caption": "网络" + }, "node_management": { "header": "设备管理", "help_node_dropdown": "选择一个设备以查看每个设备的选项。", @@ -1854,6 +1861,7 @@ "no_zones_created_yet": "您还没有建立地点。" }, "zwave": { + "button": "配置", "caption": "Z-Wave", "common": { "index": "指数", From d6c85719c9ba894ae592ffcff9a870240f0708f1 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 14 Jun 2020 21:08:10 -0700 Subject: [PATCH 03/30] Fix preload Roboto on older devices (#6165) --- src/html/_preload_roboto.html.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/html/_preload_roboto.html.template b/src/html/_preload_roboto.html.template index 6ac777eb8e..53431bb914 100644 --- a/src/html/_preload_roboto.html.template +++ b/src/html/_preload_roboto.html.template @@ -2,7 +2,7 @@ if (navigator.userAgent.indexOf("Android") === -1 && navigator.userAgent.indexOf("CrOS") === -1) { function _pf(src, type) { - const el = document.createElement("link"); + var el = document.createElement("link"); el.rel = "preload"; el.as = "font"; el.type = "font/woff2"; From f53f81dbc4d6e4f610e7529688aee1c558ae771e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Lov=C3=A9n?= Date: Mon, 15 Jun 2020 16:17:07 +0200 Subject: [PATCH 04/30] Fix translation in device options (#6172) --- .../device-registry-detail/dialog-device-registry-detail.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dialogs/device-registry-detail/dialog-device-registry-detail.ts b/src/dialogs/device-registry-detail/dialog-device-registry-detail.ts index 592299c605..5758c8f3a0 100644 --- a/src/dialogs/device-registry-detail/dialog-device-registry-detail.ts +++ b/src/dialogs/device-registry-detail/dialog-device-registry-detail.ts @@ -66,7 +66,7 @@ class DialogDeviceRegistryDetail extends LitElement { From 8c0c0592e29b11a70bfcbda88887e8099215cf73 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 15 Jun 2020 07:18:58 -0700 Subject: [PATCH 05/30] Move Jinja directives to own script block (#6166) --- src/html/index.html.template | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/html/index.html.template b/src/html/index.html.template index d61595003c..93b146d5a5 100644 --- a/src/html/index.html.template +++ b/src/html/index.html.template @@ -58,12 +58,13 @@ window.customPanelJS = "<%= latestCustomPanelJS %>"; window.latestJS = true; + + import("{{ extra_module }}"); {% endfor -%} + + {% for extra_url in extra_urls -%} From 256b64b6b3442f1b0851fc21dffbaa0856e4ffe5 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 16 Jun 2020 00:41:21 +0200 Subject: [PATCH 06/30] Remove filtering for attribute hidden (#6171) --- src/panels/config/automation/ha-config-automation.ts | 4 +--- src/panels/config/scene/ha-config-scene.ts | 3 +-- src/panels/config/script/ha-config-script.ts | 3 +-- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/panels/config/automation/ha-config-automation.ts b/src/panels/config/automation/ha-config-automation.ts index 8ee8267f0b..3ae487499f 100644 --- a/src/panels/config/automation/ha-config-automation.ts +++ b/src/panels/config/automation/ha-config-automation.ts @@ -54,9 +54,7 @@ class HaConfigAutomation extends HassRouterPage { private _getAutomations = memoizeOne( (states: HassEntities): AutomationEntity[] => { return Object.values(states).filter( - (entity) => - computeStateDomain(entity) === "automation" && - !entity.attributes.hidden + (entity) => computeStateDomain(entity) === "automation" ) as AutomationEntity[]; } ); diff --git a/src/panels/config/scene/ha-config-scene.ts b/src/panels/config/scene/ha-config-scene.ts index 1ac455b676..ab3b61dadb 100644 --- a/src/panels/config/scene/ha-config-scene.ts +++ b/src/panels/config/scene/ha-config-scene.ts @@ -53,8 +53,7 @@ class HaConfigScene extends HassRouterPage { private _getScenes = memoizeOne((states: HassEntities): SceneEntity[] => { return Object.values(states).filter( - (entity) => - computeStateDomain(entity) === "scene" && !entity.attributes.hidden + (entity) => computeStateDomain(entity) === "scene" ) as SceneEntity[]; }); diff --git a/src/panels/config/script/ha-config-script.ts b/src/panels/config/script/ha-config-script.ts index 0f3ba479bf..0782ece4b3 100644 --- a/src/panels/config/script/ha-config-script.ts +++ b/src/panels/config/script/ha-config-script.ts @@ -53,8 +53,7 @@ class HaConfigScript extends HassRouterPage { private _getScripts = memoizeOne((states: HassEntities): ScriptEntity[] => { return Object.values(states).filter( - (entity) => - computeStateDomain(entity) === "script" && !entity.attributes.hidden + (entity) => computeStateDomain(entity) === "script" ) as ScriptEntity[]; }); From 4e17875011b4df7eaf8d354e1cba54add68ef7a3 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Tue, 16 Jun 2020 00:32:24 +0000 Subject: [PATCH 07/30] [ci skip] Translation update --- translations/frontend/es.json | 3 + translations/frontend/it.json | 14 +- translations/frontend/nb.json | 14 +- translations/frontend/nl.json | 44 ++- translations/frontend/vi.json | 622 ++++++++++++++++++++++++++++++++-- 5 files changed, 660 insertions(+), 37 deletions(-) diff --git a/translations/frontend/es.json b/translations/frontend/es.json index 5759c4c1dd..c10daa63dc 100644 --- a/translations/frontend/es.json +++ b/translations/frontend/es.json @@ -1728,8 +1728,11 @@ }, "zha": { "add_device_page": { + "discovered_text": "Los dispositivos aparecerán aquí una vez descubiertos.", "discovery_text": "Los dispositivos detectados aparecerán aquí. Ponlos en modo emparejamiento siguiendo sus instrucciones.", "header": "Domótica Zigbee - Añadir dispositivos", + "no_devices_found": "No se encontraron dispositivos, asegúrate de que están en modo de emparejamiento y mantenlos despiertos mientras el descubrimiento se está ejecutando.", + "pairing_mode": "Asegúrate de que tus dispositivos están en modo de emparejamiento. Consulta las instrucciones de tu dispositivo sobre cómo hacerlo.", "search_again": "Buscar de nuevo", "spinner": "Buscando dispositivos ZHA Zigbee...." }, diff --git a/translations/frontend/it.json b/translations/frontend/it.json index 800f058369..dbc85d95c2 100644 --- a/translations/frontend/it.json +++ b/translations/frontend/it.json @@ -694,10 +694,10 @@ }, "zha_device_info": { "buttons": { - "add": "Aggiungi dispositivi", + "add": "Aggiungi dispositivi tramite questo dispositivo", "reconfigure": "Riconfigura dispositivo", "remove": "Rimuovi dispositivo", - "zigbee_information": "Informazioni Zigbee" + "zigbee_information": "Firma del dispositivo Zigbee" }, "confirmations": { "remove": "Sei sicuro di voler rimuovere il dispositivo?" @@ -717,7 +717,7 @@ "unknown": "Sconosciuto", "zha_device_card": { "area_picker_label": "Area", - "device_name_placeholder": "Nome assegnato dall'utente", + "device_name_placeholder": "Cambia il nome del dispositivo", "update_name_button": "Aggiorna nome" } } @@ -1728,8 +1728,11 @@ }, "zha": { "add_device_page": { + "discovered_text": "I dispositivi verranno visualizzati qui una volta scoperti.", "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 svegli mentre la scansione è in esecuzione.", + "pairing_mode": "Assicurati che i tuoi dispositivi siano in modalità di associazione. Controlla le istruzioni del tuo dispositivo su come eseguire questa operazione.", "search_again": "Cerca di nuovo", "spinner": "Ricerca di dispositivi ZHA Zigbee ..." }, @@ -1737,6 +1740,7 @@ "caption": "Aggiungi dispositivi", "description": "Aggiungi dispositivi alla rete Zigbee" }, + "button": "Configura", "caption": "ZHA", "cluster_attributes": { "attributes_of_cluster": "Attributi del cluster selezionato", @@ -1815,6 +1819,9 @@ "header": "Gestione della rete", "introduction": "Comandi che influiscono sull'intera rete" }, + "network": { + "caption": "Rete" + }, "node_management": { "header": "Gestione dei dispositivi", "help_node_dropdown": "Selezionare un dispositivo per visualizzare le opzioni per dispositivo.", @@ -1854,6 +1861,7 @@ "no_zones_created_yet": "Sembra che tu non abbia ancora creato nessuna zona." }, "zwave": { + "button": "Configura", "caption": "Z-Wave", "common": { "index": "Indice", diff --git a/translations/frontend/nb.json b/translations/frontend/nb.json index a1bb3ed50a..4b64241be8 100644 --- a/translations/frontend/nb.json +++ b/translations/frontend/nb.json @@ -694,10 +694,10 @@ }, "zha_device_info": { "buttons": { - "add": "Legg til enheter", + "add": "Legg til enheter via denne enheten", "reconfigure": "Rekonfigurer enhet", "remove": "Fjern enhet", - "zigbee_information": "Zigbee informasjon" + "zigbee_information": "Zigbee-enhetssignatur" }, "confirmations": { "remove": "Er du sikker på at du vil fjerne enheten?" @@ -717,7 +717,7 @@ "unknown": "Ukjent", "zha_device_card": { "area_picker_label": "Område", - "device_name_placeholder": "Brukers navn", + "device_name_placeholder": "Endre enhetsnavn", "update_name_button": "Oppdater navn" } } @@ -1728,8 +1728,11 @@ }, "zha": { "add_device_page": { + "discovered_text": "Enheter vises her når de er oppdaget.", "discovery_text": "Oppdagede enheter vises her. Følg instruksjonene for enheten(e) og sett enheten(e) i paringsmodus.", "header": "Zigbee Home Automation - Legg til enheter", + "no_devices_found": "Ingen enheter er funnet, sørg for at de er i paringsmodus og holde dem våken mens du oppdager kjører.", + "pairing_mode": "Kontroller at enhetene er i paringsmodus. Sjekk instruksjonene til enheten om hvordan du gjør dette.", "search_again": "Søk på nytt", "spinner": "Søker etter ZHA Zigbee-enheter..." }, @@ -1737,6 +1740,7 @@ "caption": "Legg til enheter", "description": "Legg til enheter i Zigbee-nettverket" }, + "button": "Konfigurer", "caption": "", "cluster_attributes": { "attributes_of_cluster": "Attributter for den valgte klyngen", @@ -1815,6 +1819,9 @@ "header": "Nettverksadministrasjon", "introduction": "Kommandoer som påvirker hele nettverket" }, + "network": { + "caption": "Nettverk" + }, "node_management": { "header": "Enhetshåndtering", "help_node_dropdown": "Velg en enhet for å vise alternativer per enhet.", @@ -1854,6 +1861,7 @@ "no_zones_created_yet": "Det ser ikke ut som du har opprettet noen soner enda" }, "zwave": { + "button": "Konfigurer", "caption": "Z-Wave", "common": { "index": "Indeks", diff --git a/translations/frontend/nl.json b/translations/frontend/nl.json index a4e068b061..a65fdfb0f1 100644 --- a/translations/frontend/nl.json +++ b/translations/frontend/nl.json @@ -478,9 +478,12 @@ "cancel": "Annuleren", "close": "Sluiten", "delete": "Verwijderen", + "error_required": "Verplicht", "loading": "Bezig met laden", + "menu": "Menu", "next": "Volgende", "no": "Nee", + "overflow_menu": "Overloopmenu", "previous": "Vorige", "refresh": "Vernieuwen", "save": "Opslaan", @@ -691,10 +694,10 @@ }, "zha_device_info": { "buttons": { - "add": "Apparaten toevoegen", + "add": "Apparaten toevoegen via dit apparaat", "reconfigure": "Apparaat opnieuw configureren", "remove": "Verwijder apparaat", - "zigbee_information": "Zigbee Informatie" + "zigbee_information": "Zigbee-apparaathandtekening" }, "confirmations": { "remove": "Weet je zeker dat je het apparaat wilt verwijderen?" @@ -714,7 +717,7 @@ "unknown": "Onbekend", "zha_device_card": { "area_picker_label": "Gebied", - "device_name_placeholder": "Door gebruiker ingegeven naam", + "device_name_placeholder": "Wijzig apparaatnaam", "update_name_button": "Naam bijwerken" } } @@ -740,6 +743,8 @@ "notification_toast": { "connection_lost": "Verbinding verbroken. Opnieuw verbinden...", "service_call_failed": "Kan service {service} niet aanroepen", + "started": "Home Assistant is gestart!", + "starting": "Home Assistant is aan het opstarten, nog niet alles is beschikbaar tot dit is voltooid.", "triggered": "Geactiveerd {name}" }, "panel": { @@ -908,6 +913,8 @@ "introduction": "Gebruik automatiseringen om je huis tot leven te brengen.", "load_error_not_editable": "Alleen automatiseringen in automations.yaml kunnen worden bewerkt.", "load_error_unknown": "Fout bij laden van automatisering ({err_no}).", + "move_down": "Verplaats omlaag", + "move_up": "Verplaats omhoog", "save": "Opslaan", "triggers": { "add": "Trigger toevoegen", @@ -1219,6 +1226,7 @@ "different_include": "Mogelijk via een domein, een glob of een andere include.", "pick_attribute": "Kies een attribuut om te overschrijven", "picker": { + "entity": "Entiteit", "header": "Aanpassingen", "introduction": "Pas attributen per entiteit aan. Toegevoegde/gewijzigde aanpassingen worden onmiddellijk van kracht. Verwijderde aanpassingen worden van kracht wanneer de entiteit wordt bijgewerkt." }, @@ -1365,7 +1373,9 @@ }, "info": { "built_using": "Gebouwd met behulp van", + "caption": "Info", "custom_uis": "Aangepaste UI's:", + "description": "Informatie over je Home Assistant installatie", "developed_by": "Ontwikkeld door een stel geweldige mensen.", "documentation": "Documentatie", "frontend": "Frontend", @@ -1453,7 +1463,9 @@ }, "introduction": "Hier kun je je componenten en Home Assistant configureren. Het is nog niet mogelijk om alles te configureren vanuit de interface, maar we werken er aan.", "logs": { + "caption": "Logboek", "clear": "Wis", + "description": "Home Assistant logboek bekijken", "details": "Logboekdetails ({level})", "load_full_log": "Laad volledige Home Assistant logboek", "loading_log": "Foutenlogboek laden ...", @@ -1706,10 +1718,12 @@ "name": "Naam", "system": "Systeem" } - } + }, + "users_privileges_note": "Gebruikersgroepen zijn nog werk in uitvoering. De gebruiker kan de instantie niet beheren via de interface. We zijn bezig met het uitvoeren van een audit om verzekerd te zijn dat de management API-eindpunten toegang voor beheerders correct beperken." }, "zha": { "add_device_page": { + "discovered_text": "Apparaten zullen hier verschijnen zodra ze zijn ontdekt.", "discovery_text": "Gevonden apparaten worden hier weergegeven. Volg de instructies voor je apparaat of apparaten en plaats het apparaat of de apparaten in de koppelingsmodus.", "header": "Zigbee Home Automation - Apparaten toevoegen", "search_again": "Opnieuw zoeken", @@ -1719,6 +1733,7 @@ "caption": "Apparaten toevoegen", "description": "Voeg apparaten toe aan het Zigbee netwerk" }, + "button": "Configureer", "caption": "ZHA", "cluster_attributes": { "attributes_of_cluster": "Attributen van het geselecteerde cluster", @@ -1797,6 +1812,9 @@ "header": "Netwerkbeheer", "introduction": "Commando's die het hele netwerk beïnvloeden" }, + "network": { + "caption": "Netwerk" + }, "node_management": { "header": "Apparaatbeheer", "help_node_dropdown": "Selecteer een apparaat om de opties per apparaat te bekijken.", @@ -1836,6 +1854,7 @@ "no_zones_created_yet": "Het lijkt erop dat je nog geen zones hebt aangemaakt." }, "zwave": { + "button": "Configureer", "caption": "Z-Wave", "common": { "index": "Index", @@ -1868,6 +1887,15 @@ "set_wakeup": "Activeringsinterval instellen", "true": "Waar" }, + "node_management": { + "add_to_group": "Toevoegen aan groep", + "entity_info": "Entiteitsinformatie", + "exclude_entity": "Sluit deze entiteit uit van Home Assistant", + "group": "Groep", + "protection": "Bescherming", + "remove_from_group": "Verwijderen uit groep", + "set_protection": "Bescherming instellen" + }, "ozw_log": { "header": "OZW-logboek", "introduction": "Bekijk het logboek. 0 is het minimum (laadt het gehele logboek) en 1000 is het maximum. Laad toont een statisch logboek en staart wordt automatisch bijgewerkt met het laatst opgegeven aantal regels van het logboek." @@ -1877,6 +1905,7 @@ "add_node_secure": "Secure Node toevoegen", "cancel_command": "Opdracht annuleren", "heal_network": "Herstel Netwerk", + "refresh_entity": "Entiteit vernieuwen", "remove_node": "Node verwijderen", "save_config": "Configuratie Opslaan", "soft_reset": "Soft Reset", @@ -2012,6 +2041,10 @@ "add_item": "Item toevoegen", "checked_items": "Geselecteerde items", "clear_items": "Geselecteerde items wissen" + }, + "starting": { + "description": "Home Assistant is aan het opstarten, even geduld...", + "header": "Home Assistant is aan het opstarten..." } }, "changed_toast": { @@ -2304,7 +2337,8 @@ "attribute_not_found": "Kenmerk {attribute} niet beschikbaar in: {entity}", "entity_non_numeric": "Entiteit is niet-numeriek: {entity}", "entity_not_found": "Entiteit niet beschikbaar: {entity}", - "entity_unavailable": "{entity} is momenteel niet beschikbaar" + "entity_unavailable": "{entity} is momenteel niet beschikbaar", + "starting": "Home Assistant is aan het opstarten, wellicht is nog niet alles beschikbaar" } }, "mailbox": { diff --git a/translations/frontend/vi.json b/translations/frontend/vi.json index ff935e05f7..0722aba40e 100644 --- a/translations/frontend/vi.json +++ b/translations/frontend/vi.json @@ -199,6 +199,8 @@ "stopped": "Đã dừng" }, "default": { + "off": "Tắt", + "on": "Bật", "unavailable": "Không có sẵn", "unknown": "Chưa biết" }, @@ -387,6 +389,9 @@ "script": { "execute": "Thi hành" }, + "service": { + "run": "Chạy" + }, "vacuum": { "actions": { "resume_cleaning": "Tiếp tục làm sạch", @@ -435,16 +440,40 @@ } }, "common": { + "and": "và", + "back": "Trở lại", "cancel": "Hủy bỏ", + "close": "Đóng", "delete": "Xóa", + "error_required": "Cần thiết", "loading": "Đang tải", + "menu": "Menu", + "next": "Kế tiếp", + "overflow_menu": "Menu tràn", + "previous": "Trước đó", + "refresh": "Làm mới", "save": "Lưu", "successfully_deleted": "Xóa thành công", "undo": "Hoàn tác" }, "components": { + "area-picker": { + "add_dialog": { + "add": "Thêm", + "failed_create_area": "Không thể tạo khu vực.", + "name": "Tên", + "text": "Nhập tên của khu vực mới.", + "title": "Thêm khu vực mới" + }, + "add_new": "Thêm khu vực mới...", + "area": "Khu vực", + "clear": "Xoá", + "show_areas": "Hiển thị các khu vực" + }, "device-picker": { - "show_devices": "Hiện các thiết bị" + "no_area": "Không có khu vực", + "show_devices": "Hiện các thiết bị", + "toggle": "Chuyển đổi" }, "entity": { "entity-picker": { @@ -455,6 +484,17 @@ "loading_history": "Đang tải lịch sử trạng thái ...", "no_history_found": "Không tìm thấy lịch sử trạng thái." }, + "related-items": { + "area": "Khu vực", + "automation": "Một phần của các tự động hóa sau", + "device": "Thiết bị", + "entity": "Các thực thể liên quan", + "group": "Một phần của các nhóm sau", + "integration": "Tích hợp", + "no_related_found": "Không tìm thấy mục nào liên quan.", + "scene": "Một phần của các ngữ cảnh sau", + "script": "Một phần của các kịch bản sau" + }, "relative_time": { "duration": { "day": "{count} {count, plural,\n one { ngày }\n other { ngày }\n}", @@ -472,27 +512,86 @@ } }, "dialogs": { + "config_entry_system_options": { + "update": "Cập nhật" + }, "entity_registry": { + "control": "Điều khiển", "editor": { + "confirm_delete": "Bạn có chắc bạn muốn xoá bỏ mục này không?", "delete": "Xóa", + "enabled_cause": "Vô hiệu hoá do {cause}.", + "enabled_description": "Các thực thể bị vô hiệu hóa sẽ không được thêm vào Home Assistant.", + "enabled_label": "Kích hoạt thực thể", + "entity_id": "Mã định danh Thực thể", + "icon_error": "Các biểu tượng phải ở định dạng 'tiền tố:tên biểu tượng', ví dụ như 'mdi:home'", + "name": "Ghi đè Tên", + "note": "Lưu ý: điều này có thể không hoạt động với tất cả các tích hợp.", + "unavailable": "Thực thể này hiện không có sẵn.", "update": "Cập nhật" - } + }, + "no_unique_id": "Thực thể này không có mã định danh duy nhất, do vậy không thể quản lý cài đặt của nó từ giao diện người dùng.", + "related": "Liên quan", + "settings": "Cài đặt" + }, + "generic": { + "cancel": "Hủy bỏ", + "close": "đóng", + "default_confirmation_title": "Bạn có chắc không?", + "ok": "Đồng ý" }, "helper_settings": { + "generic": { + "icon": "Biểu tượng", + "name": "Tên" + }, "input_datetime": { "date": "Ngày", "datetime": "Ngày và giờ", "mode": "Bạn muốn nhập gì", "time": "Thời gian" }, + "input_number": { + "box": "Trường nhập liệu", + "max": "Giá trị tối đa", + "min": "Giá trị tối thiểu", + "mode": "Chế độ hiển thị", + "slider": "Thanh trượt", + "step": "Cỡ bước", + "unit_of_measurement": "Đơn vị đo lường" + }, + "input_select": { + "add": "Thêm tuỳ chọn", + "add_option": "Thêm tùy chọn", + "no_options": "Chưa có lựa chọn nào.", + "options": "Tùy Chọn" + }, "input_text": { "max": "Độ dài tối đa", - "min": "Độ dài tối thiểu" - } + "min": "Độ dài tối thiểu", + "mode": "Chế độ hiển thị", + "password": "Mật khẩu", + "pattern": "Mẫu Regex để xác thực giá trị ở phía client", + "text": "Văn bản" + }, + "platform_not_loaded": "Tích hợp {platform} không được nạp. Hãy thêm nó vào cấu hình của bạn bằng cách thêm 'default_config:' hoặc ''{platform}:''.", + "required_error_msg": "Trường này là cần thiết" }, "more_info_control": { + "edit": "Chỉnh sửa thực thể", + "person": { + "create_zone": "Tạo vùng từ vị trí hiện tại" + }, + "restored": { + "confirm_remove_text": "Bạn có chắc bạn muốn loại bỏ thực thể này không?", + "confirm_remove_title": "Loại bỏ thực thể?", + "not_provided": "Thực thể này hiện không khả dụng và thuộc về một tích hợp hay thiết bị đã bị loại bỏ, thay đổi hoặc rối loạn chức năng.", + "remove_action": "Loại bỏ thực thể", + "remove_intro": "Nếu thực thể không còn được sử dụng, bạn có thể dọn dẹp bằng cách loại bỏ nó." + }, "script": { - "last_action": "Hành động cuối" + "last_action": "Hành động cuối", + "last_triggered": "Lần kích hoạt cuối" }, "sun": { "elevation": "Độ cao", @@ -501,17 +600,42 @@ }, "updater": { "title": "Hướng dẫn cập nhật" + }, + "vacuum": { + "clean_spot": "Làm sạch một vùng nhỏ", + "commands": "Các lệnh điều khiển máy hút bụi:", + "fan_speed": "Tốc độ quạt", + "locate": "Định vị", + "pause": "Tạm dừng", + "return_home": "Trở lại bệ sạc", + "start": "Bắt đầu", + "start_pause": "Bắt Đầu/Tạm Dừng", + "status": "Trạng thái", + "stop": "Dừng" } }, "mqtt_device_debug_info": { - "show_as_yaml": "Hiển thị dưới dạng YAML" + "deserialize": "Cố gắng phân tích các thông điệp MQTT dưới dạng JSON", + "entities": "Các thực thể", + "no_entities": "Không có thực thể", + "no_triggers": "Không có kích hoạt", + "payload_display": "Hiển thị nội dung", + "recent_messages": "{n} thông điệp nhận được gần đây nhất", + "show_as_yaml": "Hiển thị dưới dạng YAML", + "title": "{device} thông tin sửa lỗi", + "triggers": "Các kích hoạt" }, "voice_command": { "label": "Nhập câu hỏi và nhấn 'Enter'" }, "zha_device_info": { "buttons": { - "add": "Thêm thiết bị" + "add": "Thêm thiết bị", + "zigbee_information": "Chữ ký thiết bị ZigBee" + }, + "device_signature": "Chữ ký thiết bị ZigBee", + "services": { + "zigbee_information": "Xem thông tin Zigbee của thiết bị." } } }, @@ -534,10 +658,19 @@ }, "notification_toast": { "connection_lost": "Kết nối bị mất. Đang kết nối lại…", - "service_call_failed": "Không thể gọi dịch vụ {service} ." + "service_call_failed": "Không thể gọi dịch vụ {service} .", + "started": "Home Assistant đã khởi động xong!", + "starting": "Home Assistant đang khởi động, không phải tất cả mọi thứ đều đã sẵn sàng cho đến khi khởi động hoàn tất." }, "panel": { + "calendar": { + "my_calendars": "Các Lịch của tôi", + "today": "Hôm nay" + }, "config": { + "advanced_mode": { + "link_profile_page": "trang hồ sơ của bạn" + }, "areas": { "caption": "Đăng ký Khu vực", "data_table": { @@ -545,6 +678,7 @@ "devices": "Thiết bị" }, "delete": { + "confirmation_text": "Tất cả các thiết bị trong khu vực này sẽ trở thành chưa được phân khu vực.", "confirmation_title": "Bạn có chắc chắn muốn xóa khu vực này?" }, "description": "Tổng quan tất cả các khu vực trong nhà bạn.", @@ -552,6 +686,8 @@ "area_id": "ID Khu vực", "create": "TẠO", "delete": "XÓA", + "name": "Tên", + "name_required": "Tên là bắt buộc", "unknown_error": "Lỗi không xác định", "update": "CẬP NHẬT" }, @@ -619,6 +755,9 @@ "device": { "condition": "Điều kiện" }, + "not": { + "label": "Không" + }, "numeric_state": { "above": "Ở trên", "below": "Bên dưới", @@ -656,9 +795,12 @@ "unsupported_condition": "Điều kiện không được hỗ trợ: {condition}" }, "default_name": "Thêm Tự động hóa", + "enable_disable": "Bật/Tắt tự động hóa", "introduction": "Sử dụng tự động hóa để mang sự sống cho nhà bạn", "load_error_not_editable": "Chỉ tự động hóa trong automations.yaml là có thể chỉnh sửa.", "load_error_unknown": "Lỗi tải tự động hóa ({err_no}).", + "move_down": "Chuyển xuống", + "move_up": "Chuyển lên", "save": "Lưu", "triggers": { "add": "Thêm Bộ khởi động", @@ -749,6 +891,9 @@ }, "picker": { "add_automation": "Thêm Tự động hóa", + "delete_automation": "Xóa tự động hóa", + "delete_confirm": "Bạn có chắc bạn muốn xoá tự động hoá này không?", + "edit_automation": "Chỉnh sửa tự động hóa", "header": "Trình biên tập tự động hóa", "headers": { "name": "Tên" @@ -756,10 +901,17 @@ "introduction": "Trình soạn thảo tự động hóa cho phép bạn tạo và chỉnh sửa tự động. Vui lòng đọc [hướng dẫn] (https://home-assistant.io/docs/automation/editor/) để đảm bảo rằng bạn đã cấu hình chính xác Home Assistant.", "learn_more": "Tìm hiểu thêm về Tự động hóa", "no_automations": "Chúng tôi không thể tìm thấy tự động hóa nào có thể chỉnh sửa", - "pick_automation": "Chọn tự động hóa để chỉnh sửa" + "only_editable": "Chỉ các tự động hóa trong automations.yaml là có thể chỉnh sửa.", + "pick_automation": "Chọn tự động hóa để chỉnh sửa", + "show_info_automation": "Hiển thị thông tin về tự động hóa" } }, "cloud": { + "account": { + "google": { + "sync_entities_404_message": "Thất bị khi đồng bộ các thực thể của bạn với Google, yêu cầu Google 'Hey Google, sync my devices' để thực hiện đồng bộ hoá." + } + }, "caption": "Home Assistant Cloud", "description_login": "Đã đăng nhập với tên {email}", "description_not_login": "Chưa đăng nhập" @@ -773,6 +925,7 @@ "edit_requires_storage": "Trình chỉnh sửa bị vô hiệu hóa do cấu hình được lưu trữ trong configuration.yaml.", "elevation": "Độ cao", "elevation_meters": "mét", + "external_url": "URL bên ngoài", "imperial_example": "Độ F, pound", "latitude": "Vĩ độ", "location_name": "Tên cài đặt Home Assistant của bạn", @@ -790,21 +943,34 @@ } }, "customize": { + "attributes_not_set": "Các thuộc tính sau chưa được thiết lập. Thiết lập chúng nếu muốn.", + "attributes_outside": "Các thuộc tính sau được tùy chỉnh từ bên ngoài customize.yaml", + "attributes_override": "Bạn có thể ghi đè chúng nếu muốn.", + "attributes_set": "Các thuộc tính sau của thực thể được thiếp lập bởi chương trình.", "caption": "Tùy chỉnh", "description": "Tùy chỉnh các thực thể của bạn", + "different_include": "Có thể qua một miền, một đường dẫn hoặc một bao gồm khác.", + "pick_attribute": "Chọn một thuộc tính để ghi đè", "picker": { + "entity": "Thực thể", "header": "Tùy chỉnh", "introduction": "Tinh chỉnh thuộc tính mỗi thực thể. Các tùy chỉnh được thêm / chỉnh sửa sẽ có hiệu lực ngay lập tức. Các tùy chỉnh bị xóa sẽ có hiệu lực khi thực thể được cập nhật." } }, "devices": { "automation": { + "automations": "Tự động hóa", + "create": "Tạo tự động hóa với thiết bị", + "no_automations": "Không có tự động hoá", + "no_device_automations": "Không có tự động hoá nào khả dụng cho thiết bị này.", "triggers": { "caption": "Làm gì đó khi ..." } }, + "cant_edit": "Bạn chỉ có thể chỉnh sửa các mục được tạo trong UI.", "caption": "Thiết bị", "confirm_delete": "Bạn có chắc bạn muốn xóa bỏ thiết bị này không?", + "confirm_rename_entity_ids": "Bạn cũng muốn đổi mã định danh của các thực thể?", "data_table": { "area": "Khu vực", "battery": "Pin", @@ -816,12 +982,30 @@ "no_devices": "Không có thiết bị nào" }, "delete": "Xóa", + "device_info": "Thông tin thiết bị", "device_not_found": "Không tìm thấy thiết bị.", "entities": { - "add_entities_lovelace": "Thêm vào Lovelace" + "add_entities_lovelace": "Thêm vào Lovelace", + "disabled_entities": "+{count} {count, plural,\n one {thực thể bị vô hiệu hoá}\n other {các thực thể bị vô hiệu hoá}\n}", + "entities": "Các thực thể", + "hide_disabled": "Ẩn các thiết bị bị vô hiệu hoá", + "none": "Thiết bị này không có thực thể nào" }, "name": "Tên", "no_devices": "Không có thiết bị nào", + "scene": { + "create": "Tạo ngữ cảnh với thiết bị", + "no_scenes": "Không có ngữ cảnh", + "scenes": "Các ngữ cảnh" + }, + "scenes": "Các ngữ cảnh", + "script": { + "create": "Tạo kịch bản với thiết bị", + "no_scripts": "Không có kịch bản", + "scripts": "Các kịch bản" + }, + "scripts": "Các kịch bản", + "unknown_error": "Lỗi không xác định", "unnamed_device": "Thiết bị không tên", "update": "Cập nhật" }, @@ -829,21 +1013,86 @@ "caption": "Đăng ký thực thể", "description": "Tổng quan tất cả các thực thể đã biết.", "picker": { + "disable_selected": { + "button": "Vô hiệu hoá các mục đã chọn" + }, + "enable_selected": { + "button": "Kích hoạt các mục đã chọn" + }, + "filter": { + "filter": "Lọc", + "show_disabled": "Hiển thị các thực thể bị vô hiệu", + "show_readonly": "Hiển thị các thực thể chỉ đọc", + "show_unavailable": "Hiện thực thể không khả dụng" + }, "header": "Đăng ký thực thể", + "headers": { + "status": "Trạng thái" + }, "introduction": "Home Assistant giữ một sổ đăng ký của mọi thực thể mà nó từng thấy có thể được xác định duy nhất. Mỗi thực thể này sẽ có một ID thực thể được gán sẽ chỉ dành riêng cho thực thể này.", - "introduction2": "Sử dụng sổ đăng ký thực thể để ghi đè tên, thay đổi ID thực thể hoặc xóa mục nhập khỏi Home Assistant. Lưu ý, xóa mục đăng ký thực thể sẽ không xóa thực thể. Để làm điều đó, hãy theo liên kết dưới đây và xóa nó khỏi trang tích hợp." + "introduction2": "Sử dụng sổ đăng ký thực thể để ghi đè tên, thay đổi ID thực thể hoặc xóa mục nhập khỏi Home Assistant. Lưu ý, xóa mục đăng ký thực thể sẽ không xóa thực thể. Để làm điều đó, hãy theo liên kết dưới đây và xóa nó khỏi trang tích hợp.", + "selected": "{number} đã chọn", + "status": { + "disabled": "Bị vô hiệu hoá", + "ok": "Đồng ý", + "readonly": "Chỉ đọc", + "unavailable": "Không khả dụng" + } } }, + "filtering": { + "clear": "Xoá", + "filtering_by": "Lọc bởi" + }, "header": "Cấu hình Home Assistant", + "helpers": { + "caption": "Người hỗ trợ", + "description": "Các yếu tố có thể giúp xây dựng tự động hóa.", + "dialog": { + "add_helper": "Thêm hỗ trợ", + "add_platform": "Thêm {platform}", + "create": "Tạo" + }, + "picker": { + "add_helper": "Thêm hỗ trợ", + "headers": { + "editable": "Có thể chỉnh sửa", + "entity_id": "Mã Thực thể", + "name": "Tên", + "type": "Loại" + } + }, + "types": { + "input_boolean": "Chuyển đổi", + "input_datetime": "Ngày và/hoặc giờ", + "input_number": "Số", + "input_select": "Thả xuống", + "input_text": "Văn bản" + } + }, "info": { + "caption": "Thông tin", + "description": "Thông tin về bản cài đặt Home Assistant của bạn", + "developed_by": "Được phát triển bởi một nhóm những con người tuyệt vời.", + "documentation": "Tài liệu", + "home_assistant_logo": "Logo của Home Assistant", + "integrations": "Các tích hợp", + "issues": "Các vấn đề", + "license": "Được xuất bản theo giấy phép Apache 2.0", + "path_configuration": "Đường dẫn đến configuration.yaml: {path}", + "server": "máy chủ", + "source": "Nguồn:", "title": "Thông tin" }, "integrations": { + "add_integration": "Thêm tích hợp", "caption": "Các bộ tích hợp", "config_entry": { "delete": "Xóa", "delete_confirm": "Bạn chắc chắn muốn xóa bộ tích hợp này?", "device_unavailable": "Thiết bị không khả dụng", + "devices": "{count} {count, plural,\n one { thiết bị }\n other { các thiết bị }\n}", + "entities": "{count} {count, plural,\n one { thực thể }\n other { các thực thể }\n}", "entity_unavailable": "Thiết bị không khả dụng", "firmware": "Firmware: {version}", "manuf": "bởi {manufacturer}", @@ -856,35 +1105,119 @@ "system_options": "Tùy chọn hệ thống" }, "config_flow": { + "aborted": "Đã hủy bỏ", + "close": "Đóng", "created_config": "Đã tạo cấu hình cho {name}.", + "dismiss": "Bỏ qua hộp thoại", + "error_saving_area": "Lỗi khi lưu khu vực: {error}", "external_step": { "description": "Bước này yêu cầu bạn truy cập một trang web bên ngoài để hoàn thành.", "open_site": "Mở trang web" - } + }, + "finish": "Hoàn thành", + "loading_first_time": "Vui lòng chờ trong khi tích hợp đang được cài đặt", + "not_all_required_fields": "Không phải tất cả các trường bắt buộc đều đã được điền.", + "submit": "Gửi đi" }, "configure": "Cấu hình", "configured": "Đã cấu hình", "description": "Quản lý thiết bị và dịch vụ đã kết nối", "discovered": "Đã quét", + "ignore": { + "confirm_delete_ignore_title": "Ngừng bỏ qua {name}?", + "hide_ignored": "Ẩn các tích hợp bị bỏ qua", + "ignored": "Đã bỏ qua", + "show_ignored": "Hiển thị các tích hợp bị bỏ qua", + "stop_ignore": "Ngừng bỏ qua" + }, "integration": "tích hợp", + "integration_not_found": "Không tìm thấy tích hợp.", "new": "Thiết lập bộ tích hợp mới", - "none": "Chưa có cấu hình nào" + "no_integrations": "Có vẻ như bạn chưa có bất kỳ tích hợp nào được cấu hình. Nhấp vào nút bên dưới để thêm tích hợp đầu tiên của bạn!", + "none": "Chưa có cấu hình nào", + "none_found": "Không tìm thấy tích hợp nào", + "none_found_detail": "Điều chỉnh tiêu chí tìm kiếm của bạn." }, "introduction": "Ở đây có thể định cấu hình các thành phần của bạn và Home Assistant. Không phải mọi thứ đều có thể được cấu hình từ giao diện người dùng, nhưng chúng tôi đang cải thiện việc đó.", + "logs": { + "caption": "Nhật ký hoạt động", + "description": "Xem nhật ký hoạt động của Home Assistant" + }, "lovelace": { "caption": "Bảng điều khiển Lovelace", "dashboards": { "cant_edit_default": "Bảng điều khiển Lovelace tiêu chuẩn không thể chỉnh sửa được từ UI. Bạn có thể ẩn nó bằng cách đặt bảng điều khiển khác làm mặc định.", + "cant_edit_yaml": "Các bảng điều khiển được định nghĩa trong YAML không thể được sửa từ giao diện người dùng. Thay đổi chúng trong configuration.yaml.", + "caption": "Bảng điều khiển", + "conf_mode": { + "storage": "Điều khiển bằng UI", + "yaml": "Tập tin YAML" + }, + "confirm_delete": "Bạn có chắc chắn muốn xóa bảng điều khiển này?", "default_dashboard": "Đây là bảng điều khiển mặc định", "detail": { + "create": "Tạo", + "delete": "Xóa", + "dismiss": "Đóng", + "edit_dashboard": "Chỉnh sửa bảng điều khiển", "icon": "Biểu tượng", - "title": "Tiêu đề" + "new_dashboard": "Thêm bảng điều khiển mới", + "require_admin": "Chỉ Quản trị viên", + "set_default": "Đặt làm mặc định trên thiết bị này", + "show_sidebar": "Hiển thị trong thanh bên", + "title": "Tiêu đề", + "title_required": "Tiêu đề là bắt buộc.", + "update": "Cập nhật", + "url": "Url", + "url_error_msg": "URL phải chứa một ký tự - và không thể chứa dấu cách hoặc ký tự đặc biệt, ngoại trừ _ và -" }, "picker": { + "add_dashboard": "Thêm bảng điều khiển", + "headers": { + "conf_mode": "Phương thức cấu hình", + "default": "Mặc định", + "filename": "Tên tệp", + "require_admin": "Chỉ Quản trị viên", + "sidebar": "Hiển thị trong thanh bên", + "title": "Tiêu đề" + }, "open": "Mở" } }, - "description": "Cấu hình bảng điều khiển Lovelace" + "description": "Cấu hình bảng điều khiển Lovelace", + "resources": { + "cant_edit_yaml": "Bạn đang sử dụng Lovelace trong chế độ YAML, do đó bạn không thể quản lý tài nguyên của mình thông qua giao diện người dùng. Quản lý chúng trong configuration.yaml.", + "caption": "Tài nguyên", + "confirm_delete": "Bạn có chắc chắn muốn xóa tài nguyên này?", + "detail": { + "create": "Tạo", + "delete": "Xóa", + "dismiss": "Đóng", + "new_resource": "Thêm tài nguyên mới", + "type": "Loại tài nguyên", + "update": "Cập nhật", + "url": "Url", + "url_error_msg": "URL là trường bắt buộc", + "warning_header": "Thận trọng!", + "warning_text": "Thêm tài nguyên có thể nguy hiểm, đảm bảo bạn biết rõ nguồn của tài nguyên và tin tưởng họ. Tài nguyên xấu có thể gây hại nghiêm trọng cho hệ thống của bạn." + }, + "picker": { + "add_resource": "Thêm tài nguyên", + "headers": { + "type": "Loại", + "url": "Url" + }, + "no_resources": "Không có tài nguyên" + }, + "refresh_body": "Bạn phải làm mới trang để hoàn tất việc xóa, bạn có muốn làm mới bây giờ không?", + "refresh_header": "Bạn có muốn làm mới không?", + "types": { + "css": "Stylesheet", + "html": "HTML (không dùng nữa)", + "js": "Tệp JavaScript (không dùng nữa)", + "module": "Mô-đun JavaScript" + } + } }, "person": { "caption": "Người", @@ -897,26 +1230,65 @@ } }, "scene": { + "activated": "Đã kích hoạt ngữ cảnh {name}.", + "caption": "Các ngữ cảnh", + "description": "Tạo và chỉnh sửa ngữ cảnh", "editor": { + "default_name": "Ngữ cảnh mới", "devices": { "add": "Thêm thiết bị", "delete": "Xóa thiết bị", - "header": "Thiết bị" - } + "header": "Thiết bị", + "introduction": "Thêm các thiết bị mà bạn muốn bao gồm trong ngữ cảnh của bạn. Đặt tất cả các thiết bị vào trạng thái mong muốn cho ngữ cảnh này." + }, + "entities": { + "add": "Thêm một thực thể", + "delete": "Xóa thực thể", + "device_entities": "Nếu bạn thêm một thực thể thuộc về một thiết bị, thiết bị cũng sẽ được thêm vào.", + "header": "Các thực thể", + "introduction": "Các thực thể không thuộc về một thiết bị có thể được đặt ở đây.", + "without_device": "Các thực thể không thuộc một thiết bị" + }, + "introduction": "Sử dụng các ngữ cảnh để mang lại sự sống cho nhà bạn.", + "load_error_not_editable": "Chỉ những ngữ cảnh nằm trong scenes.yaml là có thể chỉnh sửa.", + "load_error_unknown": "Lỗi khi tải ngữ cảnh ({err_no}).", + "name": "Tên", + "save": "Lưu", + "unsaved_confirm": "Bạn có những thay đổi chưa được lưu. Bạn có chắc chắn muốn rời đi không?" }, "picker": { + "add_scene": "Thêm ngữ cảnh", + "delete_confirm": "Bạn có chắc bạn muốn xóa bỏ ngữ cảnh này không?", + "delete_scene": "Xóa ngữ cảnh", + "edit_scene": "Chỉnh sửa ngữ cảnh", + "header": "Trình soạn thảo Ngữ cảnh", "headers": { "name": "Tên" - } + }, + "introduction": "Trình soạn thảo ngữ cảnh cho phép bạn tạo và chỉnh sửa các ngữ cảnh. Vui lòng theo liên kết dưới đây để xem hướng dẫn nhằm đảm bảo rằng bạn đã cấu hình Home Assistant chính xác.", + "learn_more": "Tìm hiểu thêm về ngữ cảnh", + "no_scenes": "Chúng tôi không thể tìm thấy bất kỳ ngữ cảnh nào có thể chỉnh sửa", + "only_editable": "Chỉ những ngữ cảnh được định nghĩa trong scenes.yaml là có thể chỉnh sửa.", + "pick_scene": "Chọn ngữ cảnh để chỉnh sửa", + "show_info_scene": "Hiển thị thông tin về ngữ cảnh" } }, "script": { "caption": "Kịch bản", "description": "Tạo và chỉnh sửa các tập lệnh", + "editor": { + "delete_script": "Xóa kịch bản", + "link_available_actions": "Tìm hiểu thêm về các hành động khả dụng.", + "sequence": "Trình tự", + "sequence_sentence": "Trình tự các hành động trong kịch bản này." + }, "picker": { + "edit_script": "Chỉnh sửa kịch bản", "headers": { "name": "Tên" - } + }, + "show_info": "Hiển thị thông tin về kịch bản", + "trigger_script": "Kích hoạt kịch bản" } }, "server_control": { @@ -928,6 +1300,11 @@ "core": "Tải lại lõi", "group": "Tải lại nhóm", "heading": "Đang tải lại cấu hình YAML", + "input_boolean": "Tải lại input boolean", + "input_datetime": "Tải lại input date time", + "input_number": "Tải lại input number", + "input_select": "Tải lại input select", + "input_text": "Tải lại input texts", "introduction": "Một số phần của Home Assistant có thể tải lại mà không yêu cầu khởi động lại. Nhấn nút tải lại sẽ gỡ bỏ cấu hình hiện tại của nó và tải một cấu hình mới.", "person": "Tải lại người", "scene": "Tải lại ngữ cảnh", @@ -975,29 +1352,70 @@ "name": "Tên", "system": "Hệ thống" } - } + }, + "users_privileges_note": "Nhóm người dùng đang trong quá trình hoàn thiện. Người dùng sẽ không thể thực hiện các thao tác quản lý qua UI. Chúng tôi vẫn đang kiểm tra tất cả các điểm kết thúc của API để đảm bảo rằng chúng giới hạn chính xác các truy cập vào quyền quản trị." }, "zha": { "add_device_page": { + "discovered_text": "Thiết bị sẽ hiển thị ở đây một khi được tìm thấy.", + "no_devices_found": "Không có thiết bị nào được tìm thấy, hãy chắc chắn thiết bị đang trong chế độ ghép nối và giữ thiết bị kích hoạt khi tự động phát hiện đang chạy.", + "pairing_mode": "Đảm bảo các thiết bị của bạn đang ở chế độ ghép nối. Kiểm tra hướng dẫn đi kèm thiết bị về cách làm điều này.", "spinner": "Tìm kiếm các thiết bị ZHA Zigbee ..." }, "add": { "caption": "Thêm thiết bị" }, + "button": "Cấu hình", "caption": "ZHA", "common": { "add_devices": "Thêm thiết bị", "devices": "Thiết bị" }, - "description": "Quản lý mạng Zigbee Home Automation" + "description": "Quản lý mạng Zigbee Home Automation", + "group_binding": { + "bind_button_help": "Liên kết nhóm đã chọn vào các cụm thiết bị đã chọn.", + "bind_button_label": "Liên kết Nhóm", + "cluster_selection_help": "Chọn các cụm để liên kết với nhóm đã chọn.", + "group_picker_help": "Chọn một nhóm để thi hành một lệnh liên kết.", + "unbind_button_help": "Hủy liên kết nhóm đã chọn khỏi cụm thiết bị đã chọn.", + "unbind_button_label": "Ngừng liên kết Nhóm" + }, + "groups": { + "add_members": "Thêm Thành viên", + "adding_members": "Thêm Thành viên", + "caption": "Các nhóm", + "group_id": "Mã Nhóm", + "group_info": "Thông tin Nhóm", + "group_not_found": "Không tìm thấy nhóm!", + "group-header": "ZigBee Home Automation - Chi tiết Nhóm", + "groups": "Nhóm", + "members": "Thành viên", + "remove_members": "Xóa Thành viên" + }, + "network": { + "caption": "Mạng" + } }, "zone": { "caption": "Khu vực", "configured_in_yaml": "Các khu vực được định cấu hình qua file configuration.yaml không thể được chỉnh sửa thông qua giao diện.", "description": "Quản lý các khu vực bạn muốn theo dõi mọi người trong đó.", + "detail": { + "create": "Tạo", + "delete": "Xóa", + "latitude": "Vĩ độ", + "longitude": "Kinh độ", + "passive": "Thụ động", + "radius": "Bán kính", + "required_error_msg": "Trường này là cần thiết", + "update": "Cập nhật" + }, + "edit_home_zone": "Bán kính của vùng Nhà chưa thể chỉnh sửa được từ frontend. Kéo điểm đánh dấu trên bản đồ để di chuyển vùng Nhà.", + "go_to_core_config": "Đi đến cấu hình chung?", "no_zones_created_yet": "Có vẻ như bạn chưa tạo ra bất kỳ khu vực nào." }, "zwave": { + "button": "Cấu hình", "caption": "Z-Wave", "common": { "index": "Mục lục", @@ -1011,25 +1429,69 @@ "set_config_parameter": "Đặt tham số cấu hình", "true": "Đúng" }, + "node_management": { + "group": "Nhóm" + }, + "ozw_log": { + "load": "Tải" + }, "services": { "cancel_command": "Hủy lệnh", + "heal_node": "Nút sửa lỗi", + "node_info": "Thông tin nút", + "print_node": "Nút in ấn", + "refresh_entity": "Làm mới Thực thể", "save_config": "Lưu cấu hình", - "soft_reset": "Khởi động lại" + "soft_reset": "Khởi động lại", + "test_node": "Nút kiểm tra" } } }, + "custom": { + "external_panel": { + "question_trust": "Bạn có tin tưởng bảng điều khiển bên ngoài {name} tại {link} không?" + } + }, "developer-tools": { "tabs": { "events": { "title": "Sự kiện" }, "mqtt": { + "description_listen": "Nghe một chủ đề", + "listening_to": "Lắng nghe", + "message_received": "Thông điệp {id} nhận được trên {topic} tại {time}:", + "payload": "Nội dung (cho phép dùng Mẫu sẵn)", + "publish": "Công bố", + "start_listening": "Bắt đầu nghe", + "stop_listening": "Dừng nghe", + "subscribe_to": "Đăng ký vào chủ đề", "title": "MQTT" }, "services": { + "alert_parsing_yaml": "Lỗi phân tích YAML: {data}", + "call_service": "Gọi Dịch vụ", + "column_description": "Mô tả", + "column_example": "Ví dụ", + "column_parameter": "Tham số", + "data": "Dữ liệu dịch vụ (YAML, tùy chọn)", + "description": "Công cụ hỗ trợ phát triển dịch vụ cho phép bạn gọi các dịch vụ khả dụng trong Home Assistant.", + "fill_example_data": "Điền các Dữ liệu Mẫu", + "no_description": "Không có mô tả nào", + "no_parameters": "Dịch vụ này không có tham số.", + "select_service": "Chọn một dịch vụ để xem mô tả", "title": "Dịch vụ" }, "states": { + "attributes": "Các thuộc tính", + "current_entities": "Thực thể hiện tại", + "entity": "Thực thể", + "filter_attributes": "Lọc các thuộc tính", + "filter_entities": "Lọc các thực thể", + "filter_states": "Lọc các trạng thái", + "set_state": "Thiết lập Trạng thái", + "state": "Trạng thái", + "state_attributes": "Các thuộc tính Trạng thái (YAML, tuỳ chọn)", "title": "Trạng thái" }, "templates": { @@ -1042,6 +1504,7 @@ "showing_entries": "Hiển thị mục cho" }, "logbook": { + "entries_not_found": "Không tìm thấy trong sổ nhật ký.", "period": "Giai đoạn", "showing_entries": "Hiển thị mục cho" }, @@ -1052,6 +1515,9 @@ "no_devices": "Trang này cho phép bạn điều khiển các thiết bị của mình, tuy nhiên có vẻ như bạn chưa có thiết bị nào được thiết lập. Đi đến trang tích hợp để bắt đầu.", "title": "Chào mừng về nhà" }, + "entities": { + "never_triggered": "Chưa bao giờ kích hoạt" + }, "picture-elements": { "call_service": "Gọi dịch vụ {name}", "hold": "Giữ:", @@ -1064,6 +1530,10 @@ "add_item": "Thêm mục", "checked_items": "Mục đã chọn", "clear_items": "Xóa các mục đã chọn" + }, + "starting": { + "description": "Home Assistant đang khởi động, vui lòng chờ...", + "header": "Home Assistant đang khởi động" } }, "changed_toast": { @@ -1072,16 +1542,70 @@ }, "editor": { "card": { + "button": { + "name": "Nút" + }, "conditional": { - "card": "Thẻ" + "card": "Thẻ", + "condition_explanation": "Thẻ sẽ được hiển thị khi TẤT CẢ các điều kiện dưới đây được đáp ứng.", + "conditions": "Điều kiện", + "current_state": "hiện tại", + "description": "Thẻ Điều kiện hiển thị một thẻ khác dựa trên trạng thái của các thực thể.", + "state_equal": "Trạng thái bằng với", + "state_not_equal": "Trạng thái không bằng với" + }, + "entity": { + "description": "Thẻ Thực thể cung cấp cho bạn thông tin tổng quát về trạng thái của thực thể.", + "name": "Thực thể" }, "generic": { + "attribute": "Thuộc tính", + "double_tap_action": "Hành động khi Nhấn Đôi", + "manual": "Thủ công", + "manual_description": "Cần thêm một thẻ tuỳ chỉnh hay chỉ muốn viết cấu hình yaml thủ công?", + "no_theme": "Không có theme.", "state": "Trạng thái" }, + "history-graph": { + "description": "Thẻ Biểu đồ Lịch sử cho phép bạn hiển thị biểu đồ cho từng thực thể được liệt kê." + }, + "horizontal-stack": { + "description": "Thẻ Xếp Ngang cho phép bạn nhóm nhiều thẻ để các thẻ này luôn nằm cạnh nhau trong cùng một hàng." + }, "iframe": { "name": "Trang web" + }, + "light": { + "description": "Thẻ Đèn cho phép bạn thay đổi độ sáng của đèn." + }, + "map": { + "description": "Thẻ Bản đồ cho phép bạn hiển thị các thực thể trên bản đồ.", + "hours_to_show": "Giờ hiển thị" + }, + "plant-status": { + "description": "Thẻ Tình trạng Cây cối dành cho tất cả các nhà thực vật học đáng yêu ngoài kia." + }, + "sensor": { + "description": "Thẻ Cảm biến cung cấp cho bạn tổng quan nhanh về trạng thái cảm biến của bạn với một biểu đồ tùy chọn thể hiện sự thay đổi qua thời gian." + }, + "shopping-list": { + "description": "Thẻ Danh sách mua sắm cho phép bạn thêm, chỉnh sửa, kiểm tra và xóa các mục khỏi danh sách mua sắm của bạn.", + "integration_not_loaded": "Thẻ này yêu cầu thiết lập tích hợp 'shopping_list'." + }, + "thermostat": { + "description": "Thẻ Điều chỉnh nhiệt cho phép kiểm soát thực thể khí hậu của bạn. Cho phép bạn thay đổi nhiệt độ và chế độ của thực thể." + }, + "vertical-stack": { + "description": "Thẻ Xếp Dọc cho phép bạn nhóm nhiều thẻ để các thẻ này luôn nằm trong cùng một cột." + }, + "weather-forecast": { + "show_forecast": "Hiển thị Dự báo thời tiết" } }, + "cardpicker": { + "custom_card": "Tuỳ chỉnh", + "no_description": "Không có mô tả nào." + }, "edit_card": { "add": "Thêm Thẻ", "delete": "Xóa", @@ -1091,14 +1615,22 @@ "move": "Di chuyển", "options": "Tùy Chọn", "pick_card": "Chọn Thẻ bạn muốn thêm.", + "pick_card_view_title": "Loại thẻ nào bạn muốn thêm vào chế độ xem {name}?", "show_code_editor": "Sửa mã nguồn", "toggle_editor": "Đổi trình biên tập" }, + "edit_lovelace": { + "edit_title": "Chỉnh sửa tiêu đề" + }, "edit_view": { "add": "Thêm Tầm nhìn", "delete": "Xóa Tầm nhìn", "edit": "Chỉnh sửa Tầm nhìn", - "header": "Cấu hình Tầm nhìn" + "header": "Cấu hình Tầm nhìn", + "tab_badges": "Huy hiệu", + "visibility": { + "select_users": "Chọn người dùng sẽ thấy chế độ xem này trong thanh điều hướng" + } }, "header": "Chỉnh sửa giao diện", "menu": { @@ -1112,32 +1644,62 @@ "para_no_id": "Phần tử này không có ID. Vui lòng thêm ID vào thành phần này trong 'ui-lovelace.yaml'." }, "raw_editor": { + "confirm_unsaved_changes": "Bạn có những thay đổi chưa được lưu, bạn có chắc muốn thoát không?", + "confirm_unsaved_comments": "Cấu hình của bạn chứa (các) ghi chú, những ghi chú này sẽ không được lưu. Bạn có muốn tiếp tục?", "error_invalid_config": "Cấu hình của bạn không hợp lệ: {error}", + "error_parse_yaml": "Không thể phân tích YAML: {error}", + "error_save_yaml": "Không thể lưu YAML: {error}", "header": "Chỉnh sửa cấu hình", + "resources_moved": "Các Tài nguyên giờ không nên được thêm vào qua cấu hình Lovelace nhưng có thể thêm vào qua bảng điều khiển cấu hình Lovelace.", "save": "Lưu", "saved": "Đã lưu", "unsaved_changes": "Thay đổi chưa lưu" }, "save_config": { "cancel": "Đừng bận tâm", + "close": "Đóng", "empty_config": "Bắt đầu với một bảng điều khiển trống", "header": "Kiểm soát giao diện Lovelace của bạn", "para": "Theo mặc định, Home Assistant sẽ duy trì giao diện của bạn, cập nhật nó khi các thực thể mới hoặc các thành phần Lovelace có sẵn. Nếu bạn kiểm soát, chúng tôi sẽ không còn thay đổi tự động cho bạn nữa.", "para_sure": "Bạn có chắc chắn muốn kiểm soát giao diện của mình không?", - "save": "Kiểm soát" + "save": "Kiểm soát", + "yaml_config": "Để giúp bạn bắt đầu, đây là cấu hình hiện tại của bảng điều khiển này:", + "yaml_control": "Để kiểm soát trong chế độ YAML, hãy tạo tệp YAML với tên bạn đã chỉ định trong cấu hình hoặc trong 'ui-lovelace.yaml' mặc định.", + "yaml_mode": "Bạn đang sử dụng chế độ YAML cho bảng điều khiển này, có nghĩa là bạn không thể thay đổi cấu hình Lovelace từ giao diện người dùng. Nếu bạn muốn quản lý bảng điều khiển này từ giao diện người dùng, loại bỏ 'mode:yaml' từ cấu hình Lovelace của bạn trong 'configuration.yaml'." }, "suggest_card": { "add": "Thêm vào Lovelace UI", "create_own": "Chọn thẻ khác" + }, + "view": { + "panel_mode": { + "description": "Chế độ này hiển thị thẻ đầu tiên với toàn bộ chiều rộng; các thẻ còn lại sẽ không được hiển thị.", + "title": "Chế độ Bảng điều khiển?", + "warning_multiple_cards": "Chế độ xem này chứa nhiều thẻ, nhưng chế độ xem dạng bảng điều khiển chỉ có thể hiển thị 1 thẻ." + } } }, "menu": { + "close": "Đóng", "configure_ui": "Cấu hình giao diện", "help": "Trợ giúp", "refresh": "Làm tươi", "reload_resources": "Tải lại các tài nguyên" }, "reload_lovelace": "Tải lại giao diện", + "reload_resources": { + "refresh_body": "Bạn phải làm mới trang để hoàn thành tải lại, bạn có muốn làm mới bây giờ không?", + "refresh_header": "Bạn có muốn làm mới không?" + }, + "unused_entities": { + "available_entities": "Đây là những thực thể mà bạn có, nhưng chưa thêm vào giao diện người dùng Lovelace.", + "domain": "Tên miền", + "entity": "Thực thể", + "entity_id": "Mã Thực thể", + "last_changed": "Thay đổi lần cuối", + "select_to_add": "Chọn thực thể bạn muốn thêm vào thẻ và sau đó nhấp vào nút Thêm thẻ.", + "title": "Thực thể chưa sử dụng" + }, "views": { "confirm_delete": "Xóa cửa sổ?" }, @@ -1145,7 +1707,8 @@ "attribute_not_found": "Thuộc tính {attribute} không có trong: {entity}", "entity_non_numeric": "Thực thể không phải là số: {entity}", "entity_not_found": "Thực thể không có sẵn: {entity}", - "entity_unavailable": "{entity} hiện không khả dụng" + "entity_unavailable": "{entity} hiện không khả dụng", + "starting": "Home Assistant đang khởi động, không phải tất cả mọi thứ đã sẵn sàng" } }, "mailbox": { @@ -1158,6 +1721,8 @@ "abort_intro": "Đã hủy đăng nhập", "authorizing_client": "Bạn sắp cấp quyền cho {clientId} truy cập vào Home Assistant của bạn.", "form": { + "error": "Lỗi: {error}", + "next": "Kế tiếp", "providers": { "command_line": { "abort": { @@ -1243,6 +1808,7 @@ } } }, + "start_over": "Bắt đầu lại", "unknown_error": "Đã xảy ra sự cố", "working": "Vui lòng đợi" }, @@ -1263,6 +1829,7 @@ "hallway": "Hành lang", "kitchen": "Phòng bếp", "patio": "Sân trong", + "temperature_study": "Nghiên cứu Nhiệt độ", "upstairs": "Tầng trên" }, "unit": { @@ -1305,6 +1872,7 @@ "profile": { "advanced_mode": { "description": "Mở các tính năng nâng cao.", + "link_promo": "Tìm hiểu thêm", "title": "Chế độ nâng cao" }, "change_password": { @@ -1332,6 +1900,8 @@ "link_promo": "Trợ giúp dịch" }, "logout": "Đăng xuất", + "logout_text": "Bạn có chắc bạn muốn đăng xuất không?", + "logout_title": "Đăng xuất?", "long_lived_access_tokens": { "confirm_delete": "Bạn có chắn chắn muốn xóa token truy cập {name}?", "create": "Tạo Token", From f15cc0b424fccf80cc0f4f598a8ab497ab01e201 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 16 Jun 2020 09:00:55 -0500 Subject: [PATCH 08/30] Show the user that made the change in logbook (#6173) Co-authored-by: Bram Kragten --- src/data/logbook.ts | 1 + src/panels/logbook/ha-logbook.ts | 26 +++++++++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/data/logbook.ts b/src/data/logbook.ts index be4ab3166e..cdb5a8197b 100644 --- a/src/data/logbook.ts +++ b/src/data/logbook.ts @@ -4,4 +4,5 @@ export interface LogbookEntry { message: string; entity_id?: string; domain: string; + context_user_id?: string; } diff --git a/src/panels/logbook/ha-logbook.ts b/src/panels/logbook/ha-logbook.ts index ded1e6a288..507319fb2e 100644 --- a/src/panels/logbook/ha-logbook.ts +++ b/src/panels/logbook/ha-logbook.ts @@ -9,6 +9,7 @@ import { } from "lit-element"; import { scroll } from "lit-virtualizer"; import { formatDate } from "../../common/datetime/format_date"; +import { fetchUsers } from "../../data/user"; import { formatTimeWithSeconds } from "../../common/datetime/format_time"; import { fireEvent } from "../../common/dom/fire_event"; import { domainIcon } from "../../common/entity/domain_icon"; @@ -21,6 +22,9 @@ import { HomeAssistant } from "../../types"; class HaLogbook extends LitElement { @property() public hass!: HomeAssistant; + @property({ attribute: false }) + private _userid_to_name = {}; + @property() public entries: LogbookEntry[] = []; @property({ attribute: "rtl", type: Boolean, reflect: true }) @@ -58,6 +62,20 @@ class HaLogbook extends LitElement { `; } + private async _fetchUsers() { + const users = await fetchUsers(this.hass); + const userid_to_name = {}; + users.forEach((user) => { + userid_to_name[user.id] = user.name; + }); + this._userid_to_name = userid_to_name; + } + + protected firstUpdated(changedProperties: PropertyValues) { + super.firstUpdated(changedProperties); + this._fetchUsers(); + } + private _renderLogbookItem( item: LogbookEntry, index?: number @@ -67,6 +85,8 @@ class HaLogbook extends LitElement { } const previous = this.entries[index - 1]; const state = item.entity_id ? this.hass.states[item.entity_id] : undefined; + const item_username = + item.context_user_id && this._userid_to_name[item.context_user_id]; return html`
${index === 0 || @@ -101,7 +121,11 @@ class HaLogbook extends LitElement { ${item.name} `} - ${item.message} + ${item.message}${item_username + ? ` (${item_username})` + : ``}
From a55d0f347b4fdf88bf57951c9b34afaec7d77915 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 16 Jun 2020 22:19:07 +0200 Subject: [PATCH 09/30] Fix reload script (#6181) --- src/panels/config/server_control/ha-config-server-control.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/panels/config/server_control/ha-config-server-control.ts b/src/panels/config/server_control/ha-config-server-control.ts index 413c49abe7..ee2dc5da11 100644 --- a/src/panels/config/server_control/ha-config-server-control.ts +++ b/src/panels/config/server_control/ha-config-server-control.ts @@ -25,7 +25,7 @@ import { checkCoreConfig } from "../../../data/core"; const reloadableDomains = [ "group", "automation", - "scripts", + "script", "scene", "person", "zone", From c251e4f2415e94f9864f2aa0c34c6af8a6a64923 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 16 Jun 2020 22:20:10 +0200 Subject: [PATCH 10/30] Prevent add card dialog to jump on search (#6180) --- .../editor/card-editor/hui-card-picker.ts | 70 +++++++++++++------ 1 file changed, 50 insertions(+), 20 deletions(-) diff --git a/src/panels/lovelace/editor/card-editor/hui-card-picker.ts b/src/panels/lovelace/editor/card-editor/hui-card-picker.ts index 14bd738d1d..76f4fe5db6 100644 --- a/src/panels/lovelace/editor/card-editor/hui-card-picker.ts +++ b/src/panels/lovelace/editor/card-editor/hui-card-picker.ts @@ -32,6 +32,7 @@ import { LovelaceCard } from "../../types"; import { getCardStubConfig } from "../get-card-stub-config"; import { CardPickTarget, Card } from "../types"; import { coreCards } from "../lovelace-cards"; +import { styleMap } from "lit-html/directives/style-map"; interface CardElement { card: Card; @@ -54,6 +55,10 @@ export class HuiCardPicker extends LitElement { private _usedEntities?: string[]; + private _width?: number; + + private _height?: number; + private _filterCards = memoizeOne( (cardElements: CardElement[], filter?: string): CardElement[] => { if (filter) { @@ -92,26 +97,33 @@ export class HuiCardPicker extends LitElement { no-label-float @value-changed=${this._handleSearchChange} > -
- ${this._filterCards(this._cards, this._filter).map( - (cardElement: CardElement) => cardElement.element - )} -
-
-
-
- ${this.hass!.localize( - `ui.panel.lovelace.editor.card.generic.manual_description` - )} -
-
- ${this.hass!.localize( - `ui.panel.lovelace.editor.card.generic.manual` - )} +
+
+ ${this._filterCards(this._cards, this._filter).map( + (cardElement: CardElement) => cardElement.element + )} +
+
+
+
+ ${this.hass!.localize( + `ui.panel.lovelace.editor.card.generic.manual_description` + )} +
+
+ ${this.hass!.localize( + `ui.panel.lovelace.editor.card.generic.manual` + )} +
@@ -153,6 +165,24 @@ export class HuiCardPicker extends LitElement { this._loadCards(); } + protected updated(changedProps) { + super.updated(changedProps); + // Store the width and height so that when we search, box doesn't jump + const div = this.shadowRoot!.querySelector("div")!; + if (!this._width) { + const width = div.clientWidth; + if (width) { + this._width = width; + } + } + if (!this._height) { + const height = div.clientHeight; + if (height) { + this._height = height; + } + } + } + private _loadCards() { let cards: Card[] = coreCards.map((card: Card) => ({ name: this.hass!.localize( From d4e137bb58af7ab818ad75678cedcbbbaa921ffe Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 16 Jun 2020 22:29:11 +0200 Subject: [PATCH 11/30] Keep add integration dialog same size while searching (#6158) --- .../config-flow/step-flow-pick-handler.ts | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/dialogs/config-flow/step-flow-pick-handler.ts b/src/dialogs/config-flow/step-flow-pick-handler.ts index 68a54c92dd..3383b094d2 100644 --- a/src/dialogs/config-flow/step-flow-pick-handler.ts +++ b/src/dialogs/config-flow/step-flow-pick-handler.ts @@ -42,6 +42,8 @@ class StepFlowPickHandler extends LitElement { private _width?: number; + private _height?: number; + private _getHandlers = memoizeOne( (h: string[], filter?: string, _localize?: LocalizeFunc) => { const handlers: HandlerObj[] = h.map((handler) => { @@ -82,7 +84,10 @@ class StepFlowPickHandler extends LitElement { @value-changed=${this._filterChanged} >
${handlers.map( @@ -139,13 +144,20 @@ class StepFlowPickHandler extends LitElement { protected updated(changedProps) { super.updated(changedProps); - // Store the width so that when we search, box doesn't jump + // Store the width and height so that when we search, box doesn't jump + const div = this.shadowRoot!.querySelector("div")!; if (!this._width) { - const width = this.shadowRoot!.querySelector("div")!.clientWidth; + const width = div.clientWidth; if (width) { this._width = width; } } + if (!this._height) { + const height = div.clientHeight; + if (height) { + this._height = height; + } + } } private async _filterChanged(e) { @@ -166,8 +178,8 @@ class StepFlowPickHandler extends LitElement { configFlowContentStyles, css` img { - max-width: 40px; - max-height: 40px; + width: 40px; + height: 40px; } search-input { display: block; @@ -180,12 +192,12 @@ class StepFlowPickHandler extends LitElement { overflow: auto; max-height: 600px; } - @media all and (max-height: 1px) { + @media all and (max-height: 900px) { div { - max-height: calc(100vh - 205px); + max-height: calc(100vh - 134px); } div.advanced { - max-height: calc(100vh - 300px); + max-height: calc(100vh - 250px); } } paper-icon-item { From 61fdab294acae50081ed1c3eb7b52fe67d785d20 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 16 Jun 2020 22:29:38 +0200 Subject: [PATCH 12/30] Fix ha-card outline box shadow in firefox (#6174) * Fix ha-card outline box shadow in firefox * Add fallback for markdown code background --- src/components/buttons/ha-progress-button.js | 3 +++ src/components/ha-card.ts | 2 +- src/components/ha-markdown.ts | 2 +- src/resources/ha-style.ts | 3 +++ 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/components/buttons/ha-progress-button.js b/src/components/buttons/ha-progress-button.js index 50212e9967..f9f7927172 100644 --- a/src/components/buttons/ha-progress-button.js +++ b/src/components/buttons/ha-progress-button.js @@ -8,6 +8,9 @@ class HaProgressButton extends PolymerElement { static get template() { return html` - - - - - - -
[[localize('panel.history')]]
-
-
- -
-
- - - - - [[localize('ui.duration.day', 'count', 1)]] - [[localize('ui.duration.day', 'count', 3)]] - [[localize('ui.duration.week', 'count', 1)]] - - -
- - -
-
- `; - } - - static get properties() { - return { - hass: Object, - narrow: Boolean, - - stateHistory: { - type: Object, - value: null, - }, - - _periodIndex: { - type: Number, - value: 0, - }, - - isLoadingData: { - type: Boolean, - value: false, - }, - - endTime: { - type: Object, - computed: "_computeEndTime(_currentDate, _periodIndex)", - }, - - // ISO8601 formatted date string - _currentDate: { - type: String, - value: function () { - var value = new Date(); - var today = new Date( - Date.UTC(value.getFullYear(), value.getMonth(), value.getDate()) - ); - return today.toISOString().split("T")[0]; - }, - }, - - _filterType: { - type: String, - value: "date", - }, - - rtl: { - type: Boolean, - reflectToAttribute: true, - computed: "_computeRTL(hass)", - }, - }; - } - - datepickerFocus() { - this.datePicker.adjustPosition(); - } - - connectedCallback() { - super.connectedCallback(); - // We are unable to parse date because we use intl api to render date - this.$.picker.set("i18n.parseDate", null); - this.$.picker.set("i18n.formatDate", (date) => - formatDate(new Date(date.year, date.month, date.day), this.hass.language) - ); - } - - _computeStartTime(_currentDate) { - if (!_currentDate) return undefined; - var parts = _currentDate.split("-"); - parts[1] = parseInt(parts[1]) - 1; - return new Date(parts[0], parts[1], parts[2]); - } - - _computeEndTime(_currentDate, periodIndex) { - var startTime = this._computeStartTime(_currentDate); - var endTime = new Date(startTime); - endTime.setDate(startTime.getDate() + this._computeFilterDays(periodIndex)); - return endTime; - } - - _computeFilterDays(periodIndex) { - switch (periodIndex) { - case 1: - return 3; - case 2: - return 7; - default: - return 1; - } - } - - _computeRTL(hass) { - return computeRTL(hass); - } -} - -customElements.define("ha-panel-history", HaPanelHistory); diff --git a/src/panels/history/ha-panel-history.ts b/src/panels/history/ha-panel-history.ts new file mode 100644 index 0000000000..e177933923 --- /dev/null +++ b/src/panels/history/ha-panel-history.ts @@ -0,0 +1,204 @@ +import "@polymer/app-layout/app-header-layout/app-header-layout"; +import "@polymer/app-layout/app-header/app-header"; +import "@polymer/app-layout/app-toolbar/app-toolbar"; +import { computeRTL } from "../../common/util/compute_rtl"; +import "../../components/ha-menu-button"; +import "../../components/state-history-charts"; +import { LitElement, css, property, PropertyValues } from "lit-element"; +import { html } from "lit-html"; +import { haStyle } from "../../resources/styles"; +import { HomeAssistant } from "../../types"; +import type { DateRangePickerRanges } from "../../components/ha-date-range-picker"; +import "../../components/ha-date-range-picker"; +import { fetchDate, computeHistory } from "../../data/history"; +import "@polymer/paper-spinner/paper-spinner"; + +class HaPanelHistory extends LitElement { + @property() hass!: HomeAssistant; + + @property({ reflect: true, type: Boolean }) narrow!: boolean; + + @property() _startDate: Date; + + @property() _endDate: Date; + + @property() _entityId = ""; + + @property() _isLoading = false; + + @property() _stateHistory?; + + @property({ reflect: true, type: Boolean }) rtl = false; + + @property() private _ranges?: DateRangePickerRanges; + + public constructor() { + super(); + + const start = new Date(); + start.setHours(start.getHours() - 2); + start.setMinutes(0); + start.setSeconds(0); + this._startDate = start; + + const end = new Date(); + end.setHours(end.getHours() + 1); + end.setMinutes(0); + end.setSeconds(0); + this._endDate = end; + } + + protected render() { + return html` + + + + +
${this.hass.localize("panel.history")}
+
+
+ +
+
+ +
+ ${this._isLoading + ? html`` + : html` + + + `} +
+
+ `; + } + + protected firstUpdated(changedProps: PropertyValues) { + super.firstUpdated(changedProps); + + const today = new Date(); + today.setHours(0, 0, 0, 0); + const todayEnd = new Date(today); + todayEnd.setDate(todayEnd.getDate() + 1); + todayEnd.setMilliseconds(todayEnd.getMilliseconds() - 1); + + const todayCopy = new Date(today); + + const yesterday = new Date(todayCopy.setDate(today.getDate() - 1)); + const yesterdayEnd = new Date(yesterday); + yesterdayEnd.setDate(yesterdayEnd.getDate() + 1); + yesterdayEnd.setMilliseconds(yesterdayEnd.getMilliseconds() - 1); + + const thisWeekStart = new Date( + todayCopy.setDate(today.getDate() - today.getDay()) + ); + const thisWeekEnd = new Date( + todayCopy.setDate(today.getDate() - today.getDay() + 7) + ); + thisWeekEnd.setMilliseconds(thisWeekEnd.getMilliseconds() - 1); + + const lastWeekStart = new Date( + todayCopy.setDate(today.getDate() - today.getDay() - 7) + ); + const lastWeekEnd = new Date( + todayCopy.setDate(today.getDate() - today.getDay()) + ); + lastWeekEnd.setMilliseconds(lastWeekEnd.getMilliseconds() - 1); + + this._ranges = { + [this.hass.localize("ui.panel.history.ranges.today")]: [today, todayEnd], + [this.hass.localize("ui.panel.history.ranges.yesterday")]: [ + yesterday, + yesterdayEnd, + ], + [this.hass.localize("ui.panel.history.ranges.this_week")]: [ + thisWeekStart, + thisWeekEnd, + ], + [this.hass.localize("ui.panel.history.ranges.last_week")]: [ + lastWeekStart, + lastWeekEnd, + ], + }; + } + + protected updated(changedProps: PropertyValues) { + if ( + changedProps.has("_startDate") || + changedProps.has("_endDate") || + changedProps.has("_entityId") + ) { + this._getHistory(); + } + + if (changedProps.has("hass")) { + const oldHass = changedProps.get("hass") as HomeAssistant | undefined; + if (!oldHass || oldHass.language !== this.hass.language) { + this.rtl = computeRTL(this.hass); + } + } + } + + private async _getHistory() { + this._isLoading = true; + const dateHistory = await fetchDate( + this.hass, + this._startDate, + this._endDate + ); + this._stateHistory = computeHistory( + this.hass, + dateHistory, + this.hass.localize, + this.hass.language + ); + this._isLoading = false; + } + + private _dateRangeChanged(ev) { + this._startDate = ev.detail.startDate; + const endDate = ev.detail.endDate; + if (endDate.getHours() === 0 && endDate.getMinutes() === 0) { + endDate.setDate(endDate.getDate() + 1); + endDate.setMilliseconds(endDate.getMilliseconds() - 1); + } + this._endDate = endDate; + } + + static get styles() { + return [ + haStyle, + css` + .content { + padding: 0 16px 16px; + } + paper-spinner { + position: absolute; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + } + `, + ]; + } +} + +customElements.define("ha-panel-history", HaPanelHistory); diff --git a/src/panels/logbook/ha-logbook-data.js b/src/panels/logbook/ha-logbook-data.js deleted file mode 100644 index 461fea1f60..0000000000 --- a/src/panels/logbook/ha-logbook-data.js +++ /dev/null @@ -1,120 +0,0 @@ -/* eslint-plugin-disable lit */ -import { PolymerElement } from "@polymer/polymer/polymer-element"; - -const DATA_CACHE = {}; -const ALL_ENTITIES = "*"; - -class HaLogbookData extends PolymerElement { - static get properties() { - return { - hass: { - type: Object, - observer: "hassChanged", - }, - - filterDate: { - type: String, - observer: "filterDataChanged", - }, - - filterPeriod: { - type: Number, - observer: "filterDataChanged", - }, - - filterEntity: { - type: String, - observer: "filterDataChanged", - }, - - isLoading: { - type: Boolean, - value: true, - readOnly: true, - notify: true, - }, - - entries: { - type: Object, - value: null, - readOnly: true, - notify: true, - }, - }; - } - - hassChanged(newHass, oldHass) { - if (!oldHass && this.filterDate) { - this.updateData(); - } - } - - filterDataChanged(newValue, oldValue) { - if (oldValue !== undefined) { - this.updateData(); - } - } - - updateData() { - if (!this.hass) return; - - this._setIsLoading(true); - - this.getData(this.filterDate, this.filterPeriod, this.filterEntity).then( - (logbookEntries) => { - this._setEntries(logbookEntries); - this._setIsLoading(false); - } - ); - } - - getData(date, period, entityId) { - if (!entityId) entityId = ALL_ENTITIES; - - if (!DATA_CACHE[period]) DATA_CACHE[period] = []; - if (!DATA_CACHE[period][date]) DATA_CACHE[period][date] = []; - - if (DATA_CACHE[period][date][entityId]) { - return DATA_CACHE[period][date][entityId]; - } - - if (entityId !== ALL_ENTITIES && DATA_CACHE[period][date][ALL_ENTITIES]) { - return DATA_CACHE[period][date][ALL_ENTITIES].then(function (entities) { - return entities.filter(function (entity) { - return entity.entity_id === entityId; - }); - }); - } - - DATA_CACHE[period][date][entityId] = this._getFromServer( - date, - period, - entityId - ); - return DATA_CACHE[period][date][entityId]; - } - - _getFromServer(date, period, entityId) { - let url = "logbook/" + date + "?period=" + period; - if (entityId !== ALL_ENTITIES) { - url += "&entity=" + entityId; - } - - return this.hass.callApi("GET", url).then( - function (logbookEntries) { - logbookEntries.reverse(); - return logbookEntries; - }, - function () { - return null; - } - ); - } - - refreshLogbook() { - DATA_CACHE[this.filterPeriod][this.filterDate] = []; - this.updateData(); - } -} - -customElements.define("ha-logbook-data", HaLogbookData); diff --git a/src/panels/logbook/ha-panel-logbook.js b/src/panels/logbook/ha-panel-logbook.js deleted file mode 100644 index 293092dc0a..0000000000 --- a/src/panels/logbook/ha-panel-logbook.js +++ /dev/null @@ -1,283 +0,0 @@ -import "@polymer/app-layout/app-header-layout/app-header-layout"; -import "@polymer/app-layout/app-header/app-header"; -import "@polymer/app-layout/app-toolbar/app-toolbar"; -import "../../components/ha-icon-button"; -import "@polymer/paper-input/paper-input"; -import "@polymer/paper-spinner/paper-spinner"; -import { html } from "@polymer/polymer/lib/utils/html-tag"; -/* eslint-plugin-disable lit */ -import { PolymerElement } from "@polymer/polymer/polymer-element"; -import "@vaadin/vaadin-date-picker/theme/material/vaadin-date-picker"; -import { formatDate } from "../../common/datetime/format_date"; -import { computeRTL } from "../../common/util/compute_rtl"; -import "../../components/entity/ha-entity-picker"; -import "../../components/ha-menu-button"; -import LocalizeMixin from "../../mixins/localize-mixin"; -import "../../resources/ha-date-picker-style"; -import "../../styles/polymer-ha-style"; -import "./ha-logbook"; -import "./ha-logbook-data"; - -/* - * @appliesMixin LocalizeMixin - */ -class HaPanelLogbook extends LocalizeMixin(PolymerElement) { - static get template() { - return html` - - - - - - - - -
[[localize('panel.logbook')]]
- -
-
- - - -
- - - - - [[localize('ui.duration.day', 'count', 1)]] - [[localize('ui.duration.day', 'count', 3)]] - [[localize('ui.duration.week', 'count', 1)]] - - - - -
- - -
- `; - } - - static get properties() { - return { - hass: Object, - - narrow: { type: Boolean, reflectToAttribute: true }, - - // ISO8601 formatted date string - _currentDate: { - type: String, - value: function () { - const value = new Date(); - const today = new Date( - Date.UTC(value.getFullYear(), value.getMonth(), value.getDate()) - ); - return today.toISOString().split("T")[0]; - }, - }, - - _periodIndex: { - type: Number, - value: 0, - }, - - _entityId: { - type: String, - value: "", - }, - - entityId: { - type: String, - value: "", - readOnly: true, - }, - - isLoading: { - type: Boolean, - }, - - entries: { - type: Array, - }, - - datePicker: { - type: Object, - }, - - rtl: { - type: Boolean, - reflectToAttribute: true, - computed: "_computeRTL(hass)", - }, - }; - } - - ready() { - super.ready(); - this.hass.loadBackendTranslation("title"); - } - - connectedCallback() { - super.connectedCallback(); - // We are unable to parse date because we use intl api to render date - this.$.picker.set("i18n.parseDate", null); - this.$.picker.set("i18n.formatDate", (date) => - formatDate(new Date(date.year, date.month, date.day), this.hass.language) - ); - } - - _computeFilterDate(_currentDate) { - if (!_currentDate) return undefined; - var parts = _currentDate.split("-"); - parts[1] = parseInt(parts[1]) - 1; - return new Date(parts[0], parts[1], parts[2]).toISOString(); - } - - _computeFilterDays(periodIndex) { - switch (periodIndex) { - case 1: - return 3; - case 2: - return 7; - default: - return 1; - } - } - - _entityPicked(ev) { - this._setEntityId(ev.target.value); - } - - refreshLogbook() { - this.shadowRoot.querySelector("ha-logbook-data").refreshLogbook(); - } - - _computeRTL(hass) { - return computeRTL(hass); - } -} - -customElements.define("ha-panel-logbook", HaPanelLogbook); diff --git a/src/panels/logbook/ha-panel-logbook.ts b/src/panels/logbook/ha-panel-logbook.ts new file mode 100644 index 0000000000..ac59b78f90 --- /dev/null +++ b/src/panels/logbook/ha-panel-logbook.ts @@ -0,0 +1,279 @@ +import "@polymer/app-layout/app-header-layout/app-header-layout"; +import "@polymer/app-layout/app-header/app-header"; +import "@polymer/app-layout/app-toolbar/app-toolbar"; +import "../../components/ha-icon-button"; +import "@polymer/paper-spinner/paper-spinner"; +import { computeRTL } from "../../common/util/compute_rtl"; +import "../../components/entity/ha-entity-picker"; +import "../../components/ha-menu-button"; +import "./ha-logbook"; +import { + LitElement, + property, + customElement, + html, + css, + PropertyValues, +} from "lit-element"; +import { HomeAssistant } from "../../types"; +import { haStyle } from "../../resources/styles"; +import { + clearLogbookCache, + getLogbookData, + LogbookEntry, +} from "../../data/logbook"; +import { mdiRefresh } from "@mdi/js"; +import "../../components/ha-date-range-picker"; +import type { DateRangePickerRanges } from "../../components/ha-date-range-picker"; + +@customElement("ha-panel-logbook") +export class HaPanelLogbook extends LitElement { + @property() hass!: HomeAssistant; + + @property({ reflect: true, type: Boolean }) narrow!: boolean; + + @property() _startDate: Date; + + @property() _endDate: Date; + + @property() _entityId = ""; + + @property() _isLoading = false; + + @property() _entries: LogbookEntry[] = []; + + @property({ reflect: true, type: Boolean }) rtl = false; + + @property() private _ranges?: DateRangePickerRanges; + + public constructor() { + super(); + + const start = new Date(); + start.setHours(start.getHours() - 2); + start.setMinutes(0); + start.setSeconds(0); + this._startDate = start; + + const end = new Date(); + end.setHours(end.getHours() + 1); + end.setMinutes(0); + end.setSeconds(0); + this._endDate = end; + } + + protected render() { + return html` + + + + +
${this.hass.localize("panel.logbook")}
+ + + +
+
+ + ${this._isLoading ? html`` : ""} + +
+ + + +
+ + ${this._isLoading + ? html`` + : html``} +
+ `; + } + + protected firstUpdated(changedProps: PropertyValues) { + super.firstUpdated(changedProps); + this.hass.loadBackendTranslation("title"); + + const today = new Date(); + today.setHours(0, 0, 0, 0); + const todayEnd = new Date(today); + todayEnd.setDate(todayEnd.getDate() + 1); + todayEnd.setMilliseconds(todayEnd.getMilliseconds() - 1); + + const todayCopy = new Date(today); + + const yesterday = new Date(todayCopy.setDate(today.getDate() - 1)); + const yesterdayEnd = new Date(yesterday); + yesterdayEnd.setDate(yesterdayEnd.getDate() + 1); + yesterdayEnd.setMilliseconds(yesterdayEnd.getMilliseconds() - 1); + + const thisWeekStart = new Date( + todayCopy.setDate(today.getDate() - today.getDay()) + ); + const thisWeekEnd = new Date( + todayCopy.setDate(today.getDate() - today.getDay() + 7) + ); + thisWeekEnd.setMilliseconds(thisWeekEnd.getMilliseconds() - 1); + + const lastWeekStart = new Date( + todayCopy.setDate(today.getDate() - today.getDay() - 7) + ); + const lastWeekEnd = new Date( + todayCopy.setDate(today.getDate() - today.getDay()) + ); + lastWeekEnd.setMilliseconds(lastWeekEnd.getMilliseconds() - 1); + + this._ranges = { + [this.hass.localize("ui.panel.logbook.ranges.today")]: [today, todayEnd], + [this.hass.localize("ui.panel.logbook.ranges.yesterday")]: [ + yesterday, + yesterdayEnd, + ], + [this.hass.localize("ui.panel.logbook.ranges.this_week")]: [ + thisWeekStart, + thisWeekEnd, + ], + [this.hass.localize("ui.panel.logbook.ranges.last_week")]: [ + lastWeekStart, + lastWeekEnd, + ], + }; + } + + protected updated(changedProps: PropertyValues) { + if ( + changedProps.has("_startDate") || + changedProps.has("_endDate") || + changedProps.has("_entityId") + ) { + this._getData(); + } + + if (changedProps.has("hass")) { + const oldHass = changedProps.get("hass") as HomeAssistant | undefined; + if (!oldHass || oldHass.language !== this.hass.language) { + this.rtl = computeRTL(this.hass); + } + } + } + + private _dateRangeChanged(ev) { + this._startDate = ev.detail.startDate; + const endDate = ev.detail.endDate; + if (endDate.getHours() === 0 && endDate.getMinutes() === 0) { + endDate.setDate(endDate.getDate() + 1); + endDate.setMilliseconds(endDate.getMilliseconds() - 1); + } + this._endDate = endDate; + } + + private _entityPicked(ev) { + this._entityId = ev.target.value; + } + + private _refreshLogbook() { + this._entries = []; + clearLogbookCache( + this._startDate.toISOString(), + this._endDate.toISOString() + ); + this._getData(); + } + + private async _getData() { + this._isLoading = true; + this._entries = await getLogbookData( + this.hass, + this._startDate.toISOString(), + this._endDate.toISOString(), + this._entityId + ); + this._isLoading = false; + } + + static get styles() { + return [ + haStyle, + css` + ha-logbook { + height: calc(100vh - 136px); + } + + :host([narrow]) ha-logbook { + height: calc(100vh - 198px); + } + + ha-date-range-picker { + margin-right: 16px; + max-width: 100%; + } + + :host([narrow]) ha-date-range-picker { + margin-right: 0; + } + + paper-spinner { + position: absolute; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + } + + .wrap { + margin-bottom: 24px; + } + + .filters { + display: flex; + align-items: flex-end; + padding: 0 16px; + } + + :host([narrow]) .filters { + flex-wrap: wrap; + } + + ha-entity-picker { + display: inline-block; + flex-grow: 1; + max-width: 400px; + --paper-input-suffix: { + height: 24px; + } + } + + :host([narrow]) ha-entity-picker { + max-width: none; + width: 100%; + } + `, + ]; + } +} diff --git a/src/panels/lovelace/cards/hui-history-graph-card.ts b/src/panels/lovelace/cards/hui-history-graph-card.ts index 404df75173..1e347183c6 100644 --- a/src/panels/lovelace/cards/hui-history-graph-card.ts +++ b/src/panels/lovelace/cards/hui-history-graph-card.ts @@ -12,7 +12,6 @@ import { classMap } from "lit-html/directives/class-map"; import "../../../components/ha-card"; import "../../../components/state-history-charts"; import { CacheConfig, getRecentWithCache } from "../../../data/cached-history"; -import "../../../data/ha-state-history-data"; import { HomeAssistant } from "../../../types"; import { findEntities } from "../common/find-entites"; import { processConfigEntities } from "../common/process-config-entities"; diff --git a/src/translations/en.json b/src/translations/en.json index 395cef344d..6c19dc6969 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -278,6 +278,11 @@ "failed_create_area": "Failed to create area." } }, + "date-range-picker": { + "start_date": "Start date", + "end_date": "End date", + "select": "Select" + }, "relative_time": { "past": "{time} ago", "future": "In {time}", @@ -1709,13 +1714,21 @@ } }, "history": { - "showing_entries": "Showing entries for", - "period": "Period" + "ranges": { + "today": "Today", + "yesterday": "Yesterday", + "this_week": "This week", + "last_week": "Last week" + } }, "logbook": { - "showing_entries": "[%key:ui::panel::history::showing_entries%]", - "period": "Period", - "entries_not_found": "No logbook entries found." + "entries_not_found": "No logbook entries found.", + "ranges": { + "today": "Today", + "yesterday": "Yesterday", + "this_week": "This week", + "last_week": "Last week" + } }, "lovelace": { "cards": { diff --git a/yarn.lock b/yarn.lock index 14318d7282..c7f51c7378 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2738,6 +2738,11 @@ dependencies: "@vaadin/vaadin-development-mode-detector" "^2.0.0" +"@vue/web-component-wrapper@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@vue/web-component-wrapper/-/web-component-wrapper-1.2.0.tgz#bb0e46f1585a7e289b4ee6067dcc5a6ae62f1dd1" + integrity sha512-Xn/+vdm9CjuC9p3Ae+lTClNutrVhsXpzxvoTXXtoys6kVRX9FkueSUAqSWAyZntmVLlR4DosBV4pH8y5Z/HbUw== + "@webassemblyjs/ast@1.8.5": version "1.8.5" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" @@ -11829,6 +11834,18 @@ vscode-uri@^1.0.6: resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-1.0.8.tgz#9769aaececae4026fb6e22359cb38946580ded59" integrity sha512-obtSWTlbJ+a+TFRYGaUumtVwb+InIUVI0Lu0VBUAPmj2cU5JutEXg3xUE0c2J5Tcy7h2DEKVJBFi+Y9ZSFzzPQ== +vue2-daterange-picker@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/vue2-daterange-picker/-/vue2-daterange-picker-0.5.1.tgz#f41f3cd20b242b7f34ce16eeea9534d9cbe9f4d7" + integrity sha512-p0y9RyI6wqqwffKM5EYgxvNM51un/fBu9hLZ/GxXVOBqTMxjDuV8mz9iUTj4p5R80lWSBwIY7GshW5RYgS8+rw== + dependencies: + vue "^2.6.10" + +vue@^2.6.10, vue@^2.6.11: + version "2.6.11" + resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.11.tgz#76594d877d4b12234406e84e35275c6d514125c5" + integrity sha512-VfPwgcGABbGAue9+sfrD4PuwFar7gPb1yl1UK1MwXoQPAw0BKSqWfoYCT/ThFrdEVWoI51dBuyCoiNU9bZDZxQ== + watchpack@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" From 497494620d718ffae9de49e97460e5fc23b77cce Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Sat, 20 Jun 2020 15:40:29 +0200 Subject: [PATCH 29/30] Log cast config fetch errors (#6197) --- cast/src/receiver/layout/hc-main.ts | 2 ++ src/panels/lovelace/cards/hui-entities-card.ts | 1 + 2 files changed, 3 insertions(+) diff --git a/cast/src/receiver/layout/hc-main.ts b/cast/src/receiver/layout/hc-main.ts index 564665846f..d5f462ad1b 100644 --- a/cast/src/receiver/layout/hc-main.ts +++ b/cast/src/receiver/layout/hc-main.ts @@ -192,6 +192,8 @@ export class HcMain extends HassElement { this._handleNewLovelaceConfig(lovelaceConfig) ); } catch (err) { + // eslint-disable-next-line + console.log("Error fetching Lovelace configuration", err, msg); // Generate a Lovelace config. this._unsubLovelace = () => undefined; await this._generateLovelaceConfig(); diff --git a/src/panels/lovelace/cards/hui-entities-card.ts b/src/panels/lovelace/cards/hui-entities-card.ts index d6d61ec7cb..4d7dfed43e 100644 --- a/src/panels/lovelace/cards/hui-entities-card.ts +++ b/src/panels/lovelace/cards/hui-entities-card.ts @@ -228,6 +228,7 @@ class HuiEntitiesCard extends LitElement implements LovelaceCard { display: flex; flex-direction: column; justify-content: space-between; + overflow: hidden; } .card-header { display: flex; From 6891f1df1c8b7ce97be4c2563dc852c9060f6383 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Sat, 20 Jun 2020 15:56:19 +0200 Subject: [PATCH 30/30] Bumped version to 20200620.0 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 663da27022..9b6e254ff5 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name="home-assistant-frontend", - version="20200617.0", + version="20200620.0", description="The Home Assistant frontend", url="https://github.com/home-assistant/home-assistant-polymer", author="The Home Assistant Authors",