From 4cbd8e76736bbcbb3488ce7e2b0d93abba348b95 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 3 Jun 2020 17:18:04 -0700 Subject: [PATCH 01/39] Include compatibility in Hass.io (#6098) --- hassio/src/entrypoint.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/hassio/src/entrypoint.ts b/hassio/src/entrypoint.ts index 1a8e26ea80..3bfa3ce898 100644 --- a/hassio/src/entrypoint.ts +++ b/hassio/src/entrypoint.ts @@ -1,3 +1,5 @@ +import "../../src/resources/compatibility"; + window.loadES5Adapter().then(() => { // eslint-disable-next-line import(/* webpackChunkName: "roboto" */ "../../src/resources/roboto"); From 3fdf9a2e285b67d397f2809ebbf1923709ce7ebf Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Thu, 4 Jun 2020 00:32:29 +0000 Subject: [PATCH 02/39] [ci skip] Translation update --- translations/frontend/ca.json | 11 ++++--- translations/frontend/da.json | 5 ++- translations/frontend/es.json | 7 +++-- translations/frontend/fi.json | 5 +++ translations/frontend/fr.json | 41 +++++++++++++++--------- translations/frontend/it.json | 50 +++++++++++++++++++++++++++--- translations/frontend/nb.json | 11 +++++-- translations/frontend/pl.json | 9 ++++-- translations/frontend/ru.json | 7 +++-- translations/frontend/zh-Hans.json | 5 ++- translations/frontend/zh-Hant.json | 7 +++-- 11 files changed, 122 insertions(+), 36 deletions(-) diff --git a/translations/frontend/ca.json b/translations/frontend/ca.json index 40e3d8378f..49c0e8024e 100644 --- a/translations/frontend/ca.json +++ b/translations/frontend/ca.json @@ -356,7 +356,7 @@ "away_mode": "Mode absent", "cooling": "{name} refredant", "current_temperature": "Temperatura actual de {name}", - "currently": "Actualment", + "currently": "Actual", "fan_mode": "Velocitat ventilador", "heating": "{name} escalfant", "high": "alt", @@ -478,6 +478,7 @@ "cancel": "Cancel·la", "close": "Tanca", "delete": "Elimina", + "error_required": "Obligatori", "loading": "Carregant", "next": "Següent", "no": "No", @@ -1221,6 +1222,7 @@ "different_include": "Possiblement a través d'un domini o una altra inclusió diferent.", "pick_attribute": "Selecciona un atribut per substituir-lo", "picker": { + "entity": "Entitat", "header": "Personalitzacions", "introduction": "Personalitza els atributs de les entitats al teu gust. Les personalitzacions afegides/modificades apareixeran immediatament, les que s'hagin eliminat tindran efecte quan l'entitat s'actualitzi." }, @@ -1679,7 +1681,8 @@ "name": "Nom", "system": "Sistema" } - } + }, + "users_privileges_note": "El grup d'usuaris encara no està del tot acabat. L'usuari no podrà administrar la instància a través de la interfície d'usuari. Encara estem verificant tots els punts de l'API de gestió per assegurar-nos que limiten correctament l'accés als administradors." }, "zha": { "add_device_page": { @@ -2048,7 +2051,7 @@ "clear_items": "Esborrar els articles seleccionats" }, "starting": { - "description": "Home Assistant està iniciant-se, espera un moment.", + "description": "Home Assistant s'està iniciant, espera un moment...", "header": "Home Assistant està iniciant-se..." } }, @@ -2565,7 +2568,7 @@ "create_failed": "No s'ha pogut crear el token d'autenticació d'accés.", "created_at": "Creat el {date}", "delete_failed": "No s'ha pogut eliminar el token d'autenticació d'accés.", - "description": "Crea tokens d'autenticació d'accés de llarga durada per permetre als teus programes (scripts) interactuar amb la instància de Home Assistant. Cada token d'autenticació serà vàlid durant deu anys després de la seva creació. Els següents tokens d'autenticació d'accés de llarga durada estan actius actualment.", + "description": "Crea tokens d'autenticació d'accés de llarga durada per permetre als teus programes/scripts interactuar amb la instància de Home Assistant. Cada token és vàlid durant deu anys després de la seva creació. Els següents tokens d'autenticació d'accés de llarga durada estan actius actualment.", "empty_state": "Encara no tens tokens d'autenticaciós d'accés de llarga durada.", "header": "Tokens d'autenticació d'accés de llarga durada", "last_used": "Darrer ús el {date} des de {location}", diff --git a/translations/frontend/da.json b/translations/frontend/da.json index 29c727d135..cc57710458 100644 --- a/translations/frontend/da.json +++ b/translations/frontend/da.json @@ -478,6 +478,7 @@ "cancel": "Annuller", "close": "Luk", "delete": "Slet", + "error_required": "Påkrævet", "loading": "Indlæser", "next": "Næste", "no": "Nej", @@ -1221,6 +1222,7 @@ "different_include": "Eventuelt via et domæne, et glob eller et andet include.", "pick_attribute": "Vælg en egenskab, du vil tilsidesætte", "picker": { + "entity": "Entitet", "header": "Tilpasninger", "introduction": "Tilpas entitetsegenskaber. Tilføjede/redigerede tilpasninger træder i kraft med det samme. Fjernede tilpasninger træder i kraft når entiteten opdateres." }, @@ -1679,7 +1681,8 @@ "name": "Navn", "system": "System" } - } + }, + "users_privileges_note": "Bruger-gruppen stadig under udvikling. Brugeren vil ikke være i stand til at administrere instansen via brugerfladen. Vi kigger stadig alle administrations-API-slutpunkter igennem for at sikre, at de korrekt begrænser adgangen til administratorer." }, "zha": { "add_device_page": { diff --git a/translations/frontend/es.json b/translations/frontend/es.json index 9d73c03f05..aabc7e1126 100644 --- a/translations/frontend/es.json +++ b/translations/frontend/es.json @@ -478,6 +478,7 @@ "cancel": "Cancelar", "close": "Cerrar", "delete": "Eliminar", + "error_required": "Obligatorio", "loading": "Cargando", "next": "Siguiente", "no": "No", @@ -1221,6 +1222,7 @@ "different_include": "Posiblemente a través de un dominio, un glob o un include diferente.", "pick_attribute": "Selecciona un atributo para anular", "picker": { + "entity": "Entidad", "header": "Personalizaciones", "introduction": "Ajustar los atributos de cada entidad. Las personalizaciones añadidas/editadas tendrán efecto inmediatamente. Las personalizaciones eliminadas tendrán efecto cuando la entidad se actualice." }, @@ -1679,7 +1681,8 @@ "name": "Nombre", "system": "Sistema" } - } + }, + "users_privileges_note": "El grupo de usuarios es un trabajo en progreso. El usuario no podrá administrar la instancia a través de la interfaz de usuario. Todavía estamos auditando todos los endpoints de la API de administración para garantizar que se limita correctamente el acceso sólo a los administradores." }, "zha": { "add_device_page": { @@ -2048,7 +2051,7 @@ "clear_items": "Borrar elementos marcados" }, "starting": { - "description": "Home Assistant se está iniciando, espera por favor.", + "description": "Home Assistant está iniciando, espera por favor...", "header": "Home Assistant se está iniciando..." } }, diff --git a/translations/frontend/fi.json b/translations/frontend/fi.json index aaff360062..3380e76200 100644 --- a/translations/frontend/fi.json +++ b/translations/frontend/fi.json @@ -740,6 +740,8 @@ "notification_toast": { "connection_lost": "Ei yhteyttä. Yritetään muodostaa yhteys uudelleen...", "service_call_failed": "Palvelua {service} ei onnistuttu kutsumaan.", + "started": "Home Assistant on käynnistynyt!", + "starting": "Home Assistant käynnistyy, kaikki ei ole vielä valmista.", "triggered": "Laukaisi kohteen {name}" }, "panel": { @@ -2039,6 +2041,9 @@ "add_item": "Lisää", "checked_items": "Valitut kohteet", "clear_items": "Tyhjää valitut kohteet" + }, + "starting": { + "header": "Home Assistant käynnistyy..." } }, "changed_toast": { diff --git a/translations/frontend/fr.json b/translations/frontend/fr.json index b11bbf2b6c..4e1caa234a 100644 --- a/translations/frontend/fr.json +++ b/translations/frontend/fr.json @@ -238,8 +238,8 @@ "on": "Actif" }, "light": { - "off": "Inactif", - "on": "Actif" + "off": "Éteint", + "on": "Allumé" }, "lock": { "locked": "Verrouillé", @@ -478,6 +478,7 @@ "cancel": "Annuler", "close": "Fermer", "delete": "Supprimer", + "error_required": "Obligatoire", "loading": "Chargement", "next": "Suivant", "no": "Non", @@ -1221,6 +1222,7 @@ "different_include": "Peut-être via un domaine, un glob ou un autre include.", "pick_attribute": "Sélectionnez un attribut à remplacer", "picker": { + "entity": "Entité", "header": "Personnalisations", "introduction": "Ajuster les attributs par entité. Les personnalisations ajoutées / modifiées prendront effet immédiatement. Les personnalisations supprimées prendront effet lors de la mise à jour de l'entité." }, @@ -1456,7 +1458,7 @@ "icon": "Icône", "new_dashboard": "Ajouter un nouveau tableau de bord", "remove_default": "Supprimer par défaut sur cet appareil", - "require_admin": "Admin uniquement", + "require_admin": "Administrateur uniquement", "set_default": "Définir par défaut sur cet appareil", "show_sidebar": "Afficher dans la barre latérale", "title": "Titre", @@ -1679,7 +1681,8 @@ "name": "Nom", "system": "Système" } - } + }, + "users_privileges_note": "Le groupe d'utilisateurs est en cours de développement. L'utilisateur ne pourra pas gérer l'instance via l'interface. Nous vérifions les entrées de l'interface de gestion pour assurer que les accès soient limités aux administrateurs." }, "zha": { "add_device_page": { @@ -1843,13 +1846,20 @@ }, "node_management": { "add_to_group": "Ajouter au groupe", + "entities": "Entités du nœud", + "entity_info": "Informations sur l'entité", + "exclude_entity": "Exclure cette entité de Home Assistant", "group": "Groupe", "header": "Gestion des nœuds Z-Wave", + "introduction": "Exécute des commandes Z-Wave affectant individuellement un nœud. Sélectionnez un nœud pour voir une liste des commandes disponibles.", "max_associations": "Associations Max:", + "node_group_associations": "Associations aux groupes de nœuds", "node_protection": "Protection des nœuds", - "node_to_control": "Noeud à contrôler", - "nodes": "Noeuds", + "node_to_control": "Nœud à contrôler", + "nodes": "Nœuds", + "nodes_hint": "Sélectionnez le nœud pour afficher les options par nœud", "nodes_in_group": "Autres nœuds de ce groupe :", + "pooling_intensity": "Intensité polling", "protection": "Protection", "remove_broadcast": "Supprimer la diffusion", "remove_from_group": "Supprimer du groupe", @@ -1858,6 +1868,8 @@ "ozw_log": { "header": "Journal OZW", "introduction": "Afficher le journal. Entrer un nombre de 1 à 1000 lignes pour limiter le nombre de lignes chargées dans le journal, ou entrer 0 pour désactiver la limitation du nombre de lignes affichées (journal complet). \"Load\" affichera un instantané du journal, alors que \"Tail\" affichera le journal en l'actualisant au fur et à mesure que de nouvelles entrées apparaissent.", + "last_log_lines": "Nombre de dernières lignes de journal", + "load": "Charge", "tail": "Queue" }, "services": { @@ -1867,6 +1879,7 @@ "heal_network": "Soigner le réseau", "heal_node": "Guérir Nœud", "node_info": "Informations sur le nœud", + "print_node": "Imprimer le nœud", "refresh_entity": "Actualiser l'entité", "refresh_node": "Actualiser Nœud", "remove_failed_node": "Supprimer le nœud défaillant", @@ -2054,7 +2067,7 @@ "name": "Panneau d'alarme" }, "button": { - "description": "La carte Button vous permet d'ajouter des boutons pour effectuer des tâches.", + "description": "La carte Bouton vous permet d'ajouter des boutons pour effectuer des tâches.", "name": "Bouton" }, "conditional": { @@ -2129,7 +2142,7 @@ }, "glance": { "columns": "Colonnes", - "description": "La carte Coup d'oeil est utile pour regrouper plusieurs capteurs dans une vue d'ensemble compacte.", + "description": "La carte Coup d'œil est utile pour regrouper plusieurs capteurs dans une vue d'ensemble compacte.", "name": "Coup d'œil" }, "history-graph": { @@ -2163,7 +2176,7 @@ "name": "Markdown" }, "media-control": { - "description": "La carte Control des médias est utilisée pour afficher les entités du lecteur multimédia sur une interface avec des commandes faciles à utiliser.", + "description": "La carte Contrôle des médias est utilisée pour afficher les entités du lecteur multimédia sur une interface avec des commandes faciles à utiliser.", "name": "Contrôle des médias" }, "picture-elements": { @@ -2175,7 +2188,7 @@ "name": "Entité image" }, "picture-glance": { - "description": "La carte Picture Glance affiche une image et les états d'entité correspondants sous forme d'icône. Les entités sur le côté droit permettent de basculer entre les actions, d'autres affichent la boîte de dialogue plus d'informations.", + "description": "La carte Coup d'œil affiche une image et les états d'entité correspondants sous forme d'icône. Les entités sur le côté droit permettent de basculer entre les actions, d'autres affichent la boîte de dialogue plus d'informations.", "name": "Coup d'œil en image" }, "picture": { @@ -2187,7 +2200,7 @@ "name": "Statut de la plante" }, "sensor": { - "description": "La carte Capteur vous donne un aperçu rapide de l'état de vos sensors avec un graphique en option pour visualiser les changements au fil du temps.", + "description": "La carte Capteur vous donne un aperçu rapide de l'état de vos capteurs avec un graphique en option pour visualiser les changements au fil du temps.", "graph_detail": "Détail du graphique", "graph_type": "Type de graphique", "name": "Capteur" @@ -2198,7 +2211,7 @@ "name": "Liste de courses" }, "thermostat": { - "description": "La carte Thermostat permet de contrôler votre entité climate. Vous permettant de changer la température et le mode de l'entité.", + "description": "La carte Thermostat permet de contrôler votre entité de chauffage. Permettant de changer la température et le mode de l'entité.", "name": "Thermostat" }, "vertical-stack": { @@ -2278,7 +2291,7 @@ "save_config": { "cancel": "Oublie ce que j'ai dit, c'est pas grave.", "close": "Fermer", - "empty_config": "Commencez avec un tableau de bord vide", + "empty_config": "Commencer avec un tableau de bord vide", "header": "Prenez le contrôle de votre Interface Lovelace", "para": "Par défaut, Home Assistant maintient votre interface utilisateur et la met à jour lorsque de nouvelles entités ou de nouveaux composants Lovelace UI sont disponibles. Si vous prenez le contrôle, nous ne ferons plus les changements automatiquement pour vous.", "para_sure": "Êtes-vous sûr de vouloir prendre le contrôle de l'interface utilisateur?", @@ -2325,7 +2338,7 @@ "views": { "confirm_delete": "Êtes-vous sûr de vouloir supprimer cette vue?", "confirm_delete_existing_cards": "La suppression de cette vue supprimera également les cartes", - "confirm_delete_existing_cards_text": "Voulez-vous vraiment supprimer votre vue ''{name}''? La vue contient {number} cartes qui seront supprimées. Cette action ne peut pas être annulée.", + "confirm_delete_existing_cards_text": "Voulez-vous vraiment supprimer votre vue ''{name}'' ? La vue contient {number} cartes qui seront supprimées. Cette action ne peut pas être annulée.", "confirm_delete_text": "Voulez-vous vraiment supprimer votre vue ''{name}''?" }, "warning": { diff --git a/translations/frontend/it.json b/translations/frontend/it.json index 0773db8794..0e7a287fd7 100644 --- a/translations/frontend/it.json +++ b/translations/frontend/it.json @@ -478,6 +478,7 @@ "cancel": "Annulla", "close": "Chiudi", "delete": "Elimina", + "error_required": "Necessario", "loading": "Caricamento", "next": "Avanti", "no": "No", @@ -740,6 +741,8 @@ "notification_toast": { "connection_lost": "Connessione persa. Riconnessione…", "service_call_failed": "Fallita chiamata a servizio {service} .", + "started": "Home Assistant è avviato!", + "starting": "Home Assistant sta iniziando, non tutto sarà disponibile fino a quando non avrà finito l'avvio.", "triggered": "Attivato {name}" }, "panel": { @@ -1219,6 +1222,7 @@ "different_include": "Possibilmente tramite un dominio, un glob o un'altra inclusione.", "pick_attribute": "Scegli un attributo da sovrascrivere", "picker": { + "entity": "Entità", "header": "Personalizzazioni", "introduction": "Modificare gli attributi per entità. Le personalizzazioni aggiunte / modificate avranno effetto immediato. Le personalizzazioni rimosse avranno effetto quando l'entità viene aggiornata." }, @@ -1677,7 +1681,8 @@ "name": "Nome", "system": "Sistema" } - } + }, + "users_privileges_note": "Il gruppo di utenti è in fase di elaborazione. L'utente non sarà in grado di amministrare l'istanza tramite l'interfaccia utente. Stiamo ancora verificando tutti gli endpoint dell'API di gestione per garantire che limitino correttamente l'accesso agli amministratori." }, "zha": { "add_device_page": { @@ -1839,21 +1844,53 @@ "set_wakeup": "Imposta intervallo di riattivazione", "true": "Vero" }, + "node_management": { + "add_to_group": "Aggiungi al Gruppo", + "entities": "Entità di questo nodo", + "entity_info": "Informazioni sull'Entità", + "exclude_entity": "Escludere questa entità da Home Assistant", + "group": "Gruppo", + "header": "Gestione dei nodi Z-Wave", + "introduction": "Esegui i comandi Z-Wave che riguardano un singolo nodo. Scegli un nodo per visualizzare un elenco di comandi disponibili.", + "max_associations": "Numero massimo di Associazioni:", + "node_group_associations": "Associazioni ai gruppi di nodi", + "node_protection": "Protezione del Nodo", + "node_to_control": "Nodo da controllare", + "nodes": "Nodi", + "nodes_hint": "Selezionare il nodo per visualizzare le opzioni per nodo", + "nodes_in_group": "Altri Nodi di questo Gruppo:", + "pooling_intensity": "Intensità di interrogazione ciclica", + "protection": "Protezione", + "remove_broadcast": "Rimuovi Trasmissione", + "remove_from_group": "Rimuovi dal Gruppo", + "set_protection": "Imposta Protezione" + }, "ozw_log": { "header": "Registro OZW", - "introduction": "Guarda il registro. 0 è il minimo (carica l'intero log) e 1000 è il massimo. Load mostrerà un log statico e la coda si aggiornerà automaticamente con l'ultimo numero di righe specificato del log." + "introduction": "Guarda il registro. 0 è il minimo (carica l'intero log) e 1000 è il massimo. Load mostrerà un log statico e la coda si aggiornerà automaticamente con l'ultimo numero di righe specificato del log.", + "last_log_lines": "Numero delle ultime righe del registro", + "load": "Carica", + "tail": "Coda" }, "services": { "add_node": "Aggiungi Nodo", "add_node_secure": "Aggiungi nodo sicuro", "cancel_command": "Annulla Comando", "heal_network": "Testa la rete", + "heal_node": "Resuscita Nodo", + "node_info": "Informazioni sul Nodo", + "print_node": "Stampa Nodo", + "refresh_entity": "Aggiorna Entità", + "refresh_node": "Aggiorna Nodo", + "remove_failed_node": "Rimuovi Nodo Difettoso", "remove_node": "Rimuovi nodo", + "replace_failed_node": "Sostituisci Nodo Difettoso", "save_config": "Salva Configurazione", "soft_reset": "Soft Reset", "start_network": "Avvia la rete", "stop_network": "Ferma la rete", - "test_network": "Testa la rete" + "test_network": "Testa la rete", + "test_node": "Test Nodo" }, "values": { "header": "Valori del nodo" @@ -2012,6 +2049,10 @@ "add_item": "Aggiungi elemento", "checked_items": "Elementi selezionati", "clear_items": "Cancella gli elementi selezionati" + }, + "starting": { + "description": "Home Assistant sta per avviarsi, attendere prego...", + "header": "Home Assistant si sta avviando..." } }, "changed_toast": { @@ -2304,7 +2345,8 @@ "attribute_not_found": "Attributo {attribute} non disponibile in: {entity}", "entity_non_numeric": "L'entità non è numerica: {entity}", "entity_not_found": "Entità non disponibile: {entity}", - "entity_unavailable": "{entity} non è al momento disponibile" + "entity_unavailable": "{entity} non è al momento disponibile", + "starting": "Home Assistant si sta avviando, non tutto potrebbe essere subito disponibile" } }, "mailbox": { diff --git a/translations/frontend/nb.json b/translations/frontend/nb.json index a98f356890..d88a8870a4 100644 --- a/translations/frontend/nb.json +++ b/translations/frontend/nb.json @@ -478,6 +478,7 @@ "cancel": "Avbryt", "close": "Lukk", "delete": "Slett", + "error_required": "Nødvendig", "loading": "Laster", "next": "Neste", "no": "Nei", @@ -1221,6 +1222,7 @@ "different_include": "Muligens via et domene, en glob eller noe annent som er inkluderet", "pick_attribute": "Velg et attributt som skal overstyres", "picker": { + "entity": "Entitet", "header": "Tilpasninger", "introduction": "Justér attributter per entitet. Lagt til eller redigerte tilpasninger trer i kraft umiddelbart. Fjernede tilpasninger trer i kraft når entiteten blir oppdatert." }, @@ -1679,7 +1681,8 @@ "name": "Navn", "system": "" } - } + }, + "users_privileges_note": "Brukere-gruppen er et pågående arbeid. Brukeren kan ikke administrere forekomsten via brukergrensesnittet. Vi overvåker fortsatt alle API-endepunkter for administrasjonsadministrasjon for å sikre at de begrenser tilgangen til administratorer på riktig måte." }, "zha": { "add_device_page": { @@ -1866,7 +1869,8 @@ "header": "OZW-logg", "introduction": "Vis loggen. 0 er minimum (laster hele loggen) og 1000 er maksimum. Load vil vise en statisk logg og halen vil automatisk oppdatere med det siste spesifiserte antall linjer av loggen.", "last_log_lines": "Antall siste logglinjer", - "load": "Laste" + "load": "Laste", + "tail": "Tail" }, "services": { "add_node": "Legg til node", @@ -1875,6 +1879,7 @@ "heal_network": "Helbrede nettverk", "heal_node": "Helbrede node", "node_info": "Nodeinformasjon", + "print_node": "Skrive ut node", "refresh_entity": "Oppdater entitet", "refresh_node": "Oppdater node", "remove_failed_node": "Fjern feilet node", @@ -2046,7 +2051,7 @@ "clear_items": "Fjern merkede elementer" }, "starting": { - "description": "Home Assistant starter, vennligst vent.", + "description": "Home Assistant starter, vennligst vent...", "header": "Home Assistant starter..." } }, diff --git a/translations/frontend/pl.json b/translations/frontend/pl.json index bdf438dbde..b0ea5b2d59 100644 --- a/translations/frontend/pl.json +++ b/translations/frontend/pl.json @@ -478,6 +478,7 @@ "cancel": "Anuluj", "close": "Zamknij", "delete": "Usuń", + "error_required": "To pole jest wymagane", "loading": "Ładowanie", "next": "Dalej", "no": "Nie", @@ -1221,6 +1222,7 @@ "different_include": "Możliwe poprzez domenę, globalnie lub inny plik.", "pick_attribute": "Wybierz atrybut do nadpisania", "picker": { + "entity": "Encja", "header": "Dostosowywanie", "introduction": "Dostosuj atrybuty encji. Dodawane/edytowane dostosowywania zostaną wprowadzone natychmiast. Usunięte dostosowania zostaną uwzględnione, gdy encja zostanie zaktualizowana." }, @@ -1460,7 +1462,7 @@ "set_default": "Ustaw jako domyślny na tym urządzeniu", "show_sidebar": "Wyświetlanie na pasku bocznym", "title": "Tytuł w pasku bocznym", - "title_required": "Tytuł jest wymagany.", + "title_required": "Tytuł jest wymagany", "update": "Aktualizuj", "url": "URL", "url_error_msg": "Adres URL nie może zawierać spacji ani znaków specjalnych, z wyjątkiem _ i -" @@ -1679,7 +1681,8 @@ "name": "Nazwa", "system": "System" } - } + }, + "users_privileges_note": "Prace nad grupami użytkowników trwają. Użytkownik nie może administrować instancją za pomocą interfejsu użytkownika. Nadal kontrolujemy wszystkie punkty końcowe interfejsu API zarządzania, aby upewnić się, że poprawnie ograniczają dostęp tylko dla administratorów." }, "zha": { "add_device_page": { @@ -1743,7 +1746,7 @@ "caption": "Grupy", "create": "Utwórz grupę", "create_group": "Zigbee Home Automation - utwórz grupę", - "create_group_details": "Wprowadź wymagane dane, aby utworzyć nową grupę zigbee", + "create_group_details": "Wprowadź wymagane dane, aby utworzyć nową grupę Zigbee", "creating_group": "Tworzenie grupy", "description": "Twórz i modyfikuj grupy Zigbee", "group_details": "Oto wszystkie szczegóły dotyczące zaznaczonej grupy Zigbee.", diff --git a/translations/frontend/ru.json b/translations/frontend/ru.json index 13d6da432c..6cd32c6fe8 100644 --- a/translations/frontend/ru.json +++ b/translations/frontend/ru.json @@ -478,6 +478,7 @@ "cancel": "Отменить", "close": "Закрыть", "delete": "Удалить", + "error_required": "Обязательное поле", "loading": "Загрузка", "next": "Далее", "no": "Нет", @@ -1221,6 +1222,7 @@ "different_include": "Возможно через домен, glob или include.", "pick_attribute": "Выберите атрибут", "picker": { + "entity": "Объект", "header": "Кастомизация", "introduction": "Настройка атрибутов объектов. Добавленные или изменённые настройки сразу же вступают в силу. Удалённые настройки вступят в силу после обновления объекта." }, @@ -1679,7 +1681,8 @@ "name": "Имя", "system": "Системный" } - } + }, + "users_privileges_note": "Группа пользователей находится в стадии разработки. В дальнейшем пользователи не смогут администрировать сервер через пользовательский интерфейс. Мы все еще проверяем все конечные точки API управления, чтобы убедиться, что они правильно ограничивают доступ." }, "zha": { "add_device_page": { @@ -2048,7 +2051,7 @@ "clear_items": "Очистить отмеченные элементы" }, "starting": { - "description": "Home Assistant запускается, пожалуйста, подождите.", + "description": "Home Assistant запускается, пожалуйста, подождите...", "header": "Запуск Home Assistant..." } }, diff --git a/translations/frontend/zh-Hans.json b/translations/frontend/zh-Hans.json index ce4c0abb8f..61fcdf58b7 100644 --- a/translations/frontend/zh-Hans.json +++ b/translations/frontend/zh-Hans.json @@ -478,6 +478,7 @@ "cancel": "取消", "close": "关闭", "delete": "删除", + "error_required": "必填", "loading": "加载中", "next": "下一步", "no": "否", @@ -1221,6 +1222,7 @@ "different_include": "可能是通过域、全局或其他引用。", "pick_attribute": "选择要覆盖的属性", "picker": { + "entity": "实体", "header": "自定义", "introduction": "调整每个实体的属性。添加/编辑的自定义设置将立即生效,删除的自定义设置将在实体更新时生效。" }, @@ -1679,7 +1681,8 @@ "name": "名称", "system": "系统" } - } + }, + "users_privileges_note": "用户组功能正在开发中。该功能使普通用户无法通过 UI 进行管理操作。我们正在审计所有管理 API,确保其仅限管理员访问。" }, "zha": { "add_device_page": { diff --git a/translations/frontend/zh-Hant.json b/translations/frontend/zh-Hant.json index 7e6388bd98..b636c4daa9 100644 --- a/translations/frontend/zh-Hant.json +++ b/translations/frontend/zh-Hant.json @@ -478,6 +478,7 @@ "cancel": "取消", "close": "關閉", "delete": "刪除", + "error_required": "必填", "loading": "讀取中", "next": "下一步", "no": "否", @@ -1221,6 +1222,7 @@ "different_include": "可能透過區域、全局或不同的包含。", "pick_attribute": "選擇欲覆寫屬性", "picker": { + "entity": "物件", "header": "自訂化", "introduction": "調整每個物件屬性。新增/編輯自訂化將可以立即生效,移除自訂化則必須等到物件更新時、方能生效。" }, @@ -1679,7 +1681,8 @@ "name": "名稱", "system": "系統" } - } + }, + "users_privileges_note": "使用者群組功能進行中。將無法透過 UI 進行使用者管理,仍在檢視所有管理 API Endpoint 以確保能夠正確符合管理員存取需求。" }, "zha": { "add_device_page": { @@ -2048,7 +2051,7 @@ "clear_items": "清除已選取項目" }, "starting": { - "description": "Home Assistant 正在啟動,請稍候。", + "description": "Home Assistant 正在啟動,請稍候...", "header": "Home Assistant 正在啟動..." } }, From 58f01ba11a3d3fe17fb3d65ec28a8fefe42c60b7 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 4 Jun 2020 01:25:12 -0700 Subject: [PATCH 03/39] Fix webpack dev server (#6100) --- build-scripts/gulp/cast.js | 1 + build-scripts/webpack.js | 10 ++++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/build-scripts/gulp/cast.js b/build-scripts/gulp/cast.js index 4d9a7fe34f..cf5eea7714 100644 --- a/build-scripts/gulp/cast.js +++ b/build-scripts/gulp/cast.js @@ -20,6 +20,7 @@ gulp.task( "translations-enable-merge-backend", gulp.parallel("gen-icons-json", "build-translations"), "copy-static-cast", + "gen-index-cast-dev", env.useRollup() ? "rollup-dev-server-cast" : "webpack-dev-server-cast" ) ); diff --git a/build-scripts/webpack.js b/build-scripts/webpack.js index df310b5532..ee2fdc406e 100644 --- a/build-scripts/webpack.js +++ b/build-scripts/webpack.js @@ -70,7 +70,9 @@ const createWebpackConfig = ({ if ( !context.includes("/node_modules/") || // calling define.amd will call require("!!webpack amd options") - resource.startsWith("!!webpack") + resource.startsWith("!!webpack") || + // loaded by webpack dev server but doesn't exist. + resource === "webpack/hot" ) { return false; } @@ -80,7 +82,11 @@ const createWebpackConfig = ({ ? path.resolve(context, resource) : require.resolve(resource); } catch (err) { - console.error("Error in ignore plugin", resource, context); + console.error( + "Error in Home Assistant ignore plugin", + resource, + context + ); throw err; } From 2c5d3f7492f046c3c4c5eb415b13690f3a8df583 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Fri, 5 Jun 2020 00:32:27 +0000 Subject: [PATCH 04/39] [ci skip] Translation update --- translations/frontend/lb.json | 33 ++++++++++++++++++++--- translations/frontend/ro.json | 49 ++++++++++++++++++++++++++++++++--- 2 files changed, 75 insertions(+), 7 deletions(-) diff --git a/translations/frontend/lb.json b/translations/frontend/lb.json index 33d3cc1967..bc7c4a4ee2 100644 --- a/translations/frontend/lb.json +++ b/translations/frontend/lb.json @@ -478,6 +478,7 @@ "cancel": "Ofbriechen", "close": "Zoumaachen", "delete": "Läschen", + "error_required": "Erfuerderlech", "loading": "Lued", "next": "Nächst", "no": "Nee", @@ -1219,6 +1220,7 @@ "different_include": "Eventuell iwwer e Domän, e Glob oder eng aner Include Method.", "pick_attribute": "Wielt een Attribut aus fir z'iwwerschreiwen", "picker": { + "entity": "Entitéit", "header": "Personaliséieren", "introduction": "Manipulatioun vun den Attributen pro Entitéit. Nei/geännert Personlisatiounen sinn direkt effektiv. Geläschte Personalisatioune ginn effektiv wann d'Entitéit sech aktualiséiert." }, @@ -1677,7 +1679,8 @@ "name": "Numm", "system": "System" } - } + }, + "users_privileges_note": "Benotzer Gruppp ass nach \"Work in progress\". De Benotzer kann d'Instanz net via UI verwalten. MIr sin mat engem Audit am gaang vun all Management API Endpunkt fir sécher ze stellen dass déi den accès richteg op Administrateuren limitéieren." }, "zha": { "add_device_page": { @@ -1839,21 +1842,38 @@ "set_wakeup": "Intervall fir z'erwächen définéieren", "true": "Richteg" }, + "node_management": { + "add_to_group": "Zum Grupp dobäisetzen", + "group": "Grupp", + "max_associations": "Max. Assoziatiounen:", + "remove_broadcast": "Broadcast läschen", + "remove_from_group": "Aus dem Grupp läschen" + }, "ozw_log": { "header": "OZW Log", - "introduction": "Logbicher kucken. 0 ass de minimum (luet de ganze Log) an 1000 ass de maximum. Luede weist ee statesche Log an \"tail\" aktualiséiert de Log automatesch mat de leschten Zeile vum Log." + "introduction": "Logbicher kucken. 0 ass de minimum (luet de ganze Log) an 1000 ass de maximum. Luede weist ee statesche Log an \"tail\" aktualiséiert de Log automatesch mat de leschten Zeile vum Log.", + "last_log_lines": "Unzuel vun läschte Log Zeilen", + "load": "Lueden" }, "services": { "add_node": "Apparat dobäisetzen", "add_node_secure": "Sëcheren Apparat dobäisetzen", "cancel_command": "Commande ofbriechen", "heal_network": "Netzwierk heelen", + "heal_node": "Node heelen", + "node_info": "Informatioun zum Node", + "print_node": "Node drécken", + "refresh_entity": "Entitéit aktualiséieren", + "refresh_node": "Node aktualiséieren", + "remove_failed_node": "Feelerhaften Node läschen", "remove_node": "Apparat läschen", + "replace_failed_node": "Feelerhaften Node ersetzen", "save_config": "Konfiguratioun späicheren", "soft_reset": "Soft Reset", "start_network": "Netzwierk starten", "stop_network": "Netzwierk stoppen", - "test_network": "Netzwierk testen" + "test_network": "Netzwierk testen", + "test_node": "Node testen" }, "values": { "header": "Wäerter vum Apparat" @@ -2012,6 +2032,10 @@ "add_item": "Element dobäisetzen", "checked_items": "Markéiert Elementer", "clear_items": "Markéiert Elementer läschen" + }, + "starting": { + "description": "Home Assistant start, waart w.e.g...", + "header": "Home Assistant start...." } }, "changed_toast": { @@ -2304,7 +2328,8 @@ "attribute_not_found": "Attribut {attribute} net disponibel an: {entity}", "entity_non_numeric": "Entitéit ass net numerescher Natur: {entity}", "entity_not_found": "Entitéit net erreechbar: {entity}", - "entity_unavailable": "{entity} ass fir de Moment net erreechbar" + "entity_unavailable": "{entity} ass fir de Moment net erreechbar", + "starting": "Home Assistant start, et wäert nach net alles prett sinn" } }, "mailbox": { diff --git a/translations/frontend/ro.json b/translations/frontend/ro.json index e6f5707d60..c6a441a471 100644 --- a/translations/frontend/ro.json +++ b/translations/frontend/ro.json @@ -466,9 +466,11 @@ }, "common": { "and": "Și", + "back": "Înapoi", "cancel": "Revocare", "close": "Închide", "delete": "Șterge", + "error_required": "Necesar", "loading": "Se încarcă", "next": "Următorul", "no": "Nu", @@ -497,6 +499,7 @@ "device-picker": { "clear": "Şterge", "device": "Dispozitiv", + "no_area": "Nicio zonă", "show_devices": "Arata dispozitivele", "toggle": "Comută" }, @@ -1031,6 +1034,7 @@ "different_include": "Posibil printr-un domeniu, un glob sau alta includere", "pick_attribute": "Alegeți un atribut pentru suprascriere", "picker": { + "entity": "Entitate", "header": "Personalizări", "introduction": "Atributele per entitate. Particularizările adăugate/editate vor avea efect imediat. Particularizările eliminate vor avea efect atunci când entitatea este actualizată." }, @@ -1592,17 +1596,44 @@ "set_wakeup": "Setați interval de trezire", "true": "Adevărat" }, + "node_management": { + "add_to_group": "Adăugare la grup", + "exclude_entity": "Excludeți această entitate din Home Assistant", + "group": "Grup", + "max_associations": "Asociații maxime:", + "node_group_associations": "Asociații de grupuri de noduri", + "node_protection": "Protecție nod", + "node_to_control": "Nod de controlat", + "nodes_in_group": "Alte noduri din acest grup:", + "protection": "Protecţie", + "remove_broadcast": "Eliminare difuzare", + "remove_from_group": "Eliminare din grup", + "set_protection": "Setare protecție" + }, + "ozw_log": { + "last_log_lines": "Numărul ultimelor linii de jurnal", + "load": "Sarcină", + "tail": "Coadă" + }, "services": { "add_node": "Adăugare nod", "add_node_secure": "Adăugare nod securizat", "cancel_command": "Anulați comanda", "heal_network": "Heal Network", + "heal_node": "Repara nod", + "node_info": "Informații nod", + "print_node": "Imprimare nod", + "refresh_entity": "Actualizare entitate", + "refresh_node": "Actualizare nod", + "remove_failed_node": "Eliminare nod eșuat", "remove_node": "Eliminare nod", + "replace_failed_node": "Înlocuiți nod eșuat", "save_config": "Salvați configurația", "soft_reset": "Resetare soft", "start_network": "Porniți rețeaua", "stop_network": "Opriți rețeaua", - "test_network": "Testati Reteaua" + "test_network": "Testati Reteaua", + "test_node": "Testare nod" }, "values": { "header": "Valoare nod" @@ -1750,6 +1781,10 @@ "add_item": "Adaugare element", "checked_items": "Elementele selectate", "clear_items": "Ștergeți elementele selectate" + }, + "starting": { + "description": "Home Assistant pornește, vă rugăm să așteptați...", + "header": "Home Assistant pornește..." } }, "changed_toast": { @@ -1815,9 +1850,13 @@ "name": "Lumina" }, "map": { + "description": "Cardul Map care vă permite să afișați entități pe o hartă.", "hours_to_show": "Ore de afisat", "name": "Hartă" }, + "markdown": { + "description": "Cardul Markdown este utilizat pentru a reda Markdown." + }, "media-control": { "name": "Control media" }, @@ -1971,7 +2010,8 @@ "warning": { "entity_non_numeric": "Entitatea este non-numerică: {entity}", "entity_not_found": "Entitatea nu este disponibilă: {entity}", - "entity_unavailable": "{entity} este momentan indisponibilă" + "entity_unavailable": "{entity} este momentan indisponibilă", + "starting": "Home Assistant pornește, nu totul poate fi disponibil încă" } }, "mailbox": { @@ -1984,6 +2024,7 @@ "abort_intro": "Conectare intrerupta", "authorizing_client": "Sunteți pe punctul de a da {clientId} accesul la instanța dumneavoastra de Home Assistant", "form": { + "next": "Următorul", "providers": { "command_line": { "abort": { @@ -2069,6 +2110,7 @@ } } }, + "start_over": "Ia-o de la capăt", "unknown_error": "Ceva n-a mers bine", "working": "Te rog așteaptă" }, @@ -2153,7 +2195,8 @@ "profile": { "advanced_mode": { "description": "Deblochează funcțiile avansate.", - "link_promo": "Află mai multe" + "link_promo": "Află mai multe", + "title": "Mod avansat" }, "change_password": { "confirm_new_password": "Confirmați Noua Parolă", From 5c1553286acd3fa1972f4aef88d860623c2a563c Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Fri, 5 Jun 2020 06:51:31 +0200 Subject: [PATCH 05/39] Fix for config undefined (#6102) --- src/state/disconnect-toast-mixin.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/state/disconnect-toast-mixin.ts b/src/state/disconnect-toast-mixin.ts index 69d076ecc4..a6a8dfa540 100644 --- a/src/state/disconnect-toast-mixin.ts +++ b/src/state/disconnect-toast-mixin.ts @@ -22,6 +22,7 @@ export default >(superClass: T) => const oldHass = changedProperties.get("hass"); if ( !changedProperties.has("hass") || + !this.hass!.config || oldHass?.config?.state === this.hass!.config.state ) { return; From a376f4525b8faeff572abcaf5541aa4e7e78a838 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Fri, 5 Jun 2020 06:52:14 +0200 Subject: [PATCH 06/39] Fix alarm card animation (#6096) fixes #5074 --- src/common/style/icon_color_css.ts | 5 ++++- src/panels/lovelace/cards/hui-alarm-panel-card.ts | 7 +++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/common/style/icon_color_css.ts b/src/common/style/icon_color_css.ts index 37af74d500..32adb53377 100644 --- a/src/common/style/icon_color_css.ts +++ b/src/common/style/icon_color_css.ts @@ -57,9 +57,12 @@ export const iconColorCSS = css` 0% { opacity: 1; } - 100% { + 50% { opacity: 0; } + 100% { + opacity: 1; + } } ha-icon[data-domain="plant"][data-state="problem"], diff --git a/src/panels/lovelace/cards/hui-alarm-panel-card.ts b/src/panels/lovelace/cards/hui-alarm-panel-card.ts index 06b5a40e9e..a0d70704d8 100644 --- a/src/panels/lovelace/cards/hui-alarm-panel-card.ts +++ b/src/panels/lovelace/cards/hui-alarm-panel-card.ts @@ -309,10 +309,13 @@ class HuiAlarmPanelCard extends LitElement implements LovelaceCard { @keyframes pulse { 0% { - --ha-label-badge-color: var(--alarm-state-color); + opacity: 1; + } + 50% { + opacity: 0; } 100% { - --ha-label-badge-color: rgba(255, 153, 0, 0.3); + opacity: 1; } } From f819e2cf8da7fb9d7986e8170856604abf4c074a Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 5 Jun 2020 02:03:11 -0700 Subject: [PATCH 07/39] Cleanup of builds (#6106) --- build-scripts/bundle.js | 4 ++-- build-scripts/gulp/compress.js | 14 ++++++++------ cast/webpack.config.js | 9 +++------ gallery/webpack.config.js | 3 +++ 4 files changed, 16 insertions(+), 14 deletions(-) diff --git a/build-scripts/bundle.js b/build-scripts/bundle.js index 4d1ec71682..6fdce58edb 100644 --- a/build-scripts/bundle.js +++ b/build-scripts/bundle.js @@ -85,8 +85,8 @@ module.exports.babelExclude = () => [ const outputPath = (outputRoot, latestBuild) => path.resolve(outputRoot, latestBuild ? "frontend_latest" : "frontend_es5"); -const publicPath = (latestBuild) => - latestBuild ? "/frontend_latest/" : "/frontend_es5/"; +const publicPath = (latestBuild, root = "") => + latestBuild ? `${root}/frontend_latest/` : `${root}/frontend_es5/`; /* BundleConfig { diff --git a/build-scripts/gulp/compress.js b/build-scripts/gulp/compress.js index 12157bc637..d247d0d1c9 100644 --- a/build-scripts/gulp/compress.js +++ b/build-scripts/gulp/compress.js @@ -6,30 +6,32 @@ const merge = require("merge-stream"); const path = require("path"); const paths = require("../paths"); +const zopfliOptions = { threshold: 150 }; + gulp.task("compress-app", function compressApp() { const jsLatest = gulp .src(path.resolve(paths.app_output_latest, "**/*.js")) - .pipe(zopfli({ threshold: 150 })) + .pipe(zopfli(zopfliOptions)) .pipe(gulp.dest(paths.app_output_latest)); const jsEs5 = gulp .src(path.resolve(paths.app_output_es5, "**/*.js")) - .pipe(zopfli({ threshold: 150 })) + .pipe(zopfli(zopfliOptions)) .pipe(gulp.dest(paths.app_output_es5)); const polyfills = gulp .src(path.resolve(paths.app_output_static, "polyfills/*.js")) - .pipe(zopfli({ threshold: 150 })) + .pipe(zopfli(zopfliOptions)) .pipe(gulp.dest(path.resolve(paths.app_output_static, "polyfills"))); const translations = gulp .src(path.resolve(paths.app_output_static, "translations/**/*.json")) - .pipe(zopfli({ threshold: 150 })) + .pipe(zopfli(zopfliOptions)) .pipe(gulp.dest(path.resolve(paths.app_output_static, "translations"))); const icons = gulp .src(path.resolve(paths.app_output_static, "mdi/*.json")) - .pipe(zopfli({ threshold: 150 })) + .pipe(zopfli(zopfliOptions)) .pipe(gulp.dest(path.resolve(paths.app_output_static, "mdi"))); return merge(jsLatest, jsEs5, polyfills, translations, icons); @@ -38,6 +40,6 @@ gulp.task("compress-app", function compressApp() { gulp.task("compress-hassio", function compressApp() { return gulp .src(path.resolve(paths.hassio_output_root, "**/*.js")) - .pipe(zopfli()) + .pipe(zopfli(zopfliOptions)) .pipe(gulp.dest(paths.hassio_output_root)); }); diff --git a/cast/webpack.config.js b/cast/webpack.config.js index fe65fcd4ac..e44575344d 100644 --- a/cast/webpack.config.js +++ b/cast/webpack.config.js @@ -1,11 +1,8 @@ const { createCastConfig } = require("../build-scripts/webpack.js"); -const { isProdBuild } = require("../build-scripts/env.js"); - -// File just used for stats builds - -const latestBuild = true; +const { isProdBuild, isStatsBuild } = require("../build-scripts/env.js"); module.exports = createCastConfig({ isProdBuild: isProdBuild(), - latestBuild, + isStatsBuild: isStatsBuild(), + latestBuild: true, }); diff --git a/gallery/webpack.config.js b/gallery/webpack.config.js index e69d751185..d7ecb07da6 100644 --- a/gallery/webpack.config.js +++ b/gallery/webpack.config.js @@ -1,5 +1,8 @@ const { createGalleryConfig } = require("../build-scripts/webpack.js"); +const { isProdBuild, isStatsBuild } = require("../build-scripts/env.js"); module.exports = createGalleryConfig({ + isProdBuild: isProdBuild(), + isStatsBuild: isStatsBuild(), latestBuild: true, }); From 67ac3b4ba379c8b6426870d51f1a2540dd39928d Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 5 Jun 2020 02:04:19 -0700 Subject: [PATCH 08/39] Drop Custom Elements ES5 adapter (#6107) --- build-scripts/gulp/gather-static.js | 4 +++- cast/src/html/launcher-faq.html.template | 1 - cast/src/html/launcher.html.template | 1 - demo/src/html/index.html.template | 1 - hassio/src/entrypoint.ts | 9 ++------- src/html/authorize.html.template | 1 - src/html/index.html.template | 1 - src/html/onboarding.html.template | 1 - 8 files changed, 5 insertions(+), 14 deletions(-) diff --git a/build-scripts/gulp/gather-static.js b/build-scripts/gulp/gather-static.js index 0a16bf636e..ea5a29326f 100644 --- a/build-scripts/gulp/gather-static.js +++ b/build-scripts/gulp/gather-static.js @@ -36,11 +36,13 @@ function copyMdiIcons(staticDir) { function copyPolyfills(staticDir) { const staticPath = genStaticPath(staticDir); - // Web Component polyfills and adapters + // For custom panels using ES5 builds that don't use Babel 7+ copyFileDir( npmPath("@webcomponents/webcomponentsjs/custom-elements-es5-adapter.js"), staticPath("polyfills/") ); + + // Web Component polyfills and adapters copyFileDir( npmPath("@webcomponents/webcomponentsjs/webcomponents-bundle.js"), staticPath("polyfills/") diff --git a/cast/src/html/launcher-faq.html.template b/cast/src/html/launcher-faq.html.template index 30589f2703..59eea6a3a0 100644 --- a/cast/src/html/launcher-faq.html.template +++ b/cast/src/html/launcher-faq.html.template @@ -45,7 +45,6 @@ (function() { // // Safari 10.1 supports type=module but ignores nomodule, so we add this check. if (!isS101) { - _ls("/static/polyfills/custom-elements-es5-adapter.js"); <% if (useRollup) { %> _ls("/static/js/s.min.js").onload = function() { System.import("<%= es5LauncherJS %>"); diff --git a/cast/src/html/launcher.html.template b/cast/src/html/launcher.html.template index fd176a1e59..88de28b196 100644 --- a/cast/src/html/launcher.html.template +++ b/cast/src/html/launcher.html.template @@ -36,7 +36,6 @@ (function() { // // Safari 10.1 supports type=module but ignores nomodule, so we add this check. if (!isS101) { - _ls("/static/polyfills/custom-elements-es5-adapter.js"); <% if (useRollup) { %> _ls("/static/js/s.min.js").onload = function() { System.import("<%= es5LauncherJS %>"); diff --git a/demo/src/html/index.html.template b/demo/src/html/index.html.template index 0b045fddd8..87f16397a1 100644 --- a/demo/src/html/index.html.template +++ b/demo/src/html/index.html.template @@ -92,7 +92,6 @@ (function() { // // Safari 10.1 supports type=module but ignores nomodule, so we add this check. if (!isS101) { - _ls("/static/polyfills/custom-elements-es5-adapter.js"); <% if (useRollup) { %> _ls("/static/js/s.min.js").onload = function() { System.import("<%= es5DemoJS %>"); diff --git a/hassio/src/entrypoint.ts b/hassio/src/entrypoint.ts index 3bfa3ce898..10f2c3a23f 100644 --- a/hassio/src/entrypoint.ts +++ b/hassio/src/entrypoint.ts @@ -1,11 +1,6 @@ import "../../src/resources/compatibility"; - -window.loadES5Adapter().then(() => { - // eslint-disable-next-line - import(/* webpackChunkName: "roboto" */ "../../src/resources/roboto"); - // eslint-disable-next-line - import(/* webpackChunkName: "hassio-main" */ "./hassio-main"); -}); +import "../../src/resources/roboto"; +import "./hassio-main"; const styleEl = document.createElement("style"); styleEl.innerHTML = ` diff --git a/src/html/authorize.html.template b/src/html/authorize.html.template index 3cbcfda5ce..62b1fdf87b 100644 --- a/src/html/authorize.html.template +++ b/src/html/authorize.html.template @@ -47,7 +47,6 @@ (function() { // Safari 10.1 supports type=module but ignores nomodule, so we add this check. if (!isS101) { - _ls("/static/polyfills/custom-elements-es5-adapter.js"); <% if (useRollup) { %> _ls("/static/js/s.min.js").onload = function() { System.import("<%= es5PageJS %>"); diff --git a/src/html/index.html.template b/src/html/index.html.template index 7ce840a0e3..d61595003c 100644 --- a/src/html/index.html.template +++ b/src/html/index.html.template @@ -66,7 +66,6 @@ (function() { if (!window.latestJS) { window.customPanelJS = "<%= es5CustomPanelJS %>"; - _ls("/static/polyfills/custom-elements-es5-adapter.js"); <% if (useRollup) { %> _ls("/static/js/s.min.js").onload = function() { diff --git a/src/html/onboarding.html.template b/src/html/onboarding.html.template index 6acf158b58..126f67ab71 100644 --- a/src/html/onboarding.html.template +++ b/src/html/onboarding.html.template @@ -49,7 +49,6 @@ (function() { // Safari 10.1 supports type=module but ignores nomodule, so we add this check. if (!isS101) { - _ls("/static/polyfills/custom-elements-es5-adapter.js"); <% if (useRollup) { %> _ls("/static/js/s.min.js").onload = function() { System.import("<%= es5PageJS %>"); From 30442b25c03ae7b60dd83f934c09320ae557173c Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Fri, 5 Jun 2020 22:14:39 +0200 Subject: [PATCH 09/39] Correct glance card size (#6109) --- src/panels/lovelace/cards/hui-glance-card.ts | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/panels/lovelace/cards/hui-glance-card.ts b/src/panels/lovelace/cards/hui-glance-card.ts index f377866025..59e31cb15f 100644 --- a/src/panels/lovelace/cards/hui-glance-card.ts +++ b/src/panels/lovelace/cards/hui-glance-card.ts @@ -69,14 +69,24 @@ export class HuiGlanceCard extends LitElement implements LovelaceCard { return ( (this._config!.title ? 1 : 0) + Math.max( - Math.ceil(this._configEntities!.length / (this._config!.columns || 5)), + ((this._config!.show_icon ? 1 : 0) + + (this._config!.show_name && this._config!.show_state ? 1 : 0)) * + Math.ceil( + this._configEntities!.length / (this._config!.columns || 5) + ), 1 ) ); } public setConfig(config: GlanceCardConfig): void { - this._config = { state_color: true, ...config }; + this._config = { + show_name: true, + show_state: true, + show_icon: true, + state_color: true, + ...config, + }; const entities = processConfigEntities(config.entities); for (const entity of entities) { @@ -234,7 +244,7 @@ export class HuiGlanceCard extends LitElement implements LovelaceCard { hasAction(entityConf.tap_action) ? "0" : undefined )} > - ${this._config!.show_name !== false + ${this._config!.show_name ? html`
${"name" in entityConf @@ -243,7 +253,7 @@ export class HuiGlanceCard extends LitElement implements LovelaceCard {
` : ""} - ${this._config!.show_icon !== false + ${this._config!.show_icon ? html` ` : ""} - ${this._config!.show_state !== false && entityConf.show_state !== false + ${this._config!.show_state && entityConf.show_state !== false ? html`
${computeDomain(entityConf.entity) === "sensor" && From 81277fd12ebc3d4c91bb066005bda8e8ef75087d Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Fri, 5 Jun 2020 22:15:06 +0200 Subject: [PATCH 10/39] Set min width to dev states columns (#6108) --- src/panels/developer-tools/state/developer-tools-state.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/panels/developer-tools/state/developer-tools-state.js b/src/panels/developer-tools/state/developer-tools-state.js index 84552378d3..c1199baebc 100644 --- a/src/panels/developer-tools/state/developer-tools-state.js +++ b/src/panels/developer-tools/state/developer-tools-state.js @@ -45,7 +45,6 @@ class HaPanelDevState extends EventsMixin(LocalizeMixin(PolymerElement)) { } .entities tr { - word-break: break-word; vertical-align: top; } @@ -58,6 +57,8 @@ class HaPanelDevState extends EventsMixin(LocalizeMixin(PolymerElement)) { } .entities td { padding: 4px; + min-width: 200px; + word-break: break-word; } .entities ha-svg-icon { --mdc-icon-size: 20px; From 0fcedc50465372900111423833dee7a39fd2a4f7 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Fri, 5 Jun 2020 23:46:16 +0200 Subject: [PATCH 11/39] Glance height fix (Again): A row could be zero height (#6110) --- src/panels/lovelace/cards/hui-glance-card.ts | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/panels/lovelace/cards/hui-glance-card.ts b/src/panels/lovelace/cards/hui-glance-card.ts index 59e31cb15f..4d3d577de6 100644 --- a/src/panels/lovelace/cards/hui-glance-card.ts +++ b/src/panels/lovelace/cards/hui-glance-card.ts @@ -66,17 +66,15 @@ export class HuiGlanceCard extends LitElement implements LovelaceCard { private _configEntities?: GlanceConfigEntity[]; public getCardSize(): number { - return ( - (this._config!.title ? 1 : 0) + - Math.max( - ((this._config!.show_icon ? 1 : 0) + - (this._config!.show_name && this._config!.show_state ? 1 : 0)) * - Math.ceil( - this._configEntities!.length / (this._config!.columns || 5) - ), - 1 - ) + const rowHeight = + (this._config!.show_icon ? 1 : 0) + + (this._config!.show_name && this._config!.show_state ? 1 : 0) || 1; + + const numRows = Math.ceil( + this._configEntities!.length / (this._config!.columns || 5) ); + + return (this._config!.title ? 1 : 0) + rowHeight * numRows; } public setConfig(config: GlanceCardConfig): void { From 7050d19be7ec3c89101eb76c6fae1ddfe9028964 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Sat, 6 Jun 2020 00:32:28 +0000 Subject: [PATCH 12/39] [ci skip] Translation update --- translations/frontend/es-419.json | 10 +--- translations/frontend/et.json | 4 -- translations/frontend/fr.json | 2 +- translations/frontend/lb.json | 22 ++++++-- translations/frontend/nb.json | 87 ++++++------------------------- translations/frontend/nl.json | 3 -- translations/frontend/pt-BR.json | 14 +++-- translations/frontend/pt.json | 12 ++--- translations/frontend/sv.json | 11 ++-- 9 files changed, 51 insertions(+), 114 deletions(-) diff --git a/translations/frontend/es-419.json b/translations/frontend/es-419.json index e0511c0a46..b2e2661a79 100644 --- a/translations/frontend/es-419.json +++ b/translations/frontend/es-419.json @@ -13,15 +13,9 @@ }, "panel": { "calendar": "Calendario", - "config": "", "developer_tools": "Herramientas para desarrolladores", - "history": "", - "logbook": "", - "mailbox": "", - "map": "", "profile": "Perfil", - "shopping_list": "Lista de compras", - "states": "" + "shopping_list": "Lista de compras" }, "state_attributes": { "climate": { @@ -1794,7 +1788,6 @@ "no_zones_created_yet": "Parece que todavía no ha creado ninguna zona." }, "zwave": { - "caption": "", "common": { "index": "Índice", "instance": "Instancia", @@ -1913,7 +1906,6 @@ "start_listening": "Comenzar a escuchar", "stop_listening": "Deja de escuchar", "subscribe_to": "Tema para suscribirse", - "title": "", "topic": "tema" }, "services": { diff --git a/translations/frontend/et.json b/translations/frontend/et.json index 1f1a88221c..0722c2b79e 100644 --- a/translations/frontend/et.json +++ b/translations/frontend/et.json @@ -875,10 +875,6 @@ "at": "Kell", "label": "Aeg" }, - "webhook": { - "label": "", - "webhook_id": "" - }, "zone": { "enter": "Sisenemine", "entity": "Asukohaga olem", diff --git a/translations/frontend/fr.json b/translations/frontend/fr.json index 4e1caa234a..57e75234fe 100644 --- a/translations/frontend/fr.json +++ b/translations/frontend/fr.json @@ -742,7 +742,7 @@ "connection_lost": "Connexion perdue. Reconnexion en cours ...", "service_call_failed": "Échec d'appel du service \"{service}\".", "started": "Home Assistant a démarré !", - "starting": "Home Assistant démarre, tout ne sera pas disponible jusqu'à ce qu'il soit terminé.", + "starting": "Home Assistant est en cours de démarrage, tout ne sera pas disponible tant qu’il n’aura pas terminé.", "triggered": "{name} déclenché" }, "panel": { diff --git a/translations/frontend/lb.json b/translations/frontend/lb.json index bc7c4a4ee2..9ba991d11f 100644 --- a/translations/frontend/lb.json +++ b/translations/frontend/lb.json @@ -741,6 +741,8 @@ "notification_toast": { "connection_lost": "Verbindung verluer. Verbindung gëtt nees opgebaut...", "service_call_failed": "Feeler beim opruffen vun {service}", + "started": "Home Assistant ass gestart!", + "starting": "Home Assistant start, et wäert nach net alles prett sinn bis et fäerdeg gestart ass.", "triggered": "{name} ausgeléist" }, "panel": { @@ -1844,10 +1846,24 @@ }, "node_management": { "add_to_group": "Zum Grupp dobäisetzen", + "entities": "Entitéiten vun dësem Node", + "entity_info": "Informatiounen vun der Entitéit", + "exclude_entity": "Dës Entitéit aus Home Assistant ausschléissen", "group": "Grupp", + "header": "Z-Wave Node Management", + "introduction": "Z-Wave Kommandoe ausféieren déi nëmmen ee Node betreffen. Wiel ee Node aus fir seng Lëscht vun verfügbare Kommandoe ze gesinn.", "max_associations": "Max. Assoziatiounen:", + "node_group_associations": "Node Grupp Assoziatiounen", + "node_protection": "Protektioun vum Node", + "node_to_control": "Node fir ze steieren", + "nodes": "Nodes", + "nodes_hint": "Node auswielen fir d'Optioune ze gesinn", + "nodes_in_group": "Aner Nodes an dësem Grupp:", + "pooling_intensity": "Polling Intensitéit", + "protection": "Protektioun", "remove_broadcast": "Broadcast läschen", - "remove_from_group": "Aus dem Grupp läschen" + "remove_from_group": "Aus dem Grupp läschen", + "set_protection": "Protektioun setzen" }, "ozw_log": { "header": "OZW Log", @@ -2276,12 +2292,12 @@ "close": "Zoumaachen", "empty_config": "Mat engem eidelen Tableau de Bord ufänken", "header": "Kontroll iwwert Loveloce UI iwwerhuelen", - "para": "Standardméisseg verwalt Home Assistant de Benotzer Interface an aktualiséiert en soubal nei Entitéiten oder Lovelace-Komponenten disponibel sinn. Wann dir d'Kontrolle iwwerhuelt, kënne mir keng automatesch Ännerung méi fir iech maachen.", + "para": "Dësen Tableau de Bord gëtt vum Home Assistant verwalt. Et gëtt automatesch aktualiséiert soubal nei Entitéiten oder Lovelace-Komponenten disponibel sinn. Wanns Du d'Kontrolle iwwerhëlls, kann dësen Tableau de Bord net méi automatesch aktualiséiertginn. Du kanns ëmmer ee neien Tableau de Bord erstellen fir domatt ze testen.", "para_sure": "Sécher fir d'Kontrolle iwwert de Benotzer Interface z'iwwerhuelen?", "save": "Kontroll iwwerhuelen", "yaml_config": "Fir de Start ze vereinfachen, hei ass déi aktuell Konfiguratioun vun dësem Tableau de Bord:", "yaml_control": "Fir d'Kontroll am YAML Modus z'iwwerhuelen, erstell ee YAML Fichier mam Numm deen an der Konfiguratioun vun dësem Tableau de Bord uginn ass, oder de Standard 'ui-lovelace.yaml'", - "yaml_mode": "Du benotz de YAML Modus, dëst bedeit dass du d'Lovelace Konfiguratioun net kanns aus dem Benotzer Interface änneren. Wann's du Lovelace vum Benotzer Interface aus wëlls änneren, läsch de 'mode: yaml' aus denger Lovelace Konfiguratioun am 'configuration.yaml'" + "yaml_mode": "Du benotz de YAML Modus fir dësen Tableau de Bord, dëst bedeit dass du d'Lovelace Konfiguratioun net kanns aus dem Benotzer Interface änneren. Wann's du Lovelace vum Benotzer Interface aus wëlls änneren, läsch de 'mode: yaml' aus denger Lovelace Konfiguratioun am 'configuration.yaml'" }, "suggest_card": { "add": "Zu Lovelace bäisetzen", diff --git a/translations/frontend/nb.json b/translations/frontend/nb.json index d88a8870a4..02c9456328 100644 --- a/translations/frontend/nb.json +++ b/translations/frontend/nb.json @@ -26,7 +26,6 @@ "state_attributes": { "climate": { "fan_mode": { - "auto": "", "off": "Av", "on": "På" }, @@ -101,7 +100,6 @@ "on": "Lavt" }, "cold": { - "off": "", "on": "Kald" }, "connectivity": { @@ -152,10 +150,6 @@ "off": "Borte", "on": "Hjemme" }, - "problem": { - "off": "", - "on": "" - }, "safety": { "off": "Sikker", "on": "Usikker" @@ -225,7 +219,6 @@ "locked": "Låst", "not_home": "Borte", "off": "Av", - "ok": "", "on": "På", "open": "Åpen", "opening": "Åpner", @@ -257,7 +250,6 @@ "home": "Hjemme" }, "plant": { - "ok": "", "problem": "Problem" }, "remote": { @@ -363,7 +355,6 @@ "low": "lav", "on_off": "På / av", "operation": "Operasjon", - "preset_mode": "", "swing_mode": "Svingmodus", "target_humidity": "Ønsket luftfuktighet", "target_temperature": "Ønsket temperatur", @@ -419,9 +410,7 @@ "timer": { "actions": { "cancel": "Avbryt", - "finish": "Ferdig", - "pause": "", - "start": "" + "finish": "Ferdig" } }, "vacuum": { @@ -453,12 +442,10 @@ "e": "Ø", "ene": "ØNØ", "ese": "ØSØ", - "n": "", "ne": "NØ", "nne": "NNØ", "nnw": "NNV", "nw": "NV", - "s": "", "se": "SØ", "sse": "SSØ", "ssw": "SSV", @@ -583,8 +570,7 @@ "generic": { "cancel": "Avbryt", "close": "Lukk", - "default_confirmation_title": "Er du sikker?", - "ok": "" + "default_confirmation_title": "Er du sikker?" }, "helper_settings": { "generic": { @@ -655,11 +641,8 @@ "commands": "Støvsugerkommandoer:", "fan_speed": "Viftehastighet", "locate": "Lokaliser", - "pause": "", "return_home": "Returner hjem", - "start": "", "start_pause": "Start / Pause", - "status": "", "stop": "Stopp" } }, @@ -705,7 +688,6 @@ "manuf": "av {manufacturer}", "no_area": "Intet område", "power_source": "Strømkilde", - "quirk": "", "services": { "reconfigure": "Rekonfigurer ZHA-enhet (heal enhet). Bruk dette hvis du har problemer med enheten. Hvis den aktuelle enheten er en batteridrevet enhet, sørg for at den er våken og aksepterer kommandoer når du bruker denne tjenesten.", "remove": "Fjern en enhet fra Zigbee-nettverket.", @@ -947,12 +929,9 @@ }, "homeassistant": { "event": "Hendelse:", - "label": "", - "shutdown": "Slå av", - "start": "" + "shutdown": "Slå av" }, "mqtt": { - "label": "", "payload": "Nyttelast (valgfritt)", "topic": "Emne" }, @@ -963,7 +942,6 @@ "value_template": "Verdi fra mal (valgfritt)" }, "state": { - "for": "", "from": "Fra", "label": "Tilstand", "to": "Til" @@ -989,10 +967,6 @@ "at": "Klokken", "label": "Tid" }, - "webhook": { - "label": "", - "webhook_id": "" - }, "zone": { "enter": "Ankommer", "entity": "Entitet med posisjon", @@ -1036,8 +1010,7 @@ "manage_entities": "Håndtér entiteter", "state_reporting_error": "Kan ikke {enable_disable} rapportere status.", "sync_entities": "Synkronisér entiteter", - "sync_entities_error": "Kunne ikke synkronisere entiteter:", - "title": "" + "sync_entities_error": "Kunne ikke synkronisere entiteter:" }, "connected": "Tilkoblet", "connection_status": "Status for skytilkobling", @@ -1055,8 +1028,7 @@ "manage_entities": "Håndtér entiteter", "security_devices": "Sikkerhetsenheter", "sync_entities": "Synkronisér entiteter til Google", - "sync_entities_404_message": "Kunne ikke synkronisere enhetene dine med Google, be Google 'Hei Google, synkroniser enhetene mine' for å synkronisere enhetene dine.", - "title": "" + "sync_entities_404_message": "Kunne ikke synkronisere enhetene dine med Google, be Google 'Hei Google, synkroniser enhetene mine' for å synkronisere enhetene dine." }, "integrations": "Integrasjoner", "integrations_introduction": "Integrasjoner for Home Assistant Cloud lar deg koble til tjenester i skyen uten å måtte avsløre Home Assistant-forekomsten offentlig på internett.", @@ -1085,18 +1057,15 @@ "no_hooks_yet": "Ser ut som du ikke har noen webhooks ennå. Kom i gang ved å konfigurere en ", "no_hooks_yet_link_automation": "webhook-automasjon", "no_hooks_yet_link_integration": "webhook-basert integrasjon", - "no_hooks_yet2": " eller ved å opprette en ", - "title": "" + "no_hooks_yet2": " eller ved å opprette en " } }, "alexa": { "banner": "Redigere hvilke entiteter som vises via dette grensesnittet er deaktivert fordi du har konfigurert entitetsfiltre i configuration.yaml.", "expose": "Eksponer til Alexa", "exposed_entities": "Eksponerte entiteter", - "not_exposed_entities": "Ikke-eksponerte entiteter", - "title": "" + "not_exposed_entities": "Ikke-eksponerte entiteter" }, - "caption": "", "description_features": "Kontroller borte fra hjemmet, integrer med Alexa og Google Assistant.", "description_login": "Logget inn som {email}", "description_not_login": "Ikke pålogget", @@ -1133,8 +1102,7 @@ "expose": "Eksponer til Google Assistant", "exposed_entities": "Eksponerte entiteter", "not_exposed_entities": "Ikke-eksponerte entiteter", - "sync_to_google": "Synkroniserer endringer til Google.", - "title": "" + "sync_to_google": "Synkroniserer endringer til Google." }, "login": { "alert_email_confirm_necessary": "Du må bekrefte e-posten din før du logger inn.", @@ -1306,7 +1274,6 @@ "confirm_title": "Vil du aktivere {number} enheter?" }, "filter": { - "filter": "", "show_disabled": "Vis deaktiverte entiteter", "show_readonly": "Vis skrivebeskyttede enheter", "show_unavailable": "Vis utilgjengelige enheter" @@ -1315,8 +1282,7 @@ "headers": { "entity_id": "Entitets-ID", "integration": "Integrasjon", - "name": "Navn", - "status": "" + "name": "Navn" }, "introduction": "Home Assistant bygger opp et register over hver entitet den har sett som kan identifiseres unikt. Hver av disse entitetene vil ha en ID som er reservert kun til denne.", "introduction2": "Bruk entitetsregistret til å overstyre navnet, endre id-en eller fjerne den fra Home Assistant.", @@ -1330,7 +1296,6 @@ "selected": "{number} valgte", "status": { "disabled": "Deaktivert", - "ok": "", "readonly": "Skrivebeskyttet", "restored": "Gjennopprettet", "unavailable": "Utilgjengelig" @@ -1355,15 +1320,13 @@ "headers": { "editable": "Redigerbare", "entity_id": "Entitets-ID", - "name": "Navn", - "type": "" + "name": "Navn" } }, "types": { "input_boolean": "Veksle", "input_datetime": "Dato og/eller klokkeslett", "input_number": "Nummer", - "input_select": "", "input_text": "Tekst" } }, @@ -1464,7 +1427,6 @@ "title": "Tittel", "title_required": "Tittel er påkrevd.", "update": "Oppdater", - "url": "", "url_error_msg": "URLen skal inneholde en - og kan ikke inneholde mellomrom eller spesialtegn, bortsett fra _ og -" }, "picker": { @@ -1492,17 +1454,12 @@ "new_resource": "Legg til ny ressurs", "type": "Ressurstype", "update": "Oppdater", - "url": "", "url_error_msg": "URL-adresse er et obligatorisk felt", "warning_header": "Vær forsiktig!", "warning_text": "Det kan være farlig å legge til ressurser, sørg for at du kjenner kilden til ressursen og stoler på dem. Dårlige ressurser kan skade systemet ditt alvorlig." }, "picker": { "add_resource": "Legg til ressurs", - "headers": { - "type": "", - "url": "" - }, "no_resources": "Ingen ressurser" }, "refresh_body": "Du må oppdatere siden for å fullføre fjerningen, vil du oppdatere nå?", @@ -1659,7 +1616,6 @@ "editor": { "activate_user": "Aktiver bruker", "active": "Aktiv", - "admin": "", "caption": "Vis bruker", "change_password": "Endre passord", "confirm_user_deletion": "Er du sikker på at du vil slette {name} ?", @@ -1678,8 +1634,7 @@ "picker": { "headers": { "group": "Gruppe", - "name": "Navn", - "system": "" + "name": "Navn" } }, "users_privileges_note": "Brukere-gruppen er et pågående arbeid. Brukeren kan ikke administrere forekomsten via brukergrensesnittet. Vi overvåker fortsatt alle API-endepunkter for administrasjonsadministrasjon for å sikre at de begrenser tilgangen til administratorer på riktig måte." @@ -1695,7 +1650,6 @@ "caption": "Legg til enheter", "description": "Legg til enheter i Zigbee-nettverket" }, - "caption": "", "cluster_attributes": { "attributes_of_cluster": "Attributter for den valgte klyngen", "get_zigbee_attribute": "Hent ZigBee-attributt", @@ -1800,7 +1754,6 @@ "new_zone": "Ny sone", "passive": "Passiv", "passive_note": "Passive soner er skjult i grensesnittet og brukes ikke som sted for enhetssporere. Dette er nyttig hvis du bare vil bruke dem til automasjoner.", - "radius": "", "required_error_msg": "Dette feltet er påkrevd", "update": "Oppdater" }, @@ -1931,7 +1884,6 @@ "documentation": "Dokumentasjon", "frontend": "frontend", "frontend_version": "Brukergrensesnittet-versjon: {version} - {type}", - "home_assistant_logo": "", "icons_by": "Ikoner fra", "integrations": "Integrasjoner", "issues": "Problemer", @@ -1971,7 +1923,6 @@ "call_service": "Tilkall tjeneste", "column_description": "Beskrivelse", "column_example": "Eksempel", - "column_parameter": "", "data": "Tjenestedata (YAML, valgfritt)", "description": "Service utviklingsverktøyet lar deg tilkalle alle tilgjengelige tjenester i Home Assistant.", "fill_example_data": "Fyll ut eksempeldata", @@ -2034,7 +1985,6 @@ }, "picture-elements": { "call_service": "Tilkall tjeneste {name}", - "hold": "", "more_info": "Vis mer info: {name}", "navigate_to": "Naviger til {location}", "tap": "Trykk:", @@ -2125,7 +2075,6 @@ "manual": "Manuell", "manual_description": "Trenger du å legge til et tilpasset kort eller bare ønsker å skrive yaml manuelt?", "maximum": "Maksimalt", - "minimum": "", "name": "Navn", "no_theme": "Ingen tema", "refresh_interval": "Oppdateringsintervall", @@ -2137,8 +2086,7 @@ "tap_action": "Trykk handling", "theme": "Tema", "title": "Tittel", - "unit": "Betegnelse", - "url": "" + "unit": "Betegnelse" }, "glance": { "columns": "Kolonner", @@ -2172,8 +2120,7 @@ }, "markdown": { "content": "Innhold", - "description": "Markdown-kortet brukes til å gjengi Markdown.", - "name": "" + "description": "Markdown-kortet brukes til å gjengi Markdown." }, "media-control": { "description": "Media Control-kortet brukes til å vise mediespillerenheter på et grensesnitt med brukervennlige kontroller.", @@ -2202,8 +2149,7 @@ "sensor": { "description": "Sensorkortet gir deg en rask oversikt over sensortilstanden din med en valgfri graf for å visualisere endring over tid.", "graph_detail": "Detaljer for graf", - "graph_type": "Graf type", - "name": "" + "graph_type": "Graf type" }, "shopping-list": { "description": "På Shopping List-kortet kan du legge til, redigere, sjekke av og fjerne gjenstander fra handlelisten din.", @@ -2492,7 +2438,6 @@ "upstairs": "Oppe" }, "unit": { - "minutes_abbr": "", "watching": "Ser på" } } @@ -2545,9 +2490,7 @@ }, "current_user": "Du er logget inn som {fullName}.", "dashboard": { - "description": "Velg et standard instrumentbord for denne enheten.", - "dropdown_label": "", - "header": "" + "description": "Velg et standard instrumentbord for denne enheten." }, "force_narrow": { "description": "Dette vil skjule sidepanelet som standard, tilsvarende opplevelsen på en mobil.", diff --git a/translations/frontend/nl.json b/translations/frontend/nl.json index 447b0b5752..d431f52ade 100644 --- a/translations/frontend/nl.json +++ b/translations/frontend/nl.json @@ -914,7 +914,6 @@ "delete": "Verwijderen", "delete_confirm": "Weet je zeker dat je dit item wilt verwijderen?", "duplicate": "Dupliceren", - "header": "", "introduction": "Triggers starten de verwerking van een automatiseringsregel. Het is mogelijk om meerdere triggers voor dezelfde regel op te geven. Zodra een trigger start, valideert Home Assistant de eventuele voorwaarden en roept hij de actie aan.", "learn_more": "Meer informatie over triggers", "name": "Trigger", @@ -944,12 +943,10 @@ }, "homeassistant": { "event": "Gebeurtenis:", - "label": "", "shutdown": "Afsluiten", "start": "Opstarten" }, "mqtt": { - "label": "", "payload": "Payload (optioneel)", "topic": "Onderwerp" }, diff --git a/translations/frontend/pt-BR.json b/translations/frontend/pt-BR.json index f9589b311b..0228283427 100644 --- a/translations/frontend/pt-BR.json +++ b/translations/frontend/pt-BR.json @@ -477,6 +477,7 @@ "cancel": "Cancelar", "close": "Fechar", "delete": "Eliminar", + "error_required": "Obrigatório", "loading": "Carregando", "next": "Próximo", "no": "Não", @@ -935,7 +936,6 @@ }, "homeassistant": { "event": "Evento:", - "label": "", "shutdown": "Desligar", "start": "Iniciar" }, @@ -1795,7 +1795,6 @@ "no_zones_created_yet": "Parece que você ainda não criou nenhuma zona." }, "zwave": { - "caption": "", "common": { "index": "Índice", "instance": "Instância", @@ -1841,7 +1840,8 @@ "soft_reset": "Soft Reset", "start_network": "Iniciar Rede", "stop_network": "Parar Rede", - "test_network": "Teste de rede" + "test_network": "Teste de rede", + "test_node": "Testar Nó" }, "values": { "header": "Valores de nó" @@ -1914,7 +1914,6 @@ "start_listening": "Começar a ouvir", "stop_listening": "Parar de ouvir", "subscribe_to": "Evento para se inscrever", - "title": "", "topic": "tópico" }, "services": { @@ -2000,6 +1999,10 @@ "add_item": "Adicionar item", "checked_items": "Itens marcados", "clear_items": "Limpar itens marcados" + }, + "starting": { + "description": "Home Assistant está iniciando, por favor aguarde...", + "header": "Home Assistant está iniciando..." } }, "changed_toast": { @@ -2292,7 +2295,8 @@ "attribute_not_found": "O atributo {attribute} não está disponível em: {entity}", "entity_non_numeric": "Entidade não é numérica: {entity}", "entity_not_found": "Entidade não disponível: {entity}", - "entity_unavailable": "{entity} não está disponível" + "entity_unavailable": "{entity} não está disponível", + "starting": "Home Assistant está iniciando, algumas funcionalidades podem estar indisponíveis" } }, "mailbox": { diff --git a/translations/frontend/pt.json b/translations/frontend/pt.json index 5b2e087e69..6d2b4f4d24 100644 --- a/translations/frontend/pt.json +++ b/translations/frontend/pt.json @@ -1029,8 +1029,7 @@ "manage_entities": "Gerir Entidades", "state_reporting_error": "Indisponível para {enable_disable} reportar estado.", "sync_entities": "Sincronizar Entidades", - "sync_entities_error": "Falha na sincronização das entidades:", - "title": "" + "sync_entities_error": "Falha na sincronização das entidades:" }, "connected": "Ligado", "connection_status": "Estado da ligação na cloud", @@ -1048,8 +1047,7 @@ "manage_entities": "Gerir Entidades", "security_devices": "Dispositivos de segurança", "sync_entities": "Sincronizar entidades com o Google", - "sync_entities_404_message": "Falha ao sincronizar suas entidades com o Google, peça ao Google 'Ok Google, sincronize os meus dispositivos' para sincronizar suas entidades.", - "title": "" + "sync_entities_404_message": "Falha ao sincronizar suas entidades com o Google, peça ao Google 'Ok Google, sincronize os meus dispositivos' para sincronizar suas entidades." }, "integrations": "Integrações", "integrations_introduction": "As integrações para o Home Assistant Cloud permitem-lhe ligar-se aos serviços na nuvem sem ter de expor publicamente o seu Home Assistant na Internet.", @@ -1078,8 +1076,7 @@ "no_hooks_yet": "Parece que você ainda não tem webhooks. Comece, configurando um", "no_hooks_yet_link_automation": "automação de webhook", "no_hooks_yet_link_integration": "integração baseada em webhook", - "no_hooks_yet2": " ou criando um ", - "title": "" + "no_hooks_yet2": " ou criando um " } }, "alexa": { @@ -1113,7 +1110,6 @@ }, "forgot_password": { "check_your_email": "Verifique o seu e-mail para obter instruções sobre como redefinir a sua senha.", - "email": "", "email_error_msg": "E-mail inválido", "instructions": "Introduza o seu endereço de e-mail e nós lhe enviaremos um link para redefinir sua password.", "send_reset_email": "Enviar e-mail de redefinição", @@ -1133,7 +1129,6 @@ "alert_email_confirm_necessary": "É necessário confirmar o seu e-mail antes de fazer login.", "alert_password_change_required": "É necessário alterar a sua password antes de fazer login.", "dismiss": "Fechar", - "email": "", "email_error_msg": "E-mail inválido", "forgot_password": "Esqueceu-se da senha?", "introduction": "O Home Assistant Cloud fornece uma conexão remota segura à sua instância enquanto estiver fora de casa. Também permite que você se conecte com serviços que apenas utilizam a nuvem: Amazon Alexa e Google Assistant.", @@ -1880,7 +1875,6 @@ "custom_uis": "IUs personalizados:", "developed_by": "Desenvolvido por um punhado de pessoas incríveis.", "documentation": "Documentação", - "frontend": "", "frontend_version": "Versão frontend: {version} - {type}", "home_assistant_logo": "Logotipo do Home Assistant", "icons_by": "Ícones por", diff --git a/translations/frontend/sv.json b/translations/frontend/sv.json index 350219cd6c..3938ba4ee2 100644 --- a/translations/frontend/sv.json +++ b/translations/frontend/sv.json @@ -1035,8 +1035,7 @@ "manage_entities": "Hantera Entiteter", "state_reporting_error": "Det går inte att {enable_disable} rapportera tillståndet.", "sync_entities": "Synkronisera Entiteter", - "sync_entities_error": "Det gick inte att synkronisera entiteter:", - "title": "" + "sync_entities_error": "Det gick inte att synkronisera entiteter:" }, "connected": "Ansluten", "connection_status": "Status för molnanslutning", @@ -1084,16 +1083,14 @@ "no_hooks_yet": "Ser ut som du inte har några webhooks ännu. Kom igång genom att konfigurera en ", "no_hooks_yet_link_automation": "webhook automation", "no_hooks_yet_link_integration": "webhook-baserad integration", - "no_hooks_yet2": " eller genom att skapa en ", - "title": "" + "no_hooks_yet2": " eller genom att skapa en " } }, "alexa": { "banner": "Redigering av vilka entiteter som visas via det här användargränssnittet är inaktiverat eftersom du har konfigurerat entitetsfilter i configuration.yaml.", "expose": "Exponera för Alexa", "exposed_entities": "Exponerade entiteter", - "not_exposed_entities": "Ej exponerade entiteter", - "title": "" + "not_exposed_entities": "Ej exponerade entiteter" }, "caption": "Home Assistant Cloud", "description_features": "Styra även när du inte är hemma, integrera med Alexa och Google Assistant.", @@ -2116,8 +2113,6 @@ "icon_height": "Ikonhöjd", "image": "Bildsökväg", "manual": "Manuell", - "maximum": "", - "minimum": "", "name": "Namn", "no_theme": "Inget tema", "refresh_interval": "Uppdateringsintervall", From e384f76ac1002729b326d1ba534e9dd18da48766 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 5 Jun 2020 21:56:56 -0700 Subject: [PATCH 13/39] Make two builds of hassio (#6105) --- build-scripts/bundle.js | 7 ++----- build-scripts/gulp/hassio.js | 23 +++++++++++++++++++++++ build-scripts/gulp/rollup.js | 13 ++----------- build-scripts/gulp/webpack.js | 5 ++--- build-scripts/paths.js | 2 +- hassio/webpack.config.js | 9 +++------ 6 files changed, 33 insertions(+), 26 deletions(-) diff --git a/build-scripts/bundle.js b/build-scripts/bundle.js index 6fdce58edb..5433c4e59d 100644 --- a/build-scripts/bundle.js +++ b/build-scripts/bundle.js @@ -170,15 +170,12 @@ module.exports.config = { }, hassio({ isProdBuild, latestBuild }) { - if (latestBuild) { - throw new Error("Hass.io does not support latest build!"); - } return { entry: { entrypoint: path.resolve(paths.hassio_dir, "src/entrypoint.ts"), }, - outputPath: paths.hassio_output_root, - publicPath: paths.hassio_publicPath, + outputPath: outputPath(paths.hassio_output_root, latestBuild), + publicPath: publicPath(latestBuild, paths.hassio_publicPath), isProdBuild, latestBuild, dontHash: new Set(["entrypoint"]), diff --git a/build-scripts/gulp/hassio.js b/build-scripts/gulp/hassio.js index 595752008c..858a58e263 100644 --- a/build-scripts/gulp/hassio.js +++ b/build-scripts/gulp/hassio.js @@ -1,6 +1,9 @@ const gulp = require("gulp"); +const fs = require("fs"); +const path = require("path"); const env = require("../env"); +const paths = require("../paths"); require("./clean.js"); require("./gen-icons-json.js"); @@ -8,6 +11,24 @@ require("./webpack.js"); require("./compress.js"); require("./rollup.js"); +async function writeEntrypointJS() { + // We ship two builds and we need to do feature detection on what version to load. + fs.mkdirSync(paths.hassio_output_root, { recursive: true }); + fs.writeFileSync( + path.resolve(paths.hassio_output_root, "entrypoint.js"), + ` +try { + new Function("import('${paths.hassio_publicPath}/frontend_latest/entrypoint.js')")(); +} catch (err) { + var el = document.createElement('script'); + el.src = '${paths.hassio_publicPath}/frontend_es5/entrypoint.js'; + document.body.appendChild(el); +} + `, + { encoding: "utf-8" } + ); +} + gulp.task( "develop-hassio", gulp.series( @@ -16,6 +37,7 @@ gulp.task( }, "clean-hassio", "gen-icons-json", + writeEntrypointJS, env.useRollup() ? "rollup-watch-hassio" : "webpack-watch-hassio" ) ); @@ -29,6 +51,7 @@ gulp.task( "clean-hassio", "gen-icons-json", env.useRollup() ? "rollup-prod-hassio" : "webpack-prod-hassio", + writeEntrypointJS, ...// Don't compress running tests (env.isTest() ? [] : ["compress-hassio"]) ) diff --git a/build-scripts/gulp/rollup.js b/build-scripts/gulp/rollup.js index b186f15407..bfb7d941c1 100644 --- a/build-scripts/gulp/rollup.js +++ b/build-scripts/gulp/rollup.js @@ -92,11 +92,7 @@ gulp.task("rollup-watch-app", () => { }); gulp.task("rollup-watch-hassio", () => { - watchRollup( - // Force latestBuild = false for hassio config. - (conf) => rollupConfig.createHassioConfig({ ...conf, latestBuild: false }), - ["hassio/src/**"] - ); + watchRollup(rollupConfig.createHassioConfig, ["hassio/src/**"]); }); gulp.task("rollup-dev-server-demo", () => { @@ -137,12 +133,7 @@ gulp.task( ); gulp.task("rollup-prod-hassio", () => - buildRollup( - rollupConfig.createHassioConfig({ - isProdBuild: true, - latestBuild: false, - }) - ) + bothBuilds(rollupConfig.createHassioConfig, { isProdBuild: true }) ); gulp.task("rollup-prod-gallery", () => diff --git a/build-scripts/gulp/webpack.js b/build-scripts/gulp/webpack.js index e7e58eb726..38fba59640 100644 --- a/build-scripts/gulp/webpack.js +++ b/build-scripts/gulp/webpack.js @@ -129,7 +129,7 @@ gulp.task("webpack-watch-hassio", () => { webpack( createHassioConfig({ isProdBuild: false, - latestBuild: false, + latestBuild: true, }) ).watch({}, handler()); }); @@ -139,9 +139,8 @@ gulp.task( () => new Promise((resolve) => webpack( - createHassioConfig({ + bothBuilds(createHassioConfig, { isProdBuild: true, - latestBuild: false, }), handler(resolve) ) diff --git a/build-scripts/paths.js b/build-scripts/paths.js index 8289890c59..0a3e4fe79d 100644 --- a/build-scripts/paths.js +++ b/build-scripts/paths.js @@ -34,7 +34,7 @@ module.exports = { hassio_dir: path.resolve(__dirname, "../hassio"), hassio_output_root: path.resolve(__dirname, "../hassio/build"), - hassio_publicPath: "/api/hassio/app/", + hassio_publicPath: "/api/hassio/app", translations_src: path.resolve(__dirname, "../src/translations"), }; diff --git a/hassio/webpack.config.js b/hassio/webpack.config.js index 222b20ef84..429c98e6b2 100644 --- a/hassio/webpack.config.js +++ b/hassio/webpack.config.js @@ -1,11 +1,8 @@ const { createHassioConfig } = require("../build-scripts/webpack.js"); -const { isProdBuild } = require("../build-scripts/env.js"); - -// File just used for stats builds - -const latestBuild = false; +const { isProdBuild, isStatsBuild } = require("../build-scripts/env.js"); module.exports = createHassioConfig({ isProdBuild: isProdBuild(), - latestBuild, + isStatsBuild: isStatsBuild(), + latestBuild: true, }); From 3099748a6dd89422150dd2105560a2d4a8cba9a7 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Sun, 7 Jun 2020 00:32:42 +0000 Subject: [PATCH 14/39] [ci skip] Translation update --- translations/frontend/de.json | 7 ++-- translations/frontend/fr.json | 60 +++++++++++++++++------------------ 2 files changed, 35 insertions(+), 32 deletions(-) diff --git a/translations/frontend/de.json b/translations/frontend/de.json index 9d49db464a..7eb5bbab05 100644 --- a/translations/frontend/de.json +++ b/translations/frontend/de.json @@ -478,6 +478,7 @@ "cancel": "Abbrechen", "close": "Schließen", "delete": "Löschen", + "error_required": "Benötigt", "loading": "Laden", "next": "Weiter", "no": "Nein", @@ -1221,6 +1222,7 @@ "different_include": "Möglich über eine Domain, einen Glob oder einen anderen Include.", "pick_attribute": "Wähle ein Attribut zum Überschreiben aus.", "picker": { + "entity": "Entität", "header": "Anpassungen", "introduction": "Optimieren Sie die Entitätenattribute. Hinzugefügte/bearbeitete Anpassungen werden sofort wirksam. Entfernte Anpassungen werden wirksam, wenn die Entität aktualisiert wird." }, @@ -1864,7 +1866,8 @@ "ozw_log": { "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" + "last_log_lines": "Anzahl der letzten Logzeilen", + "load": "Laden" }, "services": { "add_node": "Knoten hinzufügen", @@ -2045,7 +2048,7 @@ "clear_items": "Markierte Elemente löschen" }, "starting": { - "description": "Home Assistant startet, bitte warten Sie.", + "description": "Home Assistant startet, bitte warten Sie..", "header": "Home Assistant startet ..." } }, diff --git a/translations/frontend/fr.json b/translations/frontend/fr.json index 57e75234fe..36d841b1c0 100644 --- a/translations/frontend/fr.json +++ b/translations/frontend/fr.json @@ -524,7 +524,7 @@ }, "related-items": { "area": "Pièce", - "automation": "Partie des automations suivantes", + "automation": "Partie des automatisations suivantes", "device": "Appareil", "entity": "Entités liées", "group": "Partie des groupes suivants", @@ -786,8 +786,8 @@ } }, "automation": { - "caption": "Automations", - "description": "Créer et modifier des automations.", + "caption": "Automatisations", + "description": "Créer et modifier des automatisations", "editor": { "actions": { "add": "Ajouter une action", @@ -795,7 +795,7 @@ "delete_confirm": "Voulez-vous vraiment effacer ?", "duplicate": "Dupliquer", "header": "Actions", - "introduction": "Les actions sont ce que Home Assistant fera quand une automation est déclenchée.", + "introduction": "Les actions sont ce que Home Assistant fera quand une automatisation est déclenchée.", "learn_more": "En savoir plus sur les actions", "name": "Action", "type_select": "Type d'action", @@ -900,17 +900,17 @@ }, "unsupported_condition": "Condition non supportée: {condition}" }, - "default_name": "Nouvelle automation", + "default_name": "Nouvelle automatisation", "description": { "label": "Description", "placeholder": "Description optionnelle" }, "edit_ui": "Modifier avec l'interface utilisateur", "edit_yaml": "Modifier en tant que YAML", - "enable_disable": "Activer/Désactiver l'automation", - "introduction": "Utilisez les automations pour donner vie à votre maison", - "load_error_not_editable": "Seules les automations dans automations.yaml sont modifiables.", - "load_error_unknown": "Erreur lors du chargement de l'automation ( {err_no} ).", + "enable_disable": "Activer/Désactiver l'automatisation", + "introduction": "Utilisez les automatisations pour donner vie à votre maison", + "load_error_not_editable": "Seules les automatisations dans automations.yaml sont modifiables.", + "load_error_unknown": "Erreur lors du chargement de l'automatisation ( {err_no} ).", "save": "Sauvegarder", "triggers": { "add": "Ajouter un déclencheur", @@ -918,7 +918,7 @@ "delete_confirm": "Voulez-vous effacer ?", "duplicate": "Dupliquer", "header": "Déclencheurs", - "introduction": "Les déclencheurs sont ce qui lance le traitement d'une règle d'automation. Il est possible de spécifier plusieurs déclencheurs pour une même règle. Dès qu'un déclencheur est activé, Home Assistant validera les conditions, s'il y en a, et appellera l'action.\n\n[En apprendre plus sur les déclencheurs.](https://home-assistant.io/docs/automation/trigger/)", + "introduction": "Les déclencheurs sont ce qui lance le traitement d'une règle d'automatisation. Il est possible de spécifier plusieurs déclencheurs pour une même règle. Dès qu'un déclencheur est activé, Home Assistant validera les conditions, s'il y en a, et appellera l'action.\n\n[En apprendre plus sur les déclencheurs.](https://home-assistant.io/docs/automation/trigger/)", "learn_more": "En savoir plus sur les déclencheurs", "name": "Déclencheur", "type_select": "Type de déclencheur", @@ -1007,20 +1007,20 @@ "unsaved_confirm": "Vous avez des changements non enregistrés. Êtes-vous sûr de vouloir quitter?" }, "picker": { - "add_automation": "Ajouter une automation", - "delete_automation": "Supprimer l'automation", - "delete_confirm": "Voulez-vous vraiment supprimer cette automation ?", - "edit_automation": "Modifier l'automation", - "header": "Éditeur d'automation", + "add_automation": "Ajouter une automatisation", + "delete_automation": "Supprimer l'automatisation", + "delete_confirm": "Voulez-vous vraiment supprimer cette automatisation ?", + "edit_automation": "Modifier l'automatisation", + "header": "Éditeur d'automatisation", "headers": { "name": "Nom" }, - "introduction": "L'éditeur d'automations vous permet de créer et modifier des automations. Veuillez lire les instructions ci-dessous pour vous assurer d'avoir configuré Home Assistant correctement.", - "learn_more": "En savoir plus sur les automations", - "no_automations": "Il n'y a aucune automation modifiable.", - "only_editable": "Seules les automations définies dans automations.yaml sont modifiables.", - "pick_automation": "Choisissez l'automation à modifier", - "show_info_automation": "Afficher des informations sur l'automation" + "introduction": "L'éditeur d'automatisation vous permet de créer et éditer des automatisations. Veuillez lire les instructions ci-dessous pour vous assurer d'avoir configuré Home-Assistant correctement.", + "learn_more": "En savoir plus sur les automatisations", + "no_automations": "Il n'y a aucune automatisation modifiable", + "only_editable": "Seules les automatisations définies dans automations.yaml sont modifiables.", + "pick_automation": "Choisissez l'automatisation à modifier", + "show_info_automation": "Afficher des informations sur l'automatisation" } }, "cloud": { @@ -1079,7 +1079,7 @@ "webhooks": { "disable_hook_error_msg": "Impossible de désactiver le Webhook:", "info": "Tout ce qui est configuré pour être déclenché par un Webhook peut recevoir une URL accessible publiquement pour vous permettre de renvoyer des données à Home Assistant de n’importe où, sans exposer votre instance à Internet.", - "link_learn_more": "En savoir plus sur la création d'automations basées sur Webhook.", + "link_learn_more": "En savoir plus sur la création d'automatisations basées sur Webhook.", "loading": "Chargement ...", "manage": "Gérer", "no_hooks_yet": "Il semble que vous n'ayez pas encore de Webhooks. Commencez en configurer un ", @@ -1237,13 +1237,13 @@ "actions": { "caption": "Quand quelque chose est déclenché ..." }, - "automations": "Automations", + "automations": "Automatisations", "conditions": { "caption": "Ne faire quelque chose que si ..." }, - "create": "Créer une automation avec l'appareil", - "no_automations": "Aucune automation", - "no_device_automations": "Aucune automation n'est disponible pour cet appareil.", + "create": "Créer une automatisation avec l'appareil", + "no_automations": "Aucune automatisation", + "no_device_automations": "Aucune automatisation n'est disponible pour cet appareil.", "triggers": { "caption": "Faire quelque chose quand ..." } @@ -1344,7 +1344,7 @@ "header": "Configurer Home Assistant", "helpers": { "caption": "Entrées", - "description": "Éléments pouvant aider à construire des automations.", + "description": "Éléments pouvant aider à construire des automatisations.", "dialog": { "add_helper": "Ajouter une entrée", "add_platform": "Ajouter {platform}", @@ -1619,7 +1619,7 @@ "description": "Redémarrer et arrêter le serveur Home Assistant", "section": { "reloading": { - "automation": "Recharger les automations", + "automation": "Recharger les automatisations", "core": "Recharger l'emplacement et les personnalisations", "group": "Recharger les groupes", "heading": "Rechargement de la configuration", @@ -1799,7 +1799,7 @@ "name": "Nom", "new_zone": "Nouvelle zone", "passive": "Passif", - "passive_note": "Les zones passives sont cachées dans l'interface utilisateur et ne sont pas utilisées comme emplacement pour les appareils suivis. Elles sont utiles si vous voulez les utiliser pour des automations.", + "passive_note": "Les zones passives sont cachées dans l'interface utilisateur et ne sont pas utilisées comme emplacement pour les appareils suivis. Elles sont utiles si vous voulez les utiliser pour des automatisations.", "radius": "Rayon", "required_error_msg": "Ce champ est requis", "update": "Mettre à jour" @@ -1808,7 +1808,7 @@ "edit_home_zone_narrow": "Le rayon de la zone d'habitation ne peut pas encore être modifié depuis le frontend. L'emplacement peut être modifié par rapport à la configuration générale.", "go_to_core_config": "Aller à la configuration générale ?", "home_zone_core_config": "L'emplacement de votre zone d'habitation est modifiable à partir de la page de configuration générale. Le rayon de la zone d'habitation ne peut pas encore être modifié depuis le frontend. Voulez-vous passer à la configuration générale ?", - "introduction": "Les zones vous permettent de spécifier certaines régions sur la terre. Lorsqu'une personne se trouve dans une zone, l'état prend le nom de la zone. Les zones peuvent également être utilisées comme déclencheur ou condition dans les configurations d'automation.", + "introduction": "Les zones vous permettent de spécifier certaines régions sur la terre. Lorsqu'une personne se trouve dans une zone, l'état prend le nom de la zone. Les zones peuvent également être utilisées comme déclencheur ou condition dans les configurations d'automatisation.", "no_zones_created_yet": "Il semble que vous n'ayez pas encore créé de zones." }, "zwave": { From 23bdc03f299f61795e03998a5a7239c12edf311b Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Mon, 8 Jun 2020 00:32:36 +0000 Subject: [PATCH 15/39] [ci skip] Translation update --- translations/frontend/pl.json | 2 +- translations/frontend/pt.json | 22 +++++++++++++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/translations/frontend/pl.json b/translations/frontend/pl.json index b0ea5b2d59..b086fdbaee 100644 --- a/translations/frontend/pl.json +++ b/translations/frontend/pl.json @@ -1321,7 +1321,7 @@ "introduction": "Home Assistant prowadzi rejestr każdej encji, jaką kiedykolwiek widział i którą można jednoznacznie zidentyfikować. Każda z tych encji będzie miała przypisany unikalny identyfikator, który będzie zarezerwowany tylko dla niej.", "introduction2": "Użyj rejestru encji, aby nadpisać jej nazwę, zmienić jej identyfikator lub usunąć ją z Home Assistant'a. Uwaga: usunięcie wpisu rejestru encji nie spowoduje usunięcia encji. Aby to zrobić, kliknij poniższy link i usuń integracje encji.", "remove_selected": { - "button": "Usuń zaznaczone", + "button": "Usuń wybrane", "confirm_partly_text": "Można usunąć tylko {removable} z wybranych {selected} encji. Encje można usunąć tylko wtedy, gdy integracja wspiera taka możliwość. Czasami trzeba ponownie uruchomić Home Assistanta, zanim będzie można usunąć encje usuniętej integracji. Czy na pewno chcesz usunąć usuwalne encje?", "confirm_partly_title": "Tylko {number} wybrane encje można usunąć.", "confirm_text": "Encje mogą zostać usunięte tylko wtedy, gdy ich integracja na to zezwala.", diff --git a/translations/frontend/pt.json b/translations/frontend/pt.json index 6d2b4f4d24..a720810a63 100644 --- a/translations/frontend/pt.json +++ b/translations/frontend/pt.json @@ -478,6 +478,7 @@ "cancel": "Cancelar", "close": "Fechar", "delete": "Apagar", + "error_required": "Obrigatório", "loading": "A carregar", "next": "Seguinte", "no": "Não", @@ -506,6 +507,7 @@ "device-picker": { "clear": "Apagar", "device": "Dispositivo", + "no_area": "Sem área", "show_devices": "Mostrar dispositivos", "toggle": "Alternar" }, @@ -738,6 +740,8 @@ "notification_toast": { "connection_lost": "Ligação perdida. A ligar de novo...", "service_call_failed": "Falha ao chamar o serviço {service}.", + "started": "Home Assistant já iniciou", + "starting": "Home Assistant está a inicializar, nem tudo estará disponivel até o processo concluir.", "triggered": "Despoletado {name}" }, "panel": { @@ -762,10 +766,12 @@ }, "description": "Visão geral de todas as áreas da sua casa.", "editor": { + "area_id": "ID da área", "create": "Criar", "default_name": "Nova área", "delete": "Apagar", "name": "Nome", + "name_required": "Nome é obrigatório", "unknown_error": "Erro desconhecido", "update": "Atualizar" }, @@ -1209,6 +1215,7 @@ "description": "Personalizar as suas entidades", "pick_attribute": "Escolha um atributo para substituir.", "picker": { + "entity": "Entidade", "header": "Personalizações", "introduction": "Ajustar atributos por entidade. Personalizações acrescentadas/editadas terão efeitos imediatos. Remoção de personalizações terão efeito quando a entidade for atualizada." }, @@ -1245,6 +1252,7 @@ "integration": "Integração", "manufacturer": "Fabricante", "model": "Modelo", + "no_area": "Sem área", "no_devices": "Sem dispositivos" }, "delete": "Apagar", @@ -1253,6 +1261,7 @@ "device_not_found": "Dispositivo não encontrado.", "entities": { "add_entities_lovelace": "Adicionar ao Lovelace", + "disabled_entities": "+{count} {count, plural,\n uma {entity}\n outras {entities}\n}", "entities": "Entidades", "hide_disabled": "Mostrar entidades desativadas", "none": "Este dispositivo não possui entidades" @@ -1357,6 +1366,8 @@ "delete_button": "Apagar {integration}", "delete_confirm": "Tem a certeza que pretende apagar esta integração?", "device_unavailable": "Dispositivo indisponível", + "devices": "{count} {count, plural,\n um {entity}\n outros {entities}\n}", + "entities": "{count} {count, plural,\n uma {entity}\n outras {entities}\n}", "entity_unavailable": "Entidade indisponível", "firmware": "Firmware: {version}", "hub": "Conectado via", @@ -1822,6 +1833,9 @@ "set_wakeup": "Definir intervalo de acordar", "true": "Verdadeiro" }, + "node_management": { + "exclude_entity": "Excluir esta entidade do Home Assistant" + }, "ozw_log": { "header": "Log OZW", "introduction": "Veja o log. 0 é o mínimo (carrega o log inteiro) e 1000 é o máximo. Ao carregar irá ser mostrado um log estático e a cauda será atualizada automaticamente com o último número especificado de linhas do log." @@ -1831,6 +1845,7 @@ "add_node_secure": "Adicionar nó seguro", "cancel_command": "Cancelar comando", "heal_network": "Curar a Rede", + "refresh_entity": "Actualizar entidade", "remove_node": "Remover nó", "save_config": "Guardar configuração", "soft_reset": "Reinicio suave", @@ -1994,6 +2009,10 @@ "add_item": "Adicionar Item", "checked_items": "Itens marcados", "clear_items": "Limpar itens marcados" + }, + "starting": { + "description": "Home Assistant está a inicializar, por favor aguarde...", + "header": "Home Assistant está a inicializar..." } }, "changed_toast": { @@ -2283,7 +2302,8 @@ "attribute_not_found": "Atributo {attribute} não disponível em: {entity}", "entity_non_numeric": "A entidade é não numérica: {entity}", "entity_not_found": "Entidade não disponível: {entity}", - "entity_unavailable": "{entity} está indisponível no momento" + "entity_unavailable": "{entity} está indisponível no momento", + "starting": "Home Assistant está a inicializar, nem tudo está já disponivel" } }, "mailbox": { From 34ac80567e89f6c31714ed0bba7cae8335d35b72 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2020 09:56:45 +0200 Subject: [PATCH 16/39] Bump websocket-extensions from 0.1.3 to 0.1.4 (#6117) Bumps [websocket-extensions](https://github.com/faye/websocket-extensions-node) from 0.1.3 to 0.1.4. - [Release notes](https://github.com/faye/websocket-extensions-node/releases) - [Changelog](https://github.com/faye/websocket-extensions-node/blob/master/CHANGELOG.md) - [Commits](https://github.com/faye/websocket-extensions-node/compare/0.1.3...0.1.4) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 3354f10e19..40e0b87b48 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11997,9 +11997,9 @@ websocket-driver@>=0.5.1: websocket-extensions ">=0.1.1" websocket-extensions@>=0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" - integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== which-module@^1.0.0: version "1.0.0" From 4d7ad0dc51bb29500457de6119b3fbe77fcea0d6 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Tue, 9 Jun 2020 00:32:32 +0000 Subject: [PATCH 17/39] [ci skip] Translation update --- translations/frontend/es-419.json | 10 +++- translations/frontend/et.json | 4 ++ translations/frontend/lb.json | 3 +- translations/frontend/nb.json | 87 +++++++++++++++++++++++++------ translations/frontend/nl.json | 3 ++ translations/frontend/pl.json | 32 ++++++------ translations/frontend/pt-BR.json | 36 ++++++++++++- translations/frontend/pt.json | 12 +++-- translations/frontend/sl.json | 50 ++++++++++++++++-- translations/frontend/sv.json | 11 ++-- 10 files changed, 203 insertions(+), 45 deletions(-) diff --git a/translations/frontend/es-419.json b/translations/frontend/es-419.json index b2e2661a79..e0511c0a46 100644 --- a/translations/frontend/es-419.json +++ b/translations/frontend/es-419.json @@ -13,9 +13,15 @@ }, "panel": { "calendar": "Calendario", + "config": "", "developer_tools": "Herramientas para desarrolladores", + "history": "", + "logbook": "", + "mailbox": "", + "map": "", "profile": "Perfil", - "shopping_list": "Lista de compras" + "shopping_list": "Lista de compras", + "states": "" }, "state_attributes": { "climate": { @@ -1788,6 +1794,7 @@ "no_zones_created_yet": "Parece que todavía no ha creado ninguna zona." }, "zwave": { + "caption": "", "common": { "index": "Índice", "instance": "Instancia", @@ -1906,6 +1913,7 @@ "start_listening": "Comenzar a escuchar", "stop_listening": "Deja de escuchar", "subscribe_to": "Tema para suscribirse", + "title": "", "topic": "tema" }, "services": { diff --git a/translations/frontend/et.json b/translations/frontend/et.json index 0722c2b79e..1f1a88221c 100644 --- a/translations/frontend/et.json +++ b/translations/frontend/et.json @@ -875,6 +875,10 @@ "at": "Kell", "label": "Aeg" }, + "webhook": { + "label": "", + "webhook_id": "" + }, "zone": { "enter": "Sisenemine", "entity": "Asukohaga olem", diff --git a/translations/frontend/lb.json b/translations/frontend/lb.json index 9ba991d11f..c9ca4af75a 100644 --- a/translations/frontend/lb.json +++ b/translations/frontend/lb.json @@ -1869,7 +1869,8 @@ "header": "OZW Log", "introduction": "Logbicher kucken. 0 ass de minimum (luet de ganze Log) an 1000 ass de maximum. Luede weist ee statesche Log an \"tail\" aktualiséiert de Log automatesch mat de leschten Zeile vum Log.", "last_log_lines": "Unzuel vun läschte Log Zeilen", - "load": "Lueden" + "load": "Lueden", + "tail": "ogon,ślad" }, "services": { "add_node": "Apparat dobäisetzen", diff --git a/translations/frontend/nb.json b/translations/frontend/nb.json index 02c9456328..d88a8870a4 100644 --- a/translations/frontend/nb.json +++ b/translations/frontend/nb.json @@ -26,6 +26,7 @@ "state_attributes": { "climate": { "fan_mode": { + "auto": "", "off": "Av", "on": "På" }, @@ -100,6 +101,7 @@ "on": "Lavt" }, "cold": { + "off": "", "on": "Kald" }, "connectivity": { @@ -150,6 +152,10 @@ "off": "Borte", "on": "Hjemme" }, + "problem": { + "off": "", + "on": "" + }, "safety": { "off": "Sikker", "on": "Usikker" @@ -219,6 +225,7 @@ "locked": "Låst", "not_home": "Borte", "off": "Av", + "ok": "", "on": "På", "open": "Åpen", "opening": "Åpner", @@ -250,6 +257,7 @@ "home": "Hjemme" }, "plant": { + "ok": "", "problem": "Problem" }, "remote": { @@ -355,6 +363,7 @@ "low": "lav", "on_off": "På / av", "operation": "Operasjon", + "preset_mode": "", "swing_mode": "Svingmodus", "target_humidity": "Ønsket luftfuktighet", "target_temperature": "Ønsket temperatur", @@ -410,7 +419,9 @@ "timer": { "actions": { "cancel": "Avbryt", - "finish": "Ferdig" + "finish": "Ferdig", + "pause": "", + "start": "" } }, "vacuum": { @@ -442,10 +453,12 @@ "e": "Ø", "ene": "ØNØ", "ese": "ØSØ", + "n": "", "ne": "NØ", "nne": "NNØ", "nnw": "NNV", "nw": "NV", + "s": "", "se": "SØ", "sse": "SSØ", "ssw": "SSV", @@ -570,7 +583,8 @@ "generic": { "cancel": "Avbryt", "close": "Lukk", - "default_confirmation_title": "Er du sikker?" + "default_confirmation_title": "Er du sikker?", + "ok": "" }, "helper_settings": { "generic": { @@ -641,8 +655,11 @@ "commands": "Støvsugerkommandoer:", "fan_speed": "Viftehastighet", "locate": "Lokaliser", + "pause": "", "return_home": "Returner hjem", + "start": "", "start_pause": "Start / Pause", + "status": "", "stop": "Stopp" } }, @@ -688,6 +705,7 @@ "manuf": "av {manufacturer}", "no_area": "Intet område", "power_source": "Strømkilde", + "quirk": "", "services": { "reconfigure": "Rekonfigurer ZHA-enhet (heal enhet). Bruk dette hvis du har problemer med enheten. Hvis den aktuelle enheten er en batteridrevet enhet, sørg for at den er våken og aksepterer kommandoer når du bruker denne tjenesten.", "remove": "Fjern en enhet fra Zigbee-nettverket.", @@ -929,9 +947,12 @@ }, "homeassistant": { "event": "Hendelse:", - "shutdown": "Slå av" + "label": "", + "shutdown": "Slå av", + "start": "" }, "mqtt": { + "label": "", "payload": "Nyttelast (valgfritt)", "topic": "Emne" }, @@ -942,6 +963,7 @@ "value_template": "Verdi fra mal (valgfritt)" }, "state": { + "for": "", "from": "Fra", "label": "Tilstand", "to": "Til" @@ -967,6 +989,10 @@ "at": "Klokken", "label": "Tid" }, + "webhook": { + "label": "", + "webhook_id": "" + }, "zone": { "enter": "Ankommer", "entity": "Entitet med posisjon", @@ -1010,7 +1036,8 @@ "manage_entities": "Håndtér entiteter", "state_reporting_error": "Kan ikke {enable_disable} rapportere status.", "sync_entities": "Synkronisér entiteter", - "sync_entities_error": "Kunne ikke synkronisere entiteter:" + "sync_entities_error": "Kunne ikke synkronisere entiteter:", + "title": "" }, "connected": "Tilkoblet", "connection_status": "Status for skytilkobling", @@ -1028,7 +1055,8 @@ "manage_entities": "Håndtér entiteter", "security_devices": "Sikkerhetsenheter", "sync_entities": "Synkronisér entiteter til Google", - "sync_entities_404_message": "Kunne ikke synkronisere enhetene dine med Google, be Google 'Hei Google, synkroniser enhetene mine' for å synkronisere enhetene dine." + "sync_entities_404_message": "Kunne ikke synkronisere enhetene dine med Google, be Google 'Hei Google, synkroniser enhetene mine' for å synkronisere enhetene dine.", + "title": "" }, "integrations": "Integrasjoner", "integrations_introduction": "Integrasjoner for Home Assistant Cloud lar deg koble til tjenester i skyen uten å måtte avsløre Home Assistant-forekomsten offentlig på internett.", @@ -1057,15 +1085,18 @@ "no_hooks_yet": "Ser ut som du ikke har noen webhooks ennå. Kom i gang ved å konfigurere en ", "no_hooks_yet_link_automation": "webhook-automasjon", "no_hooks_yet_link_integration": "webhook-basert integrasjon", - "no_hooks_yet2": " eller ved å opprette en " + "no_hooks_yet2": " eller ved å opprette en ", + "title": "" } }, "alexa": { "banner": "Redigere hvilke entiteter som vises via dette grensesnittet er deaktivert fordi du har konfigurert entitetsfiltre i configuration.yaml.", "expose": "Eksponer til Alexa", "exposed_entities": "Eksponerte entiteter", - "not_exposed_entities": "Ikke-eksponerte entiteter" + "not_exposed_entities": "Ikke-eksponerte entiteter", + "title": "" }, + "caption": "", "description_features": "Kontroller borte fra hjemmet, integrer med Alexa og Google Assistant.", "description_login": "Logget inn som {email}", "description_not_login": "Ikke pålogget", @@ -1102,7 +1133,8 @@ "expose": "Eksponer til Google Assistant", "exposed_entities": "Eksponerte entiteter", "not_exposed_entities": "Ikke-eksponerte entiteter", - "sync_to_google": "Synkroniserer endringer til Google." + "sync_to_google": "Synkroniserer endringer til Google.", + "title": "" }, "login": { "alert_email_confirm_necessary": "Du må bekrefte e-posten din før du logger inn.", @@ -1274,6 +1306,7 @@ "confirm_title": "Vil du aktivere {number} enheter?" }, "filter": { + "filter": "", "show_disabled": "Vis deaktiverte entiteter", "show_readonly": "Vis skrivebeskyttede enheter", "show_unavailable": "Vis utilgjengelige enheter" @@ -1282,7 +1315,8 @@ "headers": { "entity_id": "Entitets-ID", "integration": "Integrasjon", - "name": "Navn" + "name": "Navn", + "status": "" }, "introduction": "Home Assistant bygger opp et register over hver entitet den har sett som kan identifiseres unikt. Hver av disse entitetene vil ha en ID som er reservert kun til denne.", "introduction2": "Bruk entitetsregistret til å overstyre navnet, endre id-en eller fjerne den fra Home Assistant.", @@ -1296,6 +1330,7 @@ "selected": "{number} valgte", "status": { "disabled": "Deaktivert", + "ok": "", "readonly": "Skrivebeskyttet", "restored": "Gjennopprettet", "unavailable": "Utilgjengelig" @@ -1320,13 +1355,15 @@ "headers": { "editable": "Redigerbare", "entity_id": "Entitets-ID", - "name": "Navn" + "name": "Navn", + "type": "" } }, "types": { "input_boolean": "Veksle", "input_datetime": "Dato og/eller klokkeslett", "input_number": "Nummer", + "input_select": "", "input_text": "Tekst" } }, @@ -1427,6 +1464,7 @@ "title": "Tittel", "title_required": "Tittel er påkrevd.", "update": "Oppdater", + "url": "", "url_error_msg": "URLen skal inneholde en - og kan ikke inneholde mellomrom eller spesialtegn, bortsett fra _ og -" }, "picker": { @@ -1454,12 +1492,17 @@ "new_resource": "Legg til ny ressurs", "type": "Ressurstype", "update": "Oppdater", + "url": "", "url_error_msg": "URL-adresse er et obligatorisk felt", "warning_header": "Vær forsiktig!", "warning_text": "Det kan være farlig å legge til ressurser, sørg for at du kjenner kilden til ressursen og stoler på dem. Dårlige ressurser kan skade systemet ditt alvorlig." }, "picker": { "add_resource": "Legg til ressurs", + "headers": { + "type": "", + "url": "" + }, "no_resources": "Ingen ressurser" }, "refresh_body": "Du må oppdatere siden for å fullføre fjerningen, vil du oppdatere nå?", @@ -1616,6 +1659,7 @@ "editor": { "activate_user": "Aktiver bruker", "active": "Aktiv", + "admin": "", "caption": "Vis bruker", "change_password": "Endre passord", "confirm_user_deletion": "Er du sikker på at du vil slette {name} ?", @@ -1634,7 +1678,8 @@ "picker": { "headers": { "group": "Gruppe", - "name": "Navn" + "name": "Navn", + "system": "" } }, "users_privileges_note": "Brukere-gruppen er et pågående arbeid. Brukeren kan ikke administrere forekomsten via brukergrensesnittet. Vi overvåker fortsatt alle API-endepunkter for administrasjonsadministrasjon for å sikre at de begrenser tilgangen til administratorer på riktig måte." @@ -1650,6 +1695,7 @@ "caption": "Legg til enheter", "description": "Legg til enheter i Zigbee-nettverket" }, + "caption": "", "cluster_attributes": { "attributes_of_cluster": "Attributter for den valgte klyngen", "get_zigbee_attribute": "Hent ZigBee-attributt", @@ -1754,6 +1800,7 @@ "new_zone": "Ny sone", "passive": "Passiv", "passive_note": "Passive soner er skjult i grensesnittet og brukes ikke som sted for enhetssporere. Dette er nyttig hvis du bare vil bruke dem til automasjoner.", + "radius": "", "required_error_msg": "Dette feltet er påkrevd", "update": "Oppdater" }, @@ -1884,6 +1931,7 @@ "documentation": "Dokumentasjon", "frontend": "frontend", "frontend_version": "Brukergrensesnittet-versjon: {version} - {type}", + "home_assistant_logo": "", "icons_by": "Ikoner fra", "integrations": "Integrasjoner", "issues": "Problemer", @@ -1923,6 +1971,7 @@ "call_service": "Tilkall tjeneste", "column_description": "Beskrivelse", "column_example": "Eksempel", + "column_parameter": "", "data": "Tjenestedata (YAML, valgfritt)", "description": "Service utviklingsverktøyet lar deg tilkalle alle tilgjengelige tjenester i Home Assistant.", "fill_example_data": "Fyll ut eksempeldata", @@ -1985,6 +2034,7 @@ }, "picture-elements": { "call_service": "Tilkall tjeneste {name}", + "hold": "", "more_info": "Vis mer info: {name}", "navigate_to": "Naviger til {location}", "tap": "Trykk:", @@ -2075,6 +2125,7 @@ "manual": "Manuell", "manual_description": "Trenger du å legge til et tilpasset kort eller bare ønsker å skrive yaml manuelt?", "maximum": "Maksimalt", + "minimum": "", "name": "Navn", "no_theme": "Ingen tema", "refresh_interval": "Oppdateringsintervall", @@ -2086,7 +2137,8 @@ "tap_action": "Trykk handling", "theme": "Tema", "title": "Tittel", - "unit": "Betegnelse" + "unit": "Betegnelse", + "url": "" }, "glance": { "columns": "Kolonner", @@ -2120,7 +2172,8 @@ }, "markdown": { "content": "Innhold", - "description": "Markdown-kortet brukes til å gjengi Markdown." + "description": "Markdown-kortet brukes til å gjengi Markdown.", + "name": "" }, "media-control": { "description": "Media Control-kortet brukes til å vise mediespillerenheter på et grensesnitt med brukervennlige kontroller.", @@ -2149,7 +2202,8 @@ "sensor": { "description": "Sensorkortet gir deg en rask oversikt over sensortilstanden din med en valgfri graf for å visualisere endring over tid.", "graph_detail": "Detaljer for graf", - "graph_type": "Graf type" + "graph_type": "Graf type", + "name": "" }, "shopping-list": { "description": "På Shopping List-kortet kan du legge til, redigere, sjekke av og fjerne gjenstander fra handlelisten din.", @@ -2438,6 +2492,7 @@ "upstairs": "Oppe" }, "unit": { + "minutes_abbr": "", "watching": "Ser på" } } @@ -2490,7 +2545,9 @@ }, "current_user": "Du er logget inn som {fullName}.", "dashboard": { - "description": "Velg et standard instrumentbord for denne enheten." + "description": "Velg et standard instrumentbord for denne enheten.", + "dropdown_label": "", + "header": "" }, "force_narrow": { "description": "Dette vil skjule sidepanelet som standard, tilsvarende opplevelsen på en mobil.", diff --git a/translations/frontend/nl.json b/translations/frontend/nl.json index d431f52ade..447b0b5752 100644 --- a/translations/frontend/nl.json +++ b/translations/frontend/nl.json @@ -914,6 +914,7 @@ "delete": "Verwijderen", "delete_confirm": "Weet je zeker dat je dit item wilt verwijderen?", "duplicate": "Dupliceren", + "header": "", "introduction": "Triggers starten de verwerking van een automatiseringsregel. Het is mogelijk om meerdere triggers voor dezelfde regel op te geven. Zodra een trigger start, valideert Home Assistant de eventuele voorwaarden en roept hij de actie aan.", "learn_more": "Meer informatie over triggers", "name": "Trigger", @@ -943,10 +944,12 @@ }, "homeassistant": { "event": "Gebeurtenis:", + "label": "", "shutdown": "Afsluiten", "start": "Opstarten" }, "mqtt": { + "label": "", "payload": "Payload (optioneel)", "topic": "Onderwerp" }, diff --git a/translations/frontend/pl.json b/translations/frontend/pl.json index b086fdbaee..898522382a 100644 --- a/translations/frontend/pl.json +++ b/translations/frontend/pl.json @@ -35,7 +35,7 @@ "drying": "osuszanie", "fan": "wentylator", "heating": "grzanie", - "idle": "nieaktywny", + "idle": "Bezczynny", "off": "wyłączony" }, "preset_mode": { @@ -324,22 +324,22 @@ }, "query_stage": { "dead": "martwy ({query_stage})", - "initializing": "inicjalizacja ({query_stage})" + "initializing": "Inicjowanie ({query_stage})" } } }, "ui": { "auth_store": { - "ask": "Czy chcesz zapamiętać dane logowania?", - "confirm": "Zapamiętaj", - "decline": "Nie, dziękuję" + "ask": "Czy chcesz pozostać zalogowany?", + "confirm": "Potwierdź", + "decline": "Rezygnuj" }, "card": { "alarm_control_panel": { - "arm_away": "uzbrojenie (nieobecny)", + "arm_away": "Uzbrojenie pod nieobecność", "arm_custom_bypass": "Niestandardowy bypass", "arm_home": "uzbrojenie (w domu)", - "arm_night": "uzbrojenie (noc)", + "arm_night": "Uzbrojenie na noc", "clear_code": "Wyczyść", "code": "Kod", "disarm": "rozbrojenie" @@ -352,12 +352,12 @@ "not_available": "Obraz niedostępny" }, "climate": { - "aux_heat": "Dodatkowe źródło ciepła", + "aux_heat": "Zewnętrznie podłączone źródło", "away_mode": "Tryb poza domem", "cooling": "{name} chłodzenie", "current_temperature": "{name} aktualna temperatura", "currently": "Obecnie", - "fan_mode": "Tryb pracy wentylatora", + "fan_mode": "Tryb nawiewu", "heating": "{name} grzanie", "high": "wysoka", "low": "niska", @@ -392,7 +392,7 @@ "brightness": "Jasność", "color_temperature": "Temperatura barwy", "effect": "Efekt", - "white_value": "Biel" + "white_value": "Wartość bieli" }, "lock": { "code": "Kod", @@ -427,7 +427,7 @@ "vacuum": { "actions": { "resume_cleaning": "Wznów sprzątanie", - "return_to_base": "Wróć do stacji dokującej", + "return_to_base": "Powrót do stacji dokującej", "start_cleaning": "Rozpocznij sprzątanie", "turn_off": "Wyłącz", "turn_on": "Włącz" @@ -442,8 +442,8 @@ }, "weather": { "attributes": { - "air_pressure": "Ciśnienie", - "humidity": "Wilgotność", + "air_pressure": "Ciśnienie atmosferyczne", + "humidity": "Wilgotność powietrza", "precipitation": "Opady", "temperature": "Temperatura", "visibility": "Widoczność", @@ -551,7 +551,7 @@ }, "dialogs": { "config_entry_system_options": { - "enable_new_entities_description": "Jeśli wyłączone, nowo wykryte encje nie będą automatycznie dodawane do Home Assistant'a.", + "enable_new_entities_description": "Jeśli wyłączone, nowo wykryte encje integracji {integration} nie będą automatycznie dodawane do Home Assistanta.", "enable_new_entities_label": "Włącz dodawanie nowych encji.", "title": "Opcje systemowe dla {integration}", "update": "Aktualizuj" @@ -841,7 +841,7 @@ "delete_confirm": "Czy chcesz usunąć?", "duplicate": "Duplikuj", "header": "Warunki", - "introduction": "Warunki są opcjonalną częścią automatyzacji i można ich użyć, aby zapobiec działaniom po uruchomieniu. Warunki wyglądają bardzo podobnie do wyzwalaczy, ale są bardzo różne. Wyzwalacz będzie analizował zdarzenia zachodzące w systemie, a warunek będzie dotyczył tylko tego, jak wygląda teraz system. Wyzwalacz może zaobserwować, że przełącznik jest przełączany. Warunek może tylko sprawdzić, czy przełącznik jest aktualnie włączony lub wyłączony.", + "introduction": "Warunki nie są wymagane w automatyzacji, ale zastosowanie ich wykluczy jej potencjalnie niechciane uruchomienia, póki logika każdego z nich przyjmuje wartość pozytywną.", "learn_more": "Dowiedz się więcej o warunkach", "name": "Warunek", "type_select": "Typ warunku", @@ -1324,7 +1324,7 @@ "button": "Usuń wybrane", "confirm_partly_text": "Można usunąć tylko {removable} z wybranych {selected} encji. Encje można usunąć tylko wtedy, gdy integracja wspiera taka możliwość. Czasami trzeba ponownie uruchomić Home Assistanta, zanim będzie można usunąć encje usuniętej integracji. Czy na pewno chcesz usunąć usuwalne encje?", "confirm_partly_title": "Tylko {number} wybrane encje można usunąć.", - "confirm_text": "Encje mogą zostać usunięte tylko wtedy, gdy ich integracja na to zezwala.", + "confirm_text": "Powinieneś uprzednio usunąć integrację z automatyzacji i konfiguracji Lovelace, jeśli encje w niej występują.", "confirm_title": "Czy chcesz usunąć {number} encj(ę/e/i)?" }, "selected": "wybrano {number}", diff --git a/translations/frontend/pt-BR.json b/translations/frontend/pt-BR.json index 0228283427..81fa65d285 100644 --- a/translations/frontend/pt-BR.json +++ b/translations/frontend/pt-BR.json @@ -474,6 +474,7 @@ }, "common": { "and": "e", + "back": "Voltar", "cancel": "Cancelar", "close": "Fechar", "delete": "Eliminar", @@ -506,6 +507,7 @@ "device-picker": { "clear": "Limpar", "device": "Dispositivo", + "no_area": "Sem área", "show_devices": "Mostrar dispositivos", "toggle": "Alternar" }, @@ -739,6 +741,8 @@ "notification_toast": { "connection_lost": "Conexão perdida. Reconectando…", "service_call_failed": "Falha ao chamar o serviço {service}.", + "started": "Home Assistant foi iniciado!", + "starting": "Home Assistant está iniciando, algumas funcionalidades podem estar indisponíveis até que esteja iniciado.", "triggered": "{name} disparado" }, "panel": { @@ -766,6 +770,9 @@ "create": "Criar", "default_name": "Nova Zona", "delete": "Excluir", + "name": "Nome", + "name_required": "Nome é obrigatório", + "unknown_error": "Erro desconhecido", "update": "Atualizar" }, "picker": { @@ -800,6 +807,7 @@ "label": "Atraso" }, "device_id": { + "action": "Açao", "extra_fields": { "code": "Código" }, @@ -841,6 +849,7 @@ "label": "E" }, "device": { + "condition": "Condição", "extra_fields": { "above": "Acima", "below": "Abaixo", @@ -919,7 +928,8 @@ "below": "Abaixo", "for": "Duração" }, - "label": "Dispositivo" + "label": "Dispositivo", + "trigger": "Gatilho" }, "event": { "event_data": "Dados de evento", @@ -936,6 +946,7 @@ }, "homeassistant": { "event": "Evento:", + "label": "", "shutdown": "Desligar", "start": "Iniciar" }, @@ -1210,6 +1221,7 @@ "different_include": "Possivelmente por meio de um domínio, um glob ou uma inclusão diferente.", "pick_attribute": "Escolha um atributo para sobrescrever", "picker": { + "entity": "Entidade", "header": "Personalizações", "introduction": "Ajustar atributos por entidade. As personalizações adicionadas / editadas entrarão em vigor imediatamente. As personalizações removidas entrarão em vigor quando a entidade for atualizada." }, @@ -1246,6 +1258,7 @@ "integration": "Integração", "manufacturer": "Fabricante", "model": "Modelo", + "no_area": "Sem área", "no_devices": "Nenhum dispositivo" }, "delete": "Eliminar", @@ -1254,7 +1267,9 @@ "device_not_found": "Dispositivo não encontrado.", "entities": { "add_entities_lovelace": "Adicionar ao Lovelace", + "disabled_entities": "+{count} {count, plural,\n one {disabled entity}\n other {disabled entities}\n}", "entities": "Entidades", + "hide_disabled": "Ocultar desativado(s)", "none": "Este dispositivo não possui entidades" }, "name": "Nome", @@ -1795,6 +1810,7 @@ "no_zones_created_yet": "Parece que você ainda não criou nenhuma zona." }, "zwave": { + "caption": "", "common": { "index": "Índice", "instance": "Instância", @@ -1826,15 +1842,27 @@ "set_wakeup": "Definir intervalo de ativação", "true": "Verdadeiro" }, + "node_management": { + "add_to_group": "Adicionar ao grupo", + "group": "Grupo", + "node_group_associations": "Associações de grupos de nós", + "node_protection": "Proteção dos nós", + "nodes": "Nós", + "protection": "Proteção", + "set_protection": "Definir proteção" + }, "ozw_log": { "header": "OZW Log", - "introduction": "Veja o log. 0 é o mínimo (carrega o log inteiro) e 1000 é o máximo. A carga mostrará um log estático e tail será atualizada automaticamente com o último número especificado de linhas do log." + "introduction": "Veja o log. 0 é o mínimo (carrega o log inteiro) e 1000 é o máximo. A carga mostrará um log estático e tail será atualizada automaticamente com o último número especificado de linhas do log.", + "load": "Carregar" }, "services": { "add_node": "Adicionar Nó", "add_node_secure": "Adicionar Nó Seguro", "cancel_command": "Cancelar Comando", "heal_network": "Reparar rede", + "node_info": "Informações do Nó", + "refresh_entity": "Atualizar Entidade", "remove_node": "Remover Nó", "save_config": "Salvar Configuração", "soft_reset": "Soft Reset", @@ -1914,6 +1942,7 @@ "start_listening": "Começar a ouvir", "stop_listening": "Parar de ouvir", "subscribe_to": "Evento para se inscrever", + "title": "", "topic": "tópico" }, "services": { @@ -2309,6 +2338,8 @@ "abort_intro": "Login cancelado", "authorizing_client": "Você está prestes a dar acesso pra {clientId} à sua instância do Home Assistant.", "form": { + "error": "Erro: {error}", + "next": "Próximo", "providers": { "command_line": { "abort": { @@ -2394,6 +2425,7 @@ } } }, + "start_over": "Recomeçar", "unknown_error": "Alguma coisa saiu errada", "working": "Aguarde" }, diff --git a/translations/frontend/pt.json b/translations/frontend/pt.json index a720810a63..d98d5c6877 100644 --- a/translations/frontend/pt.json +++ b/translations/frontend/pt.json @@ -1035,7 +1035,8 @@ "manage_entities": "Gerir Entidades", "state_reporting_error": "Indisponível para {enable_disable} reportar estado.", "sync_entities": "Sincronizar Entidades", - "sync_entities_error": "Falha na sincronização das entidades:" + "sync_entities_error": "Falha na sincronização das entidades:", + "title": "" }, "connected": "Ligado", "connection_status": "Estado da ligação na cloud", @@ -1053,7 +1054,8 @@ "manage_entities": "Gerir Entidades", "security_devices": "Dispositivos de segurança", "sync_entities": "Sincronizar entidades com o Google", - "sync_entities_404_message": "Falha ao sincronizar suas entidades com o Google, peça ao Google 'Ok Google, sincronize os meus dispositivos' para sincronizar suas entidades." + "sync_entities_404_message": "Falha ao sincronizar suas entidades com o Google, peça ao Google 'Ok Google, sincronize os meus dispositivos' para sincronizar suas entidades.", + "title": "" }, "integrations": "Integrações", "integrations_introduction": "As integrações para o Home Assistant Cloud permitem-lhe ligar-se aos serviços na nuvem sem ter de expor publicamente o seu Home Assistant na Internet.", @@ -1082,7 +1084,8 @@ "no_hooks_yet": "Parece que você ainda não tem webhooks. Comece, configurando um", "no_hooks_yet_link_automation": "automação de webhook", "no_hooks_yet_link_integration": "integração baseada em webhook", - "no_hooks_yet2": " ou criando um " + "no_hooks_yet2": " ou criando um ", + "title": "" } }, "alexa": { @@ -1116,6 +1119,7 @@ }, "forgot_password": { "check_your_email": "Verifique o seu e-mail para obter instruções sobre como redefinir a sua senha.", + "email": "", "email_error_msg": "E-mail inválido", "instructions": "Introduza o seu endereço de e-mail e nós lhe enviaremos um link para redefinir sua password.", "send_reset_email": "Enviar e-mail de redefinição", @@ -1135,6 +1139,7 @@ "alert_email_confirm_necessary": "É necessário confirmar o seu e-mail antes de fazer login.", "alert_password_change_required": "É necessário alterar a sua password antes de fazer login.", "dismiss": "Fechar", + "email": "", "email_error_msg": "E-mail inválido", "forgot_password": "Esqueceu-se da senha?", "introduction": "O Home Assistant Cloud fornece uma conexão remota segura à sua instância enquanto estiver fora de casa. Também permite que você se conecte com serviços que apenas utilizam a nuvem: Amazon Alexa e Google Assistant.", @@ -1890,6 +1895,7 @@ "custom_uis": "IUs personalizados:", "developed_by": "Desenvolvido por um punhado de pessoas incríveis.", "documentation": "Documentação", + "frontend": "", "frontend_version": "Versão frontend: {version} - {type}", "home_assistant_logo": "Logotipo do Home Assistant", "icons_by": "Ícones por", diff --git a/translations/frontend/sl.json b/translations/frontend/sl.json index 1550e445b2..2f0c4dcbd2 100644 --- a/translations/frontend/sl.json +++ b/translations/frontend/sl.json @@ -478,6 +478,7 @@ "cancel": "Prekliči", "close": "Zapri", "delete": "Izbriši", + "error_required": "Zahtevano", "loading": "Nalaganje", "next": "Naslednji", "no": "Ne", @@ -740,6 +741,8 @@ "notification_toast": { "connection_lost": "Povezava prekinjena. Vnovično vzpostavljanje povezave...", "service_call_failed": "Storitve ni bilo mogoče poklicati {service}.", + "started": "Home Assistant se je zagnal!", + "starting": "Home Assistant se zaganja, vse ne bo na voljo, dokler se zagon ne konča.", "triggered": "Sproženo {name}" }, "panel": { @@ -1219,6 +1222,7 @@ "different_include": "Mogoče prek domene, globusa ali drugačne vsebovanosti.", "pick_attribute": "Izberite atribut, ki ga želite preglasiti", "picker": { + "entity": "Subjekt", "header": "Prilagoditve", "introduction": "Prilagajanja atributov na entiteti. Dodane/spremenjene prilagoditve začnejo veljati takoj. Odstranjene pa po posodobitvi entitete." }, @@ -1677,7 +1681,8 @@ "name": "Ime", "system": "Sistem" } - } + }, + "users_privileges_note": "Skupine uporabnikov je delo v teku. Uporabnik ne bo mogel upravljati primerka prek uporabniškega vmesnika. Še vedno poteka revidiranje vseh končnih točk API-ja za upravljanje, da zagotovimo pravilno omejevanje dostopa do administratorjev." }, "zha": { "add_device_page": { @@ -1839,21 +1844,53 @@ "set_wakeup": "Nastavite Interval bujenja", "true": "Prav" }, + "node_management": { + "add_to_group": "Dodaj v skupino", + "entities": "Subjekti tega vozlišča", + "entity_info": "Podatki o subjektu", + "exclude_entity": "Izključite to entiteto iz Home Assistant-a", + "group": "Skupina", + "header": "Upravljanje Z-Wave vozlišč", + "introduction": "Poženite ukaze Z-Wave, ki vplivajo na posamezno vozlišče. Izberite vozlišče in si oglejte seznam razpoložljivih ukazov.", + "max_associations": "Max združenja:", + "node_group_associations": "Združenja skupin vozlišč", + "node_protection": "Zaščita vozlišča", + "node_to_control": "Vozlišče za nadzor", + "nodes": "Vozlišča", + "nodes_hint": "Izberite vozlišče za ogled njegovih možnosti", + "nodes_in_group": "Druga vozlišča v tej skupini:", + "pooling_intensity": "Intenzivnost osveževanja", + "protection": "Zaščita", + "remove_broadcast": "Odstrani oddajanje", + "remove_from_group": "Odstrani iz skupine", + "set_protection": "Nastavite zaščito" + }, "ozw_log": { "header": "OZW dnevnik", - "introduction": "Oglejte si dnevnik. 0 je minimum (naloži celoten dnevnik), 1000 pa največ. Prikazan bo statični dnevnik, konec pa se bo samodejno posodobil z zadnjim določenim številom vrstic dnevnika." + "introduction": "Oglejte si dnevnik. 0 je minimum (naloži celoten dnevnik), 1000 pa največ. Prikazan bo statični dnevnik, konec pa se bo samodejno posodobil z zadnjim določenim številom vrstic dnevnika.", + "last_log_lines": "Število zadnjih vrstic dnevnika", + "load": "Obremenitev", + "tail": "Rep" }, "services": { "add_node": "Dodaj vozlišče", "add_node_secure": "Dodaj vozlišče varno", "cancel_command": "Prekliči ukaz", "heal_network": "Pozdravite omrežje", + "heal_node": "Pozdravi Vozlišče", + "node_info": "Informacije o vozlišču", + "print_node": "Podatki o vozlišču", + "refresh_entity": "Osveži subjekt", + "refresh_node": "Osveži vozlišče", + "remove_failed_node": "Odstranite neuspešno vozlišče", "remove_node": "Odstrani vozlišče", + "replace_failed_node": "Zamenjaj neuspešno vozlišče", "save_config": "Shrani konfiguracijo", "soft_reset": "Resetiraj", "start_network": "Zaženite omrežje", "stop_network": "Ustavite omrežje", - "test_network": "Preizkusite omrežje" + "test_network": "Preizkusite omrežje", + "test_node": "Preizkusi vozlišče" }, "values": { "header": "Vrednosti vozlišča" @@ -2012,6 +2049,10 @@ "add_item": "Dodaj element", "checked_items": "Označeni predmeti", "clear_items": "Počisti označene elemente" + }, + "starting": { + "description": "Home Assistant se zaganja, prosimo počakajte ...", + "header": "Home Assistant se zaganja ..." } }, "changed_toast": { @@ -2304,7 +2345,8 @@ "attribute_not_found": "Atribut {attribute} ni na voljo v: {entity}", "entity_non_numeric": "Entiteta je neštevilska: {entity}", "entity_not_found": "Entiteta ni na voljo: {entity}", - "entity_unavailable": "{entity} trenutno ni na voljo" + "entity_unavailable": "{entity} trenutno ni na voljo", + "starting": "Home Assistant se zaganja, morda še ni vse na voljo" } }, "mailbox": { diff --git a/translations/frontend/sv.json b/translations/frontend/sv.json index 3938ba4ee2..350219cd6c 100644 --- a/translations/frontend/sv.json +++ b/translations/frontend/sv.json @@ -1035,7 +1035,8 @@ "manage_entities": "Hantera Entiteter", "state_reporting_error": "Det går inte att {enable_disable} rapportera tillståndet.", "sync_entities": "Synkronisera Entiteter", - "sync_entities_error": "Det gick inte att synkronisera entiteter:" + "sync_entities_error": "Det gick inte att synkronisera entiteter:", + "title": "" }, "connected": "Ansluten", "connection_status": "Status för molnanslutning", @@ -1083,14 +1084,16 @@ "no_hooks_yet": "Ser ut som du inte har några webhooks ännu. Kom igång genom att konfigurera en ", "no_hooks_yet_link_automation": "webhook automation", "no_hooks_yet_link_integration": "webhook-baserad integration", - "no_hooks_yet2": " eller genom att skapa en " + "no_hooks_yet2": " eller genom att skapa en ", + "title": "" } }, "alexa": { "banner": "Redigering av vilka entiteter som visas via det här användargränssnittet är inaktiverat eftersom du har konfigurerat entitetsfilter i configuration.yaml.", "expose": "Exponera för Alexa", "exposed_entities": "Exponerade entiteter", - "not_exposed_entities": "Ej exponerade entiteter" + "not_exposed_entities": "Ej exponerade entiteter", + "title": "" }, "caption": "Home Assistant Cloud", "description_features": "Styra även när du inte är hemma, integrera med Alexa och Google Assistant.", @@ -2113,6 +2116,8 @@ "icon_height": "Ikonhöjd", "image": "Bildsökväg", "manual": "Manuell", + "maximum": "", + "minimum": "", "name": "Namn", "no_theme": "Inget tema", "refresh_interval": "Uppdateringsintervall", From 8f86a7ad8cbfd3fb00e44bcb036a867df91c5b21 Mon Sep 17 00:00:00 2001 From: Robert Date: Tue, 9 Jun 2020 11:52:43 +0200 Subject: [PATCH 18/39] Removed docker build method. (#6126) The docker build method doesn't work anymore. Removed all scripts/references related to it. --- .dockerignore | 4 -- Dockerfile | 31 ----------- README.md | 9 ---- package.json | 4 +- script/docker_entrypoint.sh | 14 ----- script/docker_run.sh | 103 ------------------------------------ 6 files changed, 1 insertion(+), 164 deletions(-) delete mode 100644 .dockerignore delete mode 100644 Dockerfile delete mode 100644 script/docker_entrypoint.sh delete mode 100755 script/docker_run.sh diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index b25d2d9ae8..0000000000 --- a/.dockerignore +++ /dev/null @@ -1,4 +0,0 @@ -node_modules -hass_frontend -hass_frontend_es5 -.git diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 826041fced..0000000000 --- a/Dockerfile +++ /dev/null @@ -1,31 +0,0 @@ -FROM node:8.11.1-alpine - -# install yarn -ENV PATH /root/.yarn/bin:$PATH - -## Install/force base tools -RUN apk update \ - && apk add make g++ curl bash binutils tar git python2 python3 \ - && rm -rf /var/cache/apk/* \ - && /bin/bash \ - && touch ~/.bashrc - -## Install yarn -RUN curl -o- -L https://yarnpkg.com/install.sh | bash - -## Setup the project -RUN mkdir -p /frontend - -WORKDIR /frontend - -COPY package.json yarn.lock ./ - -RUN yarn install --frozen-lockfile - -COPY . . - -COPY script/docker_entrypoint.sh /usr/bin/docker_entrypoint.sh - -RUN chmod +x /usr/bin/docker_entrypoint.sh - -CMD [ "docker_entrypoint.sh" ] diff --git a/README.md b/README.md index ab25dde882..c5b6edde12 100644 --- a/README.md +++ b/README.md @@ -22,15 +22,6 @@ This is the repository for the official [Home Assistant](https://home-assistant. A complete guide can be found at the following [link](https://www.home-assistant.io/developers/frontend/). It describes a short guide for the build of project. -### Docker environment - -It is possible to compile the project and/or run commands in the development environment having only the [Docker](https://www.docker.com) pre-installed in the system. On the root of project you can do: - -- `sh ./script/docker_run.sh build` Build all the project with one command -- `sh ./script/docker_run.sh bash` Open an interactive shell (the same environment generated by the _classic environment_) where you can run commands. This bash work on your project directory and any change on your file is automatically present within your build bash. - -**Note**: if you have installed `npm` in addition to the `docker`, you can use the commands `npm run docker_build` and `npm run bash` to get a full build or bash as explained above - ## License Home Assistant is open-source and Apache 2 licensed. Feel free to browse the repository, learn and reuse parts in your own projects. diff --git a/package.json b/package.json index 32f5d1fe8d..43658529fa 100644 --- a/package.json +++ b/package.json @@ -17,9 +17,7 @@ "lint": "npm run lint:eslint && npm run lint:prettier && npm run lint:types", "format": "npm run format:eslint && npm run format:prettier", "mocha": "node_modules/.bin/ts-mocha -p test-mocha/tsconfig.test.json --opts test-mocha/mocha.opts", - "test": "npm run lint && npm run mocha", - "docker_build": "sh ./script/docker_run.sh build $npm_package_version", - "bash": "sh ./script/docker_run.sh bash $npm_package_version" + "test": "npm run lint && npm run mocha" }, "author": "Paulus Schoutsen (http://paulusschoutsen.nl)", "license": "Apache-2.0", diff --git a/script/docker_entrypoint.sh b/script/docker_entrypoint.sh deleted file mode 100644 index 9d7d228bfc..0000000000 --- a/script/docker_entrypoint.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -# Docker entry point inspired by travis build and script/build_frontend - -# Stop on errors -set -e - -# Build the frontend but not used the npm run build -/bin/bash script/build_frontend - -# TEST -npm run test - -# -#xvfb-run wct diff --git a/script/docker_run.sh b/script/docker_run.sh deleted file mode 100755 index 8ee7abe474..0000000000 --- a/script/docker_run.sh +++ /dev/null @@ -1,103 +0,0 @@ -#!/bin/bash -# Basic Docker Management scripts -# With this script you can build software, or enter an agnostic development environment and run commands interactively. - - - -check_mandatory_tools(){ - if [ "x$(which docker)" == "x" ]; then - echo "UNKNOWN - Missing docker binary! Are you sure it is installed and reachable?" - exit 3 - fi - - docker info > /dev/null 2>&1 - if [ $? -ne 0 ]; then - echo "UNKNOWN - Unable to talk to the docker daemon! Maybe the docker daemon is not running" - exit 3 - fi -} - -check_dev_image(){ - if [[ "$(docker images -q ${IMAGE_NAME}:$IMAGE_TAG 2> /dev/null)" == "" ]]; then - echo "UNKNOWN - Can't find the development docker image ${IMAGE_NAME}:$IMAGE_TAG" - while true; do - read -p "Do you want to create it now?" yn - case $yn in - [Yy]* ) create_image; break;; - [Nn]* ) exit 3;; - * ) echo "Please answer y or n";; - esac - done - fi -} - -# Building the basic image for compiling the production frontend -create_image(){ - docker build -t ${IMAGE_NAME}:${IMAGE_TAG} . -} - -# -# Execute interactive bash on basic image -# -run_bash_on_docker(){ - - check_dev_image - - docker run -it \ - -v $PWD/:/frontend/ \ - -v /frontend/node_modules \ - -v /frontend/bower_components \ - ${IMAGE_NAME}:${IMAGE_TAG} /bin/bash -} - -# -# Execute the basic image for compiling the production frontend -# -build_all(){ - - check_dev_image - - docker run -it \ - -v $PWD/:/frontend/ \ - -v /frontend/node_modules \ - -v /frontend/bower_components \ - ${IMAGE_NAME}:${IMAGE_TAG} /bin/bash script/build_frontend - -} - -# Init Global Variable -IMAGE_NAME=home_assistant_fe_image -IMAGE_TAG=${2:-latest} - -check_mandatory_tools - -case "$1" in - setup_env) - create_image - ;; - bash) - run_bash_on_docker - ;; - build) - build_all - ;; - *) - echo "NAME" - echo " Docker Management." - echo "" - echo "SYNOPSIS" - echo " ${0} command [version]" - echo "" - echo "DESCRIPTION" - echo " With this script you can build software, or enter an agnostic development environment and run commands interactively." - echo "" - echo " The command are:" - echo " setup_env Create develop images" - echo " bash Run bash on develop enviroments" - echo " build Run silent build" - echo "" - echo " The version is optional, if not inserted it assumes \"latest\". " - exit 1 - ;; -esac -exit 0 From edc4601f8e24a1260b7fd3ed54126ad465f786f1 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 9 Jun 2020 14:06:42 +0200 Subject: [PATCH 19/39] Run prettier (#6128) --- src/components/ha-markdown-element.ts | 2 +- src/panels/profile/ha-refresh-tokens-card.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/ha-markdown-element.ts b/src/components/ha-markdown-element.ts index 69844b3ad2..03e3f17362 100644 --- a/src/components/ha-markdown-element.ts +++ b/src/components/ha-markdown-element.ts @@ -13,7 +13,7 @@ class HaMarkdownElement extends UpdatingElement { protected update(changedProps) { super.update(changedProps); if (this.content !== undefined) { - this._render(); + this._render(); } } diff --git a/src/panels/profile/ha-refresh-tokens-card.js b/src/panels/profile/ha-refresh-tokens-card.js index 437ed22f62..81f83b41c5 100644 --- a/src/panels/profile/ha-refresh-tokens-card.js +++ b/src/panels/profile/ha-refresh-tokens-card.js @@ -116,7 +116,7 @@ class HaRefreshTokens extends LocalizeMixin(EventsMixin(PolymerElement)) { } catch (err) { // eslint-disable-next-line console.error(err); - showAlertDialog(this, { + showAlertDialog(this, { text: this.localize("ui.panel.profile.refresh_tokens.delete_failed"), }); } From 168cc607aae7bdfa871ff80296ffcb891e8a060d Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 9 Jun 2020 22:30:18 +0200 Subject: [PATCH 20/39] Move lovelace card edit dialog to mwc-dialog (#6130) --- src/components/ha-dialog.ts | 6 +- .../editor/card-editor/hui-card-editor.ts | 3 - .../card-editor/hui-dialog-edit-card.ts | 139 +++++++++--------- 3 files changed, 71 insertions(+), 77 deletions(-) diff --git a/src/components/ha-dialog.ts b/src/components/ha-dialog.ts index bffab35560..1af4d63882 100644 --- a/src/components/ha-dialog.ts +++ b/src/components/ha-dialog.ts @@ -13,7 +13,7 @@ export const createCloseHeading = (hass: HomeAssistant, title: string) => html` @@ -35,10 +35,12 @@ export class HaDialog extends MwcDialog { display: block; height: 20px; } - .close_button { + .header_button { position: absolute; right: 16px; top: 12px; + text-decoration: none; + color: inherit; } `, ]; diff --git a/src/panels/lovelace/editor/card-editor/hui-card-editor.ts b/src/panels/lovelace/editor/card-editor/hui-card-editor.ts index 490222ae80..4d884e469c 100644 --- a/src/panels/lovelace/editor/card-editor/hui-card-editor.ts +++ b/src/panels/lovelace/editor/card-editor/hui-card-editor.ts @@ -187,7 +187,6 @@ export class HuiCardEditor extends LitElement { // Refresh code editor when switching to yaml mode this._refreshYamlEditor(true); } - fireEvent(this as HTMLElement, "iron-resize"); } if (this._configElement && changedProperties.has("hass")) { @@ -207,7 +206,6 @@ export class HuiCardEditor extends LitElement { this._yamlEditor.codemirror.focus(); } } - fireEvent(this as HTMLElement, "iron-resize"); }, 1); } @@ -279,7 +277,6 @@ export class HuiCardEditor extends LitElement { this.GUImode = false; } finally { this._loading = false; - fireEvent(this, "iron-resize"); } } diff --git a/src/panels/lovelace/editor/card-editor/hui-dialog-edit-card.ts b/src/panels/lovelace/editor/card-editor/hui-dialog-edit-card.ts index 0c832dc73d..93ae17ff3f 100755 --- a/src/panels/lovelace/editor/card-editor/hui-dialog-edit-card.ts +++ b/src/panels/lovelace/editor/card-editor/hui-dialog-edit-card.ts @@ -1,4 +1,3 @@ -import "@polymer/paper-dialog-scrollable/paper-dialog-scrollable"; import deepFreeze from "deep-freeze"; import { css, @@ -12,7 +11,7 @@ import { PropertyValues, } from "lit-element"; import type { HASSDomEvent } from "../../../../common/dom/fire_event"; -import "../../../../components/dialog/ha-paper-dialog"; +import "../../../../components/ha-dialog"; import type { LovelaceCardConfig, LovelaceViewConfig, @@ -28,6 +27,7 @@ import "./hui-card-picker"; import "./hui-card-preview"; import type { EditCardDialogParams } from "./show-edit-card-dialog"; import { getCardDocumentationURL } from "../get-card-documentation-url"; +import { mdiHelpCircle } from "@mdi/js"; declare global { // for fire event @@ -116,28 +116,29 @@ export class HuiDialogEditCard extends LitElement { } return html` - -
-

- ${heading} -

- ${this._documentationURL !== undefined - ? html` - - - - ` - : ""} -
- + + + + + + ` + : ""}`} + > +
${this._cardConfig === undefined ? html`
`} -
-
- ${this._cardConfig !== undefined - ? html` - - ${this.hass!.localize( - !this._cardEditorEl || this._GUImode - ? "ui.panel.lovelace.editor.edit_card.show_code_editor" - : "ui.panel.lovelace.editor.edit_card.show_visual_editor" - )} - - ` - : ""} - - ${this.hass!.localize("ui.common.cancel")} - - ${this._cardConfig !== undefined - ? html` - - ${this._saving - ? html` - - ` - : this.hass!.localize("ui.common.save")} - - ` - : ``}
-
+ ${this._cardConfig !== undefined + ? html` + + ${this.hass!.localize( + !this._cardEditorEl || this._GUImode + ? "ui.panel.lovelace.editor.edit_card.show_code_editor" + : "ui.panel.lovelace.editor.edit_card.show_visual_editor" + )} + + ` + : ""} + + ${this.hass!.localize("ui.common.cancel")} + + ${this._cardConfig !== undefined + ? html` + + ${this._saving + ? html` ` + : this.hass!.localize("ui.common.save")} + + ` + : ``} + `; } @@ -223,20 +222,20 @@ export class HuiDialogEditCard extends LitElement { @media all and (max-width: 450px), all and (max-height: 500px) { /* overrule the ha-style-dialog max-height on small screens */ - ha-paper-dialog { - max-height: 100%; + ha-dialog { + --mdc-dialog-max-height: 100%; height: 100%; } } @media all and (min-width: 850px) { - ha-paper-dialog { - width: 845px; + ha-dialog { + --mdc-dialog-min-width: 845px; } } - ha-paper-dialog { - max-width: 845px; + ha-dialog { + --mdc-dialog-max-width: 845px; } .center { @@ -258,9 +257,9 @@ export class HuiDialogEditCard extends LitElement { } @media (min-width: 1200px) { - ha-paper-dialog { - max-width: none; - width: 1000px; + ha-dialog { + --mdc-dialog-max-width: calc(100% - 32px); + --mdc-dialog-min-width: 1000px; } .content { @@ -317,10 +316,6 @@ export class HuiDialogEditCard extends LitElement { align-items: center; justify-content: space-between; } - .help-icon { - text-decoration: none; - color: inherit; - } `, ]; } From 25cc76e02247734079005ce40ef941e88005e9f5 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 9 Jun 2020 22:30:36 +0200 Subject: [PATCH 21/39] Replace paper-menu-button (#6132) --- hassio/src/system/hassio-system.ts | 1 - src/components/ha-button-menu.ts | 2 +- src/components/ha-icon-button-arrow-next.ts | 32 +- src/components/ha-icon-button-arrow-prev.ts | 11 +- src/components/ha-icon-button-next.ts | 32 +- src/components/ha-icon-button-prev.ts | 32 +- src/components/ha-menu-button.ts | 5 +- src/components/ha-sidebar.ts | 60 ++-- .../action/ha-automation-action-row.ts | 108 ++++--- .../condition/ha-automation-condition-row.ts | 73 +++-- .../trigger/ha-automation-trigger-row.ts | 79 +++-- .../config/entities/ha-config-entities.ts | 90 +++--- .../integrations/ha-config-integrations.ts | 57 ++-- .../integrations/ha-integration-card.ts | 47 ++- .../lovelace/components/hui-card-options.ts | 88 +++--- src/panels/lovelace/hui-root.ts | 286 +++++++++--------- src/panels/lovelace/views/hui-view.ts | 2 - .../shopping-list/ha-panel-shopping-list.js | 27 +- src/translations/en.json | 4 + 19 files changed, 553 insertions(+), 483 deletions(-) diff --git a/hassio/src/system/hassio-system.ts b/hassio/src/system/hassio-system.ts index 1824c2be90..5db8cc409c 100644 --- a/hassio/src/system/hassio-system.ts +++ b/hassio/src/system/hassio-system.ts @@ -1,4 +1,3 @@ -import "@polymer/paper-menu-button/paper-menu-button"; import { css, CSSResult, diff --git a/src/components/ha-button-menu.ts b/src/components/ha-button-menu.ts index 3ba40df40c..31f9105d93 100644 --- a/src/components/ha-button-menu.ts +++ b/src/components/ha-button-menu.ts @@ -40,7 +40,7 @@ export class HaButtonMenu extends LitElement { static get styles(): CSSResult { return css` :host { - display: block; + display: inline-block; position: relative; } `; diff --git a/src/components/ha-icon-button-arrow-next.ts b/src/components/ha-icon-button-arrow-next.ts index 269b7792a5..150f5b4b2d 100644 --- a/src/components/ha-icon-button-arrow-next.ts +++ b/src/components/ha-icon-button-arrow-next.ts @@ -1,17 +1,37 @@ -import { HaIconButton } from "./ha-icon-button"; +import { + LitElement, + property, + TemplateResult, + html, + customElement, +} from "lit-element"; +import { mdiArrowLeft, mdiArrowRight } from "@mdi/js"; +import "@material/mwc-icon-button/mwc-icon-button"; +import "./ha-svg-icon"; + +@customElement("ha-icon-button-arrow-next") +export class HaIconButtonArrowNext extends LitElement { + @property({ type: Boolean }) public disabled = false; + + @property() private _icon = mdiArrowRight; -export class HaIconButtonArrowNext extends HaIconButton { public connectedCallback() { super.connectedCallback(); // wait to check for direction since otherwise direction is wrong even though top level is RTL setTimeout(() => { - this.icon = + this._icon = window.getComputedStyle(this).direction === "ltr" - ? "hass:arrow-right" - : "hass:arrow-left"; + ? mdiArrowRight + : mdiArrowLeft; }, 100); } + + protected render(): TemplateResult { + return html` + + `; + } } declare global { @@ -19,5 +39,3 @@ declare global { "ha-icon-button-arrow-next": HaIconButtonArrowNext; } } - -customElements.define("ha-icon-button-arrow-next", HaIconButtonArrowNext); diff --git a/src/components/ha-icon-button-arrow-prev.ts b/src/components/ha-icon-button-arrow-prev.ts index 59f5b7482f..06e97b290c 100644 --- a/src/components/ha-icon-button-arrow-prev.ts +++ b/src/components/ha-icon-button-arrow-prev.ts @@ -1,8 +1,15 @@ -import { LitElement, property, TemplateResult, html } from "lit-element"; +import { + LitElement, + property, + TemplateResult, + html, + customElement, +} from "lit-element"; import { mdiArrowLeft, mdiArrowRight } from "@mdi/js"; import "@material/mwc-icon-button/mwc-icon-button"; import "./ha-svg-icon"; +@customElement("ha-icon-button-arrow-prev") export class HaIconButtonArrowPrev extends LitElement { @property({ type: Boolean }) public disabled = false; @@ -32,5 +39,3 @@ declare global { "ha-icon-button-arrow-prev": HaIconButtonArrowPrev; } } - -customElements.define("ha-icon-button-arrow-prev", HaIconButtonArrowPrev); diff --git a/src/components/ha-icon-button-next.ts b/src/components/ha-icon-button-next.ts index 68bfa5004c..6e37d1c764 100644 --- a/src/components/ha-icon-button-next.ts +++ b/src/components/ha-icon-button-next.ts @@ -1,17 +1,37 @@ -import { HaIconButton } from "./ha-icon-button"; +import { + LitElement, + property, + TemplateResult, + html, + customElement, +} from "lit-element"; +import { mdiChevronRight, mdiChevronLeft } from "@mdi/js"; +import "@material/mwc-icon-button"; +import "./ha-svg-icon"; + +@customElement("ha-icon-button-next") +export class HaIconButtonNext extends LitElement { + @property({ type: Boolean }) public disabled = false; + + @property() private _icon = mdiChevronRight; -export class HaIconButtonNext extends HaIconButton { public connectedCallback() { super.connectedCallback(); // wait to check for direction since otherwise direction is wrong even though top level is RTL setTimeout(() => { - this.icon = + this._icon = window.getComputedStyle(this).direction === "ltr" - ? "hass:chevron-right" - : "hass:chevron-left"; + ? mdiChevronRight + : mdiChevronLeft; }, 100); } + + protected render(): TemplateResult { + return html` + + `; + } } declare global { @@ -19,5 +39,3 @@ declare global { "ha-icon-button-next": HaIconButtonNext; } } - -customElements.define("ha-icon-button-next", HaIconButtonNext); diff --git a/src/components/ha-icon-button-prev.ts b/src/components/ha-icon-button-prev.ts index 675719fc6e..7548004c02 100644 --- a/src/components/ha-icon-button-prev.ts +++ b/src/components/ha-icon-button-prev.ts @@ -1,17 +1,37 @@ -import { HaIconButton } from "./ha-icon-button"; +import { + LitElement, + property, + TemplateResult, + html, + customElement, +} from "lit-element"; +import { mdiChevronRight, mdiChevronLeft } from "@mdi/js"; +import "@material/mwc-icon-button/mwc-icon-button"; +import "./ha-svg-icon"; + +@customElement("ha-icon-button-prev") +export class HaIconButtonPrev extends LitElement { + @property({ type: Boolean }) public disabled = false; + + @property() private _icon = mdiChevronLeft; -export class HaIconButtonPrev extends HaIconButton { public connectedCallback() { super.connectedCallback(); // wait to check for direction since otherwise direction is wrong even though top level is RTL setTimeout(() => { - this.icon = + this._icon = window.getComputedStyle(this).direction === "ltr" - ? "hass:chevron-left" - : "hass:chevron-right"; + ? mdiChevronLeft + : mdiChevronRight; }, 100); } + + protected render(): TemplateResult { + return html` + + `; + } } declare global { @@ -19,5 +39,3 @@ declare global { "ha-icon-button-prev": HaIconButtonPrev; } } - -customElements.define("ha-icon-button-prev", HaIconButtonPrev); diff --git a/src/components/ha-menu-button.ts b/src/components/ha-menu-button.ts index 4f65237636..985678b03b 100644 --- a/src/components/ha-menu-button.ts +++ b/src/components/ha-menu-button.ts @@ -1,3 +1,5 @@ +import "@material/mwc-icon-button"; +import { mdiMenu } from "@mdi/js"; import { UnsubscribeFunc } from "home-assistant-js-websocket"; import { css, @@ -12,8 +14,7 @@ import { fireEvent } from "../common/dom/fire_event"; import { computeDomain } from "../common/entity/compute_domain"; import { subscribeNotifications } from "../data/persistent_notification"; import { HomeAssistant } from "../types"; -import "./ha-icon-button"; -import { mdiMenu } from "@mdi/js"; +import "./ha-svg-icon"; @customElement("ha-menu-button") class HaMenuButton extends LitElement { diff --git a/src/components/ha-sidebar.ts b/src/components/ha-sidebar.ts index 5ceb4950f9..70c2806800 100644 --- a/src/components/ha-sidebar.ts +++ b/src/components/ha-sidebar.ts @@ -1,6 +1,12 @@ -import { mdiBell, mdiCellphoneSettingsVariant } from "@mdi/js"; +import "@material/mwc-icon-button"; +import { + mdiBell, + mdiCellphoneSettingsVariant, + mdiMenuOpen, + mdiMenu, + mdiViewDashboard, +} from "@mdi/js"; import "@polymer/app-layout/app-toolbar/app-toolbar"; -import "./ha-icon-button"; import "@polymer/paper-item/paper-icon-item"; import type { PaperIconItemElement } from "@polymer/paper-item/paper-icon-item"; import "@polymer/paper-item/paper-item"; @@ -29,9 +35,9 @@ import { getExternalConfig, } from "../external_app/external_config"; import type { HomeAssistant, PanelInfo } from "../types"; -import "./ha-svg-icon"; import "./ha-icon"; import "./ha-menu-button"; +import "./ha-svg-icon"; import "./user/ha-user-badge"; const SHOW_AFTER_SPACER = ["config", "developer-tools", "hassio"]; @@ -153,13 +159,16 @@ class HaSidebar extends LitElement { - - + + + + + ${this.hass.localize( + "ui.panel.config.integrations.config_entry.system_options" )} - > - - - ${this.hass.localize( - "ui.panel.config.integrations.config_entry.system_options" - )} - - ${this.hass.localize( - "ui.panel.config.integrations.config_entry.delete" - )} - - + + + ${this.hass.localize( + "ui.panel.config.integrations.config_entry.delete" + )} + +
`; @@ -379,9 +373,8 @@ export class HaIntegrationCard extends LitElement { margin-top: 0; min-height: 24px; } - paper-menu-button { + ha-button-menu { color: var(--secondary-text-color); - padding: 0; } @media (min-width: 563px) { paper-listbox { diff --git a/src/panels/lovelace/components/hui-card-options.ts b/src/panels/lovelace/components/hui-card-options.ts index e199c1b141..1d87c26803 100644 --- a/src/panels/lovelace/components/hui-card-options.ts +++ b/src/panels/lovelace/components/hui-card-options.ts @@ -1,7 +1,7 @@ import "@material/mwc-button"; -import "../../../components/ha-icon-button"; -import "@polymer/paper-listbox/paper-listbox"; -import "@polymer/paper-menu-button/paper-menu-button"; +import "@material/mwc-list/mwc-list-item"; +import "@material/mwc-icon-button"; +import "../../../components/ha-button-menu"; import { css, CSSResult, @@ -19,6 +19,7 @@ import { swapCard } from "../editor/config-util"; import { confDeleteCard } from "../editor/delete-card"; import { Lovelace, LovelaceCard } from "../types"; import { computeCardSize } from "../common/compute-card-size"; +import { mdiDotsVertical, mdiArrowDown, mdiArrowUp } from "@mdi/js"; @customElement("hui-card-options") export class HuiCardOptions extends LitElement { @@ -47,53 +48,52 @@ export class HuiCardOptions extends LitElement { >
- - + + + - - + + - - - ${this.hass!.localize( - "ui.panel.lovelace.editor.edit_card.move" - )} - ${this.hass!.localize( - "ui.panel.lovelace.editor.edit_card.duplicate" - )} - - ${this.hass!.localize( - "ui.panel.lovelace.editor.edit_card.delete" - )} - - + title="${this.hass!.localize( + "ui.panel.lovelace.editor.edit_card.options" + )}" + > + + + + + ${this.hass!.localize( + "ui.panel.lovelace.editor.edit_card.move" + )} + ${this.hass!.localize( + "ui.panel.lovelace.editor.edit_card.duplicate" + )} + + ${this.hass!.localize( + "ui.panel.lovelace.editor.edit_card.delete" + )} +
@@ -103,7 +103,6 @@ export class HuiCardOptions extends LitElement { static get styles(): CSSResult { return css` :host(:hover) { - overflow: hidden; outline: 2px solid var(--primary-color); } @@ -132,23 +131,14 @@ export class HuiCardOptions extends LitElement { text-align: right; } - ha-icon-button { + mwc-icon-button { color: var(--primary-text-color); } - ha-icon-button.move-arrow[disabled] { + mwc-icon-button.move-arrow[disabled] { color: var(--disabled-text-color); } - paper-menu-button { - color: var(--secondary-text-color); - padding: 0; - } - - paper-listbox { - padding: 0; - } - paper-item.header { color: var(--primary-text-color); text-transform: uppercase; diff --git a/src/panels/lovelace/hui-root.ts b/src/panels/lovelace/hui-root.ts index 289100b08c..95843c2642 100644 --- a/src/panels/lovelace/hui-root.ts +++ b/src/panels/lovelace/hui-root.ts @@ -1,12 +1,17 @@ import "@material/mwc-button"; +import "@material/mwc-list/mwc-list-item"; +import { + mdiDotsVertical, + mdiMicrophone, + mdiPlus, + mdiClose, + mdiPencil, + mdiHelpCircle, +} from "@mdi/js"; import "@polymer/app-layout/app-header-layout/app-header-layout"; import "@polymer/app-layout/app-header/app-header"; import "@polymer/app-layout/app-scroll-effects/effects/waterfall"; import "@polymer/app-layout/app-toolbar/app-toolbar"; -import "../../components/ha-icon-button"; -import "@polymer/paper-item/paper-item"; -import "@polymer/paper-listbox/paper-listbox"; -import "@polymer/paper-menu-button/paper-menu-button"; import "@polymer/paper-tabs/paper-tab"; import "@polymer/paper-tabs/paper-tabs"; import { @@ -27,10 +32,12 @@ import { navigate } from "../../common/navigate"; import { computeRTLDirection } from "../../common/util/compute_rtl"; import { debounce } from "../../common/util/debounce"; import { afterNextRender } from "../../common/util/render-status"; +import "../../components/ha-button-menu"; import "../../components/ha-icon"; -import "../../components/ha-menu-button"; +import "../../components/ha-svg-icon"; import "../../components/ha-icon-button-arrow-next"; import "../../components/ha-icon-button-arrow-prev"; +import "../../components/ha-menu-button"; import type { LovelaceConfig, LovelacePanelConfig, @@ -99,78 +106,73 @@ class HUIRoot extends LitElement { ${this._editMode ? html` - + > + +
${this.config.title || this.hass!.localize("ui.panel.lovelace.editor.header")} - + > + +
- - - + - - ${__DEMO__ /* No unused entities available in the demo */ - ? "" - : html` - - ${this.hass!.localize( - "ui.panel.lovelace.unused_entities.title" - )} - - `} - - ${this.hass!.localize( - "ui.panel.lovelace.editor.menu.raw_editor" - )} - - - + + + ${__DEMO__ /* No unused entities available in the demo */ + ? "" + : html` + + ${this.hass!.localize( + "ui.panel.lovelace.unused_entities.title" + )} + + `} + + ${this.hass!.localize( + "ui.panel.lovelace.editor.menu.raw_editor" + )} + +
` : html` @@ -182,96 +184,88 @@ class HUIRoot extends LitElement {
${this.config.title || "Home Assistant"}
${this._conversation(this.hass.config.components) ? html` - + > + + ` : ""} - - + - - ${this._yamlMode - ? html` - - ${this.hass!.localize( - "ui.panel.lovelace.menu.refresh" - )} - - - ${this.hass!.localize( - "ui.panel.lovelace.unused_entities.title" - )} - - ` - : ""} - ${(this.hass.panels.lovelace - ?.config as LovelacePanelConfig)?.mode === "yaml" - ? html` - - ${this.hass!.localize( - "ui.panel.lovelace.menu.reload_resources" - )} - - ` - : ""} - ${this.hass!.user!.is_admin && - !this.hass!.config.safe_mode - ? html` - - ${this.hass!.localize( - "ui.panel.lovelace.menu.configure_ui" - )} - - ` - : ""} - - ${this.hass!.localize("ui.panel.lovelace.menu.help")} - - - + + + ${this._yamlMode + ? html` + + ${this.hass!.localize( + "ui.panel.lovelace.menu.refresh" + )} + + + ${this.hass!.localize( + "ui.panel.lovelace.unused_entities.title" + )} + + ` + : ""} + ${(this.hass.panels.lovelace?.config as LovelacePanelConfig) + ?.mode === "yaml" + ? html` + + ${this.hass!.localize( + "ui.panel.lovelace.menu.reload_resources" + )} + + ` + : ""} + ${this.hass!.user!.is_admin && !this.hass!.config.safe_mode + ? html` + + ${this.hass!.localize( + "ui.panel.lovelace.menu.configure_ui" + )} + + ` + : ""} + + ${this.hass!.localize("ui.panel.lovelace.menu.help")} + + `} ${this.lovelace!.config.views.length > 1 || this._editMode @@ -321,14 +315,14 @@ class HUIRoot extends LitElement { : view.title || "Unnamed view"} ${this._editMode ? html` - + > + > + + ` : ""} @@ -500,10 +495,6 @@ class HUIRoot extends LitElement { navigate(this, `${this.route?.prefix}/hass-unused-entities`); } - private _deselect(ev): void { - ev.target.selected = null; - } - private _showVoiceCommandDialog(): void { showVoiceCommandDialog(this); } @@ -671,9 +662,6 @@ class HUIRoot extends LitElement { ha-app-layout { min-height: 100%; } - paper-menu-button { - padding: 0; - } paper-tabs { margin-left: 12px; --paper-tabs-selection-bar-color: var(--text-primary-color, #fff); @@ -702,10 +690,9 @@ class HUIRoot extends LitElement { position: absolute; height: 44px; } - #add-view ha-icon { + #add-view ha-svg-icon { background-color: var(--accent-color); - border-radius: 5px; - margin-top: 4px; + border-radius: 4px; } app-toolbar a { color: var(--text-primary-color, white); @@ -740,9 +727,6 @@ class HUIRoot extends LitElement { #view.tabs-hidden { min-height: calc(100vh - 64px); } - paper-item { - cursor: pointer; - } .hide-tab { display: none; } diff --git a/src/panels/lovelace/views/hui-view.ts b/src/panels/lovelace/views/hui-view.ts index 0ff04793ab..ed5a68cc43 100644 --- a/src/panels/lovelace/views/hui-view.ts +++ b/src/panels/lovelace/views/hui-view.ts @@ -372,8 +372,6 @@ export class HUIView extends LitElement { flex: 1 0 0; max-width: 500px; min-width: 0; - /* on iOS devices the column can become wider when toggling a switch */ - overflow-x: hidden; } .column > * { diff --git a/src/panels/shopping-list/ha-panel-shopping-list.js b/src/panels/shopping-list/ha-panel-shopping-list.js index db11be6cc0..0f9e591367 100644 --- a/src/panels/shopping-list/ha-panel-shopping-list.js +++ b/src/panels/shopping-list/ha-panel-shopping-list.js @@ -8,7 +8,8 @@ import "@polymer/paper-item/paper-icon-item"; import "@polymer/paper-item/paper-item"; import "@polymer/paper-item/paper-item-body"; import "@polymer/paper-listbox/paper-listbox"; -import "@polymer/paper-menu-button/paper-menu-button"; +import "@material/mwc-list/mwc-list-item"; +import "../../components/ha-button-menu"; import { html } from "@polymer/polymer/lib/utils/html-tag"; /* eslint-plugin-disable lit */ import { PolymerElement } from "@polymer/polymer/polymer-element"; @@ -18,6 +19,7 @@ import "../../components/ha-menu-button"; import { showVoiceCommandDialog } from "../../dialogs/voice-command-dialog/show-ha-voice-command-dialog"; import LocalizeMixin from "../../mixins/localize-mixin"; import "../../styles/polymer-ha-style"; +import { mdiDotsVertical } from "@mdi/js"; /* * @appliesMixin LocalizeMixin @@ -81,22 +83,17 @@ class HaPanelShoppingList extends LocalizeMixin(PolymerElement) { icon="hass:microphone" on-click="_showVoiceCommandDialog" > - - + - - [[localize('ui.panel.shopping-list.clear_completed')]] - - + label="Menu" + slot="trigger" + > + + + [[localize('ui.panel.shopping-list.clear_completed')]] + + diff --git a/src/translations/en.json b/src/translations/en.json index 2bb5d2bade..57e177903d 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -243,6 +243,8 @@ "save": "Save", "yes": "Yes", "no": "No", + "menu": "Menu", + "overflow_menu": "Overflow menu", "successfully_saved": "Successfully saved", "successfully_deleted": "Successfully deleted", "back": "Back", @@ -765,6 +767,8 @@ "save": "Save", "unsaved_confirm": "You have unsaved changes. Are you sure you want to leave?", "alias": "Name", + "move_up": "Move up", + "move_down": "Move down", "description": { "label": "Description", "placeholder": "Optional description" From 20dd3ca21c9e30f85fa82e01fa1f354f431e6d15 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 9 Jun 2020 22:31:27 +0200 Subject: [PATCH 22/39] data-entry-flow: replace paper-dialog with mwc-dialog (#6129) --- src/components/ha-dialog.ts | 3 + .../config-flow/dialog-data-entry-flow.ts | 204 ++++++++---------- src/dialogs/config-flow/styles.ts | 15 +- .../config/person/dialog-person-detail.ts | 6 +- 4 files changed, 111 insertions(+), 117 deletions(-) diff --git a/src/components/ha-dialog.ts b/src/components/ha-dialog.ts index 1af4d63882..92c17b0fa8 100644 --- a/src/components/ha-dialog.ts +++ b/src/components/ha-dialog.ts @@ -35,6 +35,9 @@ export class HaDialog extends MwcDialog { display: block; height: 20px; } + .mdc-dialog__content { + padding: var(--dialog-content-padding, 20px 24px); + } .header_button { position: absolute; right: 16px; diff --git a/src/dialogs/config-flow/dialog-data-entry-flow.ts b/src/dialogs/config-flow/dialog-data-entry-flow.ts index 8ee7b60587..a92f7e36d9 100644 --- a/src/dialogs/config-flow/dialog-data-entry-flow.ts +++ b/src/dialogs/config-flow/dialog-data-entry-flow.ts @@ -14,8 +14,7 @@ import { PropertyValues, TemplateResult, } from "lit-element"; -import "../../components/dialog/ha-paper-dialog"; -import type { HaPaperDialog } from "../../components/dialog/ha-paper-dialog"; +import "../../components/ha-dialog"; import "../../components/ha-form/ha-form"; import "../../components/ha-markdown"; import { @@ -27,7 +26,6 @@ import { DeviceRegistryEntry, subscribeDeviceRegistry, } from "../../data/device_registry"; -import { PolymerChangedEvent } from "../../polymer-types"; import { haStyleDialog } from "../../resources/styles"; import type { HomeAssistant } from "../../types"; import { DataEntryFlowDialogParams } from "./show-dialog-data-entry-flow"; @@ -90,7 +88,6 @@ class DataEntryFlowDialog extends LitElement { // We only load the handlers once if (this._handlers === undefined) { this._loading = true; - this.updateComplete.then(() => this._scheduleCenterDialog()); try { this._handlers = await params.flowConfig.getFlowHandlers(this.hass); } finally { @@ -98,7 +95,6 @@ class DataEntryFlowDialog extends LitElement { } } await this.updateComplete; - this._scheduleCenterDialog(); return; } @@ -115,9 +111,6 @@ class DataEntryFlowDialog extends LitElement { this._processStep(step); this._loading = false; - // When the flow changes, center the dialog. - // Don't do it on each step or else the dialog keeps bouncing. - this._scheduleCenterDialog(); } protected render(): TemplateResult { @@ -126,80 +119,84 @@ class DataEntryFlowDialog extends LitElement { } return html` - - ${this._loading || (this._step === null && this._handlers === undefined) - ? html` - - ` - : this._step === undefined - ? // When we are going to next step, we render 1 round of empty - // to reset the element. - "" - : html` - - ${this._step === null - ? // Show handler picker - html` - - ` - : this._step.type === "form" - ? html` - - ` - : this._step.type === "external" - ? html` - - ` - : this._step.type === "abort" - ? html` - - ` - : this._devices === undefined || this._areas === undefined - ? // When it's a create entry result, we will fetch device & area registry - html` ` - : html` - - `} - `} - +
+ ${this._loading || + (this._step === null && this._handlers === undefined) + ? html` + + ` + : this._step === undefined + ? // When we are going to next step, we render 1 round of empty + // to reset the element. + "" + : html` + + ${this._step === null + ? // Show handler picker + html` + + ` + : this._step.type === "form" + ? html` + + ` + : this._step.type === "external" + ? html` + + ` + : this._step.type === "abort" + ? html` + + ` + : this._devices === undefined || this._areas === undefined + ? // When it's a create entry result, we will fetch device & area registry + html` ` + : html` + + `} + `} +
+ `; } @@ -225,18 +222,6 @@ class DataEntryFlowDialog extends LitElement { this._areas = []; } } - - if (changedProps.has("_devices") && this._dialog) { - this._scheduleCenterDialog(); - } - } - - private _scheduleCenterDialog() { - setTimeout(() => this._dialog.center(), 0); - } - - private get _dialog(): HaPaperDialog { - return this.shadowRoot!.querySelector("ha-paper-dialog")!; } private async _fetchDevices(configEntryId) { @@ -310,16 +295,13 @@ class DataEntryFlowDialog extends LitElement { } } - private _openedChanged(ev: PolymerChangedEvent): void { - // Closed dialog by clicking on the overlay - if (!ev.detail.value) { - if (this._step) { - this._flowDone(); - } else if (this._step === null) { - // Flow aborted during picking flow - this._step = undefined; - this._params = undefined; - } + private _close(): void { + if (this._step) { + this._flowDone(); + } else if (this._step === null) { + // Flow aborted during picking flow + this._step = undefined; + this._params = undefined; } } @@ -327,18 +309,14 @@ class DataEntryFlowDialog extends LitElement { return [ haStyleDialog, css` - ha-paper-dialog { - max-width: 600px; - } - ha-paper-dialog > * { - margin: 0; - display: block; - padding: 0; + ha-dialog { + --dialog-content-padding: 0; } ha-icon-button { - display: inline-block; - padding: 8px; - float: right; + padding: 16px; + position: absolute; + top: 0; + right: 0; } `, ]; diff --git a/src/dialogs/config-flow/styles.ts b/src/dialogs/config-flow/styles.ts index 0e8b6e2609..b6e2b8d831 100644 --- a/src/dialogs/config-flow/styles.ts +++ b/src/dialogs/config-flow/styles.ts @@ -2,8 +2,21 @@ import { css } from "lit-element"; export const configFlowContentStyles = css` h2 { - margin-top: 24px; + margin: 24px 0 0; padding: 0 24px; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: var( + --mdc-typography-headline6-font-family, + var(--mdc-typography-font-family, Roboto, sans-serif) + ); + font-size: var(--mdc-typography-headline6-font-size, 1.25rem); + line-height: var(--mdc-typography-headline6-line-height, 2rem); + font-weight: var(--mdc-typography-headline6-font-weight, 500); + letter-spacing: var(--mdc-typography-headline6-letter-spacing, 0.0125em); + text-decoration: var(--mdc-typography-headline6-text-decoration, inherit); + text-transform: var(--mdc-typography-headline6-text-transform, inherit); + box-sizing: border-box; } .content { diff --git a/src/panels/config/person/dialog-person-detail.ts b/src/panels/config/person/dialog-person-detail.ts index 13c957dea5..fa784f1793 100644 --- a/src/panels/config/person/dialog-person-detail.ts +++ b/src/panels/config/person/dialog-person-detail.ts @@ -65,9 +65,9 @@ class DialogPersonDetail extends LitElement { return html` Date: Tue, 9 Jun 2020 22:37:43 +0200 Subject: [PATCH 23/39] Remove slot from ha-switch (#6133) --- gallery/src/components/demo-cards.js | 8 ++- src/components/ha-formfield.ts | 33 +++++++++++ src/components/ha-switch.ts | 55 +------------------ .../dialog-config-entry-system-options.ts | 25 ++++----- .../dialog-mqtt-device-debug-info.ts | 29 ++++++---- src/panels/config/cloud/alexa/cloud-alexa.ts | 20 ++++--- .../cloud-google-assistant.ts | 20 ++++--- .../entities/entity-registry-basic-editor.ts | 53 ++++++++++-------- .../entities/entity-registry-settings.ts | 53 ++++++++++-------- .../config/entities/ha-config-entities.ts | 3 - .../helpers/forms/ha-input_boolean-form.ts | 1 - .../helpers/forms/ha-input_datetime-form.ts | 1 - .../helpers/forms/ha-input_number-form.ts | 1 - .../helpers/forms/ha-input_select-form.ts | 1 - .../helpers/forms/ha-input_text-form.ts | 1 - .../dialog-lovelace-dashboard-detail.ts | 32 +++++++---- src/panels/config/users/dialog-add-user.ts | 10 +++- src/panels/config/users/dialog-user-detail.ts | 16 ++++-- src/panels/config/zone/dialog-zone-detail.ts | 12 +++- .../config-elements/hui-button-card-editor.ts | 22 +++++--- .../hui-conditional-card-editor.ts | 1 - .../hui-entities-card-editor.ts | 16 ++++-- .../config-elements/hui-gauge-card-editor.ts | 14 +++-- .../config-elements/hui-glance-card-editor.ts | 48 ++++++++++------ .../config-elements/hui-map-card-editor.ts | 16 ++++-- .../hui-picture-entity-card-editor.ts | 31 +++++++---- .../hui-weather-forecast-card-editor.ts | 16 ++++-- .../lovelace/editor/hui-dialog-save-config.ts | 14 +++-- .../editor/view-editor/hui-view-editor.ts | 16 ++++-- 29 files changed, 320 insertions(+), 248 deletions(-) create mode 100644 src/components/ha-formfield.ts diff --git a/gallery/src/components/demo-cards.js b/gallery/src/components/demo-cards.js index 5b1c8123ad..26ac82e3f7 100644 --- a/gallery/src/components/demo-cards.js +++ b/gallery/src/components/demo-cards.js @@ -3,6 +3,7 @@ import { html } from "@polymer/polymer/lib/utils/html-tag"; /* eslint-plugin-disable lit */ import { PolymerElement } from "@polymer/polymer/polymer-element"; import "../../../src/components/ha-switch"; +import "../../../src/components/ha-formfield"; import "./demo-card"; class DemoCards extends PolymerElement { @@ -26,9 +27,10 @@ class DemoCards extends PolymerElement {
- - Show config - + + + +
diff --git a/src/components/ha-formfield.ts b/src/components/ha-formfield.ts new file mode 100644 index 0000000000..45462d0689 --- /dev/null +++ b/src/components/ha-formfield.ts @@ -0,0 +1,33 @@ +import "@material/mwc-formfield"; +import type { Formfield } from "@material/mwc-formfield"; +import { style } from "@material/mwc-formfield/mwc-formfield-css"; +import { css, CSSResult, customElement } from "lit-element"; +import { Constructor } from "../types"; + +const MwcFormfield = customElements.get("mwc-formfield") as Constructor< + Formfield +>; + +@customElement("ha-formfield") +export class HaFormfield extends MwcFormfield { + protected static get styles(): CSSResult[] { + return [ + style, + css` + ::slotted(ha-switch) { + margin-right: 10px; + } + [dir="rtl"] ::slotted(ha-switch), + ::slotted(ha-switch)[dir="rtl"] { + margin-left: 10px; + } + `, + ]; + } +} + +declare global { + interface HTMLElementTagNameMap { + "ha-formfield": HaFormfield; + } +} diff --git a/src/components/ha-switch.ts b/src/components/ha-switch.ts index 0addeb5e1a..ed5c123a1d 100644 --- a/src/components/ha-switch.ts +++ b/src/components/ha-switch.ts @@ -1,15 +1,7 @@ -import { ripple } from "@material/mwc-ripple/ripple-directive"; import "@material/mwc-switch"; import type { Switch } from "@material/mwc-switch"; import { style } from "@material/mwc-switch/mwc-switch-css"; -import { - css, - CSSResult, - customElement, - html, - property, - query, -} from "lit-element"; +import { css, CSSResult, customElement, property } from "lit-element"; import { forwardHaptic } from "../data/haptics"; import { Constructor } from "../types"; @@ -22,18 +14,12 @@ export class HaSwitch extends MwcSwitch { // Do not add haptic when a user is required to press save. @property({ type: Boolean }) public haptic = false; - @query("slot") private _slot!: HTMLSlotElement; - protected firstUpdated() { super.firstUpdated(); this.style.setProperty( "--mdc-theme-secondary", "var(--switch-checked-color)" ); - this.classList.toggle( - "slotted", - Boolean(this._slot.assignedNodes().length) - ); this.addEventListener("change", () => { if (this.haptic) { forwardHaptic("light"); @@ -41,40 +27,10 @@ export class HaSwitch extends MwcSwitch { }); } - protected render() { - return html` -
-
-
-
- -
-
-
- - `; - } - protected static get styles(): CSSResult[] { return [ style, css` - :host { - display: flex; - flex-direction: row; - align-items: center; - } .mdc-switch.mdc-switch--checked .mdc-switch__thumb { background-color: var(--switch-checked-button-color); border-color: var(--switch-checked-button-color); @@ -91,18 +47,9 @@ export class HaSwitch extends MwcSwitch { background-color: var(--switch-unchecked-track-color); border-color: var(--switch-unchecked-track-color); } - :host(.slotted) .mdc-switch { - margin-right: 24px; - } `, ]; } - - private _haChangeHandler(e: Event) { - this.mdcFoundation.handleChange(e); - // catch "click" event and sync properties - this.checked = this.formElement.checked; - } } declare global { diff --git a/src/dialogs/config-entry-system-options/dialog-config-entry-system-options.ts b/src/dialogs/config-entry-system-options/dialog-config-entry-system-options.ts index 5ee5bfd538..b995ce6d1d 100644 --- a/src/dialogs/config-entry-system-options/dialog-config-entry-system-options.ts +++ b/src/dialogs/config-entry-system-options/dialog-config-entry-system-options.ts @@ -11,6 +11,7 @@ import { } from "lit-element"; import "../../components/dialog/ha-paper-dialog"; import "../../components/ha-switch"; +import "../../components/ha-formfield"; import type { HaSwitch } from "../../components/ha-switch"; import { getConfigEntrySystemOptions, @@ -82,13 +83,8 @@ class DialogConfigEntrySystemOptions extends LitElement { ? html`
${this._error}
` : ""}
- -
-

+ ${this.hass.localize( "ui.dialogs.config_entry_system_options.enable_new_entities_label" )} @@ -101,9 +97,15 @@ class DialogConfigEntrySystemOptions extends LitElement { `component.${this._params.entry.domain}.title` ) || this._params.entry.domain )} -

-
-
+

`} + > + + +
`} @@ -172,9 +174,6 @@ class DialogConfigEntrySystemOptions extends LitElement { padding-bottom: 24px; color: var(--primary-text-color); } - p { - margin: 0; - } .secondary { color: var(--secondary-text-color); } diff --git a/src/dialogs/mqtt-device-debug-info-dialog/dialog-mqtt-device-debug-info.ts b/src/dialogs/mqtt-device-debug-info-dialog/dialog-mqtt-device-debug-info.ts index 4eb09e5382..80b3326e64 100644 --- a/src/dialogs/mqtt-device-debug-info-dialog/dialog-mqtt-device-debug-info.ts +++ b/src/dialogs/mqtt-device-debug-info-dialog/dialog-mqtt-device-debug-info.ts @@ -11,6 +11,7 @@ import { import { computeStateName } from "../../common/entity/compute_state_name"; import "../../components/ha-dialog"; import "../../components/ha-switch"; +import "../../components/ha-formfield"; import type { HaSwitch } from "../../components/ha-switch"; import { computeDeviceName } from "../../data/device_registry"; import { fetchMQTTDebugInfo, MQTTDeviceDebugInfo } from "../../data/mqtt"; @@ -61,22 +62,28 @@ class DialogMQTTDeviceDebugInfo extends LitElement { "ui.dialogs.mqtt_device_debug_info.payload_display" )} - - ${this.hass!.localize( + - - ${this.hass!.localize( + + + + + > + + +

${this.hass!.localize("ui.dialogs.mqtt_device_debug_info.entities")}

diff --git a/src/panels/config/cloud/alexa/cloud-alexa.ts b/src/panels/config/cloud/alexa/cloud-alexa.ts index d9fbad2daa..e0218135b6 100644 --- a/src/panels/config/cloud/alexa/cloud-alexa.ts +++ b/src/panels/config/cloud/alexa/cloud-alexa.ts @@ -33,6 +33,7 @@ import { showDomainTogglerDialog } from "../../../../dialogs/domain-toggler/show import "../../../../layouts/hass-loading-screen"; import "../../../../layouts/hass-subpage"; import type { HomeAssistant } from "../../../../types"; +import "../../../../components/ha-formfield"; const DEFAULT_CONFIG_EXPOSE = true; const IGNORE_INTERFACES = ["Alexa.EndpointHealth"]; @@ -127,14 +128,19 @@ class CloudAlexa extends LitElement { ) .join(", ")} - - ${this.hass!.localize("ui.panel.config.cloud.alexa.expose")} - + + +
`); diff --git a/src/panels/config/cloud/google-assistant/cloud-google-assistant.ts b/src/panels/config/cloud/google-assistant/cloud-google-assistant.ts index 325cc56dae..7a2ec32a87 100644 --- a/src/panels/config/cloud/google-assistant/cloud-google-assistant.ts +++ b/src/panels/config/cloud/google-assistant/cloud-google-assistant.ts @@ -38,6 +38,7 @@ import "../../../../layouts/hass-loading-screen"; import "../../../../layouts/hass-subpage"; import type { HomeAssistant } from "../../../../types"; import { showToast } from "../../../../util/toast"; +import "../../../../components/ha-formfield"; const DEFAULT_CONFIG_EXPOSE = true; @@ -127,14 +128,19 @@ class CloudGoogleAssistant extends LitElement { .map((trait) => trait.substr(trait.lastIndexOf(".") + 1)) .join(", ")} - - ${this.hass!.localize("ui.panel.config.cloud.google.expose")} - + + + ${entity.might_2fa ? html` -
-
- ${this.hass.localize( - "ui.dialogs.entity_registry.editor.enabled_label" - )} -
-
- ${this._disabledBy && this._disabledBy !== "user" - ? this.hass.localize( - "ui.dialogs.entity_registry.editor.enabled_cause", - "cause", - this.hass.localize( - `config_entry.disabled_by.${this._disabledBy}` - ) - ) - : ""} - ${this.hass.localize( - "ui.dialogs.entity_registry.editor.enabled_description" - )} -
${this.hass.localize( - "ui.dialogs.entity_registry.editor.note" - )} -
-
+
+
+ ${this.hass.localize( + "ui.dialogs.entity_registry.editor.enabled_label" + )} +
+
+ ${this._disabledBy && this._disabledBy !== "user" + ? this.hass.localize( + "ui.dialogs.entity_registry.editor.enabled_cause", + "cause", + this.hass.localize( + `config_entry.disabled_by.${this._disabledBy}` + ) + ) + : ""} + ${this.hass.localize( + "ui.dialogs.entity_registry.editor.enabled_description" + )} +
${this.hass.localize( + "ui.dialogs.entity_registry.editor.note" + )} +
+
`; } @@ -127,9 +127,14 @@ export class HaEntityRegistryBasicEditor extends LitElement { static get styles() { return css` + ha-switch { + margin-right: 16px; + } .row { margin-top: 8px; color: var(--primary-text-color); + display: flex; + align-items: center; } .secondary { color: var(--secondary-text-color); diff --git a/src/panels/config/entities/entity-registry-settings.ts b/src/panels/config/entities/entity-registry-settings.ts index ad85511e99..7fc445518b 100644 --- a/src/panels/config/entities/entity-registry-settings.ts +++ b/src/panels/config/entities/entity-registry-settings.ts @@ -120,31 +120,31 @@ export class EntityRegistrySettings extends LitElement { .checked=${!this._disabledBy} @change=${this._disabledByChanged} > -
-
- ${this.hass.localize( - "ui.dialogs.entity_registry.editor.enabled_label" - )} -
-
- ${this._disabledBy && this._disabledBy !== "user" - ? this.hass.localize( - "ui.dialogs.entity_registry.editor.enabled_cause", - "cause", - this.hass.localize( - `config_entry.disabled_by.${this._disabledBy}` - ) - ) - : ""} - ${this.hass.localize( - "ui.dialogs.entity_registry.editor.enabled_description" - )} -
${this.hass.localize( - "ui.dialogs.entity_registry.editor.note" - )} -
-
+
+
+ ${this.hass.localize( + "ui.dialogs.entity_registry.editor.enabled_label" + )} +
+
+ ${this._disabledBy && this._disabledBy !== "user" + ? this.hass.localize( + "ui.dialogs.entity_registry.editor.enabled_cause", + "cause", + this.hass.localize( + `config_entry.disabled_by.${this._disabledBy}` + ) + ) + : ""} + ${this.hass.localize( + "ui.dialogs.entity_registry.editor.enabled_description" + )} +
${this.hass.localize( + "ui.dialogs.entity_registry.editor.note" + )} +
+
@@ -247,9 +247,14 @@ export class EntityRegistrySettings extends LitElement { mwc-button.warning { margin-right: auto; } + ha-switch { + margin-right: 16px; + } .row { margin-top: 8px; color: var(--primary-text-color); + display: flex; + align-items: center; } `, ]; diff --git a/src/panels/config/entities/ha-config-entities.ts b/src/panels/config/entities/ha-config-entities.ts index fcbbbef6b0..09766612bd 100644 --- a/src/panels/config/entities/ha-config-entities.ts +++ b/src/panels/config/entities/ha-config-entities.ts @@ -741,9 +741,6 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) { height: calc(100vh - 65px); display: block; } - ha-switch { - margin-top: 16px; - } ha-button-menu { margin-right: 8px; } diff --git a/src/panels/config/helpers/forms/ha-input_boolean-form.ts b/src/panels/config/helpers/forms/ha-input_boolean-form.ts index 55872f7250..af22fc3b06 100644 --- a/src/panels/config/helpers/forms/ha-input_boolean-form.ts +++ b/src/panels/config/helpers/forms/ha-input_boolean-form.ts @@ -10,7 +10,6 @@ import { } from "lit-element"; import { fireEvent } from "../../../../common/dom/fire_event"; import "../../../../components/ha-icon-input"; -import "../../../../components/ha-switch"; import { InputBoolean } from "../../../../data/input_boolean"; import { haStyle } from "../../../../resources/styles"; import { HomeAssistant } from "../../../../types"; diff --git a/src/panels/config/helpers/forms/ha-input_datetime-form.ts b/src/panels/config/helpers/forms/ha-input_datetime-form.ts index dbe99860c0..081f550618 100644 --- a/src/panels/config/helpers/forms/ha-input_datetime-form.ts +++ b/src/panels/config/helpers/forms/ha-input_datetime-form.ts @@ -12,7 +12,6 @@ import { } from "lit-element"; import { fireEvent } from "../../../../common/dom/fire_event"; import "../../../../components/ha-icon-input"; -import "../../../../components/ha-switch"; import { InputDateTime } from "../../../../data/input_datetime"; import { haStyle } from "../../../../resources/styles"; import { HomeAssistant } from "../../../../types"; diff --git a/src/panels/config/helpers/forms/ha-input_number-form.ts b/src/panels/config/helpers/forms/ha-input_number-form.ts index 078c63768b..a6b383348b 100644 --- a/src/panels/config/helpers/forms/ha-input_number-form.ts +++ b/src/panels/config/helpers/forms/ha-input_number-form.ts @@ -12,7 +12,6 @@ import { } from "lit-element"; import { fireEvent } from "../../../../common/dom/fire_event"; import "../../../../components/ha-icon-input"; -import "../../../../components/ha-switch"; import { InputNumber } from "../../../../data/input_number"; import { haStyle } from "../../../../resources/styles"; import { HomeAssistant } from "../../../../types"; diff --git a/src/panels/config/helpers/forms/ha-input_select-form.ts b/src/panels/config/helpers/forms/ha-input_select-form.ts index 8d1fa83b14..e73eddee5b 100644 --- a/src/panels/config/helpers/forms/ha-input_select-form.ts +++ b/src/panels/config/helpers/forms/ha-input_select-form.ts @@ -16,7 +16,6 @@ import { } from "lit-element"; import { fireEvent } from "../../../../common/dom/fire_event"; import "../../../../components/ha-icon-input"; -import "../../../../components/ha-switch"; import type { InputSelect } from "../../../../data/input_select"; import { showConfirmationDialog } from "../../../../dialogs/generic/show-dialog-box"; import { haStyle } from "../../../../resources/styles"; diff --git a/src/panels/config/helpers/forms/ha-input_text-form.ts b/src/panels/config/helpers/forms/ha-input_text-form.ts index 9839d65153..5e2a2c0407 100644 --- a/src/panels/config/helpers/forms/ha-input_text-form.ts +++ b/src/panels/config/helpers/forms/ha-input_text-form.ts @@ -12,7 +12,6 @@ import { } from "lit-element"; import { fireEvent } from "../../../../common/dom/fire_event"; import "../../../../components/ha-icon-input"; -import "../../../../components/ha-switch"; import { InputText } from "../../../../data/input_text"; import { haStyle } from "../../../../resources/styles"; import { HomeAssistant } from "../../../../types"; diff --git a/src/panels/config/lovelace/dashboards/dialog-lovelace-dashboard-detail.ts b/src/panels/config/lovelace/dashboards/dialog-lovelace-dashboard-detail.ts index b4acba31c2..3ecf330d99 100644 --- a/src/panels/config/lovelace/dashboards/dialog-lovelace-dashboard-detail.ts +++ b/src/panels/config/lovelace/dashboards/dialog-lovelace-dashboard-detail.ts @@ -10,7 +10,9 @@ import { } from "lit-element"; import { createCloseHeading } from "../../../../components/ha-dialog"; import "../../../../components/ha-icon-input"; -import { HaSwitch } from "../../../../components/ha-switch"; +import type { HaSwitch } from "../../../../components/ha-switch"; +import "../../../../components/ha-switch"; +import "../../../../components/ha-formfield"; import { slugify } from "../../../../common/string/slugify"; import { LovelaceDashboard, @@ -141,20 +143,28 @@ export class DialogLovelaceDashboardDetail extends LitElement { > ` : ""} - ${this.hass.localize( + - ${this.hass.localize( + > + + + + + > + + + `} diff --git a/src/panels/config/users/dialog-add-user.ts b/src/panels/config/users/dialog-add-user.ts index 568f0e6d35..f5ef631db4 100644 --- a/src/panels/config/users/dialog-add-user.ts +++ b/src/panels/config/users/dialog-add-user.ts @@ -13,6 +13,7 @@ import { } from "lit-element"; import "../../../components/ha-dialog"; import "../../../components/ha-switch"; +import "../../../components/ha-formfield"; import { createAuthForUser } from "../../../data/auth"; import { createUser, @@ -112,9 +113,12 @@ export class DialogAddUser extends LitElement { @value-changed=${this._passwordChanged} .errorMessage=${this.hass.localize("ui.common.error_required")} > - - ${this.hass.localize("ui.panel.config.users.editor.admin")} - + + + + ${!this._isAdmin ? html`
diff --git a/src/panels/config/users/dialog-user-detail.ts b/src/panels/config/users/dialog-user-detail.ts index 929fcdae6e..430db81236 100644 --- a/src/panels/config/users/dialog-user-detail.ts +++ b/src/panels/config/users/dialog-user-detail.ts @@ -12,6 +12,7 @@ import { } from "lit-element"; import { createCloseHeading } from "../../../components/ha-dialog"; import "../../../components/ha-switch"; +import "../../../components/ha-formfield"; import { SYSTEM_GROUP_ID_ADMIN, SYSTEM_GROUP_ID_USER, @@ -99,13 +100,16 @@ class DialogUserDetail extends LitElement { "ui.panel.config.users.editor.name" )}" > - - ${this.hass.localize("ui.panel.config.users.editor.admin")} - + + + ${!this._isAdmin ? html`
diff --git a/src/panels/config/zone/dialog-zone-detail.ts b/src/panels/config/zone/dialog-zone-detail.ts index 51fcdad3b8..ea656125a6 100644 --- a/src/panels/config/zone/dialog-zone-detail.ts +++ b/src/panels/config/zone/dialog-zone-detail.ts @@ -11,6 +11,7 @@ import { import { addDistanceToCoord } from "../../../common/location/add_distance_to_coord"; import { createCloseHeading } from "../../../components/ha-dialog"; import "../../../components/ha-switch"; +import "../../../components/ha-formfield"; import "../../../components/map/ha-location-editor"; import { defaultRadiusColor, @@ -181,11 +182,16 @@ class DialogZoneDetail extends LitElement {

${this.hass!.localize("ui.panel.config.zone.detail.passive_note")}

- ${this.hass!.localize( + + + ${this._params.entry diff --git a/src/panels/lovelace/editor/config-elements/hui-button-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-button-card-editor.ts index 17b5ae531c..f281b43867 100644 --- a/src/panels/lovelace/editor/config-elements/hui-button-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-button-card-editor.ts @@ -23,6 +23,7 @@ import { EntitiesEditorEvent, } from "../types"; import "../../../../components/ha-switch"; +import "../../../../components/ha-formfield"; import { configElementStyle } from "./config-elements-style"; const cardConfigStruct = struct({ @@ -143,22 +144,25 @@ export class HuiButtonCardEditor extends LitElement >
- + ${this.hass.localize( - "ui.panel.lovelace.editor.card.generic.show_name" - )} - + + ${this.hass.localize( - "ui.panel.lovelace.editor.card.generic.show_icon" - )} + >
- ${this.hass.localize( + + +
- ${this.hass.localize( + + ${this._config!.severity !== undefined ? html`
- ${this.hass.localize( + - ${this.hass.localize( + + + - ${this.hass.localize( + + + + + + +
- ${this.hass.localize( + +
- ${this.hass.localize( + - ${this.hass.localize( + + +
- ${this.hass.localize( + +
`; diff --git a/src/panels/lovelace/editor/hui-dialog-save-config.ts b/src/panels/lovelace/editor/hui-dialog-save-config.ts index 9ca6a348a5..fb505b1806 100644 --- a/src/panels/lovelace/editor/hui-dialog-save-config.ts +++ b/src/panels/lovelace/editor/hui-dialog-save-config.ts @@ -15,6 +15,7 @@ import { fireEvent } from "../../../common/dom/fire_event"; import "../../../components/dialog/ha-paper-dialog"; import type { HaPaperDialog } from "../../../components/dialog/ha-paper-dialog"; import "../../../components/ha-switch"; +import "../../../components/ha-formfield"; import "../../../components/ha-yaml-editor"; import type { PolymerChangedEvent } from "../../../polymer-types"; import { haStyleDialog } from "../../../resources/styles"; @@ -72,13 +73,16 @@ export class HuiSaveConfig extends LitElement { "ui.panel.lovelace.editor.save_config.para_sure" )}

- ${this.hass!.localize( + + ` : html`

diff --git a/src/panels/lovelace/editor/view-editor/hui-view-editor.ts b/src/panels/lovelace/editor/view-editor/hui-view-editor.ts index 83208d236e..6ab6be4a0f 100644 --- a/src/panels/lovelace/editor/view-editor/hui-view-editor.ts +++ b/src/panels/lovelace/editor/view-editor/hui-view-editor.ts @@ -11,6 +11,7 @@ import { import { fireEvent } from "../../../../common/dom/fire_event"; import { slugify } from "../../../../common/string/slugify"; import "../../../../components/ha-switch"; +import "../../../../components/ha-formfield"; import "../../../../components/ha-icon-input"; import { LovelaceViewConfig } from "../../../../data/lovelace"; import { HomeAssistant } from "../../../../types"; @@ -121,14 +122,17 @@ export class HuiViewEditor extends LitElement { .configValue=${"theme"} @value-changed=${this._valueChanged} > - ${this.hass.localize( + + ${this.hass.localize( "ui.panel.lovelace.editor.view.panel_mode.description" From db68c5852ce85141afa92fddd924145ae0410941 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Wed, 10 Jun 2020 00:32:12 +0000 Subject: [PATCH 24/39] [ci skip] Translation update --- translations/frontend/en.json | 4 ++ translations/frontend/fi.json | 14 ++++++- translations/frontend/hi.json | 75 +++++++++++++++++++++++++++++++---- translations/frontend/ko.json | 7 +++- translations/frontend/pl.json | 10 ++--- 5 files changed, 94 insertions(+), 16 deletions(-) diff --git a/translations/frontend/en.json b/translations/frontend/en.json index 13bf45dc77..270901cd2c 100644 --- a/translations/frontend/en.json +++ b/translations/frontend/en.json @@ -480,8 +480,10 @@ "delete": "Delete", "error_required": "Required", "loading": "Loading", + "menu": "Menu", "next": "Next", "no": "No", + "overflow_menu": "Overflow menu", "previous": "Previous", "refresh": "Refresh", "save": "Save", @@ -911,6 +913,8 @@ "introduction": "Use automations to bring your home alive.", "load_error_not_editable": "Only automations in automations.yaml are editable.", "load_error_unknown": "Error loading automation ({err_no}).", + "move_down": "Move down", + "move_up": "Move up", "save": "Save", "triggers": { "add": "Add trigger", diff --git a/translations/frontend/fi.json b/translations/frontend/fi.json index 3380e76200..de4a364d8f 100644 --- a/translations/frontend/fi.json +++ b/translations/frontend/fi.json @@ -478,6 +478,7 @@ "cancel": "Peruuta", "close": "Sulje", "delete": "Poista", + "error_required": "Pakollinen", "loading": "Ladataan", "next": "Seuraava", "no": "Ei", @@ -1221,6 +1222,7 @@ "different_include": "Mahdollisesti verkkotunnuksen, glob-kaavan tai muun sisällön kautta.", "pick_attribute": "Valitse yliajettava määrite", "picker": { + "entity": "Kohde", "header": "Räätälöinti", "introduction": "Muotoile ominaisuuksia olemuskohtaisesti. Lisäykset/muokkaukset tulevat välittömästi voimaan. Poistetut mukautukset tulevat voimaan, kun olemus päivitetään." }, @@ -1679,7 +1681,8 @@ "name": "Nimi", "system": "Järjestelmä" } - } + }, + "users_privileges_note": "Käyttäjät-ryhmä on vielä kesken. Käyttäjä ei voi hallita Home Assistantia käyttöliittymän kautta. Auditoimme edelleen kaikkia hallinta-API-päätepisteitä varmistaaksemme, että ne rajoittavat pääsyn oikein." }, "zha": { "add_device_page": { @@ -1849,10 +1852,13 @@ "group": "Ryhmä", "header": "Z-Wave-solmun hallinta", "introduction": "Suorita Z-Wave-komennot, jotka vaikuttavat yhteen solmuun. Valitse solmu nähdäksesi luettelon käytettävissä olevista komennoista.", + "max_associations": "Maksimiyhdistykset:", + "node_group_associations": "Solmujen ryhmäyhdistykset", "node_protection": "Solmujen suojaus", "node_to_control": "Hallinnoitava solmu", "nodes": "Solmut", "nodes_hint": "Valitse solmu tarkastellaksesi solmukohtaisia vaihtoehtoja", + "nodes_in_group": "Muut tämän ryhmän solmut:", "pooling_intensity": "Kyselyn voimakkuus", "protection": "Suojaus", "remove_broadcast": "Poista lähetys", @@ -1876,7 +1882,9 @@ "print_node": "Tulosta solmu", "refresh_entity": "Päivitä kohde", "refresh_node": "Päivitä solmu", + "remove_failed_node": "Poista epäonnistunut solmu", "remove_node": "Poista solmu", + "replace_failed_node": "Korvaa epäonnistunut solmu", "save_config": "Tallenna asetukset", "soft_reset": "Pehmeä nollaus", "start_network": "Käynnistä verkko", @@ -2043,6 +2051,7 @@ "clear_items": "Tyhjää valitut kohteet" }, "starting": { + "description": "Home Assistant käynnistyy...", "header": "Home Assistant käynnistyy..." } }, @@ -2336,7 +2345,8 @@ "attribute_not_found": "Määrite {attribute} ei ole käytettävissä kohteessa {entity}", "entity_non_numeric": "Yksikkö ei ole numeerinen: {entity}", "entity_not_found": "Yksikkö ei ole käytettävissä: {entity}", - "entity_unavailable": "{entity} ei ole tällä hetkellä käytettävissä" + "entity_unavailable": "{entity} ei ole tällä hetkellä käytettävissä", + "starting": "Home Assistant käynnistyy. Kaikki palvelut eivät välttämättä ole vielä saatavilla." } }, "mailbox": { diff --git a/translations/frontend/hi.json b/translations/frontend/hi.json index d4912ce2a8..5284d1ebea 100644 --- a/translations/frontend/hi.json +++ b/translations/frontend/hi.json @@ -12,7 +12,8 @@ "state_attributes": { "climate": { "fan_mode": { - "off": "बंद" + "off": "बंद", + "on": "चालू" } } }, @@ -35,7 +36,8 @@ }, "state": { "automation": { - "off": "बंद" + "off": "बंद", + "on": "चालू" }, "binary_sensor": { "battery": { @@ -51,7 +53,8 @@ "on": "जुड़े हुए" }, "default": { - "off": "बंद" + "off": "बंद", + "on": "चालू" }, "door": { "off": "बंद", @@ -64,6 +67,10 @@ "heat": { "on": "गर्म" }, + "moisture": { + "off": "सूखा", + "on": "गीला" + }, "motion": { "off": "विशद", "on": "अनुसन्धानित" @@ -74,13 +81,18 @@ "presence": { "on": "घर" }, + "safety": { + "off": "सुरक्षित", + "on": "असुरक्षित" + }, "window": { "off": "बंद", "on": "खुली" } }, "calendar": { - "off": "बंद" + "off": "बंद", + "on": "चालू" }, "camera": { "recording": "रिकॉर्डिंग" @@ -88,6 +100,7 @@ "climate": { "cool": "ठंडा", "dry": "सूखा", + "fan_only": "केवल पंखा", "heat": "गर्मी", "off": "बंद" }, @@ -104,13 +117,16 @@ "group": { "home": "घर", "off": "बंद", + "on": "चालू", "problem": "समस्या" }, "input_boolean": { - "off": "बंद" + "off": "बंद", + "on": "चालू" }, "light": { - "off": "बंद" + "off": "बंद", + "on": "चालू" }, "lock": { "locked": "अवरोधित", @@ -141,7 +157,8 @@ "below_horizon": "क्षितिज के नीचे" }, "switch": { - "off": "बंद" + "off": "बंद", + "on": "चालू" }, "zwave": { "default": { @@ -165,6 +182,8 @@ } }, "common": { + "and": "और", + "previous": "पिछला", "undo": "पूर्ववत करें" }, "dialogs": { @@ -190,7 +209,15 @@ "title": "सूचनाएँ" }, "panel": { + "calendar": { + "today": "आज" + }, "config": { + "areas": { + "editor": { + "name": "नाम" + } + }, "automation": { "editor": { "conditions": { @@ -238,6 +265,33 @@ } } }, + "cloud": { + "account": { + "google": { + "title": "Google Assistant" + }, + "thank_you_note": "होम असिस्टेंट क्लाउड का हिस्सा बनने के लिए धन्यवाद। यह आप जैसे लोगों की वजह से है कि हम हर किसी के लिए एक शानदार होम ऑटोमेशन अनुभव बनाने में सक्षम हैं। धन्यवाद!" + }, + "forgot_password": { + "email": "ईमेल", + "subtitle": "अपना पासवर्ड भूल गए", + "title": "पासवर्ड भूल गए" + }, + "login": { + "email": "ईमेल", + "email_error_msg": "अवैध ईमेल", + "forgot_password": "पासवर्ड भूल गए?", + "introduction": "होम असिस्टेंट क्लाउड आपको घर से दूर रहते हुए अपने इंस्टेंस से सुरक्षित रिमोट कनेक्शन प्रदान करता है। यह आपको क्लाउड-ओनली सेवाओं से जुड़ने की भी अनुमति देता है: अमेज़न एलेक्सा और गूगल असिस्टेंट।", + "introduction2": "यह सेवा हमारे साथी द्वारा चलाई जाती है", + "introduction2a": ", होम असिस्टेंट और हैसियो के संस्थापकों द्वारा स्थापित कंपनी।", + "learn_more_link": "होम असिस्टेंट क्लाउड के बारे में अधिक जानें", + "password": "पासवर्ड", + "start_trial": "अपना मुफ्त 1 महीने का परीक्षण शुरू करें" + }, + "register": { + "password": "पासवर्ड" + } + }, "filtering": { "clear": "विशद", "filtering_by": "द्वारा छान रहे हैं" @@ -310,6 +364,12 @@ } }, "lovelace": { + "cards": { + "starting": { + "description": "होम असिस्टेंट शुरू हो रहा है, कृपया प्रतीक्षा करें ...", + "header": "होम असिस्टेंट शुरू हो रहा है ..." + } + }, "editor": { "card": { "entity": { @@ -336,6 +396,7 @@ }, "page-authorize": { "form": { + "next": "अगला", "providers": { "trusted_networks": { "step": { diff --git a/translations/frontend/ko.json b/translations/frontend/ko.json index abf2fb6584..d5b86b3a63 100644 --- a/translations/frontend/ko.json +++ b/translations/frontend/ko.json @@ -478,6 +478,7 @@ "cancel": "취소", "close": "닫기", "delete": "삭제", + "error_required": "필수 요소", "loading": "읽는 중", "next": "다음", "no": "아니오", @@ -1221,6 +1222,7 @@ "different_include": "도메인, 글로브 혹은 다른 포함 구성을 통해 가능할 수 있습니다.", "pick_attribute": "재정의 할 속성 선택", "picker": { + "entity": "구성요소", "header": "사용자화", "introduction": "구성요소의 속성값을 입맛에 맞게 변경할 수 있습니다. 추가 혹은 수정된 사용자 정의 내용은 즉시 적용되지만, 제거된 내용은 구성요소가 업데이트 될 때 적용됩니다." }, @@ -1679,7 +1681,8 @@ "name": "이름", "system": "시스템" } - } + }, + "users_privileges_note": "사용자 그룹은 현재 작업 중이며, 사용자는 UI 를 통해 인스턴스를 관리할 수 없습니다. 모든 사용자 관리 API 엔드포인트가 관리자에 대한 액세스를 올바르게 제한하는지를 확인하는 중입니다." }, "zha": { "add_device_page": { @@ -2048,7 +2051,7 @@ "clear_items": "선택한 항목 삭제" }, "starting": { - "description": "Home Assistant 가 시작 중입니다. 잠시만 기다려주세요.", + "description": "Home Assistant 가 시작 중입니다. 잠시만 기다려주세요...", "header": "Home Assistant 시작 중 ..." } }, diff --git a/translations/frontend/pl.json b/translations/frontend/pl.json index 898522382a..dd4ca199d6 100644 --- a/translations/frontend/pl.json +++ b/translations/frontend/pl.json @@ -566,7 +566,7 @@ "confirm_delete": "Czy na pewno chcesz usunąć ten wpis?", "delete": "USUŃ", "enabled_cause": "Wyłączone przez {cause}.", - "enabled_description": "Wyłączone encje nie zostaną dodane do Home Assistanta.", + "enabled_description": "Wyłączone encje nie będą dostępne w Home Assistancie.", "enabled_label": "Włącz encję", "entity_id": "Identyfikator encji", "icon": "Nadpisanie ikony", @@ -1297,13 +1297,13 @@ "picker": { "disable_selected": { "button": "Wyłącz wybrane", - "confirm_text": "Wyłączone encje nie zostaną dodane do Home Assistanta.", - "confirm_title": "Czy chcesz wyłączyć {number} encj(ę/e/i)?" + "confirm_text": "Wyłączone encje nie będą dostępne w Home Assistancie.", + "confirm_title": "Czy chcesz wyłączyć encje: {number}?" }, "enable_selected": { "button": "Włącz wybrane", "confirm_text": "Dzięki temu będą ponownie dostępne w Home Assistant, jeśli są teraz wyłączone.", - "confirm_title": "Czy chcesz włączyć {number} encj(ę/e/i)?" + "confirm_title": "Czy chcesz włączyć encje: {number}?" }, "filter": { "filter": "Filtr", @@ -1325,7 +1325,7 @@ "confirm_partly_text": "Można usunąć tylko {removable} z wybranych {selected} encji. Encje można usunąć tylko wtedy, gdy integracja wspiera taka możliwość. Czasami trzeba ponownie uruchomić Home Assistanta, zanim będzie można usunąć encje usuniętej integracji. Czy na pewno chcesz usunąć usuwalne encje?", "confirm_partly_title": "Tylko {number} wybrane encje można usunąć.", "confirm_text": "Powinieneś uprzednio usunąć integrację z automatyzacji i konfiguracji Lovelace, jeśli encje w niej występują.", - "confirm_title": "Czy chcesz usunąć {number} encj(ę/e/i)?" + "confirm_title": "Czy chcesz usunąć encje: {number}?" }, "selected": "wybrano {number}", "status": { From 0b16a4880a981f5bff94d0a84c19283b2702ea8b Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 10 Jun 2020 11:59:05 +0200 Subject: [PATCH 25/39] Move info and log panels (#6127) --- .../config/dashboard/ha-config-dashboard.ts | 3 +- .../config/dashboard/ha-config-navigation.ts | 7 +- src/panels/config/ha-panel-config.ts | 79 +++++-- src/panels/config/info/ha-config-info.ts | 209 ++++++++++++++++++ .../info/integrations-card.ts | 8 +- .../info/system-health-card.ts | 4 +- .../logs/dialog-system-log-detail.ts | 2 +- .../logs/error-log-card.ts | 10 +- .../logs/ha-config-logs.ts} | 30 ++- .../logs/show-dialog-system-log-detail.ts | 0 .../logs/system-log-card.ts | 10 +- .../{developer-tools => config}/logs/util.ts | 0 .../developer-tools/developer-tools-router.ts | 10 +- .../ha-panel-developer-tools.ts | 6 - .../info/developer-tools-info.ts | 189 ---------------- .../lovelace/cards/hui-safe-mode-card.ts | 2 +- src/translations/en.json | 60 ++--- 17 files changed, 349 insertions(+), 280 deletions(-) create mode 100644 src/panels/config/info/ha-config-info.ts rename src/panels/{developer-tools => config}/info/integrations-card.ts (93%) rename src/panels/{developer-tools => config}/info/system-health-card.ts (95%) rename src/panels/{developer-tools => config}/logs/dialog-system-log-detail.ts (98%) rename src/panels/{developer-tools => config}/logs/error-log-card.ts (83%) rename src/panels/{developer-tools/logs/developer-tools-logs.ts => config/logs/ha-config-logs.ts} (59%) rename src/panels/{developer-tools => config}/logs/show-dialog-system-log-detail.ts (100%) rename src/panels/{developer-tools => config}/logs/system-log-card.ts (93%) rename src/panels/{developer-tools => config}/logs/util.ts (100%) delete mode 100644 src/panels/developer-tools/info/developer-tools-info.ts diff --git a/src/panels/config/dashboard/ha-config-dashboard.ts b/src/panels/config/dashboard/ha-config-dashboard.ts index 3671555353..eeff0bfc9a 100644 --- a/src/panels/config/dashboard/ha-config-dashboard.ts +++ b/src/panels/config/dashboard/ha-config-dashboard.ts @@ -20,6 +20,7 @@ import { HomeAssistant } from "../../../types"; import "../ha-config-section"; import { configSections } from "../ha-panel-config"; import "./ha-config-navigation"; +import { mdiCloudLock } from "@mdi/js"; @customElement("ha-config-dashboard") class HaConfigDashboard extends LitElement { @@ -66,7 +67,7 @@ class HaConfigDashboard extends LitElement { path: "/config/cloud", translationKey: "ui.panel.config.cloud.caption", info: this.cloudStatus, - icon: "hass:cloud-lock", + iconPath: mdiCloudLock, }, ]} > diff --git a/src/panels/config/dashboard/ha-config-navigation.ts b/src/panels/config/dashboard/ha-config-navigation.ts index a19f73a114..74c5afcfed 100644 --- a/src/panels/config/dashboard/ha-config-navigation.ts +++ b/src/panels/config/dashboard/ha-config-navigation.ts @@ -38,7 +38,10 @@ class HaConfigNavigation extends LitElement { tabindex="-1" > - + ${this.hass.localize( page.translationKey || @@ -88,7 +91,7 @@ class HaConfigNavigation extends LitElement { display: block; outline: 0; } - ha-icon, + ha-svg-icon, ha-icon-next { color: var(--secondary-text-color); } diff --git a/src/panels/config/ha-panel-config.ts b/src/panels/config/ha-panel-config.ts index 550e6d8d3f..7b344b9e5c 100644 --- a/src/panels/config/ha-panel-config.ts +++ b/src/panels/config/ha-panel-config.ts @@ -9,6 +9,25 @@ import "../../layouts/hass-loading-screen"; import { HassRouterPage, RouterOptions } from "../../layouts/hass-router-page"; import { PageNavigation } from "../../layouts/hass-tabs-subpage"; import { HomeAssistant, Route } from "../../types"; +import { + mdiPuzzle, + mdiDevices, + mdiShape, + mdiSofa, + mdiRobot, + mdiPalette, + mdiScriptText, + mdiTools, + mdiViewDashboard, + mdiAccount, + mdiMapMarkerRadius, + mdiAccountBadgeHorizontal, + mdiHomeAssistant, + mdiServer, + mdiInformation, + mdiMathLog, + mdiPencil, +} from "@mdi/js"; declare global { // for fire event @@ -23,28 +42,28 @@ export const configSections: { [name: string]: PageNavigation[] } = { component: "integrations", path: "/config/integrations", translationKey: "ui.panel.config.integrations.caption", - icon: "hass:puzzle", + iconPath: mdiPuzzle, core: true, }, { component: "devices", path: "/config/devices", translationKey: "ui.panel.config.devices.caption", - icon: "hass:devices", + iconPath: mdiDevices, core: true, }, { component: "entities", path: "/config/entities", translationKey: "ui.panel.config.entities.caption", - icon: "hass:shape", + iconPath: mdiShape, core: true, }, { component: "areas", path: "/config/areas", translationKey: "ui.panel.config.areas.caption", - icon: "hass:sofa", + iconPath: mdiSofa, core: true, }, ], @@ -53,25 +72,25 @@ export const configSections: { [name: string]: PageNavigation[] } = { component: "automation", path: "/config/automation", translationKey: "ui.panel.config.automation.caption", - icon: "hass:robot", + iconPath: mdiRobot, }, { component: "scene", path: "/config/scene", translationKey: "ui.panel.config.scene.caption", - icon: "hass:palette", + iconPath: mdiPalette, }, { component: "script", path: "/config/script", translationKey: "ui.panel.config.script.caption", - icon: "hass:script-text", + iconPath: mdiScriptText, }, { component: "helpers", path: "/config/helpers", translationKey: "ui.panel.config.helpers.caption", - icon: "hass:tools", + iconPath: mdiTools, core: true, }, ], @@ -80,7 +99,7 @@ export const configSections: { [name: string]: PageNavigation[] } = { component: "lovelace", path: "/config/lovelace/dashboards", translationKey: "ui.panel.config.lovelace.caption", - icon: "hass:view-dashboard", + iconPath: mdiViewDashboard, }, ], persons: [ @@ -88,19 +107,19 @@ export const configSections: { [name: string]: PageNavigation[] } = { component: "person", path: "/config/person", translationKey: "ui.panel.config.person.caption", - icon: "hass:account", + iconPath: mdiAccount, }, { component: "zone", path: "/config/zone", translationKey: "ui.panel.config.zone.caption", - icon: "hass:map-marker-radius", + iconPath: mdiMapMarkerRadius, }, { component: "users", path: "/config/users", translationKey: "ui.panel.config.users.caption", - icon: "hass:account-badge-horizontal", + iconPath: mdiAccountBadgeHorizontal, core: true, }, ], @@ -109,21 +128,37 @@ export const configSections: { [name: string]: PageNavigation[] } = { component: "core", path: "/config/core", translationKey: "ui.panel.config.core.caption", - icon: "hass:home-assistant", + iconPath: mdiHomeAssistant, core: true, }, { component: "server_control", path: "/config/server_control", translationKey: "ui.panel.config.server_control.caption", - icon: "hass:server", + iconPath: mdiServer, core: true, }, + { + component: "logs", + path: "/config/logs", + translationKey: "ui.panel.config.logs.caption", + iconPath: mdiMathLog, + core: true, + }, + { + component: "info", + path: "/config/info", + translationKey: "ui.panel.config.info.caption", + iconPath: mdiInformation, + core: true, + }, + ], + advanced: [ { component: "customize", path: "/config/customize", translationKey: "ui.panel.config.customize.caption", - icon: "hass:pencil", + iconPath: mdiPencil, core: true, advancedOnly: true, }, @@ -197,6 +232,20 @@ class HaPanelConfig extends HassRouterPage { /* webpackChunkName: "panel-config-server-control" */ "./server_control/ha-config-server-control" ), }, + logs: { + tag: "ha-config-logs", + load: () => + import( + /* webpackChunkName: "panel-config-logs" */ "./logs/ha-config-logs" + ), + }, + info: { + tag: "ha-config-info", + load: () => + import( + /* webpackChunkName: "panel-config-info" */ "./info/ha-config-info" + ), + }, customize: { tag: "ha-config-customize", load: () => diff --git a/src/panels/config/info/ha-config-info.ts b/src/panels/config/info/ha-config-info.ts new file mode 100644 index 0000000000..f1fd86998b --- /dev/null +++ b/src/panels/config/info/ha-config-info.ts @@ -0,0 +1,209 @@ +import { + css, + CSSResult, + html, + LitElement, + property, + TemplateResult, +} from "lit-element"; +import { haStyle } from "../../../resources/styles"; +import { HomeAssistant, Route } from "../../../types"; +import "./integrations-card"; +import "./system-health-card"; +import { configSections } from "../ha-panel-config"; +import "../../../layouts/hass-tabs-subpage"; + +const JS_TYPE = __BUILD__; +const JS_VERSION = __VERSION__; + +class HaConfigInfo extends LitElement { + @property() public hass!: HomeAssistant; + + @property() public narrow!: boolean; + + @property() public isWide!: boolean; + + @property() public showAdvanced!: boolean; + + @property() public route!: Route; + + protected render(): TemplateResult { + const hass = this.hass; + const customUiList: Array<{ name: string; url: string; version: string }> = + (window as any).CUSTOM_UI_LIST || []; + + return html` + +

+ ${this.hass.localize(
+                +
+

Home Assistant ${hass.connection.haVersion}

+

+ ${this.hass.localize( + "ui.panel.config.info.path_configuration", + "path", + hass.config.config_dir + )} +

+

+ + ${this.hass.localize("ui.panel.config.info.developed_by")} + +

+

+ ${this.hass.localize("ui.panel.config.info.license")}
+ ${this.hass.localize("ui.panel.config.info.source")} + ${this.hass.localize("ui.panel.config.info.server")} + — + ${this.hass.localize("ui.panel.config.info.frontend")} +

+

+ ${this.hass.localize("ui.panel.config.info.built_using")} + Python 3, + Polymer, ${this.hass.localize("ui.panel.config.info.icons_by")} + Google + ${this.hass.localize("ui.common.and")} + MaterialDesignIcons.com. +

+

+ ${this.hass.localize( + "ui.panel.config.info.frontend_version", + "version", + JS_VERSION, + "type", + JS_TYPE + )} + ${customUiList.length > 0 + ? html` +

+ ${this.hass.localize("ui.panel.config.info.custom_uis")} + ${customUiList.map( + (item) => html` +
+ ${item.name}: ${item.version} +
+ ` + )} +
+ ` + : ""} +

+
+
+ + +
+ + `; + } + + protected firstUpdated(changedProps): void { + super.firstUpdated(changedProps); + + // Legacy custom UI can be slow to register, give them time. + const customUI = ((window as any).CUSTOM_UI_LIST || []).length; + setTimeout(() => { + if (((window as any).CUSTOM_UI_LIST || []).length !== customUI.length) { + this.requestUpdate(); + } + }, 1000); + } + + static get styles(): CSSResult[] { + return [ + haStyle, + css` + :host { + -ms-user-select: initial; + -webkit-user-select: initial; + -moz-user-select: initial; + } + + .content { + direction: ltr; + } + + .about { + text-align: center; + line-height: 2em; + } + + .version { + @apply --paper-font-headline; + } + + .develop { + @apply --paper-font-subhead; + } + + .about a { + color: var(--primary-color); + } + + system-health-card, + integrations-card { + display: block; + max-width: 600px; + margin: 0 auto; + padding-bottom: 16px; + } + `, + ]; + } +} + +declare global { + interface HTMLElementTagNameMap { + "ha-config-info": HaConfigInfo; + } +} + +customElements.define("ha-config-info", HaConfigInfo); diff --git a/src/panels/developer-tools/info/integrations-card.ts b/src/panels/config/info/integrations-card.ts similarity index 93% rename from src/panels/developer-tools/info/integrations-card.ts rename to src/panels/config/info/integrations-card.ts index 6dd26b38ba..01390123b5 100644 --- a/src/panels/developer-tools/info/integrations-card.ts +++ b/src/panels/config/info/integrations-card.ts @@ -35,9 +35,7 @@ class IntegrationsCard extends LitElement { protected render(): TemplateResult { return html` @@ -67,7 +65,7 @@ class IntegrationsCard extends LitElement { rel="noreferrer" > ${this.hass.localize( - "ui.panel.developer-tools.tabs.info.documentation" + "ui.panel.config.info.documentation" )} @@ -83,7 +81,7 @@ class IntegrationsCard extends LitElement { rel="noreferrer" > ${this.hass.localize( - "ui.panel.developer-tools.tabs.info.issues" + "ui.panel.config.info.issues" )} diff --git a/src/panels/developer-tools/info/system-health-card.ts b/src/panels/config/info/system-health-card.ts similarity index 95% rename from src/panels/developer-tools/info/system-health-card.ts rename to src/panels/config/info/system-health-card.ts index 0ff2151131..84a184c97e 100644 --- a/src/panels/developer-tools/info/system-health-card.ts +++ b/src/panels/config/info/system-health-card.ts @@ -97,9 +97,7 @@ class SystemHealthCard extends LitElement { } catch (err) { this._info = { system_health: { - error: this.hass.localize( - "ui.panel.developer-tools.tabs.info.system_health_error" - ), + error: this.hass.localize("ui.panel.config.info.system_health_error"), }, }; } diff --git a/src/panels/developer-tools/logs/dialog-system-log-detail.ts b/src/panels/config/logs/dialog-system-log-detail.ts similarity index 98% rename from src/panels/developer-tools/logs/dialog-system-log-detail.ts rename to src/panels/config/logs/dialog-system-log-detail.ts index 7db4d653c2..237a42e90e 100644 --- a/src/panels/developer-tools/logs/dialog-system-log-detail.ts +++ b/src/panels/config/logs/dialog-system-log-detail.ts @@ -61,7 +61,7 @@ class DialogSystemLogDetail extends LitElement { >

${this.hass.localize( - "ui.panel.developer-tools.tabs.logs.details", + "ui.panel.config.logs.details", "level", item.level )} diff --git a/src/panels/developer-tools/logs/error-log-card.ts b/src/panels/config/logs/error-log-card.ts similarity index 83% rename from src/panels/developer-tools/logs/error-log-card.ts rename to src/panels/config/logs/error-log-card.ts index cc441fb186..916eb2e436 100644 --- a/src/panels/developer-tools/logs/error-log-card.ts +++ b/src/panels/config/logs/error-log-card.ts @@ -28,9 +28,7 @@ class ErrorLogCard extends LitElement { ` : html` - ${this.hass.localize( - "ui.panel.developer-tools.tabs.logs.load_full_log" - )} + ${this.hass.localize("ui.panel.config.logs.load_full_log")} `}

@@ -67,12 +65,10 @@ class ErrorLogCard extends LitElement { } private async _refreshErrorLog(): Promise { - this._errorLog = this.hass.localize( - "ui.panel.developer-tools.tabs.logs.loading_log" - ); + this._errorLog = this.hass.localize("ui.panel.config.logs.loading_log"); const log = await fetchErrorLog(this.hass!); this._errorLog = - log || this.hass.localize("ui.panel.developer-tools.tabs.logs.no_errors"); + log || this.hass.localize("ui.panel.config.logs.no_errors"); } } diff --git a/src/panels/developer-tools/logs/developer-tools-logs.ts b/src/panels/config/logs/ha-config-logs.ts similarity index 59% rename from src/panels/developer-tools/logs/developer-tools-logs.ts rename to src/panels/config/logs/ha-config-logs.ts index 5a027e3e0f..dd4a40c91c 100644 --- a/src/panels/developer-tools/logs/developer-tools-logs.ts +++ b/src/panels/config/logs/ha-config-logs.ts @@ -9,15 +9,25 @@ import { TemplateResult, } from "lit-element"; import { haStyle } from "../../../resources/styles"; -import { HomeAssistant } from "../../../types"; +import { HomeAssistant, Route } from "../../../types"; import "./error-log-card"; import "./system-log-card"; import type { SystemLogCard } from "./system-log-card"; +import { configSections } from "../ha-panel-config"; +import "../../../layouts/hass-tabs-subpage"; -@customElement("developer-tools-logs") +@customElement("ha-config-logs") export class HaPanelDevLogs extends LitElement { @property() public hass!: HomeAssistant; + @property() public narrow!: boolean; + + @property() public isWide!: boolean; + + @property() public showAdvanced!: boolean; + + @property() public route!: Route; + @query("system-log-card") private systemLog?: SystemLogCard; public connectedCallback() { @@ -29,10 +39,18 @@ export class HaPanelDevLogs extends LitElement { protected render(): TemplateResult { return html` -
- - -
+ +
+ + +
+
`; } diff --git a/src/panels/developer-tools/logs/show-dialog-system-log-detail.ts b/src/panels/config/logs/show-dialog-system-log-detail.ts similarity index 100% rename from src/panels/developer-tools/logs/show-dialog-system-log-detail.ts rename to src/panels/config/logs/show-dialog-system-log-detail.ts diff --git a/src/panels/developer-tools/logs/system-log-card.ts b/src/panels/config/logs/system-log-card.ts similarity index 93% rename from src/panels/developer-tools/logs/system-log-card.ts rename to src/panels/config/logs/system-log-card.ts index b7243fef2c..52187e7a05 100644 --- a/src/panels/developer-tools/logs/system-log-card.ts +++ b/src/panels/config/logs/system-log-card.ts @@ -54,9 +54,7 @@ export class SystemLogCard extends LitElement { ${this._items.length === 0 ? html`
- ${this.hass.localize( - "ui.panel.developer-tools.tabs.logs.no_issues" - )} + ${this.hass.localize("ui.panel.config.logs.no_issues")}
` : this._items.map( @@ -83,7 +81,7 @@ export class SystemLogCard extends LitElement { ? html` - ${this.hass.localize( - "ui.panel.developer-tools.tabs.logs.multiple_messages", + "ui.panel.config.logs.multiple_messages", "time", formatSystemLogTime( item.first_occurred, @@ -106,12 +104,12 @@ export class SystemLogCard extends LitElement { domain="system_log" service="clear" >${this.hass.localize( - "ui.panel.developer-tools.tabs.logs.clear" + "ui.panel.config.logs.clear" )} ${this.hass.localize( - "ui.panel.developer-tools.tabs.logs.refresh" + "ui.panel.config.logs.refresh" )} diff --git a/src/panels/developer-tools/logs/util.ts b/src/panels/config/logs/util.ts similarity index 100% rename from src/panels/developer-tools/logs/util.ts rename to src/panels/config/logs/util.ts diff --git a/src/panels/developer-tools/developer-tools-router.ts b/src/panels/developer-tools/developer-tools-router.ts index ecb4caf2ad..ca9bc9efdf 100644 --- a/src/panels/developer-tools/developer-tools-router.ts +++ b/src/panels/developer-tools/developer-tools-router.ts @@ -14,7 +14,7 @@ class DeveloperToolsRouter extends HassRouterPage { beforeRender: (page) => { if (!page || page === "not_found") { // If we can, we are going to restore the last visited page. - return this._currentPage ? this._currentPage : "info"; + return this._currentPage ? this._currentPage : "state"; } return undefined; }, @@ -25,14 +25,6 @@ class DeveloperToolsRouter extends HassRouterPage { tag: "developer-tools-event", load: () => import("./event/developer-tools-event"), }, - info: { - tag: "developer-tools-info", - load: () => import("./info/developer-tools-info"), - }, - logs: { - tag: "developer-tools-logs", - load: () => import("./logs/developer-tools-logs"), - }, mqtt: { tag: "developer-tools-mqtt", load: () => import("./mqtt/developer-tools-mqtt"), diff --git a/src/panels/developer-tools/ha-panel-developer-tools.ts b/src/panels/developer-tools/ha-panel-developer-tools.ts index 085d9ab350..4ff9f8edad 100644 --- a/src/panels/developer-tools/ha-panel-developer-tools.ts +++ b/src/panels/developer-tools/ha-panel-developer-tools.ts @@ -62,9 +62,6 @@ class PanelDeveloperTools extends LitElement { "ui.panel.developer-tools.tabs.services.title" )} - - ${this.hass.localize("ui.panel.developer-tools.tabs.logs.title")} - ${this.hass.localize( "ui.panel.developer-tools.tabs.templates.title" @@ -84,9 +81,6 @@ class PanelDeveloperTools extends LitElement { ` : ""} - - ${this.hass.localize("ui.panel.developer-tools.tabs.info.title")} - = - (window as any).CUSTOM_UI_LIST || []; - - return html` -
-

- ${this.hass.localize(
-                -
-

Home Assistant ${hass.connection.haVersion}

-

-

- ${this.hass.localize( - "ui.panel.developer-tools.tabs.info.path_configuration", - "path", - hass.config.config_dir - )} -

-

- - ${this.hass.localize( - "ui.panel.developer-tools.tabs.info.developed_by" - )} - -

-

- ${this.hass.localize( - "ui.panel.developer-tools.tabs.info.license" - )}
- ${this.hass.localize("ui.panel.developer-tools.tabs.info.source")} - ${this.hass.localize( - "ui.panel.developer-tools.tabs.info.server" - )} - — - ${this.hass.localize( - "ui.panel.developer-tools.tabs.info.frontend" - )} -

-

- ${this.hass.localize( - "ui.panel.developer-tools.tabs.info.built_using" - )} - Python 3, - Polymer, - ${this.hass.localize("ui.panel.developer-tools.tabs.info.icons_by")} - Google - ${this.hass.localize("ui.common.and")} - MaterialDesignIcons.com. -

-

- ${this.hass.localize( - "ui.panel.developer-tools.tabs.info.frontend_version", - "version", - JS_VERSION, - "type", - JS_TYPE - )} - ${ - customUiList.length > 0 - ? html` -

- ${this.hass.localize( - "ui.panel.developer-tools.tabs.info.custom_uis" - )} - ${customUiList.map( - (item) => html` -
- ${item.name}: ${item.version} -
- ` - )} -
- ` - : "" - } -

-
-
- - -
- `; - } - - protected firstUpdated(changedProps): void { - super.firstUpdated(changedProps); - - // Legacy custom UI can be slow to register, give them time. - const customUI = ((window as any).CUSTOM_UI_LIST || []).length; - setTimeout(() => { - if (((window as any).CUSTOM_UI_LIST || []).length !== customUI.length) { - this.requestUpdate(); - } - }, 1000); - } - - static get styles(): CSSResult[] { - return [ - haStyle, - css` - :host { - -ms-user-select: initial; - -webkit-user-select: initial; - -moz-user-select: initial; - } - - .content { - direction: ltr; - } - - .about { - text-align: center; - line-height: 2em; - } - - .version { - @apply --paper-font-headline; - } - - .develop { - @apply --paper-font-subhead; - } - - .about a { - color: var(--primary-color); - } - - system-health-card, - integrations-card { - display: block; - max-width: 600px; - margin: 0 auto; - padding-bottom: 16px; - } - `, - ]; - } -} - -declare global { - interface HTMLElementTagNameMap { - "developer-tools-info": HaPanelDevInfo; - } -} - -customElements.define("developer-tools-info", HaPanelDevInfo); diff --git a/src/panels/lovelace/cards/hui-safe-mode-card.ts b/src/panels/lovelace/cards/hui-safe-mode-card.ts index 02e6e5c236..133c97e249 100644 --- a/src/panels/lovelace/cards/hui-safe-mode-card.ts +++ b/src/panels/lovelace/cards/hui-safe-mode-card.ts @@ -10,7 +10,7 @@ import { } from "lit-element"; import "../../../components/ha-card"; import { HomeAssistant } from "../../../types"; -import "../../developer-tools/logs/error-log-card"; +import "../../config/logs/error-log-card"; import { LovelaceCard } from "../types"; @customElement("hui-safe-mode-card") diff --git a/src/translations/en.json b/src/translations/en.json index 57e177903d..251c4f1330 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -609,6 +609,37 @@ } } }, + "info": { + "caption": "Info", + "description": "Info about your Home Assistant installation", + "home_assistant_logo": "Home Assistant logo", + "path_configuration": "Path to configuration.yaml: {path}", + "developed_by": "Developed by a bunch of awesome people.", + "license": "Published under the Apache 2.0 license", + "source": "Source:", + "server": "server", + "frontend": "frontend-ui", + "built_using": "Built using", + "icons_by": "Icons by", + "frontend_version": "Frontend version: {version} - {type}", + "custom_uis": "Custom UIs:", + "system_health_error": "System Health component is not loaded. Add 'system_health:' to configuration.yaml", + "integrations": "Integrations", + "documentation": "Documentation", + "issues": "Issues" + }, + "logs": { + "caption": "Logs", + "description": "View the Home Assistant logs", + "details": "Log Details ({level})", + "load_full_log": "Load Full Home Assistant Log", + "loading_log": "Loading error log…", + "no_errors": "No errors have been reported.", + "no_issues": "There are no new issues!", + "clear": "Clear", + "refresh": "Refresh", + "multiple_messages": "message first occurred at {time} and shows up {counter} times" + }, "lovelace": { "caption": "Lovelace Dashboards", "description": "Configure your Lovelace Dashboards", @@ -2236,35 +2267,6 @@ }, "developer-tools": { "tabs": { - "info": { - "title": "Info", - "home_assistant_logo": "Home Assistant logo", - "path_configuration": "Path to configuration.yaml: {path}", - "developed_by": "Developed by a bunch of awesome people.", - "license": "Published under the Apache 2.0 license", - "source": "Source:", - "server": "server", - "frontend": "frontend-ui", - "built_using": "Built using", - "icons_by": "Icons by", - "frontend_version": "Frontend version: {version} - {type}", - "custom_uis": "Custom UIs:", - "system_health_error": "System Health component is not loaded. Add 'system_health:' to configuration.yaml", - "integrations": "Integrations", - "documentation": "Documentation", - "issues": "Issues" - }, - "logs": { - "title": "Logs", - "details": "Log Details ({level})", - "load_full_log": "Load Full Home Assistant Log", - "loading_log": "Loading error log…", - "no_errors": "No errors have been reported.", - "no_issues": "There are no new issues!", - "clear": "Clear", - "refresh": "Refresh", - "multiple_messages": "message first occurred at {time} and shows up {counter} times" - }, "events": { "title": "Events", "description": "Fire an event on the event bus.", From 26a87e928021507ef390d786501a339ef68fa0d7 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 10 Jun 2020 12:01:37 +0200 Subject: [PATCH 26/39] Changes ha-card to new material design rules (#6137) --- src/components/ha-card.ts | 20 +++++++++++++++---- .../integrations/ha-config-integrations.ts | 10 +++++----- .../integrations/ha-integration-card.ts | 3 ++- .../lovelace/components/hui-card-options.ts | 3 --- 4 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/components/ha-card.ts b/src/components/ha-card.ts index c37687190d..97ed27a7d7 100644 --- a/src/components/ha-card.ts +++ b/src/components/ha-card.ts @@ -12,6 +12,8 @@ import { class HaCard extends LitElement { @property() public header?: string; + @property({ type: Boolean, reflect: true }) public outlined = false; + static get styles(): CSSResult { return css` :host { @@ -19,12 +21,12 @@ class HaCard extends LitElement { --ha-card-background, var(--paper-card-background-color, white) ); - border-radius: var(--ha-card-border-radius, 2px); + border-radius: var(--ha-card-border-radius, 4px); box-shadow: var( --ha-card-box-shadow, - 0 2px 2px 0 rgba(0, 0, 0, 0.14), - 0 1px 5px 0 rgba(0, 0, 0, 0.12), - 0 3px 1px -2px rgba(0, 0, 0, 0.2) + 0px 2px 1px -1px rgba(0, 0, 0, 0.2), + 0px 1px 1px 0px rgba(0, 0, 0, 0.14), + 0px 1px 3px 0px rgba(0, 0, 0, 0.12) ); color: var(--primary-text-color); display: block; @@ -32,6 +34,16 @@ class HaCard extends LitElement { position: relative; } + :host([outlined]) { + box-shadow: 0 0 0 0; + border-width: 1px; + border-style: solid; + border-color: var( + --ha-card-border-color, + var(--divider-color, #e0e0e0) + ); + } + .card-header, :host ::slotted(.card-header) { color: var(--ha-card-header-color, --primary-text-color); diff --git a/src/panels/config/integrations/ha-config-integrations.ts b/src/panels/config/integrations/ha-config-integrations.ts index 6838af965c..ee6a60ddf1 100644 --- a/src/panels/config/integrations/ha-config-integrations.ts +++ b/src/panels/config/integrations/ha-config-integrations.ts @@ -299,7 +299,7 @@ class HaConfigIntegrations extends SubscribeMixin(LitElement) { ${this._showIgnored ? ignoredConfigEntries.map( (item: ConfigEntryExtended) => html` - +
${this.hass.localize( "ui.panel.config.integrations.ignore.ignored" @@ -335,7 +335,7 @@ class HaConfigIntegrations extends SubscribeMixin(LitElement) { ${configEntriesInProgress.length ? configEntriesInProgress.map( (flow: DataEntryFlowProgressExtended) => html` - +
${this.hass.localize( "ui.panel.config.integrations.discovered" @@ -396,7 +396,7 @@ class HaConfigIntegrations extends SubscribeMixin(LitElement) { ) : !this._configEntries.length ? html` - +

${this.hass.localize("ui.panel.config.integrations.none")} @@ -613,7 +613,7 @@ class HaConfigIntegrations extends SubscribeMixin(LitElement) { justify-content: space-between; } .discovered { - border: 1px solid var(--primary-color); + --ha-card-border-color: var(--primary-color); } .discovered .header { background: var(--primary-color); @@ -622,7 +622,7 @@ class HaConfigIntegrations extends SubscribeMixin(LitElement) { text-align: center; } .ignored { - border: 1px solid var(--light-theme-disabled-color); + --ha-card-border-color: var(--light-theme-disabled-color); } .ignored img { filter: grayscale(1); diff --git a/src/panels/config/integrations/ha-integration-card.ts b/src/panels/config/integrations/ha-integration-card.ts index 8cb53bace6..a904ebc338 100644 --- a/src/panels/config/integrations/ha-integration-card.ts +++ b/src/panels/config/integrations/ha-integration-card.ts @@ -76,7 +76,7 @@ export class HaIntegrationCard extends LitElement { private _renderGroupedIntegration(): TemplateResult { return html` - +
Date: Wed, 10 Jun 2020 21:19:42 +0200 Subject: [PATCH 27/39] Migrate dialog-box to ha-dialog (#6140) --- src/dialogs/generic/dialog-box.ts | 63 +++++++++++++------------------ 1 file changed, 27 insertions(+), 36 deletions(-) diff --git a/src/dialogs/generic/dialog-box.ts b/src/dialogs/generic/dialog-box.ts index 8c9b40aadb..3194332822 100644 --- a/src/dialogs/generic/dialog-box.ts +++ b/src/dialogs/generic/dialog-box.ts @@ -1,5 +1,4 @@ import "@material/mwc-button/mwc-button"; -import "@polymer/paper-dialog-scrollable/paper-dialog-scrollable"; import "@polymer/paper-input/paper-input"; import { css, @@ -11,7 +10,7 @@ import { TemplateResult, } from "lit-element"; import { classMap } from "lit-html/directives/class-map"; -import "../../components/dialog/ha-paper-dialog"; +import "../../components/ha-dialog"; import "../../components/ha-switch"; import { PolymerChangedEvent } from "../../polymer-types"; import { haStyleDialog } from "../../resources/styles"; @@ -41,21 +40,17 @@ class DialogBox extends LitElement { const confirmPrompt = this._params.confirmation || this._params.prompt; return html` - -

- ${this._params.title - ? this._params.title - : this._params.confirmation && - this.hass.localize( - "ui.dialogs.generic.default_confirmation_title" - )} -

- +
${this._params.text ? html`

` : ""} - -

- ${confirmPrompt && - html` - - ${this._params.dismissText - ? this._params.dismissText - : this.hass.localize("ui.dialogs.generic.cancel")} - - `} - - ${this._params.confirmText - ? this._params.confirmText - : this.hass.localize("ui.dialogs.generic.ok")} -
- + ${confirmPrompt && + html` + + ${this._params.dismissText + ? this._params.dismissText + : this.hass.localize("ui.dialogs.generic.cancel")} + + `} + + ${this._params.confirmText + ? this._params.confirmText + : this.hass.localize("ui.dialogs.generic.ok")} + + `; } @@ -127,10 +120,8 @@ class DialogBox extends LitElement { this._dismiss(); } - private _openedChanged(ev: PolymerChangedEvent): void { - if (!(ev.detail as any).value) { - this._params = undefined; - } + private _close(): void { + this._params = undefined; } static get styles(): CSSResult[] { From 0864aeb9c649aca18cb16931dd944e6a7949b028 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 10 Jun 2020 21:21:04 +0200 Subject: [PATCH 28/39] Convert config server control to Lit (#6141) --- src/data/core.ts | 8 + .../ha-config-section-server-control.js | 267 ----------------- .../ha-config-server-control.js | 72 ----- .../ha-config-server-control.ts | 269 ++++++++++++++++++ src/translations/en.json | 7 +- 5 files changed, 283 insertions(+), 340 deletions(-) delete mode 100644 src/panels/config/server_control/ha-config-section-server-control.js delete mode 100644 src/panels/config/server_control/ha-config-server-control.js create mode 100644 src/panels/config/server_control/ha-config-server-control.ts diff --git a/src/data/core.ts b/src/data/core.ts index 646b4b5098..667a90cd61 100644 --- a/src/data/core.ts +++ b/src/data/core.ts @@ -12,6 +12,11 @@ export interface ConfigUpdateValues { internal_url?: string | null; } +export interface CheckConfigResult { + result: "valid" | "invalid"; + errors: string | null; +} + export const saveCoreConfig = ( hass: HomeAssistant, values: Partial @@ -25,3 +30,6 @@ export const detectCoreConfig = (hass: HomeAssistant) => hass.callWS>({ type: "config/core/detect", }); + +export const checkCoreConfig = (hass: HomeAssistant) => + hass.callApi("POST", "config/core/check_config"); diff --git a/src/panels/config/server_control/ha-config-section-server-control.js b/src/panels/config/server_control/ha-config-section-server-control.js deleted file mode 100644 index 97afdccba9..0000000000 --- a/src/panels/config/server_control/ha-config-section-server-control.js +++ /dev/null @@ -1,267 +0,0 @@ -import "@material/mwc-button"; -import "@polymer/paper-input/paper-input"; -import { html } from "@polymer/polymer/lib/utils/html-tag"; -/* eslint-plugin-disable lit */ -import { PolymerElement } from "@polymer/polymer/polymer-element"; -import { isComponentLoaded } from "../../../common/config/is_component_loaded"; -import "../../../components/buttons/ha-call-service-button"; -import "../../../components/ha-card"; -import LocalizeMixin from "../../../mixins/localize-mixin"; -import "../../../styles/polymer-ha-style"; -import "../ha-config-section"; - -/* - * @appliesMixin LocalizeMixin - */ -class HaConfigSectionServerControl extends LocalizeMixin(PolymerElement) { - static get template() { - return html` - - - [[localize('ui.panel.config.server_control.caption')]] - [[localize('ui.panel.config.server_control.description')]] - - - -
- [[localize('ui.panel.config.server_control.section.server_management.introduction')]] -
-
- [[localize('ui.panel.config.server_control.section.server_management.restart')]] - - [[localize('ui.panel.config.server_control.section.server_management.stop')]] - -
-
-
- `; - } - - static get properties() { - return { - hass: { - type: Object, - }, - - isWide: { - type: Boolean, - value: false, - }, - - validating: { - type: Boolean, - value: false, - }, - - isValid: { - type: Boolean, - value: null, - }, - - validateLog: { - type: String, - value: "", - }, - - showAdvanced: Boolean, - }; - } - - groupLoaded(hass) { - return isComponentLoaded(hass, "group"); - } - - automationLoaded(hass) { - return isComponentLoaded(hass, "automation"); - } - - scriptLoaded(hass) { - return isComponentLoaded(hass, "script"); - } - - sceneLoaded(hass) { - return isComponentLoaded(hass, "scene"); - } - - personLoaded(hass) { - return isComponentLoaded(hass, "person"); - } - - validateConfig() { - this.validating = true; - this.validateLog = ""; - this.isValid = null; - - this.hass.callApi("POST", "config/core/check_config").then((result) => { - this.validating = false; - this.isValid = result.result === "valid"; - - if (!this.isValid) { - this.validateLog = result.errors; - } - }); - } -} - -customElements.define( - "ha-config-section-server-control", - HaConfigSectionServerControl -); diff --git a/src/panels/config/server_control/ha-config-server-control.js b/src/panels/config/server_control/ha-config-server-control.js deleted file mode 100644 index 2cd4e8f87e..0000000000 --- a/src/panels/config/server_control/ha-config-server-control.js +++ /dev/null @@ -1,72 +0,0 @@ -import "@polymer/app-layout/app-header/app-header"; -import "@polymer/app-layout/app-toolbar/app-toolbar"; -import { html } from "@polymer/polymer/lib/utils/html-tag"; -/* eslint-plugin-disable lit */ -import { PolymerElement } from "@polymer/polymer/polymer-element"; -import "../../../layouts/hass-tabs-subpage"; -import LocalizeMixin from "../../../mixins/localize-mixin"; -import "../../../styles/polymer-ha-style"; -import { configSections } from "../ha-panel-config"; -import "./ha-config-section-server-control"; - -/* - * @appliesMixin LocalizeMixin - */ -class HaConfigServerControl extends LocalizeMixin(PolymerElement) { - static get template() { - return html` - - - -
- -
-
- `; - } - - static get properties() { - return { - hass: Object, - isWide: Boolean, - narrow: Boolean, - route: Object, - showAdvanced: Boolean, - }; - } - - _computeTabs() { - return configSections.general; - } - - computeClasses(isWide) { - return isWide ? "content" : "content narrow"; - } -} - -customElements.define("ha-config-server-control", HaConfigServerControl); diff --git a/src/panels/config/server_control/ha-config-server-control.ts b/src/panels/config/server_control/ha-config-server-control.ts new file mode 100644 index 0000000000..413c49abe7 --- /dev/null +++ b/src/panels/config/server_control/ha-config-server-control.ts @@ -0,0 +1,269 @@ +import "@polymer/app-layout/app-header/app-header"; +import "@polymer/app-layout/app-toolbar/app-toolbar"; +import "../../../layouts/hass-tabs-subpage"; +import { configSections } from "../ha-panel-config"; +import { + LitElement, + property, + customElement, + html, + css, + CSSResult, + TemplateResult, +} from "lit-element"; +import { HomeAssistant, Route } from "../../../types"; + +import "@material/mwc-button"; +import "@polymer/paper-input/paper-input"; +import { isComponentLoaded } from "../../../common/config/is_component_loaded"; +import "../../../components/buttons/ha-call-service-button"; +import "../../../components/ha-card"; +import "../ha-config-section"; +import { haStyle } from "../../../resources/styles"; +import { checkCoreConfig } from "../../../data/core"; + +const reloadableDomains = [ + "group", + "automation", + "scripts", + "scene", + "person", + "zone", + "input_boolean", + "input_text", + "input_number", + "input_datetime", + "input_select", +]; + +@customElement("ha-config-server-control") +export class HaConfigServerControl extends LitElement { + @property() public hass!: HomeAssistant; + + @property() public isWide!: boolean; + + @property() public narrow!: boolean; + + @property() public route!: Route; + + @property() public showAdvanced!: boolean; + + @property() private _validating = false; + + private _validateLog = ""; + + private _isValid: boolean | null = null; + + protected render(): TemplateResult { + return html` + + + ${this.hass.localize( + "ui.panel.config.server_control.caption" + )} + ${this.hass.localize( + "ui.panel.config.server_control.description" + )} + + ${this.showAdvanced + ? html` +
+ ${this.hass.localize( + "ui.panel.config.server_control.section.validation.introduction" + )} + ${!this._validateLog + ? html` +
+ ${!this._validating + ? html` + ${this._isValid + ? html`
+ ${this.hass.localize( + "ui.panel.config.server_control.section.validation.valid" + )} +
` + : ""} + + ${this.hass.localize( + "ui.panel.config.server_control.section.validation.check_config" + )} + + ` + : html` `} +
+ ` + : html` +
+ + ${this.hass.localize( + "ui.panel.config.server_control.section.validation.invalid" + )} + + + ${this.hass.localize( + "ui.panel.config.server_control.section.validation.check_config" + )} + +
+
+ ${this._validateLog} +
+ `} +
+
` + : ""} + + +
+ ${this.hass.localize( + "ui.panel.config.server_control.section.server_management.introduction" + )} +
+
+ ${this.hass.localize( + "ui.panel.config.server_control.section.server_management.restart" + )} + + ${this.hass.localize( + "ui.panel.config.server_control.section.server_management.stop" + )} + +
+
+ + ${this.showAdvanced + ? html` + +
+ ${this.hass.localize( + "ui.panel.config.server_control.section.reloading.introduction" + )} +
+
+ ${this.hass.localize( + "ui.panel.config.server_control.section.reloading.core" + )} + +
+ ${reloadableDomains.map((domain) => + isComponentLoaded(this.hass, domain) + ? html`
+ ${this.hass.localize( + `ui.panel.config.server_control.section.reloading.${domain}` + )} + +
` + : "" + )} +
+ ` + : ""} +
+
+ `; + } + + private async _validateConfig() { + this._validating = true; + this._validateLog = ""; + this._isValid = null; + + const configCheck = await checkCoreConfig(this.hass); + this._validating = false; + this._isValid = configCheck.result === "valid"; + + if (configCheck.errors) { + this._validateLog = configCheck.errors; + } + } + + static get styles(): CSSResult[] { + return [ + haStyle, + css` + .validate-container { + height: 140px; + } + + .validate-result { + color: var(--google-green-500); + font-weight: 500; + margin-bottom: 1em; + } + + .config-invalid { + margin: 1em 0; + } + + .config-invalid .text { + color: var(--google-red-500); + font-weight: 500; + } + + .config-invalid mwc-button { + float: right; + } + + .validate-log { + white-space: pre-wrap; + direction: ltr; + } + `, + ]; + } +} diff --git a/src/translations/en.json b/src/translations/en.json index 251c4f1330..a57584da22 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -737,7 +737,12 @@ "script": "Reload scripts", "scene": "Reload scenes", "person": "Reload persons", - "zone": "Reload zones" + "zone": "Reload zones", + "input_boolean": "Reload input booleans", + "input_text": "Reload input texts", + "input_number": "Reload input numbers", + "input_datetime": "Reload input date times", + "input_select": "Reload input selects" }, "server_management": { "heading": "Server management", From f5f8ad0e029dee4285e4cd8c30c2b7bb5f9bb38d Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Thu, 11 Jun 2020 00:32:27 +0000 Subject: [PATCH 29/39] [ci skip] Translation update --- translations/frontend/af.json | 6 +- translations/frontend/bg.json | 12 ++-- translations/frontend/ca.json | 61 ++++++++++--------- translations/frontend/cs.json | 62 ++++++++++---------- translations/frontend/da.json | 62 +++++++++++--------- translations/frontend/de.json | 58 +++++++++--------- translations/frontend/el.json | 52 ++++++++--------- translations/frontend/en.json | 67 ++++++++++++--------- translations/frontend/eo.json | 48 +++++++-------- translations/frontend/es-419.json | 58 +++++++++--------- translations/frontend/es.json | 62 +++++++++++--------- translations/frontend/et.json | 48 +++++++-------- translations/frontend/fa.json | 30 +++++----- translations/frontend/fi.json | 59 ++++++++++--------- translations/frontend/fr.json | 62 +++++++++++--------- translations/frontend/he.json | 58 +++++++++--------- translations/frontend/hi.json | 6 +- translations/frontend/hr.json | 22 +++---- translations/frontend/hu.json | 69 ++++++++++++---------- translations/frontend/hy.json | 12 ++-- translations/frontend/is.json | 18 +++--- translations/frontend/it.json | 66 +++++++++++---------- translations/frontend/ja.json | 34 +++++------ translations/frontend/ko.json | 58 +++++++++--------- translations/frontend/lb.json | 58 +++++++++--------- translations/frontend/lv.json | 18 +++--- translations/frontend/nb.json | 64 ++++++++++---------- translations/frontend/nl.json | 58 +++++++++--------- translations/frontend/nn.json | 18 +++--- translations/frontend/pl.json | 58 +++++++++--------- translations/frontend/pt-BR.json | 58 +++++++++--------- translations/frontend/pt.json | 58 +++++++++--------- translations/frontend/ro.json | 44 +++++++------- translations/frontend/ru.json | 58 +++++++++--------- translations/frontend/sk.json | 52 ++++++++--------- translations/frontend/sl.json | 58 +++++++++--------- translations/frontend/sv.json | 94 +++++++++++++++++------------- translations/frontend/th.json | 6 +- translations/frontend/tr.json | 58 +++++++++--------- translations/frontend/uk.json | 52 ++++++++--------- translations/frontend/ur.json | 10 +--- translations/frontend/vi.json | 6 +- translations/frontend/zh-Hans.json | 58 +++++++++--------- translations/frontend/zh-Hant.json | 62 +++++++++++--------- 44 files changed, 1049 insertions(+), 989 deletions(-) diff --git a/translations/frontend/af.json b/translations/frontend/af.json index ccc4ded0b0..2f6bb7e855 100644 --- a/translations/frontend/af.json +++ b/translations/frontend/af.json @@ -1011,6 +1011,9 @@ "input_text": "Teks" } }, + "info": { + "title": "Inligting" + }, "integrations": { "add_integration": "Stel 'n nuwe integrasie op", "caption": "Integrasies", @@ -1374,9 +1377,6 @@ "events": { "title": "Gebeure" }, - "info": { - "title": "Inligting" - }, "mqtt": { "title": "MQTT" }, diff --git a/translations/frontend/bg.json b/translations/frontend/bg.json index 5515cdf8df..beb697cb42 100644 --- a/translations/frontend/bg.json +++ b/translations/frontend/bg.json @@ -877,6 +877,9 @@ "filtering_by": "Филтриране по" }, "header": "Конфигуриране на Home Assistant", + "info": { + "title": "Информация" + }, "integrations": { "add_integration": "Добавяне на интеграция", "caption": "Интеграции", @@ -915,6 +918,9 @@ "rename_dialog": "Редактирайте името на този запис в конфигурацията" }, "introduction": "Тук е възможно да конфигурирате Вашите компоненти и Home Assistant. Не всичко е възможно да се конфигурира от Интерфейса, но работим по върпоса.", + "logs": { + "title": "Журнали" + }, "lovelace": { "dashboards": { "cant_edit_default": "Стандартното Lovelace табло не може да се редактира от потребителския интерфейс. Можете да го скриете, като зададете друго табло по подразбиране.", @@ -1086,12 +1092,6 @@ "events": { "title": "Събития" }, - "info": { - "title": "Информация" - }, - "logs": { - "title": "Журнали" - }, "mqtt": { "title": "MQTT" }, diff --git a/translations/frontend/ca.json b/translations/frontend/ca.json index 49c0e8024e..523a19397a 100644 --- a/translations/frontend/ca.json +++ b/translations/frontend/ca.json @@ -480,6 +480,7 @@ "delete": "Elimina", "error_required": "Obligatori", "loading": "Carregant", + "menu": "Menú", "next": "Següent", "no": "No", "previous": "Anterior", @@ -911,6 +912,8 @@ "introduction": "Utilitza les automatitzacions per donar més vida a la teva casa", "load_error_not_editable": "Només es poden editar les automatitzacions de l'arxiu automations.yaml.", "load_error_unknown": "Error en carregar l'automatització ({err_no}).", + "move_down": "Mou avall", + "move_up": "Mou amunt", "save": "Desa", "triggers": { "add": "Afegeix disparador", @@ -1367,6 +1370,24 @@ "input_text": "Text" } }, + "info": { + "built_using": "Creat utilitzant", + "custom_uis": "Interfícies d'usuari personalitzades:", + "developed_by": "Desenvolupat per un munt de gent fantàstica.", + "documentation": "Documentació", + "frontend": "frontend-ui", + "frontend_version": "Versió de la interfície web d'usuari: {version} - {type}", + "home_assistant_logo": "Logotip de Home Assistant", + "icons_by": "Icones de", + "integrations": "Integracions", + "issues": "Problemes", + "license": "Publicat amb la llicència Apache 2.0", + "path_configuration": "Ruta al fitxer configuration.yaml: {path}", + "server": "servidor", + "source": "Font:", + "system_health_error": "El component Estat del Sistema no està configurat. Afegeix 'system_health:' a configuration.yaml", + "title": "Informació" + }, "integrations": { "add_integration": "Afegeix integració", "caption": "Integracions", @@ -1438,6 +1459,17 @@ "rename_input_label": "Nom de l'entrada" }, "introduction": "Aquí pots configurar Home Assistant i els seus components. Encara no és possible configurar-ho tot des de la interfície d'usuari, però hi estem treballant.", + "logs": { + "clear": "Esborra", + "details": "Detalls del registre ({level})", + "load_full_log": "Carrega el registre complet de Home Assistant", + "loading_log": "Carregant el registre d'errors...", + "multiple_messages": "missatge produit per primera vegada a les {time}, apareix {counter} vegades", + "no_errors": "No s'ha informat de cap error.", + "no_issues": "No hi ha registres nous!", + "refresh": "Actualitza", + "title": "Registres" + }, "lovelace": { "caption": "Panells Lovelace", "dashboards": { @@ -1924,35 +1956,6 @@ "title": "Esdeveniments", "type": "Tipus d'esdeveniment" }, - "info": { - "built_using": "Creat utilitzant", - "custom_uis": "Interfícies d'usuari personalitzades:", - "developed_by": "Desenvolupat per un munt de gent fantàstica.", - "documentation": "Documentació", - "frontend": "frontend-ui", - "frontend_version": "Versió de la interfície web d'usuari: {version} - {type}", - "home_assistant_logo": "Logotip de Home Assistant", - "icons_by": "Icones de", - "integrations": "Integracions", - "issues": "Problemes", - "license": "Publicat amb la llicència Apache 2.0", - "path_configuration": "Ruta al fitxer configuration.yaml: {path}", - "server": "servidor", - "source": "Font:", - "system_health_error": "El component Estat del Sistema no està configurat. Afegeix 'system_health:' a configuration.yaml", - "title": "Informació" - }, - "logs": { - "clear": "Esborra", - "details": "Detalls del registre ({level})", - "load_full_log": "Carrega el registre complet de Home Assistant", - "loading_log": "Carregant el registre d'errors...", - "multiple_messages": "missatge produit per primera vegada a les {time}, apareix {counter} vegades", - "no_errors": "No s'ha informat de cap error.", - "no_issues": "No hi ha registres nous!", - "refresh": "Actualitza", - "title": "Registres" - }, "mqtt": { "description_listen": "Escolta d'un tòpic", "description_publish": "Publicació d'un paquet", diff --git a/translations/frontend/cs.json b/translations/frontend/cs.json index 6de56f3a50..bb43eefda4 100644 --- a/translations/frontend/cs.json +++ b/translations/frontend/cs.json @@ -1266,6 +1266,7 @@ "device_not_found": "Zařízení nebylo nalezeno.", "entities": { "add_entities_lovelace": "Přidat všechny entity zařízení do Lovelace", + "disabled_entities": "+{count} {count, plural,\n one {zakázaná entita}\n other {zakázaných entit}\n}", "entities": "Entity", "hide_disabled": "Skrýt zakázané", "none": "Toto zařízení nemá žádné entity" @@ -1364,6 +1365,24 @@ "input_text": "Text" } }, + "info": { + "built_using": "Sestaveno pomocí", + "custom_uis": "Vlastní uživatelská rozhraní:", + "developed_by": "Vyvinuto partou úžasných lidí.", + "documentation": "Dokumentace", + "frontend": "frontend-ui", + "frontend_version": "Verze rozhraní frontend: {version} - {type}", + "home_assistant_logo": "Home Assistant logo", + "icons_by": "Ikony od", + "integrations": "Integrace", + "issues": "Problémy", + "license": "Publikováno pod licencí Apache 2.0", + "path_configuration": "Cesta k souboru configuration.yaml: {path}", + "server": "server", + "source": "Zdroj:", + "system_health_error": "Součást System Health není načtena. Přidejte 'system_health:' do configuration.yaml", + "title": "Informace" + }, "integrations": { "add_integration": "Přidat integraci", "caption": "Integrace", @@ -1373,6 +1392,7 @@ "delete_button": "Smazat {integration}", "delete_confirm": "Opravdu chcete odstranit tuto integraci?", "device_unavailable": "zařízení není k dispozici", + "entities": "{count} {count, plural,\n one {entita}\n other {entit}\n}", "entity_unavailable": "entita není k dispozici", "firmware": "Firmware: {version}", "hub": "Připojeno přes", @@ -1384,7 +1404,7 @@ "rename": "Přejmenovat", "restart_confirm": "Restartujte Home Assistant pro odstranění této integrace", "settings_button": "Upravit nastavení pro {integration}", - "system_options": "Systémové možnosti pro {integration}", + "system_options": "Více možností", "system_options_button": "Systémové možnosti pro {integration}", "unnamed_entry": "Nepojmenovaný záznam" }, @@ -1433,6 +1453,17 @@ "rename_input_label": "Název položky" }, "introduction": "Zde je možné konfigurovat vaše komponenty a Home Assistant.\nZ uživatelského rozhraní sice zatím není možné konfigurovat vše, ale pracujeme na tom.", + "logs": { + "clear": "Zrušit", + "details": "Detaily protokolu ({level})", + "load_full_log": "Načíst úplný protokol Home Assistanta", + "loading_log": "Načítání protokolu chyb...", + "multiple_messages": "zpráva se poprvé objevila v {time} a zobrazuje se {counter} krát", + "no_errors": "Nebyly hlášeny žádné chyby.", + "no_issues": "Nejsou žádné nové problémy!", + "refresh": "Obnovit", + "title": "Logy" + }, "lovelace": { "caption": "Lovelace Dashboardy", "dashboards": { @@ -1916,35 +1947,6 @@ "title": "Události", "type": "Typ události" }, - "info": { - "built_using": "Sestaveno pomocí", - "custom_uis": "Vlastní uživatelská rozhraní:", - "developed_by": "Vyvinuto partou úžasných lidí.", - "documentation": "Dokumentace", - "frontend": "frontend-ui", - "frontend_version": "Verze rozhraní frontend: {version} - {type}", - "home_assistant_logo": "Home Assistant logo", - "icons_by": "Ikony od", - "integrations": "Integrace", - "issues": "Problémy", - "license": "Publikováno pod licencí Apache 2.0", - "path_configuration": "Cesta k souboru configuration.yaml: {path}", - "server": "server", - "source": "Zdroj:", - "system_health_error": "Součást System Health není načtena. Přidejte 'system_health:' do configuration.yaml", - "title": "Informace" - }, - "logs": { - "clear": "Zrušit", - "details": "Detaily protokolu ({level})", - "load_full_log": "Načíst úplný protokol Home Assistanta", - "loading_log": "Načítání protokolu chyb...", - "multiple_messages": "zpráva se poprvé objevila v {time} a zobrazuje se {counter} krát", - "no_errors": "Nebyly hlášeny žádné chyby.", - "no_issues": "Nejsou žádné nové problémy!", - "refresh": "Obnovit", - "title": "Logy" - }, "mqtt": { "description_listen": "Naslouchat tématu", "description_publish": "Publikovat paket", diff --git a/translations/frontend/da.json b/translations/frontend/da.json index cc57710458..3bc6a67e1e 100644 --- a/translations/frontend/da.json +++ b/translations/frontend/da.json @@ -480,8 +480,10 @@ "delete": "Slet", "error_required": "Påkrævet", "loading": "Indlæser", + "menu": "Menu", "next": "Næste", "no": "Nej", + "overflow_menu": "Overløbsmenu", "previous": "Forrige", "refresh": "Opdater", "save": "Gem", @@ -911,6 +913,8 @@ "introduction": "Brug automatiseringer til at vække dit hjem til live.", "load_error_not_editable": "Kun automatiseringer i 'automations.yaml' kan redigeres.", "load_error_unknown": "Fejl ved indlæsning af automatisering ({err_no}).", + "move_down": "Flyt ned", + "move_up": "Flyt op", "save": "Gem", "triggers": { "add": "Tilføj udløser", @@ -1367,6 +1371,24 @@ "input_text": "Tekst" } }, + "info": { + "built_using": "Bygget ved hjælp af", + "custom_uis": "Tilpassede brugergrænseflader:", + "developed_by": "Udviklet af en masse fantastiske mennesker.", + "documentation": "Dokumentation", + "frontend": "brugerflade", + "frontend_version": "Brugerfladeversion: {version} - {type}", + "home_assistant_logo": "Home Assistant-logo", + "icons_by": "Ikoner af", + "integrations": "Integrationer", + "issues": "Problemer", + "license": "Udgivet under Apache 2.0-licensen", + "path_configuration": "Sti til 'configuration.yaml': {path}", + "server": "server", + "source": "Kilde:", + "system_health_error": "System Health-komponenten er ikke indlæst. Føj 'system_health:' til 'config.yaml'", + "title": "Info" + }, "integrations": { "add_integration": "Tilføj integration", "caption": "Integrationer", @@ -1438,6 +1460,17 @@ "rename_input_label": "Navn på post" }, "introduction": "Her er det muligt at konfigurere dine komponenter og Home Assistant. Ikke alt er muligt at konfigurere fra brugerfladen endnu, men vi arbejder på det.", + "logs": { + "clear": "Ryd", + "details": "Logdetaljer ({level})", + "load_full_log": "Indlæs fuld Home Assistant-log", + "loading_log": "Indlæser fejllog...", + "multiple_messages": "beskeden forekom først kl. {time} og ses {counter} gange", + "no_errors": "Der er ikke rapporteret nogen fejl.", + "no_issues": "Der er ingen nye problemer!", + "refresh": "Opdater", + "title": "Logs" + }, "lovelace": { "caption": "Lovelace-betjeningspaneler", "dashboards": { @@ -1892,35 +1925,6 @@ "title": "Hændelser", "type": "Hændelsestype" }, - "info": { - "built_using": "Bygget ved hjælp af", - "custom_uis": "Tilpassede brugergrænseflader:", - "developed_by": "Udviklet af en masse fantastiske mennesker.", - "documentation": "Dokumentation", - "frontend": "brugerflade", - "frontend_version": "Brugerfladeversion: {version} - {type}", - "home_assistant_logo": "Home Assistant-logo", - "icons_by": "Ikoner af", - "integrations": "Integrationer", - "issues": "Problemer", - "license": "Udgivet under Apache 2.0-licensen", - "path_configuration": "Sti til 'configuration.yaml': {path}", - "server": "server", - "source": "Kilde:", - "system_health_error": "System Health-komponenten er ikke indlæst. Føj 'system_health:' til 'config.yaml'", - "title": "Info" - }, - "logs": { - "clear": "Ryd", - "details": "Logdetaljer ({level})", - "load_full_log": "Indlæs fuld Home Assistant-log", - "loading_log": "Indlæser fejllog...", - "multiple_messages": "beskeden forekom først kl. {time} og ses {counter} gange", - "no_errors": "Der er ikke rapporteret nogen fejl.", - "no_issues": "Der er ingen nye problemer!", - "refresh": "Opdater", - "title": "Logs" - }, "mqtt": { "description_listen": "Lyt til et emne", "description_publish": "Udsend en pakke", diff --git a/translations/frontend/de.json b/translations/frontend/de.json index 7eb5bbab05..728b02c355 100644 --- a/translations/frontend/de.json +++ b/translations/frontend/de.json @@ -1366,6 +1366,24 @@ "input_text": "Text" } }, + "info": { + "built_using": "Gebaut mit", + "custom_uis": "Benutzerdefinierte UIs:", + "developed_by": "Entwickelt von einem Haufen toller Leute.", + "documentation": "Dokumentation", + "frontend": "Frontend-UI", + "frontend_version": "Frontend-Version: {version} - {type}", + "home_assistant_logo": "Home Assistant-Logo", + "icons_by": "Icons von", + "integrations": "Integrationen", + "issues": "Probleme", + "license": "Veröffentlicht unter der Apache 2.0 Lizenz", + "path_configuration": "Pfad zu configuration.yaml: {path}", + "server": "Server", + "source": "Quelle:", + "system_health_error": "System Health-Komponente wird nicht geladen. Füge 'system_health:' zu configuration.yaml hinzu", + "title": "Info" + }, "integrations": { "add_integration": "Integration hinzufügen", "caption": "Integrationen", @@ -1437,6 +1455,17 @@ "rename_input_label": "Eintragsname" }, "introduction": "Hier ist es möglich, deine Komponenten und Home Assistant zu konfigurieren. Noch ist nicht alles über die GUI einstellbar, aber wir arbeiten daran.", + "logs": { + "clear": "Leeren", + "details": "Protokolldetails ( {level} )", + "load_full_log": "Vollständiges Home Assistant-Protokoll laden", + "loading_log": "Fehlerprotokoll wird geladen...", + "multiple_messages": "Die Nachricht ist zum ersten Mal um {time} aufgetreten und erscheint {counter} mal", + "no_errors": "Es wurden keine Fehler gemeldet.", + "no_issues": "Es gibt keine neuen Probleme!", + "refresh": "Aktualisieren", + "title": "Logs" + }, "lovelace": { "caption": "Lovelace Dashboards", "dashboards": { @@ -1921,35 +1950,6 @@ "title": "Ereignisse", "type": "Ereignistyp" }, - "info": { - "built_using": "Gebaut mit", - "custom_uis": "Benutzerdefinierte UIs:", - "developed_by": "Entwickelt von einem Haufen toller Leute.", - "documentation": "Dokumentation", - "frontend": "Frontend-UI", - "frontend_version": "Frontend-Version: {version} - {type}", - "home_assistant_logo": "Home Assistant-Logo", - "icons_by": "Icons von", - "integrations": "Integrationen", - "issues": "Probleme", - "license": "Veröffentlicht unter der Apache 2.0 Lizenz", - "path_configuration": "Pfad zu configuration.yaml: {path}", - "server": "Server", - "source": "Quelle:", - "system_health_error": "System Health-Komponente wird nicht geladen. Füge 'system_health:' zu configuration.yaml hinzu", - "title": "Info" - }, - "logs": { - "clear": "Leeren", - "details": "Protokolldetails ( {level} )", - "load_full_log": "Vollständiges Home Assistant-Protokoll laden", - "loading_log": "Fehlerprotokoll wird geladen...", - "multiple_messages": "Die Nachricht ist zum ersten Mal um {time} aufgetreten und erscheint {counter} mal", - "no_errors": "Es wurden keine Fehler gemeldet.", - "no_issues": "Es gibt keine neuen Probleme!", - "refresh": "Aktualisieren", - "title": "Logs" - }, "mqtt": { "description_listen": "Auf einen Topic hören", "description_publish": "Ein Paket veröffentlichen", diff --git a/translations/frontend/el.json b/translations/frontend/el.json index faccb2ec1b..047a194f23 100644 --- a/translations/frontend/el.json +++ b/translations/frontend/el.json @@ -1216,6 +1216,21 @@ "input_text": "Κείμενο" } }, + "info": { + "built_using": "Κατασκευάστηκε με χρήση", + "custom_uis": "Προσαρμοσμένα περιβάλλοντα χρήστη:", + "developed_by": "Αναπτύχθηκε από ένα μάτσο απίθανων ανθρώπων.", + "frontend": "Τελική επιφάνεια εργασίας χρήστη", + "frontend_version": "Έκδοση Frontend: {version} - {type}", + "home_assistant_logo": "Λογότυπο του Home Assistant", + "icons_by": "Εικόνες από", + "license": "Δημοσιεύτηκε κάτω από την άδεια χρήσης Apache 2.0", + "path_configuration": "Διαδρομή στo configuration.yaml: {path}", + "server": "Διακομιστής", + "source": "Πηγή", + "system_health_error": "Το στοιχείο Υγεία Συστήματος δεν έχει φορτωθεί. Προσθέστε 'system_health:' στη ρύθμιση παραμέτρων configuration.yaml", + "title": "Πληροφορίες" + }, "integrations": { "caption": "Ενσωματώσεις", "config_entry": { @@ -1272,6 +1287,17 @@ "note_about_website_reference": "Περισσότερα είναι διαθέσιμα στο" }, "introduction": "Εδώ είναι δυνατή η διαμόρφωση του Home Assistant και των εξαρτημάτων. Δεν είναι δυνατή η διαμόρφωση όλων από την διεπαφή χρήστη (UI) αλλά εργαζόμαστε πάνω σε αυτό.", + "logs": { + "clear": "Καθαρισμός", + "details": "Λεπτομέρειες καταγραφής ({level})", + "load_full_log": "Φόρτωση ολόκληρου του αρχείου καταγραφής του Home Assistant.", + "loading_log": "Φόρτωση αρχείου καταγραφής σφαλμάτων…", + "multiple_messages": "μήνυμα παρουσιάστηκε για πρώτη φορά στο {time} και εμφανίζεται {counter} φορές", + "no_errors": "Δεν έχουν αναφερθεί σφάλματα.", + "no_issues": "Δεν υπάρχουν νέα θέματα!", + "refresh": "Ανανέωση", + "title": "Αρχεία καταγραφής" + }, "lovelace": { "dashboards": { "caption": "Επισκόπηση", @@ -1625,32 +1651,6 @@ "title": "Γεγονότα", "type": "Τύπος συμβάντος" }, - "info": { - "built_using": "Κατασκευάστηκε με χρήση", - "custom_uis": "Προσαρμοσμένα περιβάλλοντα χρήστη:", - "developed_by": "Αναπτύχθηκε από ένα μάτσο απίθανων ανθρώπων.", - "frontend": "Τελική επιφάνεια εργασίας χρήστη", - "frontend_version": "Έκδοση Frontend: {version} - {type}", - "home_assistant_logo": "Λογότυπο του Home Assistant", - "icons_by": "Εικόνες από", - "license": "Δημοσιεύτηκε κάτω από την άδεια χρήσης Apache 2.0", - "path_configuration": "Διαδρομή στo configuration.yaml: {path}", - "server": "Διακομιστής", - "source": "Πηγή", - "system_health_error": "Το στοιχείο Υγεία Συστήματος δεν έχει φορτωθεί. Προσθέστε 'system_health:' στη ρύθμιση παραμέτρων configuration.yaml", - "title": "Πληροφορίες" - }, - "logs": { - "clear": "Καθαρισμός", - "details": "Λεπτομέρειες καταγραφής ({level})", - "load_full_log": "Φόρτωση ολόκληρου του αρχείου καταγραφής του Home Assistant.", - "loading_log": "Φόρτωση αρχείου καταγραφής σφαλμάτων…", - "multiple_messages": "μήνυμα παρουσιάστηκε για πρώτη φορά στο {time} και εμφανίζεται {counter} φορές", - "no_errors": "Δεν έχουν αναφερθεί σφάλματα.", - "no_issues": "Δεν υπάρχουν νέα θέματα!", - "refresh": "Ανανέωση", - "title": "Αρχεία καταγραφής" - }, "mqtt": { "description_listen": "Ακούστε ένα θέμα", "description_publish": "Δημοσιεύστε ένα πακέτο", diff --git a/translations/frontend/en.json b/translations/frontend/en.json index 270901cd2c..65bfb5d650 100644 --- a/translations/frontend/en.json +++ b/translations/frontend/en.json @@ -1371,6 +1371,26 @@ "input_text": "Text" } }, + "info": { + "built_using": "Built using", + "caption": "Info", + "custom_uis": "Custom UIs:", + "description": "Info about your Home Assistant installation", + "developed_by": "Developed by a bunch of awesome people.", + "documentation": "Documentation", + "frontend": "frontend-ui", + "frontend_version": "Frontend version: {version} - {type}", + "home_assistant_logo": "Home Assistant logo", + "icons_by": "Icons by", + "integrations": "Integrations", + "issues": "Issues", + "license": "Published under the Apache 2.0 license", + "path_configuration": "Path to configuration.yaml: {path}", + "server": "server", + "source": "Source:", + "system_health_error": "System Health component is not loaded. Add 'system_health:' to configuration.yaml", + "title": "Info" + }, "integrations": { "add_integration": "Add integration", "caption": "Integrations", @@ -1442,6 +1462,19 @@ "rename_input_label": "Entry name" }, "introduction": "Here it is possible to configure your components and Home Assistant. Not everything is possible to configure from the UI yet, but we're working on it.", + "logs": { + "caption": "Logs", + "clear": "Clear", + "description": "View the Home Assistant logs", + "details": "Log Details ({level})", + "load_full_log": "Load Full Home Assistant Log", + "loading_log": "Loading error log…", + "multiple_messages": "message first occurred at {time} and shows up {counter} times", + "no_errors": "No errors have been reported.", + "no_issues": "There are no new issues!", + "refresh": "Refresh", + "title": "Logs" + }, "lovelace": { "caption": "Lovelace Dashboards", "dashboards": { @@ -1627,6 +1660,11 @@ "core": "Reload location & customizations", "group": "Reload groups", "heading": "YAML configuration reloading", + "input_boolean": "Reload input booleans", + "input_datetime": "Reload input date times", + "input_number": "Reload input numbers", + "input_select": "Reload input selects", + "input_text": "Reload input texts", "introduction": "Some parts of Home Assistant can reload without requiring a restart. Hitting reload will unload their current YAML configuration and load the new one.", "person": "Reload persons", "scene": "Reload scenes", @@ -1928,35 +1966,6 @@ "title": "Events", "type": "Event Type" }, - "info": { - "built_using": "Built using", - "custom_uis": "Custom UIs:", - "developed_by": "Developed by a bunch of awesome people.", - "documentation": "Documentation", - "frontend": "frontend-ui", - "frontend_version": "Frontend version: {version} - {type}", - "home_assistant_logo": "Home Assistant logo", - "icons_by": "Icons by", - "integrations": "Integrations", - "issues": "Issues", - "license": "Published under the Apache 2.0 license", - "path_configuration": "Path to configuration.yaml: {path}", - "server": "server", - "source": "Source:", - "system_health_error": "System Health component is not loaded. Add 'system_health:' to configuration.yaml", - "title": "Info" - }, - "logs": { - "clear": "Clear", - "details": "Log Details ({level})", - "load_full_log": "Load Full Home Assistant Log", - "loading_log": "Loading error log…", - "multiple_messages": "message first occurred at {time} and shows up {counter} times", - "no_errors": "No errors have been reported.", - "no_issues": "There are no new issues!", - "refresh": "Refresh", - "title": "Logs" - }, "mqtt": { "description_listen": "Listen to a topic", "description_publish": "Publish a packet", diff --git a/translations/frontend/eo.json b/translations/frontend/eo.json index 623f9ecd89..00c435dca2 100644 --- a/translations/frontend/eo.json +++ b/translations/frontend/eo.json @@ -118,6 +118,20 @@ "unknown_error": "Nekonata eraro", "unnamed_device": "Nenomita aparato" }, + "info": { + "built_using": "Konstruita uzante", + "custom_uis": "Propraj UIoj:", + "developed_by": "Disvolvita de amaso da mojosaj homoj.", + "frontend": "frontend-ui", + "frontend_version": "Frontendversio: {version} - {type}", + "home_assistant_logo": "Logo de Home Assistant", + "icons_by": "Ikonoj de", + "license": "Publikigita sub la permesilo Apache 2.0", + "path_configuration": "Pado al configuration.yaml: {path}", + "server": "servilo", + "source": "Fonto:", + "system_health_error": "Komponento pri Sistema Sano ne estas ŝarĝita. Aldonu 'system_health:' al configuration.yaml" + }, "integrations": { "config_entry": { "area": "En {area}", @@ -148,6 +162,16 @@ }, "integration_not_found": "Integriĝo ne trovita." }, + "logs": { + "clear": "Klarigi", + "details": "Logaj Detaloj ({level})", + "load_full_log": "Ŝargi Plena Home Assistant Protokolo", + "loading_log": "Ŝarĝante eraran protokolon ...", + "multiple_messages": "mesaĝo unuafoje okazis je {time} kaj aperas {counter} fojojn", + "no_errors": "Neniuj eraroj estis raportitaj.", + "no_issues": "Ne estas novaj aferoj!", + "refresh": "Refreŝigi" + }, "scene": { "activated": "Aktivigita sceno {name}.", "caption": "Scenoj", @@ -292,30 +316,6 @@ "subscribe_to": "Evento por aboni", "type": "Eventa Tipo" }, - "info": { - "built_using": "Konstruita uzante", - "custom_uis": "Propraj UIoj:", - "developed_by": "Disvolvita de amaso da mojosaj homoj.", - "frontend": "frontend-ui", - "frontend_version": "Frontendversio: {version} - {type}", - "home_assistant_logo": "Logo de Home Assistant", - "icons_by": "Ikonoj de", - "license": "Publikigita sub la permesilo Apache 2.0", - "path_configuration": "Pado al configuration.yaml: {path}", - "server": "servilo", - "source": "Fonto:", - "system_health_error": "Komponento pri Sistema Sano ne estas ŝarĝita. Aldonu 'system_health:' al configuration.yaml" - }, - "logs": { - "clear": "Klarigi", - "details": "Logaj Detaloj ({level})", - "load_full_log": "Ŝargi Plena Home Assistant Protokolo", - "loading_log": "Ŝarĝante eraran protokolon ...", - "multiple_messages": "mesaĝo unuafoje okazis je {time} kaj aperas {counter} fojojn", - "no_errors": "Neniuj eraroj estis raportitaj.", - "no_issues": "Ne estas novaj aferoj!", - "refresh": "Refreŝigi" - }, "mqtt": { "description_listen": "Aŭskulti temon", "description_publish": "Publikigi pakaĵon", diff --git a/translations/frontend/es-419.json b/translations/frontend/es-419.json index e0511c0a46..acc5baf3e8 100644 --- a/translations/frontend/es-419.json +++ b/translations/frontend/es-419.json @@ -1351,6 +1351,24 @@ "input_text": "Texto" } }, + "info": { + "built_using": "Construido usando", + "custom_uis": "Interfaces de usuario personalizadas:", + "developed_by": "Desarrollado por un grupo de personas increíbles.", + "documentation": "Documentación", + "frontend": "frontend-ui", + "frontend_version": "Versión de la interfaz: {version} - {type}", + "home_assistant_logo": "Logotipo de Home Assistant", + "icons_by": "Iconos por", + "integrations": "Integraciones", + "issues": "Problemas", + "license": "Publicado bajo la licencia Apache 2.0", + "path_configuration": "Ruta de acceso a configuration.yaml: {path}", + "server": "servidor", + "source": "Fuente:", + "system_health_error": "El componente de mantenimiento del sistema no está cargado. Agregue 'system_health:' a configuration.yaml", + "title": "Información" + }, "integrations": { "add_integration": "Agregar integración", "caption": "Integraciones", @@ -1421,6 +1439,17 @@ "rename_input_label": "Ingresar Nombre" }, "introduction": "Aquí es posible configurar sus componentes y Home Assistant. Todavía no es posible configurar todo desde la interfaz de usuario, pero estamos trabajando en ello.", + "logs": { + "clear": "Limpiar", + "details": "Detalles del registro ({level})", + "load_full_log": "Cargar registro completo de Home Assistant", + "loading_log": "Cargando registro de errores ...", + "multiple_messages": "el mensaje se produjo por primera vez a las {time} y aparece {counter} veces", + "no_errors": "No se han reportado errores.", + "no_issues": "¡No hay nuevos problemas!", + "refresh": "Refrescar", + "title": "Registros" + }, "lovelace": { "caption": "Tableros de Lovelace", "dashboards": { @@ -1874,35 +1903,6 @@ "title": "Eventos", "type": "Tipo de evento" }, - "info": { - "built_using": "Construido usando", - "custom_uis": "Interfaces de usuario personalizadas:", - "developed_by": "Desarrollado por un grupo de personas increíbles.", - "documentation": "Documentación", - "frontend": "frontend-ui", - "frontend_version": "Versión de la interfaz: {version} - {type}", - "home_assistant_logo": "Logotipo de Home Assistant", - "icons_by": "Iconos por", - "integrations": "Integraciones", - "issues": "Problemas", - "license": "Publicado bajo la licencia Apache 2.0", - "path_configuration": "Ruta de acceso a configuration.yaml: {path}", - "server": "servidor", - "source": "Fuente:", - "system_health_error": "El componente de mantenimiento del sistema no está cargado. Agregue 'system_health:' a configuration.yaml", - "title": "Información" - }, - "logs": { - "clear": "Limpiar", - "details": "Detalles del registro ({level})", - "load_full_log": "Cargar registro completo de Home Assistant", - "loading_log": "Cargando registro de errores ...", - "multiple_messages": "el mensaje se produjo por primera vez a las {time} y aparece {counter} veces", - "no_errors": "No se han reportado errores.", - "no_issues": "¡No hay nuevos problemas!", - "refresh": "Refrescar", - "title": "Registros" - }, "mqtt": { "description_listen": "Escuchar un tema", "description_publish": "Publicar un paquete", diff --git a/translations/frontend/es.json b/translations/frontend/es.json index aabc7e1126..2217c2818b 100644 --- a/translations/frontend/es.json +++ b/translations/frontend/es.json @@ -480,8 +480,10 @@ "delete": "Eliminar", "error_required": "Obligatorio", "loading": "Cargando", + "menu": "Menú", "next": "Siguiente", "no": "No", + "overflow_menu": "Menú de desbordamiento", "previous": "Anterior", "refresh": "Actualizar", "save": "Guardar", @@ -911,6 +913,8 @@ "introduction": "Utiliza automatizaciones para darle vida a tu hogar.", "load_error_not_editable": "Solo las automatizaciones en automations.yaml son editables.", "load_error_unknown": "Error al cargar la automatización ({err_no}).", + "move_down": "Mover hacia abajo", + "move_up": "Mover hacia arriba", "save": "Guardar", "triggers": { "add": "Añadir desencadenante", @@ -1367,6 +1371,24 @@ "input_text": "Texto" } }, + "info": { + "built_using": "Construido usando", + "custom_uis": "IU personalizadas:", + "developed_by": "Desarrollado por un montón de gente impresionante.", + "documentation": "Documentación", + "frontend": "interfaz de usuario", + "frontend_version": "Versión del frontend: {version} - {type}", + "home_assistant_logo": "Logotipo de Home Assistant", + "icons_by": "Iconos por", + "integrations": "Integraciones", + "issues": "Incidencias", + "license": "Publicado bajo la licencia Apache 2.0", + "path_configuration": "Ruta a configuration.yaml: {path}", + "server": "servidor", + "source": "Fuente:", + "system_health_error": "El componente Estado del Sistema no está cargado. Añade 'system_health:' a configuration.yaml", + "title": "Información" + }, "integrations": { "add_integration": "Añadir integración", "caption": "Integraciones", @@ -1438,6 +1460,17 @@ "rename_input_label": "Nombre de la entrada" }, "introduction": "Aquí puedes configurar tus componentes y Home Assistant. Aún no es posible configurar todo desde la interfaz de usuario, pero estamos trabajando en ello.", + "logs": { + "clear": "Limpiar", + "details": "Detalles de registro ({level})", + "load_full_log": "Cargar registro completo de Home Assistant", + "loading_log": "Cargando registro de errores...", + "multiple_messages": "el mensaje se produjo por primera vez a las {time} y aparece {counter} veces", + "no_errors": "No se han reportado errores.", + "no_issues": "¡No hay nuevos problemas!", + "refresh": "Actualizar", + "title": "Registros" + }, "lovelace": { "caption": "Paneles de Control Lovelace", "dashboards": { @@ -1924,35 +1957,6 @@ "title": "Eventos", "type": "Tipo de evento" }, - "info": { - "built_using": "Construido usando", - "custom_uis": "IU personalizadas:", - "developed_by": "Desarrollado por un montón de gente impresionante.", - "documentation": "Documentación", - "frontend": "interfaz de usuario", - "frontend_version": "Versión del frontend: {version} - {type}", - "home_assistant_logo": "Logotipo de Home Assistant", - "icons_by": "Iconos por", - "integrations": "Integraciones", - "issues": "Incidencias", - "license": "Publicado bajo la licencia Apache 2.0", - "path_configuration": "Ruta a configuration.yaml: {path}", - "server": "servidor", - "source": "Fuente:", - "system_health_error": "El componente Estado del Sistema no está cargado. Añade 'system_health:' a configuration.yaml", - "title": "Información" - }, - "logs": { - "clear": "Limpiar", - "details": "Detalles de registro ({level})", - "load_full_log": "Cargar registro completo de Home Assistant", - "loading_log": "Cargando registro de errores...", - "multiple_messages": "el mensaje se produjo por primera vez a las {time} y aparece {counter} veces", - "no_errors": "No se han reportado errores.", - "no_issues": "¡No hay nuevos problemas!", - "refresh": "Actualizar", - "title": "Registros" - }, "mqtt": { "description_listen": "Escuchar un tema", "description_publish": "Publicar un paquete", diff --git a/translations/frontend/et.json b/translations/frontend/et.json index 1f1a88221c..22461166d8 100644 --- a/translations/frontend/et.json +++ b/translations/frontend/et.json @@ -1149,6 +1149,20 @@ } }, "header": "Home Assistant'i seadistamine", + "info": { + "built_using": "Ehitatud kasutades", + "custom_uis": "Kohandatud kasutajaliidesed:", + "developed_by": "Tehtud paljude lahedate inimeste poolt.", + "frontend": "frontend-ui", + "frontend_version": "Frontend versioon: {version} - {type}", + "home_assistant_logo": "Home Assistant'i logo", + "icons_by": "Ikoonide autorid", + "license": "Avaldatud Apache 2.0 litsentsi alusel", + "path_configuration": "configuration.yaml asukoht: {path}", + "server": "server", + "source": "Allikas:", + "title": "Info" + }, "integrations": { "caption": "Sidumised", "config_entry": { @@ -1199,6 +1213,16 @@ "note_about_website_reference": "Rohkem on saadaval " }, "introduction": "Siin saab seadistada oma komponente ja Home Assistant'i. Mitte kõike ei saa veel kasutajaliidese kaudu seadistada, kuid me töötame selle nimel.", + "logs": { + "clear": "Puhasta", + "details": "Logi üksikasjad ({level})", + "load_full_log": "Lae kogu Home Assistant'i logi", + "loading_log": "Laadin vigade logi...", + "no_errors": "Vigadest pole teatatud.", + "no_issues": "Uusi probleeme pole!", + "refresh": "Värskenda", + "title": "Logid" + }, "person": { "add_person": "Lisa isik", "caption": "Isikud", @@ -1510,30 +1534,6 @@ "title": "Sündmused", "type": "Sündmuse tüüp" }, - "info": { - "built_using": "Ehitatud kasutades", - "custom_uis": "Kohandatud kasutajaliidesed:", - "developed_by": "Tehtud paljude lahedate inimeste poolt.", - "frontend": "frontend-ui", - "frontend_version": "Frontend versioon: {version} - {type}", - "home_assistant_logo": "Home Assistant'i logo", - "icons_by": "Ikoonide autorid", - "license": "Avaldatud Apache 2.0 litsentsi alusel", - "path_configuration": "configuration.yaml asukoht: {path}", - "server": "server", - "source": "Allikas:", - "title": "Info" - }, - "logs": { - "clear": "Puhasta", - "details": "Logi üksikasjad ({level})", - "load_full_log": "Lae kogu Home Assistant'i logi", - "loading_log": "Laadin vigade logi...", - "no_errors": "Vigadest pole teatatud.", - "no_issues": "Uusi probleeme pole!", - "refresh": "Värskenda", - "title": "Logid" - }, "mqtt": { "description_listen": "Kuula teemat", "listening_to": "Kuulamas", diff --git a/translations/frontend/fa.json b/translations/frontend/fa.json index 42b8748594..3f23daf671 100644 --- a/translations/frontend/fa.json +++ b/translations/frontend/fa.json @@ -1022,6 +1022,17 @@ "input_text": "Text" } }, + "info": { + "built_using": "Construit cu ajutorul", + "documentation": "مستندات", + "home_assistant_logo": "Logo Home Assistant", + "icons_by": "آیکون توسط", + "integrations": "یکپارچگی", + "issues": "موضوعات", + "server": "سرور", + "source": "Sursa:", + "title": "اطلاعات" + }, "integrations": { "add_integration": "اضافه کردن ادغام", "caption": "یکپارچگی", @@ -1076,6 +1087,10 @@ "rename_input_label": "ورود نام" }, "introduction": "در اینجا می توانید اجزای خود و صفحه اصلی دستیار را پیکربندی کنید. ", + "logs": { + "refresh": "تازه کن", + "title": "وقایع" + }, "lovelace": { "dashboards": { "cant_edit_default": "داشبورد استاندارد Lovelace را نمی توان از UI ویرایش کرد. می توانید با تنظیم داشبورد دیگر به عنوان پیش فرض ، آن را مخفی کنید.", @@ -1347,21 +1362,6 @@ "events": { "title": "رویدادها" }, - "info": { - "built_using": "Construit cu ajutorul", - "documentation": "مستندات", - "home_assistant_logo": "Logo Home Assistant", - "icons_by": "آیکون توسط", - "integrations": "یکپارچگی", - "issues": "موضوعات", - "server": "سرور", - "source": "Sursa:", - "title": "اطلاعات" - }, - "logs": { - "refresh": "تازه کن", - "title": "وقایع" - }, "mqtt": { "publish": "Publica", "subscribe_to": "Subiect pentru abonare", diff --git a/translations/frontend/fi.json b/translations/frontend/fi.json index de4a364d8f..d759003877 100644 --- a/translations/frontend/fi.json +++ b/translations/frontend/fi.json @@ -480,6 +480,7 @@ "delete": "Poista", "error_required": "Pakollinen", "loading": "Ladataan", + "menu": "Valikko", "next": "Seuraava", "no": "Ei", "previous": "Edellinen", @@ -1367,6 +1368,24 @@ "input_text": "Teksti" } }, + "info": { + "built_using": "Rakennettu käyttäen", + "custom_uis": "Mukautetut käyttöliittymät:", + "developed_by": "Kehittänyt joukko mahtavia ihmisiä.", + "documentation": "Dokumentointi", + "frontend": "frontend-ui", + "frontend_version": "Käyttöliittymän versio: {version} - {type}", + "home_assistant_logo": "Home Assistant-logo", + "icons_by": "Kuvakkeet luonut", + "integrations": "Integraatiot", + "issues": "Ongelmat", + "license": "Julkaistu Apache 2.0-lisenssillä", + "path_configuration": "Polku configuration.yaml-tiedostoon: {path}", + "server": "palvelin", + "source": "Lähde:", + "system_health_error": "Järjestelmän kunto-komponenttia ei ole ladattu. Lisää 'system_health:' kohteeseen configuration.yaml", + "title": "Tiedot" + }, "integrations": { "add_integration": "Lisää integraatio", "caption": "Integraatiot", @@ -1438,6 +1457,17 @@ "rename_input_label": "Merkinnän nimi" }, "introduction": "Täällä voit säätää Home Assistanttia ja sen komponentteja. Huomioithan, ettei kaikkea voi vielä säätää käyttöliittymän kautta, mutta teemme jatkuvasti töitä sen mahdollistamiseksi.", + "logs": { + "clear": "Tyhjennä", + "details": "Lokitiedot ( {level} )", + "load_full_log": "Lataa Home Assistantin koko loki", + "loading_log": "Ladataan virhelokia...", + "multiple_messages": "Viesti esiintyi ensimmäisen kerran {time} ja tämän jälkeen {counter} kertaa", + "no_errors": "Virheitä ei ole ilmoitettu.", + "no_issues": "Ei uusia aiheita!", + "refresh": "Päivitä", + "title": "Lokit" + }, "lovelace": { "caption": "Lovelace-kojelaudat", "dashboards": { @@ -1924,35 +1954,6 @@ "title": "Tapahtumat", "type": "Tapahtumatyyppi" }, - "info": { - "built_using": "Rakennettu käyttäen", - "custom_uis": "Mukautetut käyttöliittymät:", - "developed_by": "Kehittänyt joukko mahtavia ihmisiä.", - "documentation": "Dokumentointi", - "frontend": "frontend-ui", - "frontend_version": "Käyttöliittymän versio: {version} - {type}", - "home_assistant_logo": "Home Assistant-logo", - "icons_by": "Kuvakkeet luonut", - "integrations": "Integraatiot", - "issues": "Ongelmat", - "license": "Julkaistu Apache 2.0-lisenssillä", - "path_configuration": "Polku configuration.yaml-tiedostoon: {path}", - "server": "palvelin", - "source": "Lähde:", - "system_health_error": "Järjestelmän kunto-komponenttia ei ole ladattu. Lisää 'system_health:' kohteeseen configuration.yaml", - "title": "Tiedot" - }, - "logs": { - "clear": "Tyhjennä", - "details": "Lokitiedot ( {level} )", - "load_full_log": "Lataa Home Assistantin koko loki", - "loading_log": "Ladataan virhelokia...", - "multiple_messages": "Viesti esiintyi ensimmäisen kerran {time} ja tämän jälkeen {counter} kertaa", - "no_errors": "Virheitä ei ole ilmoitettu.", - "no_issues": "Ei uusia aiheita!", - "refresh": "Päivitä", - "title": "Lokit" - }, "mqtt": { "description_listen": "Kuuntele aihetta", "description_publish": "Julkaise paketti", diff --git a/translations/frontend/fr.json b/translations/frontend/fr.json index 36d841b1c0..06d1a657ba 100644 --- a/translations/frontend/fr.json +++ b/translations/frontend/fr.json @@ -480,8 +480,10 @@ "delete": "Supprimer", "error_required": "Obligatoire", "loading": "Chargement", + "menu": "Menu", "next": "Suivant", "no": "Non", + "overflow_menu": "Menu de débordement", "previous": "Précédent", "refresh": "Rafraîchir", "save": "Enregistrer", @@ -911,6 +913,8 @@ "introduction": "Utilisez les automatisations pour donner vie à votre maison", "load_error_not_editable": "Seules les automatisations dans automations.yaml sont modifiables.", "load_error_unknown": "Erreur lors du chargement de l'automatisation ( {err_no} ).", + "move_down": "Déplacer vers le bas", + "move_up": "Déplacer vers le haut", "save": "Sauvegarder", "triggers": { "add": "Ajouter un déclencheur", @@ -1367,6 +1371,24 @@ "input_text": "Texte" } }, + "info": { + "built_using": "Construit en utilisant", + "custom_uis": "Interfaces utilisateur personnalisées :", + "developed_by": "Développé par un groupe de personnes formidables.", + "documentation": "Documentation", + "frontend": "interface utilisateur", + "frontend_version": "Version interface utilisateur : {version} - {type}", + "home_assistant_logo": "Logo de Home Assistant", + "icons_by": "Icônes par", + "integrations": "Intégrations", + "issues": "Problèmes", + "license": "Publié sous la licence Apache 2.0", + "path_configuration": "Chemin vers configuration.yaml : {path}", + "server": "serveur", + "source": "Source:", + "system_health_error": "Le composant System Health n'est pas chargé. Ajouter 'system_health:' à configuration.yaml", + "title": "Info" + }, "integrations": { "add_integration": "Ajouter l'intégration", "caption": "Intégrations", @@ -1438,6 +1460,17 @@ "rename_input_label": "Nom de l'entrée" }, "introduction": "Ici, il est possible de configurer vos composants et Home Assistant. Tout n'est pas encore possible de configurer à partir de l'interface utilisateur, mais nous y travaillons.", + "logs": { + "clear": "Nettoyer", + "details": "Détails du journal ( {level} )", + "load_full_log": "Charger le journal complet de Home Assistant", + "loading_log": "Chargement du journal des erreurs…", + "multiple_messages": "message survenu pour la première fois à {time} et apparu {counter} fois.", + "no_errors": "Aucune erreur n'a été signalée.", + "no_issues": "Il n'y a pas de nouveaux problèmes!", + "refresh": "Rafraîchir", + "title": "Journaux" + }, "lovelace": { "caption": "Tableaux de bord Lovelace", "dashboards": { @@ -1924,35 +1957,6 @@ "title": "Événements", "type": "Type d'événement" }, - "info": { - "built_using": "Construit en utilisant", - "custom_uis": "Interfaces utilisateur personnalisées :", - "developed_by": "Développé par un groupe de personnes formidables.", - "documentation": "Documentation", - "frontend": "interface utilisateur", - "frontend_version": "Version interface utilisateur : {version} - {type}", - "home_assistant_logo": "Logo de Home Assistant", - "icons_by": "Icônes par", - "integrations": "Intégrations", - "issues": "Problèmes", - "license": "Publié sous la licence Apache 2.0", - "path_configuration": "Chemin vers configuration.yaml : {path}", - "server": "serveur", - "source": "Source:", - "system_health_error": "Le composant System Health n'est pas chargé. Ajouter 'system_health:' à configuration.yaml", - "title": "Info" - }, - "logs": { - "clear": "Nettoyer", - "details": "Détails du journal ( {level} )", - "load_full_log": "Charger le journal complet de Home Assistant", - "loading_log": "Chargement du journal des erreurs…", - "multiple_messages": "message survenu pour la première fois à {time} et apparu {counter} fois.", - "no_errors": "Aucune erreur n'a été signalée.", - "no_issues": "Il n'y a pas de nouveaux problèmes!", - "refresh": "Rafraîchir", - "title": "Journaux" - }, "mqtt": { "description_listen": "Écouter un sujet", "description_publish": "Publier un paquet", diff --git a/translations/frontend/he.json b/translations/frontend/he.json index 8bd93c4e2a..7ec36180c9 100644 --- a/translations/frontend/he.json +++ b/translations/frontend/he.json @@ -1181,6 +1181,24 @@ "input_text": "טקסט" } }, + "info": { + "built_using": "נבנה באמצעות", + "custom_uis": "ממשקי משתמש מותאמים אישית:", + "developed_by": "פותח על ידי חבורה של אנשים מדהימים.", + "documentation": "תיעוד", + "frontend": "frontend-ui", + "frontend_version": "גרסת ממשק המשתמש: {version} - {type}", + "home_assistant_logo": "לוגו Home Assistant", + "icons_by": "סמלים מאת", + "integrations": "אינטגרציות", + "issues": "בעיות", + "license": "פורסם תחת רישיון Apache 2.0", + "path_configuration": "נתיב ל - configuration.yaml: {path}", + "server": "שרת", + "source": "מקור:", + "system_health_error": "רכיב ה System Health אינו טעון. הוסף 'system_health:' ל - configuration.yaml", + "title": "מידע" + }, "integrations": { "add_integration": "הוסף אינטגרציה", "caption": "אינטגרציות", @@ -1237,6 +1255,17 @@ "rename_input_label": "שם ישות" }, "introduction": "כאן ניתן להגדיר את הרכיבים ואת ה Home Assistant. לא הכל ניתן להגדיר את ממשק המשתמש עדיין, אבל אנחנו עובדים על זה.", + "logs": { + "clear": "נקה", + "details": "פרטי יומן האירועים ({level})", + "load_full_log": "טען את הלוג המלא של Home Assistant", + "loading_log": "טוען יומן שגיאות ...", + "multiple_messages": "ההודעה התרחשה לראשונה בשעה {time} והיא מופיעה {counter} פעמים", + "no_errors": "לא דווחו שגיאות.", + "no_issues": "אין נושאים חדשים!", + "refresh": "רענן", + "title": "יומנים" + }, "lovelace": { "dashboards": { "caption": "לוחות בקרה", @@ -1598,35 +1627,6 @@ "title": "אירועים", "type": "סוג אירוע" }, - "info": { - "built_using": "נבנה באמצעות", - "custom_uis": "ממשקי משתמש מותאמים אישית:", - "developed_by": "פותח על ידי חבורה של אנשים מדהימים.", - "documentation": "תיעוד", - "frontend": "frontend-ui", - "frontend_version": "גרסת ממשק המשתמש: {version} - {type}", - "home_assistant_logo": "לוגו Home Assistant", - "icons_by": "סמלים מאת", - "integrations": "אינטגרציות", - "issues": "בעיות", - "license": "פורסם תחת רישיון Apache 2.0", - "path_configuration": "נתיב ל - configuration.yaml: {path}", - "server": "שרת", - "source": "מקור:", - "system_health_error": "רכיב ה System Health אינו טעון. הוסף 'system_health:' ל - configuration.yaml", - "title": "מידע" - }, - "logs": { - "clear": "נקה", - "details": "פרטי יומן האירועים ({level})", - "load_full_log": "טען את הלוג המלא של Home Assistant", - "loading_log": "טוען יומן שגיאות ...", - "multiple_messages": "ההודעה התרחשה לראשונה בשעה {time} והיא מופיעה {counter} פעמים", - "no_errors": "לא דווחו שגיאות.", - "no_issues": "אין נושאים חדשים!", - "refresh": "רענן", - "title": "יומנים" - }, "mqtt": { "description_listen": "האזנה לנושא", "description_publish": "פרסם חבילה", diff --git a/translations/frontend/hi.json b/translations/frontend/hi.json index 5284d1ebea..ce045820de 100644 --- a/translations/frontend/hi.json +++ b/translations/frontend/hi.json @@ -308,6 +308,9 @@ "rename_dialog": "इस कॉन्फ़िगरेशन प्रविष्टि का नाम संपादित करें", "rename_input_label": "प्रवेश का नाम" }, + "logs": { + "title": "लॉग्स" + }, "script": { "picker": { "headers": { @@ -349,9 +352,6 @@ "events": { "title": "घटनाओं" }, - "logs": { - "title": "लॉग्स" - }, "mqtt": { "title": "MQTT" }, diff --git a/translations/frontend/hr.json b/translations/frontend/hr.json index 8d90fbad35..7c0729d29a 100644 --- a/translations/frontend/hr.json +++ b/translations/frontend/hr.json @@ -1008,6 +1008,14 @@ } }, "header": "Konfigurirajte Home Assistant", + "info": { + "frontend_version": "Verzija sučelja: {version} - {type}", + "home_assistant_logo": "Logotip Home Assistanta", + "license": "Objavljeno pod licencom Apache 2.0", + "path_configuration": "Put do configuration.yaml: {path}", + "source": "Izvorni kod:", + "title": "Informacije" + }, "integrations": { "caption": "Integracije", "config_entry": { @@ -1045,6 +1053,9 @@ "none": "Još ništa nije konfigurirano" }, "introduction": "Ovdje možete konfigurirati vaše komponente i Home Assistant. Nije moguće baš sve konfigurirati koristeći UI zasada, ali radimo na tome.", + "logs": { + "title": "Logovi" + }, "person": { "caption": "Osobe", "description": "Upravljajte osobama koje Home Assistant prati.", @@ -1287,17 +1298,6 @@ "events": { "title": "Događaji" }, - "info": { - "frontend_version": "Verzija sučelja: {version} - {type}", - "home_assistant_logo": "Logotip Home Assistanta", - "license": "Objavljeno pod licencom Apache 2.0", - "path_configuration": "Put do configuration.yaml: {path}", - "source": "Izvorni kod:", - "title": "Informacije" - }, - "logs": { - "title": "Logovi" - }, "mqtt": { "title": "MQTT" }, diff --git a/translations/frontend/hu.json b/translations/frontend/hu.json index 39753dde74..501234aa56 100644 --- a/translations/frontend/hu.json +++ b/translations/frontend/hu.json @@ -478,9 +478,12 @@ "cancel": "Mégse", "close": "Bezárás", "delete": "Törlés", + "error_required": "Szükséges", "loading": "Betöltés", + "menu": "Menü", "next": "Tovább", "no": "Nem", + "overflow_menu": "Lebegő menü", "previous": "Előző", "refresh": "Frissítés", "save": "Mentés", @@ -910,6 +913,8 @@ "introduction": "Használj automatizálásokat otthonod életre keltéséhez", "load_error_not_editable": "Csak az automations.yaml fájlban megadott automatizálások szerkeszthetők.", "load_error_unknown": "Hiba az automatizálás betöltésekor ({err_no}).", + "move_down": "Le", + "move_up": "Fel", "save": "Mentés", "triggers": { "add": "Trigger hozzáadása", @@ -1221,6 +1226,7 @@ "different_include": "Lehet domainnel, globbal vagy egy másik include fájllal.", "pick_attribute": "Válassz egy attribútumot a felülbíráláshoz", "picker": { + "entity": "Entitás", "header": "Testreszabások", "introduction": "Szabd testre az entitások attribútumait. A hozzáadott, szerkesztett testreszabások azonnal érvényesülnek. A testreszabások eltávolítása akkor lép életbe, amikor az entitás frissül." }, @@ -1365,6 +1371,24 @@ "input_text": "Szöveg" } }, + "info": { + "built_using": "Buildelve:", + "custom_uis": "Egyéni felhasználói felületek:", + "developed_by": "Egy csomó fantasztikus ember által kifejlesztve.", + "documentation": "Dokumentáció", + "frontend": "frontend-ui", + "frontend_version": "Frontend verzió: {version} - {type}", + "home_assistant_logo": "Home Assistant logó", + "icons_by": "Ikonokat készítette:", + "integrations": "Integrációk", + "issues": "Problémák", + "license": "Megjelent az Apache 2.0 licenc alatt", + "path_configuration": "A configuration.yaml fájl elérési útja: {path}", + "server": "server", + "source": "Forrás:", + "system_health_error": "A rendszerállapot összetevő nincs betöltve. Add hozzá a 'system_health:' sort a configuration.yaml fájlhoz.", + "title": "Infó" + }, "integrations": { "add_integration": "Integráció hozzáadása", "caption": "Integrációk", @@ -1436,6 +1460,17 @@ "rename_input_label": "Bejegyzés neve" }, "introduction": "Itt a komponenseket és a Home Assistant szervert lehet beállítani. Még nem lehet mindent a felületről, de dolgozunk rajta.", + "logs": { + "clear": "Törlés", + "details": "Naplózás részletessége ({level})", + "load_full_log": "Teljes Home Assistant napló betöltése", + "loading_log": "Hibanapló betöltése...", + "multiple_messages": "az üzenet először a következő időpontban fordult elő: {time}, majd később {counter} alkalommal ismétlődött", + "no_errors": "Nem jelentettek hibát.", + "no_issues": "Nincsenek új bejegyzések!", + "refresh": "Frissítés", + "title": "Napló" + }, "lovelace": { "caption": "Lovelace Irányítópultok", "dashboards": { @@ -1853,12 +1888,15 @@ "add_node_secure": "Biztonságos csomópont hozzáadása", "cancel_command": "Parancs megszakítása", "heal_network": "Hálózati struktúra feltérképezése", + "node_info": "Node információ", + "refresh_entity": "Entitás frissítése", "remove_node": "Csomópont eltávolítása", "save_config": "Konfiguráció mentése", "soft_reset": "Soft Reset", "start_network": "Hálózat indítása", "stop_network": "Hálózat leállítása", - "test_network": "Hálózat tesztelése" + "test_network": "Hálózat tesztelése", + "test_node": "Teszt Node" }, "values": { "header": "Csomópont értékek" @@ -1892,35 +1930,6 @@ "title": "Események", "type": "Esemény típusa" }, - "info": { - "built_using": "Buildelve:", - "custom_uis": "Egyéni felhasználói felületek:", - "developed_by": "Egy csomó fantasztikus ember által kifejlesztve.", - "documentation": "Dokumentáció", - "frontend": "frontend-ui", - "frontend_version": "Frontend verzió: {version} - {type}", - "home_assistant_logo": "Home Assistant logó", - "icons_by": "Ikonokat készítette:", - "integrations": "Integrációk", - "issues": "Problémák", - "license": "Megjelent az Apache 2.0 licenc alatt", - "path_configuration": "A configuration.yaml fájl elérési útja: {path}", - "server": "server", - "source": "Forrás:", - "system_health_error": "A rendszerállapot összetevő nincs betöltve. Add hozzá a 'system_health:' sort a configuration.yaml fájlhoz.", - "title": "Infó" - }, - "logs": { - "clear": "Törlés", - "details": "Naplózás részletessége ({level})", - "load_full_log": "Teljes Home Assistant napló betöltése", - "loading_log": "Hibanapló betöltése...", - "multiple_messages": "az üzenet először a következő időpontban fordult elő: {time}, majd később {counter} alkalommal ismétlődött", - "no_errors": "Nem jelentettek hibát.", - "no_issues": "Nincsenek új bejegyzések!", - "refresh": "Frissítés", - "title": "Napló" - }, "mqtt": { "description_listen": "Téma figyelése", "description_publish": "Csomag közzététele", diff --git a/translations/frontend/hy.json b/translations/frontend/hy.json index e3656f650e..637fc7987e 100644 --- a/translations/frontend/hy.json +++ b/translations/frontend/hy.json @@ -806,6 +806,9 @@ } }, "header": "Կարգավորել Home Assistant-ը", + "info": { + "title": "Ինֆորմացիա" + }, "integrations": { "caption": "Ինտեգրում", "config_entry": { @@ -834,6 +837,9 @@ "none": "Ոչինչ տրամադրված չէ" }, "introduction": "Այստեղ հնարավոր է կարգավորել ձեր բաղադրիչները և Home Assistant:Դեռ ամեն ինչ հնարավոր չէ կազմաձևել UI- ից, բայց մենք աշխատում ենք այդ ուղղությամբ", + "logs": { + "title": "log-եր" + }, "person": { "caption": "Անձինք", "description": "Կառավարել այն անձանց, որոնք հետապնդում են Home Assistant-ին:", @@ -959,12 +965,6 @@ "events": { "title": "Իրադարձություններ" }, - "info": { - "title": "Ինֆորմացիա" - }, - "logs": { - "title": "log-եր" - }, "mqtt": { "title": "MQTT" }, diff --git a/translations/frontend/is.json b/translations/frontend/is.json index a11c207ebf..f7acfa34da 100644 --- a/translations/frontend/is.json +++ b/translations/frontend/is.json @@ -1073,6 +1073,12 @@ "input_text": "Texti" } }, + "info": { + "documentation": "Skjölun", + "icons_by": "Smátákn eftir", + "integrations": "Samþættingar", + "title": "Upplýsingar" + }, "integrations": { "add_integration": "Bæta við samþættingu", "caption": "Samþættingar", @@ -1120,6 +1126,9 @@ "none": "Ekkert skilgreint sem stendur" }, "introduction": "Hér er mögulegt að stilla af íhluti og Home Assistant. Því miður er ekki hægt að breyta öllu í gegnum viðmótið ennþá, en við erum að vinna í því.", + "logs": { + "clear": "Hreinsa" + }, "lovelace": { "caption": "Lovelace mælaborð", "dashboards": { @@ -1392,15 +1401,6 @@ "events": { "title": "Viðburðir" }, - "info": { - "documentation": "Skjölun", - "icons_by": "Smátákn eftir", - "integrations": "Samþættingar", - "title": "Upplýsingar" - }, - "logs": { - "clear": "Hreinsa" - }, "mqtt": { "title": "MQTT" }, diff --git a/translations/frontend/it.json b/translations/frontend/it.json index 0e7a287fd7..5f76c3c65f 100644 --- a/translations/frontend/it.json +++ b/translations/frontend/it.json @@ -480,8 +480,10 @@ "delete": "Elimina", "error_required": "Necessario", "loading": "Caricamento", + "menu": "Menù", "next": "Avanti", "no": "No", + "overflow_menu": "Menù di Overflow", "previous": "Indietro", "refresh": "Aggiorna", "save": "Salva", @@ -741,8 +743,8 @@ "notification_toast": { "connection_lost": "Connessione persa. Riconnessione…", "service_call_failed": "Fallita chiamata a servizio {service} .", - "started": "Home Assistant è avviato!", - "starting": "Home Assistant sta iniziando, non tutto sarà disponibile fino a quando non avrà finito l'avvio.", + "started": "Home Assistant si è avviato!", + "starting": "Home Assistant si sta avviando, non tutto sarà disponibile fino a quando non avrà completato l'avvio.", "triggered": "Attivato {name}" }, "panel": { @@ -911,6 +913,8 @@ "introduction": "Usa le automazioni per dare vita alla tua casa.", "load_error_not_editable": "Solo le Automazioni in automations.yaml sono modificabili.", "load_error_unknown": "Errore durante il caricamento dell'Automazione ({err_no}).", + "move_down": "Sposta sotto", + "move_up": "Sposta sopra", "save": "Salva", "triggers": { "add": "Aggiungi Attivazione", @@ -1367,6 +1371,24 @@ "input_text": "Testo" } }, + "info": { + "built_using": "Costruito usando", + "custom_uis": "Interfacce Utente personalizzate:", + "developed_by": "Sviluppato da un gruppo di persone fantastiche.", + "documentation": "Documentazione", + "frontend": "frontend-ui", + "frontend_version": "Versione Frontend: {version} - {type}", + "home_assistant_logo": "Logo Home Assistant", + "icons_by": "Icone di", + "integrations": "integrazioni", + "issues": "Problemi", + "license": "Pubblicato sotto la licenza Apache 2.0", + "path_configuration": "Percorso del file configuration.yaml: {path}", + "server": "server", + "source": "Sorgenti:", + "system_health_error": "Il componente System Health non è caricato. Aggiungere 'system_health:' a configuration.yaml", + "title": "Informazioni" + }, "integrations": { "add_integration": "Aggiungi integrazione", "caption": "Integrazioni", @@ -1438,6 +1460,17 @@ "rename_input_label": "Nome della voce" }, "introduction": "Qui è possibile configurare i componenti e Home Assistant. Non è ancora possibile configurare tutto dall'Interfaccia Utente, ma ci stiamo lavorando.", + "logs": { + "clear": "Pulisci", + "details": "Dettagli registro ({level})", + "load_full_log": "Carica il registro completo di Home Assistant", + "loading_log": "Caricamento del registro errori...", + "multiple_messages": "il messaggio si è verificato per la prima volta alle {time} e compare {counter} volte", + "no_errors": "Non sono stati segnalati errori.", + "no_issues": "Non ci sono nuovi problemi!", + "refresh": "Aggiorna", + "title": "Registri" + }, "lovelace": { "caption": "Cruscotti Lovelace", "dashboards": { @@ -1924,35 +1957,6 @@ "title": "Eventi", "type": "Tipo di Evento" }, - "info": { - "built_using": "Costruito usando", - "custom_uis": "Interfacce Utente personalizzate:", - "developed_by": "Sviluppato da un gruppo di persone fantastiche.", - "documentation": "Documentazione", - "frontend": "frontend-ui", - "frontend_version": "Versione Frontend: {version} - {type}", - "home_assistant_logo": "Logo Home Assistant", - "icons_by": "Icone di", - "integrations": "integrazioni", - "issues": "Problemi", - "license": "Pubblicato sotto la licenza Apache 2.0", - "path_configuration": "Percorso del file configuration.yaml: {path}", - "server": "server", - "source": "Sorgenti:", - "system_health_error": "Il componente System Health non è caricato. Aggiungere 'system_health:' a configuration.yaml", - "title": "Informazioni" - }, - "logs": { - "clear": "Pulisci", - "details": "Dettagli registro ({level})", - "load_full_log": "Carica il registro completo di Home Assistant", - "loading_log": "Caricamento del registro errori...", - "multiple_messages": "il messaggio si è verificato per la prima volta alle {time} e compare {counter} volte", - "no_errors": "Non sono stati segnalati errori.", - "no_issues": "Non ci sono nuovi problemi!", - "refresh": "Aggiorna", - "title": "Registri" - }, "mqtt": { "description_listen": "Ascoltare un argomento", "description_publish": "Pubblicare un pacchetto", diff --git a/translations/frontend/ja.json b/translations/frontend/ja.json index 681f56b25a..f2899d8908 100644 --- a/translations/frontend/ja.json +++ b/translations/frontend/ja.json @@ -852,6 +852,14 @@ "input_text": "テキスト" } }, + "info": { + "frontend_version": "フロントエンドバージョン: {version} - {type}", + "issues": "問題", + "path_configuration": "ディスク上に configuration.yaml へのパス: {path}", + "server": "サーバー", + "system_health_error": "「システムの正常性」コンポーネントが有効されていません、configuration.yaml に 'system_health:' を追加してください。", + "title": "情報" + }, "integrations": { "add_integration": "インテグレーションを追加", "config_entry": { @@ -897,6 +905,15 @@ "rename_dialog": "このコンフィグレーションエントリーの名前を変更", "rename_input_label": "エントリー名" }, + "logs": { + "clear": "消去", + "load_full_log": "完全な Home Assistant ログを読み込む", + "loading_log": "エラーログを読み込んでいます…", + "no_errors": "エラーは報告されていません。", + "no_issues": "新しい問題はありません!", + "refresh": "更新", + "title": "ログ" + }, "lovelace": { "caption": "Lovelace ダッシュボード", "dashboards": { @@ -1157,23 +1174,6 @@ "title": "イベント", "type": "イベントの種類" }, - "info": { - "frontend_version": "フロントエンドバージョン: {version} - {type}", - "issues": "問題", - "path_configuration": "ディスク上に configuration.yaml へのパス: {path}", - "server": "サーバー", - "system_health_error": "「システムの正常性」コンポーネントが有効されていません、configuration.yaml に 'system_health:' を追加してください。", - "title": "情報" - }, - "logs": { - "clear": "消去", - "load_full_log": "完全な Home Assistant ログを読み込む", - "loading_log": "エラーログを読み込んでいます…", - "no_errors": "エラーは報告されていません。", - "no_issues": "新しい問題はありません!", - "refresh": "更新", - "title": "ログ" - }, "mqtt": { "description_listen": "トピックをリッスン", "description_publish": "パケットをパブリッシュ", diff --git a/translations/frontend/ko.json b/translations/frontend/ko.json index d5b86b3a63..cf5675cfc4 100644 --- a/translations/frontend/ko.json +++ b/translations/frontend/ko.json @@ -1367,6 +1367,24 @@ "input_text": "텍스트" } }, + "info": { + "built_using": "다음을 사용하여 제작", + "custom_uis": "사용자 UI :", + "developed_by": "Home Assistant 는 수많은 멋진 사람들에 의해 개발되었습니다.", + "documentation": "관련문서", + "frontend": "프런트엔드-UI", + "frontend_version": "프런트엔드 버전: {version} - {type}", + "home_assistant_logo": "Home Assistant 로고", + "icons_by": "아이콘 출처", + "integrations": "통합 구성요소", + "issues": "이슈", + "license": "Apache 2.0 License 에 따라 게시", + "path_configuration": "configuration.yaml 의 위치: {path}", + "server": "서버", + "source": "소스:", + "system_health_error": "시스템 상태보기 구성요소가 로드되지 않았습니다. configuration.yaml 에 'system_health:' 를 추가해주세요.", + "title": "정보" + }, "integrations": { "add_integration": "통합 구성요소 추가", "caption": "통합 구성요소", @@ -1438,6 +1456,17 @@ "rename_input_label": "구성 항목의 이름" }, "introduction": "여기에서 구성요소와 Home Assistant 를 설정할 수 있습니다. 아직 여기서 모두 설정할 수는 없지만, 모든 내용을 설정할 수 있도록 작업 중입니다.", + "logs": { + "clear": "지우기", + "details": "로그 상세정보 ({level})", + "load_full_log": "Home Assistant 로그 전부 불러오기", + "loading_log": "오류 로그를 읽는 중...", + "multiple_messages": "{time} 에 처음 발생했으며, {counter} 번 발생했습니다.", + "no_errors": "보고된 오류가 없습니다.", + "no_issues": "새롭게 보고된 문제가 없습니다!", + "refresh": "새로고침", + "title": "로그" + }, "lovelace": { "caption": "Lovelace 대시보드", "dashboards": { @@ -1924,35 +1953,6 @@ "title": "이벤트", "type": "이벤트 유형" }, - "info": { - "built_using": "다음을 사용하여 제작", - "custom_uis": "사용자 UI :", - "developed_by": "Home Assistant 는 수많은 멋진 사람들에 의해 개발되었습니다.", - "documentation": "관련문서", - "frontend": "프런트엔드-UI", - "frontend_version": "프런트엔드 버전: {version} - {type}", - "home_assistant_logo": "Home Assistant 로고", - "icons_by": "아이콘 출처", - "integrations": "통합 구성요소", - "issues": "이슈", - "license": "Apache 2.0 License 에 따라 게시", - "path_configuration": "configuration.yaml 의 위치: {path}", - "server": "서버", - "source": "소스:", - "system_health_error": "시스템 상태보기 구성요소가 로드되지 않았습니다. configuration.yaml 에 'system_health:' 를 추가해주세요.", - "title": "정보" - }, - "logs": { - "clear": "지우기", - "details": "로그 상세정보 ({level})", - "load_full_log": "Home Assistant 로그 전부 불러오기", - "loading_log": "오류 로그를 읽는 중...", - "multiple_messages": "{time} 에 처음 발생했으며, {counter} 번 발생했습니다.", - "no_errors": "보고된 오류가 없습니다.", - "no_issues": "새롭게 보고된 문제가 없습니다!", - "refresh": "새로고침", - "title": "로그" - }, "mqtt": { "description_listen": "토픽 내용 들어보기", "description_publish": "패킷 발행", diff --git a/translations/frontend/lb.json b/translations/frontend/lb.json index c9ca4af75a..7beaaba6e0 100644 --- a/translations/frontend/lb.json +++ b/translations/frontend/lb.json @@ -1367,6 +1367,24 @@ "input_text": "Text" } }, + "info": { + "built_using": "Erstallt mat", + "custom_uis": "Personaliséierte Benotzer Interface:", + "developed_by": "Entwéckelt vun enger ganzer Rei fantastesche Leit.", + "documentation": "Dokumentatioun", + "frontend": "frontend-ui", + "frontend_version": "Frontend Versioun: {version} - {type}", + "home_assistant_logo": "Home Assistant logo", + "icons_by": "Ikonen vun", + "integrations": "Integratioune", + "issues": "Problemer", + "license": "Verëffentlecht ënnert der Apache 2.0 Lizenz", + "path_configuration": "Pad zur configuration.yaml: {path}", + "server": "server", + "source": "Quell:", + "system_health_error": "System Gesondheet Komponent net gelueden. Setz 'system_health:' zur configuration.yaml dobäi", + "title": "Info" + }, "integrations": { "add_integration": "Integratioun dobäisetzen", "caption": "Integratiounen", @@ -1438,6 +1456,17 @@ "rename_input_label": "Numm" }, "introduction": "Hei ass et méiglech är Komponenten vum Home Assistant ze konfiguréieren. Net alles ass méiglech fir iwwert den Interface anzestellen, mee mir schaffen drun.", + "logs": { + "clear": "Läschen", + "details": "Detailler vum Log ({level})", + "load_full_log": "Kompletten Home Assistant Log lueden", + "loading_log": "Feeler Log gëtt gelueden...", + "multiple_messages": "Noriicht als éischt opgetrueden um {time} a säit deem {counter} mol opgetrueden", + "no_errors": "Et gouf kee Feeler gemellt.", + "no_issues": "Keng nei Problemer!", + "refresh": "Aktualiséieren", + "title": "Logbicher" + }, "lovelace": { "caption": "Lovelace Tableau de Bord", "dashboards": { @@ -1924,35 +1953,6 @@ "title": "Evenementer", "type": "Typ vun Evenement" }, - "info": { - "built_using": "Erstallt mat", - "custom_uis": "Personaliséierte Benotzer Interface:", - "developed_by": "Entwéckelt vun enger ganzer Rei fantastesche Leit.", - "documentation": "Dokumentatioun", - "frontend": "frontend-ui", - "frontend_version": "Frontend Versioun: {version} - {type}", - "home_assistant_logo": "Home Assistant logo", - "icons_by": "Ikonen vun", - "integrations": "Integratioune", - "issues": "Problemer", - "license": "Verëffentlecht ënnert der Apache 2.0 Lizenz", - "path_configuration": "Pad zur configuration.yaml: {path}", - "server": "server", - "source": "Quell:", - "system_health_error": "System Gesondheet Komponent net gelueden. Setz 'system_health:' zur configuration.yaml dobäi", - "title": "Info" - }, - "logs": { - "clear": "Läschen", - "details": "Detailler vum Log ({level})", - "load_full_log": "Kompletten Home Assistant Log lueden", - "loading_log": "Feeler Log gëtt gelueden...", - "multiple_messages": "Noriicht als éischt opgetrueden um {time} a säit deem {counter} mol opgetrueden", - "no_errors": "Et gouf kee Feeler gemellt.", - "no_issues": "Keng nei Problemer!", - "refresh": "Aktualiséieren", - "title": "Logbicher" - }, "mqtt": { "description_listen": "Sujet lauschteren", "description_publish": "Ee Pak publizéieren", diff --git a/translations/frontend/lv.json b/translations/frontend/lv.json index 7feaa848c4..d515e5ce3a 100644 --- a/translations/frontend/lv.json +++ b/translations/frontend/lv.json @@ -1017,6 +1017,11 @@ "input_text": "Teksts" } }, + "info": { + "server": "serveris", + "source": "Avots:", + "title": "Informācija" + }, "integrations": { "caption": "Integrācijas", "config_entry": { @@ -1073,6 +1078,10 @@ "note_about_website_reference": "Vairāk informācijas vietnē " }, "introduction": "Šeit iespējams konfigurēt Jūsu komponentus un pašu Home Assistant. Pagaidām ne visu ir iespējams konfigurēt no lietotāja saskarnes, bet mēs strādājam pie tā.", + "logs": { + "clear": "Notīrīt", + "refresh": "Atsvaidzināt" + }, "person": { "add_person": "Pievienot personu", "caption": "Personas", @@ -1346,15 +1355,6 @@ "events": { "title": "Notikumi" }, - "info": { - "server": "serveris", - "source": "Avots:", - "title": "Informācija" - }, - "logs": { - "clear": "Notīrīt", - "refresh": "Atsvaidzināt" - }, "mqtt": { "publish": "Publicēt", "title": "MQTT", diff --git a/translations/frontend/nb.json b/translations/frontend/nb.json index d88a8870a4..584d3610af 100644 --- a/translations/frontend/nb.json +++ b/translations/frontend/nb.json @@ -480,8 +480,10 @@ "delete": "Slett", "error_required": "Nødvendig", "loading": "Laster", + "menu": "Meny", "next": "Neste", "no": "Nei", + "overflow_menu": "Overløpsmeny", "previous": "Forrige", "refresh": "Oppdater", "save": "Lagre", @@ -911,6 +913,8 @@ "introduction": "Bruk automasjon for å få liv i hjemmet ditt", "load_error_not_editable": "Kun automasjoner i automations.yaml kan redigeres.", "load_error_unknown": "Feil ved lasting av automasjon ({err_no}).", + "move_down": "Flytt ned", + "move_up": "Flytt opp", "save": "Lagre", "triggers": { "add": "Legg til utløser", @@ -1367,6 +1371,24 @@ "input_text": "Tekst" } }, + "info": { + "built_using": "Bygget med", + "custom_uis": "Tilpassede brukergrensesnitt:", + "developed_by": "Utviklet av en gjeng med fantastiske mennesker.", + "documentation": "Dokumentasjon", + "frontend": "frontend", + "frontend_version": "Brukergrensesnittet-versjon: {version} - {type}", + "home_assistant_logo": "", + "icons_by": "Ikoner fra", + "integrations": "Integrasjoner", + "issues": "Problemer", + "license": "Publisert under Apache 2.0-lisensen", + "path_configuration": "Sti til configurasjon.yaml: {path}", + "server": "core", + "source": "Kilder:", + "system_health_error": "System tilstand komponenten er ikke lastet inn. Legg til 'system_health:' i configuration.yaml", + "title": "Informasjon" + }, "integrations": { "add_integration": "Legg til integrasjon", "caption": "Integrasjoner", @@ -1438,6 +1460,17 @@ "rename_input_label": "Navn på oppføring" }, "introduction": "Her er det mulig å konfigurere dine komponenter og Home Assistant. Ikke alt er mulig å konfigurere fra brukergrensesnittet enda, men vi jobber med det.", + "logs": { + "clear": "Tøm", + "details": "Loggdetaljer ({level})", + "load_full_log": "Last inn fullstendig Home Assistant logg", + "loading_log": "Laster inn feillogg ...", + "multiple_messages": "meldingen oppstod først ved {time} og vist {counter} ganger", + "no_errors": "Ingen feil er rapportert.", + "no_issues": "Det er ingen nye problemer!", + "refresh": "Oppdater", + "title": "Logger" + }, "lovelace": { "caption": "Lovelace instrumentbord", "dashboards": { @@ -1924,35 +1957,6 @@ "title": "Hendelser", "type": "Type hendelse" }, - "info": { - "built_using": "Bygget med", - "custom_uis": "Tilpassede brukergrensesnitt:", - "developed_by": "Utviklet av en gjeng med fantastiske mennesker.", - "documentation": "Dokumentasjon", - "frontend": "frontend", - "frontend_version": "Brukergrensesnittet-versjon: {version} - {type}", - "home_assistant_logo": "", - "icons_by": "Ikoner fra", - "integrations": "Integrasjoner", - "issues": "Problemer", - "license": "Publisert under Apache 2.0-lisensen", - "path_configuration": "Sti til configurasjon.yaml: {path}", - "server": "core", - "source": "Kilder:", - "system_health_error": "System tilstand komponenten er ikke lastet inn. Legg til 'system_health:' i configuration.yaml", - "title": "Informasjon" - }, - "logs": { - "clear": "Tøm", - "details": "Loggdetaljer ({level})", - "load_full_log": "Last inn fullstendig Home Assistant logg", - "loading_log": "Laster inn feillogg ...", - "multiple_messages": "meldingen oppstod først ved {time} og vist {counter} ganger", - "no_errors": "Ingen feil er rapportert.", - "no_issues": "Det er ingen nye problemer!", - "refresh": "Oppdater", - "title": "Logger" - }, "mqtt": { "description_listen": "Lytt til et emne", "description_publish": "Publiser en pakke", @@ -2346,7 +2350,7 @@ "entity_non_numeric": "Entiteten er ikke-numerisk: {entity}", "entity_not_found": "Entitet ikke tilgjengelig: {entity}", "entity_unavailable": "{entity} er for øyeblikket utilgjengelig", - "starting": "Home Assistant starter, ikke alt er kanskje tilgjengelig ennå" + "starting": "Home Assistant starter, kanskje ikke alt er tilgjengelig ennå" } }, "mailbox": { diff --git a/translations/frontend/nl.json b/translations/frontend/nl.json index 447b0b5752..a4e068b061 100644 --- a/translations/frontend/nl.json +++ b/translations/frontend/nl.json @@ -1363,6 +1363,24 @@ "input_text": "Tekst" } }, + "info": { + "built_using": "Gebouwd met behulp van", + "custom_uis": "Aangepaste UI's:", + "developed_by": "Ontwikkeld door een stel geweldige mensen.", + "documentation": "Documentatie", + "frontend": "Frontend", + "frontend_version": "Frontend-versie: {version} - {type}", + "home_assistant_logo": "Home Assistant-logo", + "icons_by": "Icons door", + "integrations": "Integraties", + "issues": "Problemen", + "license": "Gepubliceerd onder de Apache 2.0-licentie", + "path_configuration": "Pad naar configuration.yaml: {path}", + "server": "Server", + "source": "Bron:", + "system_health_error": "De systeemstatus component is niet geladen. Voeg ' system_health: ' toe aan het configuratiebestand.", + "title": "Info" + }, "integrations": { "add_integration": "Integratie toevoegen", "caption": "Integraties", @@ -1434,6 +1452,17 @@ "rename_input_label": "Invoernaam" }, "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": { + "clear": "Wis", + "details": "Logboekdetails ({level})", + "load_full_log": "Laad volledige Home Assistant logboek", + "loading_log": "Foutenlogboek laden ...", + "multiple_messages": "bericht kwam voor het eerst om {time} en verschijnt {counter} malen", + "no_errors": "Er zijn geen fouten gerapporteerd.", + "no_issues": "Er zijn geen problemen!", + "refresh": "Vernieuwen", + "title": "Logboek" + }, "lovelace": { "caption": "Lovelace-dashboards", "dashboards": { @@ -1887,35 +1916,6 @@ "title": "Gebeurtenissen", "type": "Type gebeurtenis" }, - "info": { - "built_using": "Gebouwd met behulp van", - "custom_uis": "Aangepaste UI's:", - "developed_by": "Ontwikkeld door een stel geweldige mensen.", - "documentation": "Documentatie", - "frontend": "Frontend", - "frontend_version": "Frontend-versie: {version} - {type}", - "home_assistant_logo": "Home Assistant-logo", - "icons_by": "Icons door", - "integrations": "Integraties", - "issues": "Problemen", - "license": "Gepubliceerd onder de Apache 2.0-licentie", - "path_configuration": "Pad naar configuration.yaml: {path}", - "server": "Server", - "source": "Bron:", - "system_health_error": "De systeemstatus component is niet geladen. Voeg ' system_health: ' toe aan het configuratiebestand.", - "title": "Info" - }, - "logs": { - "clear": "Wis", - "details": "Logboekdetails ({level})", - "load_full_log": "Laad volledige Home Assistant logboek", - "loading_log": "Foutenlogboek laden ...", - "multiple_messages": "bericht kwam voor het eerst om {time} en verschijnt {counter} malen", - "no_errors": "Er zijn geen fouten gerapporteerd.", - "no_issues": "Er zijn geen problemen!", - "refresh": "Vernieuwen", - "title": "Logboek" - }, "mqtt": { "description_listen": "Luisteren naar onderwerp", "description_publish": "Publiceer een pakket", diff --git a/translations/frontend/nn.json b/translations/frontend/nn.json index 6659dca42f..ba46958360 100644 --- a/translations/frontend/nn.json +++ b/translations/frontend/nn.json @@ -962,6 +962,12 @@ "filtering_by": "Filtrerer etter" }, "header": "Konfigurer Home Assistant", + "info": { + "documentation": "Dokumentasjon ", + "integrations": "Integrasjonar", + "issues": "Problem ", + "title": "Info" + }, "integrations": { "add_integration": "Legg til integrasjon ", "caption": "Integrasjoner", @@ -1008,6 +1014,9 @@ "rename_input_label": "Oppføringsnavn" }, "introduction": "Her er det mogleg å konfigurere dine komponenter og Home Assistant. Ikkje alt er mogleg å konfigurere frå brukarsnittet endå, men vi jobbar med saka.", + "logs": { + "title": "Loggar" + }, "person": { "caption": "Personar", "description": "Administrer personane Home Assistant sporer.", @@ -1229,15 +1238,6 @@ "events": { "title": "Hendingar" }, - "info": { - "documentation": "Dokumentasjon ", - "integrations": "Integrasjonar", - "issues": "Problem ", - "title": "Info" - }, - "logs": { - "title": "Loggar" - }, "mqtt": { "title": "MQTT" }, diff --git a/translations/frontend/pl.json b/translations/frontend/pl.json index dd4ca199d6..316ca6c59c 100644 --- a/translations/frontend/pl.json +++ b/translations/frontend/pl.json @@ -1367,6 +1367,24 @@ "input_text": "Tekst" } }, + "info": { + "built_using": "Zbudowany przy użyciu", + "custom_uis": "Niestandardowe interfejsy użytkownika:", + "developed_by": "Opracowany przez grono wspaniałych ludzi.", + "documentation": "Dokumentacja", + "frontend": "frontend-ui", + "frontend_version": "Wersja interfejsu użytkownika: {version} - {type}", + "home_assistant_logo": "Logo Home Assistant", + "icons_by": "ikon", + "integrations": "Integracje", + "issues": "Problemy", + "license": "Opublikowany na licencji Apache 2.0", + "path_configuration": "Ścieżka do pliku configuration.yaml: {path}", + "server": "serwer", + "source": "Źródło:", + "system_health_error": "Komponent kondycji systemu nie jest załadowany. Dodaj 'system_health:' do pliku configuration.yaml", + "title": "Informacje" + }, "integrations": { "add_integration": "Dodaj integrację", "caption": "Integracje", @@ -1438,6 +1456,17 @@ "rename_input_label": "Nazwa wpisu" }, "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": { + "clear": "Wyczyść", + "details": "Szczegóły loga ({level})", + "load_full_log": "Załaduj cały log Home Assistanta", + "loading_log": "Ładowanie loga błędów…", + "multiple_messages": "wiadomość pojawiła się po raz pierwszy o godzinie {time} i powtarzała się {counter} razy", + "no_errors": "Nie zgłoszono żadnych błędów.", + "no_issues": "Nie ma nowych problemów!", + "refresh": "Odśwież", + "title": "Logi" + }, "lovelace": { "caption": "Dashboardy", "dashboards": { @@ -1924,35 +1953,6 @@ "title": "Zdarzenia", "type": "Typ zdarzenia" }, - "info": { - "built_using": "Zbudowany przy użyciu", - "custom_uis": "Niestandardowe interfejsy użytkownika:", - "developed_by": "Opracowany przez grono wspaniałych ludzi.", - "documentation": "Dokumentacja", - "frontend": "frontend-ui", - "frontend_version": "Wersja interfejsu użytkownika: {version} - {type}", - "home_assistant_logo": "Logo Home Assistant", - "icons_by": "ikon", - "integrations": "Integracje", - "issues": "Problemy", - "license": "Opublikowany na licencji Apache 2.0", - "path_configuration": "Ścieżka do pliku configuration.yaml: {path}", - "server": "serwer", - "source": "Źródło:", - "system_health_error": "Komponent kondycji systemu nie jest załadowany. Dodaj 'system_health:' do pliku configuration.yaml", - "title": "Informacje" - }, - "logs": { - "clear": "Wyczyść", - "details": "Szczegóły loga ({level})", - "load_full_log": "Załaduj cały log Home Assistanta", - "loading_log": "Ładowanie loga błędów…", - "multiple_messages": "wiadomość pojawiła się po raz pierwszy o godzinie {time} i powtarzała się {counter} razy", - "no_errors": "Nie zgłoszono żadnych błędów.", - "no_issues": "Nie ma nowych problemów!", - "refresh": "Odśwież", - "title": "Logi" - }, "mqtt": { "description_listen": "Nasłuch tematu", "description_publish": "Opublikuj pakiet", diff --git a/translations/frontend/pt-BR.json b/translations/frontend/pt-BR.json index 81fa65d285..6e934dbb50 100644 --- a/translations/frontend/pt-BR.json +++ b/translations/frontend/pt-BR.json @@ -1366,6 +1366,24 @@ "input_text": "Texto" } }, + "info": { + "built_using": "Construído usando", + "custom_uis": "UIs personalizadas:", + "developed_by": "Desenvolvido por um monte de pessoas incríveis.", + "documentation": "Documentação", + "frontend": "frontend-ui", + "frontend_version": "Versão do Frontend: {version} - {type}", + "home_assistant_logo": "Home Assistant logo", + "icons_by": "Ícones por", + "integrations": "Integrações", + "issues": "Problemas", + "license": "Publicado sob a licença Apache 2.0", + "path_configuration": "Caminho para configuration.yaml: {path}", + "server": "servidor", + "source": "Código fonte:", + "system_health_error": "O componente System Health não foi carregado. Adicione 'system_health:' ao configuration.yaml", + "title": "Info" + }, "integrations": { "add_integration": "Adicionar integração", "caption": "Integrações", @@ -1437,6 +1455,17 @@ "rename_input_label": "Nome da entrada" }, "introduction": "Aqui é possível configurar seus componentes e Home Assistant. Nem tudo é possível configurar via UI, mas estamos trabalhando nisso.", + "logs": { + "clear": "Limpar", + "details": "Detalhes do log ({Level})", + "load_full_log": "Carregar todos os logs do Home Assistant", + "loading_log": "Carregando log de erros…", + "multiple_messages": "a mensagem ocorreu pela primeira às {time} e apareceu {counter} vezes", + "no_errors": "Nenhum erro foi reportado.", + "no_issues": "Não há novos problemas!", + "refresh": "Atualizar", + "title": "Logs" + }, "lovelace": { "caption": "Painéis Lovelace", "dashboards": { @@ -1903,35 +1932,6 @@ "title": "Eventos", "type": "Tipo de evento" }, - "info": { - "built_using": "Construído usando", - "custom_uis": "UIs personalizadas:", - "developed_by": "Desenvolvido por um monte de pessoas incríveis.", - "documentation": "Documentação", - "frontend": "frontend-ui", - "frontend_version": "Versão do Frontend: {version} - {type}", - "home_assistant_logo": "Home Assistant logo", - "icons_by": "Ícones por", - "integrations": "Integrações", - "issues": "Problemas", - "license": "Publicado sob a licença Apache 2.0", - "path_configuration": "Caminho para configuration.yaml: {path}", - "server": "servidor", - "source": "Código fonte:", - "system_health_error": "O componente System Health não foi carregado. Adicione 'system_health:' ao configuration.yaml", - "title": "Info" - }, - "logs": { - "clear": "Limpar", - "details": "Detalhes do log ({Level})", - "load_full_log": "Carregar todos os logs do Home Assistant", - "loading_log": "Carregando log de erros…", - "multiple_messages": "a mensagem ocorreu pela primeira às {time} e apareceu {counter} vezes", - "no_errors": "Nenhum erro foi reportado.", - "no_issues": "Não há novos problemas!", - "refresh": "Atualizar", - "title": "Logs" - }, "mqtt": { "description_listen": "Ouvir um tópico", "description_publish": "Publicar um pacote", diff --git a/translations/frontend/pt.json b/translations/frontend/pt.json index d98d5c6877..a20a2f6a23 100644 --- a/translations/frontend/pt.json +++ b/translations/frontend/pt.json @@ -1362,6 +1362,24 @@ "input_text": "Texto" } }, + "info": { + "built_using": "Construído com", + "custom_uis": "IUs personalizados:", + "developed_by": "Desenvolvido por um punhado de pessoas incríveis.", + "documentation": "Documentação", + "frontend": "", + "frontend_version": "Versão frontend: {version} - {type}", + "home_assistant_logo": "Logotipo do Home Assistant", + "icons_by": "Ícones por", + "integrations": "Integrações", + "issues": "Problemas", + "license": "Publicado sob a licença de Apache 2.0", + "path_configuration": "Caminho para configuration.yaml: {path}", + "server": "servidor", + "source": "Fonte:", + "system_health_error": "O componente System Health não está carregado. Adicione 'system_health:' ao configuration.yaml", + "title": "Informações" + }, "integrations": { "add_integration": "Adicionar integração", "caption": "Integrações", @@ -1433,6 +1451,17 @@ "rename_input_label": "Nome da entrada" }, "introduction": "Aqui é possível configurar os seus componentes e o Home Assistant. Nem tudo é possível de ser configurado a partir da Interface Gráfica, mas estamos a trabalhar para isso.", + "logs": { + "clear": "Limpar", + "details": "Detalhes do log ( {level} )", + "load_full_log": "Carregar log completo do Home Assistant", + "loading_log": "A carregar o log de erros...", + "multiple_messages": "mensagem ocorreu primeiro em {time} e repetiu-se {counter} vezes", + "no_errors": "Nenhum erro foi reportado.", + "no_issues": "Não há novos problemas!", + "refresh": "Atualizar", + "title": "Logs" + }, "lovelace": { "caption": "Painéis Lovelace", "dashboards": { @@ -1890,35 +1919,6 @@ "title": "Eventos", "type": "Tipo de Evento" }, - "info": { - "built_using": "Construído com", - "custom_uis": "IUs personalizados:", - "developed_by": "Desenvolvido por um punhado de pessoas incríveis.", - "documentation": "Documentação", - "frontend": "", - "frontend_version": "Versão frontend: {version} - {type}", - "home_assistant_logo": "Logotipo do Home Assistant", - "icons_by": "Ícones por", - "integrations": "Integrações", - "issues": "Problemas", - "license": "Publicado sob a licença de Apache 2.0", - "path_configuration": "Caminho para configuration.yaml: {path}", - "server": "servidor", - "source": "Fonte:", - "system_health_error": "O componente System Health não está carregado. Adicione 'system_health:' ao configuration.yaml", - "title": "Informações" - }, - "logs": { - "clear": "Limpar", - "details": "Detalhes do log ( {level} )", - "load_full_log": "Carregar log completo do Home Assistant", - "loading_log": "A carregar o log de erros...", - "multiple_messages": "mensagem ocorreu primeiro em {time} e repetiu-se {counter} vezes", - "no_errors": "Nenhum erro foi reportado.", - "no_issues": "Não há novos problemas!", - "refresh": "Atualizar", - "title": "Logs" - }, "mqtt": { "description_listen": "Ouvir um tópico", "description_publish": "Publicar um pacote", diff --git a/translations/frontend/ro.json b/translations/frontend/ro.json index c6a441a471..3b4d587a94 100644 --- a/translations/frontend/ro.json +++ b/translations/frontend/ro.json @@ -1171,6 +1171,19 @@ "input_text": "Text" } }, + "info": { + "built_using": "Construit folosind", + "documentation": "Documentație", + "frontend": "front-end-ui", + "home_assistant_logo": "Logo-ul Home Assistant", + "icons_by": "Icoane ca", + "integrations": "Integrări", + "issues": "Probleme", + "license": "Publicat sub licenta Apache 2.0", + "server": "Server", + "source": "Sursă:", + "title": "Info" + }, "integrations": { "add_integration": "Adăugați integrare", "caption": "Integrări", @@ -1233,6 +1246,15 @@ "rename_input_label": "Introdu nume" }, "introduction": "Aici este posibil să vă configurați componentele și Home Assistant. Nu este posibilă configurarea de la UI, dar lucrăm la asta.", + "logs": { + "clear": "Şterge", + "details": "Detalii jurnal ({level})", + "load_full_log": "Încărcare jurnal complet Home Assistant", + "loading_log": "Se încarcă jurnalul de erori...", + "no_errors": "Nu au fost raportate erori.", + "refresh": "Reîmprospătare", + "title": "Jurnale" + }, "lovelace": { "caption": "Panouri de bord Lovelace", "dashboards": { @@ -1665,28 +1687,6 @@ "title": "Evenimente", "type": "Tip eveniment" }, - "info": { - "built_using": "Construit folosind", - "documentation": "Documentație", - "frontend": "front-end-ui", - "home_assistant_logo": "Logo-ul Home Assistant", - "icons_by": "Icoane ca", - "integrations": "Integrări", - "issues": "Probleme", - "license": "Publicat sub licenta Apache 2.0", - "server": "Server", - "source": "Sursă:", - "title": "Info" - }, - "logs": { - "clear": "Şterge", - "details": "Detalii jurnal ({level})", - "load_full_log": "Încărcare jurnal complet Home Assistant", - "loading_log": "Se încarcă jurnalul de erori...", - "no_errors": "Nu au fost raportate erori.", - "refresh": "Reîmprospătare", - "title": "Jurnale" - }, "mqtt": { "description_listen": "Ascultă un subiect", "description_publish": "Publică un pachet", diff --git a/translations/frontend/ru.json b/translations/frontend/ru.json index 6cd32c6fe8..b46d4e2598 100644 --- a/translations/frontend/ru.json +++ b/translations/frontend/ru.json @@ -1367,6 +1367,24 @@ "input_text": "Текст" } }, + "info": { + "built_using": "Создано с использованием", + "custom_uis": "Кастомные интерфейсы:", + "developed_by": "Разработано множеством замечательных людей.", + "documentation": "Документация", + "frontend": "пользовательский интерфейс", + "frontend_version": "Версия интерфейса: {version} - {type}", + "home_assistant_logo": "Логотип Home Assistant", + "icons_by": "Значки от", + "integrations": "Интеграции", + "issues": "Вопросы", + "license": "Опубликовано под лицензией Apache 2.0", + "path_configuration": "Путь к configuration.yaml: {path}", + "server": "сервер", + "source": "Исходный код:", + "system_health_error": "Компонент System Health не загружен. Добавьте 'system_health:' в файл configuration.yaml.", + "title": "О системе" + }, "integrations": { "add_integration": "Добавить интеграцию", "caption": "Интеграции", @@ -1438,6 +1456,17 @@ "rename_input_label": "Название" }, "introduction": "Здесь можно настроить Home Assistant. Пока что не все настройки доступны из интерфейса, но мы работаем над этим.", + "logs": { + "clear": "Очистить", + "details": "Уровень: {level}", + "load_full_log": "Показать весь журнал", + "loading_log": "Загрузка журнала…", + "multiple_messages": "первое сообщение получено {time} и повторялось {counter} раз", + "no_errors": "Нет сообщений об ошибках.", + "no_issues": "Нет сообщений о проблемах.", + "refresh": "Обновить", + "title": "Лог" + }, "lovelace": { "caption": "Панели Lovelace", "dashboards": { @@ -1924,35 +1953,6 @@ "title": "События", "type": "Событие" }, - "info": { - "built_using": "Создано с использованием", - "custom_uis": "Кастомные интерфейсы:", - "developed_by": "Разработано множеством замечательных людей.", - "documentation": "Документация", - "frontend": "пользовательский интерфейс", - "frontend_version": "Версия интерфейса: {version} - {type}", - "home_assistant_logo": "Логотип Home Assistant", - "icons_by": "Значки от", - "integrations": "Интеграции", - "issues": "Вопросы", - "license": "Опубликовано под лицензией Apache 2.0", - "path_configuration": "Путь к configuration.yaml: {path}", - "server": "сервер", - "source": "Исходный код:", - "system_health_error": "Компонент System Health не загружен. Добавьте 'system_health:' в файл configuration.yaml.", - "title": "О системе" - }, - "logs": { - "clear": "Очистить", - "details": "Уровень: {level}", - "load_full_log": "Показать весь журнал", - "loading_log": "Загрузка журнала…", - "multiple_messages": "первое сообщение получено {time} и повторялось {counter} раз", - "no_errors": "Нет сообщений об ошибках.", - "no_issues": "Нет сообщений о проблемах.", - "refresh": "Обновить", - "title": "Лог" - }, "mqtt": { "description_listen": "Подписаться на топик", "description_publish": "Опубликовать данные", diff --git a/translations/frontend/sk.json b/translations/frontend/sk.json index c49cf64314..fda0343384 100644 --- a/translations/frontend/sk.json +++ b/translations/frontend/sk.json @@ -1284,6 +1284,21 @@ "input_text": "Text" } }, + "info": { + "built_using": "Postavené pomocou", + "custom_uis": "Vlastné používateľské rozhrania:", + "developed_by": "Vyvinuté partiou úžasných ľudí.", + "frontend": "frontend-ui", + "frontend_version": "Verzia frontendu: {version} - {type}", + "home_assistant_logo": "Home Assistant logo", + "icons_by": "Ikony od", + "license": "Publikované pod licenciou Apache 2.0", + "path_configuration": "Cesta k configuration.yaml: {path}", + "server": "server", + "source": "Zdroj:", + "system_health_error": "Súčasť System Health nie je načítaná. Pridajte 'system_health:' do súboru configuration.yaml", + "title": "Info" + }, "integrations": { "add_integration": "Pridať integráciu", "caption": "Integrácie", @@ -1345,6 +1360,17 @@ "note_about_website_reference": "Viac informácií je k dispozícii na" }, "introduction": "Tu je možné konfigurovať vaše komponenty a Home Assistant. Aktuálne sa z používateľského rozhrania nedá konfigurovať všetko, ale pracujeme na tom.", + "logs": { + "clear": "Vyčistiť", + "details": "Podrobnosti denníka ( {level} )", + "load_full_log": "Načítať celý denník denníka asistenta", + "loading_log": "Načítava sa denník chýb...", + "multiple_messages": "správa sa prvýkrát vyskytla o {time} a opakuje sa {counter} krát", + "no_errors": "Neboli hlásené žiadne chyby.", + "no_issues": "Žiadne nové chyby!", + "refresh": "Obnoviť", + "title": "Logy" + }, "lovelace": { "caption": "Lovelace dashboardy", "dashboards": { @@ -1765,32 +1791,6 @@ "title": "Udalosti", "type": "Typ udalosti" }, - "info": { - "built_using": "Postavené pomocou", - "custom_uis": "Vlastné používateľské rozhrania:", - "developed_by": "Vyvinuté partiou úžasných ľudí.", - "frontend": "frontend-ui", - "frontend_version": "Verzia frontendu: {version} - {type}", - "home_assistant_logo": "Home Assistant logo", - "icons_by": "Ikony od", - "license": "Publikované pod licenciou Apache 2.0", - "path_configuration": "Cesta k configuration.yaml: {path}", - "server": "server", - "source": "Zdroj:", - "system_health_error": "Súčasť System Health nie je načítaná. Pridajte 'system_health:' do súboru configuration.yaml", - "title": "Info" - }, - "logs": { - "clear": "Vyčistiť", - "details": "Podrobnosti denníka ( {level} )", - "load_full_log": "Načítať celý denník denníka asistenta", - "loading_log": "Načítava sa denník chýb...", - "multiple_messages": "správa sa prvýkrát vyskytla o {time} a opakuje sa {counter} krát", - "no_errors": "Neboli hlásené žiadne chyby.", - "no_issues": "Žiadne nové chyby!", - "refresh": "Obnoviť", - "title": "Logy" - }, "mqtt": { "description_listen": "Počúvať tému", "description_publish": "Publikovať paket", diff --git a/translations/frontend/sl.json b/translations/frontend/sl.json index 2f0c4dcbd2..41ffdf8afa 100644 --- a/translations/frontend/sl.json +++ b/translations/frontend/sl.json @@ -1367,6 +1367,24 @@ "input_text": "Besedilo" } }, + "info": { + "built_using": "Zgrajen z uporabo", + "custom_uis": "Uporabniški vmesniki po meri:", + "developed_by": "Razvija ga kup osupljivih ljudi.", + "documentation": "Dokumentacija", + "frontend": "frontend-ui", + "frontend_version": "Frontend različica: {version} - {type}", + "home_assistant_logo": "Home Assistant logotip", + "icons_by": "Ikone ustvarili z", + "integrations": "Integracije", + "issues": "Težave", + "license": "Objavljeno pod licenco Apache 2.0", + "path_configuration": "Pot do configuration.yaml: {path}", + "server": "strežnik", + "source": "Vir:", + "system_health_error": "Komponenta \"system health\" ni naložena. Dodajte \"system_health:\" v svoj configuration.yaml", + "title": "Info" + }, "integrations": { "add_integration": "Dodaj integracijo", "caption": "Integracije", @@ -1438,6 +1456,17 @@ "rename_input_label": "Ime vnosa" }, "introduction": "Tukaj je mogoče konfigurirati vaše komponente in Home Assistanta. Vsega ni mogoče konfigurirati iz uporabniškega vmesnika (vendar delamo na tem).", + "logs": { + "clear": "Počisti", + "details": "Podrobnosti dnevnika ({level})", + "load_full_log": "Naloži celoten dnevnik Home Assistant-a", + "loading_log": "Nalaganje dnevnika napak ...", + "multiple_messages": "sporočilo se je prvič pojavilo ob {time} in se prikaže {counter} krat", + "no_errors": "Ni prijavljenih napak.", + "no_issues": "Ni novih težav!", + "refresh": "Osveži", + "title": "Dnevniki" + }, "lovelace": { "caption": "Nadzorne plošče Lovelace", "dashboards": { @@ -1924,35 +1953,6 @@ "title": "Dogodki", "type": "Vrsta dogodka" }, - "info": { - "built_using": "Zgrajen z uporabo", - "custom_uis": "Uporabniški vmesniki po meri:", - "developed_by": "Razvija ga kup osupljivih ljudi.", - "documentation": "Dokumentacija", - "frontend": "frontend-ui", - "frontend_version": "Frontend različica: {version} - {type}", - "home_assistant_logo": "Home Assistant logotip", - "icons_by": "Ikone ustvarili z", - "integrations": "Integracije", - "issues": "Težave", - "license": "Objavljeno pod licenco Apache 2.0", - "path_configuration": "Pot do configuration.yaml: {path}", - "server": "strežnik", - "source": "Vir:", - "system_health_error": "Komponenta \"system health\" ni naložena. Dodajte \"system_health:\" v svoj configuration.yaml", - "title": "Info" - }, - "logs": { - "clear": "Počisti", - "details": "Podrobnosti dnevnika ({level})", - "load_full_log": "Naloži celoten dnevnik Home Assistant-a", - "loading_log": "Nalaganje dnevnika napak ...", - "multiple_messages": "sporočilo se je prvič pojavilo ob {time} in se prikaže {counter} krat", - "no_errors": "Ni prijavljenih napak.", - "no_issues": "Ni novih težav!", - "refresh": "Osveži", - "title": "Dnevniki" - }, "mqtt": { "description_listen": "Poslušajte temi", "description_publish": "Objavi paket", diff --git a/translations/frontend/sv.json b/translations/frontend/sv.json index 350219cd6c..48852dd9d5 100644 --- a/translations/frontend/sv.json +++ b/translations/frontend/sv.json @@ -331,8 +331,8 @@ "ui": { "auth_store": { "ask": "Vill du fortsätta vara inloggad?", - "confirm": "Spara inloggning", - "decline": "Nej tack" + "confirm": "Ja", + "decline": "Nej" }, "card": { "alarm_control_panel": { @@ -478,9 +478,12 @@ "cancel": "Avbryt", "close": "Stäng", "delete": "Radera", + "error_required": "Krävs", "loading": "Läser in", + "menu": "Meny", "next": "Nästa", "no": "Nej", + "overflow_menu": "Överflödesmeny", "previous": "Föregående", "refresh": "Uppdatera", "save": "Spara", @@ -910,6 +913,8 @@ "introduction": "Använd automatiseringar för väcka liv i ditt hem", "load_error_not_editable": "Endast automatiseringar i automations.yaml kan redigeras.", "load_error_unknown": "Fel vid inläsning av automatisering ({err_no}).", + "move_down": "Flytta nedåt", + "move_up": "Flytta uppåt", "save": "Spara", "triggers": { "add": "Lägg till händelse", @@ -1221,6 +1226,7 @@ "different_include": "Möjligen via en domain, en glob eller en annan include.", "pick_attribute": "Välj ett attribut att anpassa", "picker": { + "entity": "Entitet", "header": "Anpassningar", "introduction": "Justera attribut per enhet. Tillagda och redigerade anpassningar kommer att tillträda omedelbart. Borttagna anpassningar kommer att träda i kraft när enheten är uppdaterad." }, @@ -1266,6 +1272,7 @@ "device_not_found": "Enheten hittades inte.", "entities": { "add_entities_lovelace": "Lägg till i Lovelace", + "disabled_entities": "+{count} {count, plural,\n one {avaktiverad entitet}\n other {avaktiverade entiteter}\n}", "entities": "Entiteter", "hide_disabled": "Dölj inaktiverad", "none": "Den här enheten har inga entiteter" @@ -1321,7 +1328,7 @@ "button": "Ta bort valda", "confirm_partly_text": "Du kan bara ta bort {removable} av de valda {selected} enheterna. Enheter kan endast tas bort när integrationen inte längre tillhandahåller enheterna. Ibland måste du starta om Home Assistant innan du kan ta bort enheterna för en borttagen integration. Är du säker på att du vill ta bort de flyttbara enheterna?", "confirm_partly_title": "Endast {number} valda entiteter kan tas bort.", - "confirm_text": "Entiteter kan endast tas bort när integrationen inte längre tillhandahåller entiteterna.", + "confirm_text": "Du bör ta bort dem från din Lovelace-konfiguration och automatisering om de innehåller dessa entiteter.", "confirm_title": "Vill du ta bort {number} entiteter?" }, "selected": "{number} valda", @@ -1364,6 +1371,24 @@ "input_text": "Text" } }, + "info": { + "built_using": "Byggt med", + "custom_uis": "Anpassade användargränssnitt:", + "developed_by": "Utvecklad av ett gäng grymma människor.", + "documentation": "Dokumentation", + "frontend": "frontend-UI", + "frontend_version": "Frontend-version: {version} - {type}", + "home_assistant_logo": "Home Assistant logotyp", + "icons_by": "Ikoner av", + "integrations": "Integrationer", + "issues": "Problem", + "license": "Publicerad under Apache 2.0-licensen", + "path_configuration": "Sökväg till configuration.yaml: {path}", + "server": "server", + "source": "Källkod:", + "system_health_error": "Systemhälsokomponenten har inte lästs in. Lägg till 'system_health:' i configuration.yaml", + "title": "Info" + }, "integrations": { "add_integration": "Lägg till integration", "caption": "Integrationer", @@ -1373,6 +1398,8 @@ "delete_button": "Ta bort {integration}", "delete_confirm": "Är du säker på att du vill radera denna integration?", "device_unavailable": "enhet otillgänglig", + "devices": "{count} {count, plural,\n one {enhet}\n other {enheter}\n}", + "entities": "{count} {count, plural,\n one {entitet}\n other {entiteter}\n}", "entity_unavailable": "entitet otillgänglig", "firmware": "Firmware: {version}", "hub": "Ansluten via", @@ -1433,6 +1460,17 @@ "rename_input_label": "Ange namn" }, "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": { + "clear": "Rensa", + "details": "Logginformation ({level})", + "load_full_log": "Ladda hela Home Assistant-loggen", + "loading_log": "Läser in fellogg ...", + "multiple_messages": "Meddelandet inträffade först {time} och har hänt {counter} gånger", + "no_errors": "Inga fel har rapporterats.", + "no_issues": "Det finns inga nya problem!", + "refresh": "Uppdatera", + "title": "Loggar" + }, "lovelace": { "caption": "Lovelace kontrollpaneler", "dashboards": { @@ -1450,13 +1488,13 @@ "delete": "Ta bort", "dismiss": "Stäng", "edit_dashboard": "Redigera instrumentpanel", - "icon": "Ikon för sidofältet", + "icon": "Ikon", "new_dashboard": "Lägg till instrumentpanel", "remove_default": "Ta bort som standard på den här enheten", "require_admin": "Endast admin", "set_default": "Ange som standard på den här enheten", "show_sidebar": "Visa i sidofältet", - "title": "Sidofältets titel", + "title": "Titel", "title_required": "Titel krävs.", "update": "Uppdatera", "url": "URL", @@ -1676,7 +1714,8 @@ "name": "Namn", "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." }, "zha": { "add_device_page": { @@ -1829,7 +1868,7 @@ "network_stopped": "Z-Wave-nätverk stoppat" }, "node_config": { - "config_parameter": "Konfigurera parameter", + "config_parameter": "Konfigurationsparameter", "config_value": "Konfigurera värde", "false": "Falskt", "header": "Alternativ för nodkonfiguration", @@ -1845,6 +1884,7 @@ "exclude_entity": "Uteslut den här enheten från Home Assistant", "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:", "node_group_associations": "Nodgruppsassociationer", "node_protection": "Nodskydd", @@ -1917,35 +1957,6 @@ "title": "Händelser", "type": "Händelsetyp" }, - "info": { - "built_using": "Byggt med", - "custom_uis": "Anpassade användargränssnitt:", - "developed_by": "Utvecklad av ett gäng grymma människor.", - "documentation": "Dokumentation", - "frontend": "frontend-UI", - "frontend_version": "Frontend-version: {version} - {type}", - "home_assistant_logo": "Home Assistant logotyp", - "icons_by": "Ikoner av", - "integrations": "Integrationer", - "issues": "Problem", - "license": "Publicerad under Apache 2.0-licensen", - "path_configuration": "Sökväg till configuration.yaml: {path}", - "server": "server", - "source": "Källkod:", - "system_health_error": "Systemhälsokomponenten har inte lästs in. Lägg till 'system_health:' i configuration.yaml", - "title": "Info" - }, - "logs": { - "clear": "Rensa", - "details": "Logginformation ({level})", - "load_full_log": "Ladda hela Home Assistant-loggen", - "loading_log": "Läser in fellogg ...", - "multiple_messages": "Meddelandet inträffade först {time} och har hänt {counter} gånger", - "no_errors": "Inga fel har rapporterats.", - "no_issues": "Det finns inga nya problem!", - "refresh": "Uppdatera", - "title": "Loggar" - }, "mqtt": { "description_listen": "Lyssna på ett ämne", "description_publish": "Publicera ett paket", @@ -2044,7 +2055,7 @@ "clear_items": "Rensa markerade objekt" }, "starting": { - "description": "Home Assistant startar, var god vänta", + "description": "Home Assistant startar, var god vänta...", "header": "Home Assistant startar..." } }, @@ -2116,6 +2127,7 @@ "icon_height": "Ikonhöjd", "image": "Bildsökväg", "manual": "Manuell", + "manual_description": "Behöver du lägga till ett anpassat kort eller vill du bara skriva yaml manuellt?", "maximum": "", "minimum": "", "name": "Namn", @@ -2134,6 +2146,7 @@ }, "glance": { "columns": "Kolumner", + "description": "Glance-kortet är användbart för att gruppera flera sensorer i en kompakt översikt.", "name": "Blick" }, "history-graph": { @@ -2141,6 +2154,7 @@ "name": "Historikdiagram" }, "horizontal-stack": { + "description": "Med Horizontal Stack-kortet kan du stapla ihop flera kort, så att de alltid sitter bredvid varandra i utrymmet av en kolumn.", "name": "Vågrät trave" }, "iframe": { @@ -2190,11 +2204,13 @@ "name": "Växtstatus" }, "sensor": { + "description": "Sensorkortet ger dig en snabb överblick över dina sensortillstånd med en valfri graf för att visualisera förändring över tid.", "graph_detail": "Detalj på kurva", "graph_type": "Typ av kurva", "name": "Sensor" }, "shopping-list": { + "description": "Shopping List-kortet gör att du kan lägga till, redigera, checka av och rensa objekt från din inköpslista.", "integration_not_loaded": "Detta kort kräver att \"shopping_list\" -integrationen konfigureras.", "name": "Inköpslista" }, @@ -2258,7 +2274,7 @@ "migrate": { "header": "Ogiltig konfiguration", "migrate": "Migrera konfiguration", - "para_migrate": "Home Assistant kan automatiskt lägga till ID till alla dina kort och vyer genom att du klickar på \"Migrera konfiguration\".", + "para_migrate": "Home Assistant kan automatiskt lägga till ID:n till alla dina kort och vyer genom att du klickar på \"Migrera konfiguration\".", "para_no_id": "Det här elementet har inget ID. Lägg till ett ID till det här elementet i \"ui-lovelace.yaml\"." }, "raw_editor": { @@ -2281,7 +2297,7 @@ "close": "Stäng", "empty_config": "Börja med en tom instrumentpanel", "header": "Ta kontroll över Lovelace UI", - "para": "Home Assistant kommer som standard att behålla ditt användargränssnitt, uppdatera det när nya enheter eller Lovelace-komponenter blir tillgängliga. Om du tar kontroll kommer vi inte längre göra ändringar automatiskt för dig.", + "para": "Denna skärm underhålls för närvarande av Home Assistant. Den uppdateras automatiskt när nya enheter eller Lovelace UI-komponenter blir tillgängliga. Om du tar kontrollen kommer denna instrumentpanel inte längre att uppdateras automatiskt. Du kan alltid skapa en ny instrumentpanel i konfigurationen att leka runt med.", "para_sure": "Är du säker på att du vill ta kontroll över ditt användargränssnitt?", "save": "Ta kontroll", "yaml_config": "För att hjälpa dig igång, så är här nuvarande inställning för denna instrumentpanel:", diff --git a/translations/frontend/th.json b/translations/frontend/th.json index fd22cd7a38..c57d84c9a8 100644 --- a/translations/frontend/th.json +++ b/translations/frontend/th.json @@ -805,6 +805,9 @@ } }, "header": "การตั้งค่า Home Assistant", + "info": { + "title": "ข้อมูล" + }, "integrations": { "caption": "การทำงานร่วมกัน", "config_entry": { @@ -930,9 +933,6 @@ "events": { "title": "เหตุการณ์" }, - "info": { - "title": "ข้อมูล" - }, "mqtt": { "title": "MQTT" }, diff --git a/translations/frontend/tr.json b/translations/frontend/tr.json index 9888486d09..52253fd07a 100644 --- a/translations/frontend/tr.json +++ b/translations/frontend/tr.json @@ -1311,6 +1311,24 @@ "input_text": "Metin" } }, + "info": { + "built_using": "Kullanılan oluşturma", + "custom_uis": "Özel kullanıcı arayüzleri:", + "developed_by": "Bir sürü harika insan tarafından geliştirildi.", + "documentation": "Belgeleri", + "frontend": "ön uç-ui", + "frontend_version": "Ön uç versiyonu: {version} - {type}", + "home_assistant_logo": "Home Assistant Logosu", + "icons_by": "Simgelerin orijni", + "integrations": "Entegrasyonlar", + "issues": "Sorunlar", + "license": "Apache 2.0 lisansı altında yayınlandı", + "path_configuration": "configuration.yaml lokasyonu: {path}", + "server": "sunucu", + "source": "Kaynak:", + "system_health_error": "Sistem Sağlığı bileşeni yüklü değil. configuration.yaml içine 'system_health:' ekleyin", + "title": "Bilgi" + }, "integrations": { "caption": "Entegrasyonlar", "config_entry": { @@ -1373,6 +1391,17 @@ "rename_input_label": "Varlık adı" }, "introduction": "Buradan bileşenlerinizi ve Home Assistant'ınızı yapılandırabilirsiniz. Herşeyi kullanıcı arayüzü ile ayarlamak henüz mümkün değil fakat üzerinde çalışıyoruz", + "logs": { + "clear": "Temizle", + "details": "Günlük Ayrıntıları ( {level} )", + "load_full_log": "Tam Home Assistant Günlüğünü Yükle", + "loading_log": "Hata günlüğü yükleniyor ...", + "multiple_messages": "ileti ilk önce {time} meydana geldi ve {counter} kez gösterildi", + "no_errors": "Herhangi bir hata rapor edilmiştir.", + "no_issues": "Yeni bir sorun yok!", + "refresh": "Yenile", + "title": "Günlük" + }, "lovelace": { "caption": "Lovelace Kontrol Panelleri", "dashboards": { @@ -1783,35 +1812,6 @@ "title": "Olaylar", "type": "Olay Türü" }, - "info": { - "built_using": "Kullanılan oluşturma", - "custom_uis": "Özel kullanıcı arayüzleri:", - "developed_by": "Bir sürü harika insan tarafından geliştirildi.", - "documentation": "Belgeleri", - "frontend": "ön uç-ui", - "frontend_version": "Ön uç versiyonu: {version} - {type}", - "home_assistant_logo": "Home Assistant Logosu", - "icons_by": "Simgelerin orijni", - "integrations": "Entegrasyonlar", - "issues": "Sorunlar", - "license": "Apache 2.0 lisansı altında yayınlandı", - "path_configuration": "configuration.yaml lokasyonu: {path}", - "server": "sunucu", - "source": "Kaynak:", - "system_health_error": "Sistem Sağlığı bileşeni yüklü değil. configuration.yaml içine 'system_health:' ekleyin", - "title": "Bilgi" - }, - "logs": { - "clear": "Temizle", - "details": "Günlük Ayrıntıları ( {level} )", - "load_full_log": "Tam Home Assistant Günlüğünü Yükle", - "loading_log": "Hata günlüğü yükleniyor ...", - "multiple_messages": "ileti ilk önce {time} meydana geldi ve {counter} kez gösterildi", - "no_errors": "Herhangi bir hata rapor edilmiştir.", - "no_issues": "Yeni bir sorun yok!", - "refresh": "Yenile", - "title": "Günlük" - }, "mqtt": { "description_listen": "Bir konuyu dinle", "description_publish": "Bir paket yayınla", diff --git a/translations/frontend/uk.json b/translations/frontend/uk.json index 2ad9613c8a..3824cf6a60 100644 --- a/translations/frontend/uk.json +++ b/translations/frontend/uk.json @@ -1227,6 +1227,21 @@ "input_datetime": "Дата та/або час" } }, + "info": { + "built_using": "Побудований за допомогою", + "custom_uis": "Спеціальні інтерфейси користувача:", + "developed_by": "Розроблена купою дивовижних людей.", + "frontend": "інтерфейс користувача", + "frontend_version": "Версія Frontend: {version} - {type}", + "home_assistant_logo": "Логотип Home Assistant", + "icons_by": "Ікони від", + "license": "Опубліковано під ліцензією Apache 2.0", + "path_configuration": "Шлях до config.yaml: {path}", + "server": "сервер", + "source": "Джерело:", + "system_health_error": "Компонент системи здоров'я не завантажено. Додайте 'system_health:' у configuration.yaml", + "title": "Інформація" + }, "integrations": { "add_integration": "Додати інтеграцію", "caption": "Інтеграція", @@ -1293,6 +1308,17 @@ "rename_input_label": "Ім'я запису" }, "introduction": "Тут можна налаштувати свої компоненти та Home Assistant. Не все можна налаштувати з інтерфейсу користувача, але ми працюємо над цим.", + "logs": { + "clear": "Очистити", + "details": "Деталі журналу ({level})", + "load_full_log": "Завантажте повний журнал Home Assistant", + "loading_log": "Завантаження журналу помилок...", + "multiple_messages": "повідомлення вперше виникло в {time} і показується {counter} раз", + "no_errors": "Про помилки не повідомлялося.", + "no_issues": "Нових проблем немає!", + "refresh": "Оновити", + "title": "Лог" + }, "lovelace": { "dashboards": { "conf_mode": { @@ -1665,32 +1691,6 @@ "title": "Події", "type": "Тип події" }, - "info": { - "built_using": "Побудований за допомогою", - "custom_uis": "Спеціальні інтерфейси користувача:", - "developed_by": "Розроблена купою дивовижних людей.", - "frontend": "інтерфейс користувача", - "frontend_version": "Версія Frontend: {version} - {type}", - "home_assistant_logo": "Логотип Home Assistant", - "icons_by": "Ікони від", - "license": "Опубліковано під ліцензією Apache 2.0", - "path_configuration": "Шлях до config.yaml: {path}", - "server": "сервер", - "source": "Джерело:", - "system_health_error": "Компонент системи здоров'я не завантажено. Додайте 'system_health:' у configuration.yaml", - "title": "Інформація" - }, - "logs": { - "clear": "Очистити", - "details": "Деталі журналу ({level})", - "load_full_log": "Завантажте повний журнал Home Assistant", - "loading_log": "Завантаження журналу помилок...", - "multiple_messages": "повідомлення вперше виникло в {time} і показується {counter} раз", - "no_errors": "Про помилки не повідомлялося.", - "no_issues": "Нових проблем немає!", - "refresh": "Оновити", - "title": "Лог" - }, "mqtt": { "description_listen": "Слухати тему", "description_publish": "Опублікувати пакет", diff --git a/translations/frontend/ur.json b/translations/frontend/ur.json index cea97d5ac7..c130104798 100644 --- a/translations/frontend/ur.json +++ b/translations/frontend/ur.json @@ -46,6 +46,9 @@ "caption": "آلات", "description": "منسلک آلات کا نظم کریں۔" }, + "logs": { + "title": "نوشتہ جات" + }, "server_control": { "caption": "سرور کنٹرول۔", "section": { @@ -60,13 +63,6 @@ "seconds": "سیکنڈ" } } - }, - "developer-tools": { - "tabs": { - "logs": { - "title": "نوشتہ جات" - } - } } } } diff --git a/translations/frontend/vi.json b/translations/frontend/vi.json index 74853d9d8c..ff935e05f7 100644 --- a/translations/frontend/vi.json +++ b/translations/frontend/vi.json @@ -835,6 +835,9 @@ } }, "header": "Cấu hình Home Assistant", + "info": { + "title": "Thông tin" + }, "integrations": { "caption": "Các bộ tích hợp", "config_entry": { @@ -1020,9 +1023,6 @@ "events": { "title": "Sự kiện" }, - "info": { - "title": "Thông tin" - }, "mqtt": { "title": "MQTT" }, diff --git a/translations/frontend/zh-Hans.json b/translations/frontend/zh-Hans.json index 61fcdf58b7..9ee8957d15 100644 --- a/translations/frontend/zh-Hans.json +++ b/translations/frontend/zh-Hans.json @@ -1367,6 +1367,24 @@ "input_text": "文本" } }, + "info": { + "built_using": "建于", + "custom_uis": "自定义用户界面:", + "developed_by": "由一帮很 Awesome~~~ 的人开发。", + "documentation": "文档", + "frontend": "前端用户界面", + "frontend_version": "前端版本: {version} - {type}", + "home_assistant_logo": "Home Assistant logo", + "icons_by": "图标来自", + "integrations": "集成", + "issues": "问题", + "license": "根据 Apache 2.0 许可发布", + "path_configuration": "configuration.yaml 路径:{path}", + "server": "服务器", + "source": "源:", + "system_health_error": "未加载系统健康组件。请将 'system_health:' 添加到 configuration.yaml", + "title": "信息" + }, "integrations": { "add_integration": "添加集成", "caption": "集成", @@ -1438,6 +1456,17 @@ "rename_input_label": "条目名称" }, "introduction": "您可以在此配置 Home Assistant 及组件。目前并非所有配置都能通过前端 UI 完成,但是我们在努力实现中。", + "logs": { + "clear": "清除", + "details": "日志详细信息( {level} )", + "load_full_log": "加载完整 Home Assistant 日志", + "loading_log": "正在加载错误日志...", + "multiple_messages": "消息首次出现在 {time},显示了 {counter} 次", + "no_errors": "未报告任何错误。", + "no_issues": "没有新问题!", + "refresh": "刷新", + "title": "日志" + }, "lovelace": { "caption": "Lovelace 仪表盘", "dashboards": { @@ -1924,35 +1953,6 @@ "title": "事件", "type": "事件类型" }, - "info": { - "built_using": "建于", - "custom_uis": "自定义用户界面:", - "developed_by": "由一帮很 Awesome~~~ 的人开发。", - "documentation": "文档", - "frontend": "前端用户界面", - "frontend_version": "前端版本: {version} - {type}", - "home_assistant_logo": "Home Assistant logo", - "icons_by": "图标来自", - "integrations": "集成", - "issues": "问题", - "license": "根据 Apache 2.0 许可发布", - "path_configuration": "configuration.yaml 路径:{path}", - "server": "服务器", - "source": "源:", - "system_health_error": "未加载系统健康组件。请将 'system_health:' 添加到 configuration.yaml", - "title": "信息" - }, - "logs": { - "clear": "清除", - "details": "日志详细信息( {level} )", - "load_full_log": "加载完整 Home Assistant 日志", - "loading_log": "正在加载错误日志...", - "multiple_messages": "消息首次出现在 {time},显示了 {counter} 次", - "no_errors": "未报告任何错误。", - "no_issues": "没有新问题!", - "refresh": "刷新", - "title": "日志" - }, "mqtt": { "description_listen": "监听一个主题(Topic)", "description_publish": "发送一个数据包", diff --git a/translations/frontend/zh-Hant.json b/translations/frontend/zh-Hant.json index b636c4daa9..f4e215974e 100644 --- a/translations/frontend/zh-Hant.json +++ b/translations/frontend/zh-Hant.json @@ -480,8 +480,10 @@ "delete": "刪除", "error_required": "必填", "loading": "讀取中", + "menu": "選單", "next": "下一步", "no": "否", + "overflow_menu": "捲動選單", "previous": "上一步", "refresh": "更新", "save": "儲存", @@ -911,6 +913,8 @@ "introduction": "使用自動化來讓你的智能家居更有魅力吧。", "load_error_not_editable": "僅有 automations.yaml 內的自動化方能編輯。", "load_error_unknown": "載入自動化錯誤({err_no})。", + "move_down": "向下移動", + "move_up": "向上移動", "save": "儲存", "triggers": { "add": "新增一個觸發", @@ -1367,6 +1371,24 @@ "input_text": "文字" } }, + "info": { + "built_using": "建置使用", + "custom_uis": "自定介面:", + "developed_by": "由一群充滿熱情的人們所開發。", + "documentation": "相關文件", + "frontend": "frontend-ui", + "frontend_version": "Frontend 版本:{version} - {type}", + "home_assistant_logo": "Home Assistant logo", + "icons_by": "圖示使用", + "integrations": "整合", + "issues": "問題", + "license": "依據 Apache 2.0 授權許可發行", + "path_configuration": "configuration.yaml 路徑:{path}", + "server": "伺服器", + "source": "來源:", + "system_health_error": "系統健康元件未載入。請於 configuration.yaml 內加入「system_health:」", + "title": "資訊" + }, "integrations": { "add_integration": "新增整合", "caption": "整合", @@ -1438,6 +1460,17 @@ "rename_input_label": "物件名稱" }, "introduction": "此處為 Home Assistant 和元件相關配置區,目前尚未支援透過 UI 進行所有設定,我們正在努力改進中。", + "logs": { + "clear": "清除", + "details": "記錄詳細資料({level})", + "load_full_log": "載入完整 Home Assistant 記錄", + "loading_log": "載入錯誤記錄中...", + "multiple_messages": "訊息首次出現於 {time}、共顯示 {counter} 次", + "no_errors": "未回報任何錯誤。", + "no_issues": "沒有新問題!", + "refresh": "更新", + "title": "記錄" + }, "lovelace": { "caption": "Lovelace 主面板", "dashboards": { @@ -1924,35 +1957,6 @@ "title": "事件", "type": "事件類別" }, - "info": { - "built_using": "建置使用", - "custom_uis": "自定介面:", - "developed_by": "由一群充滿熱情的人們所開發。", - "documentation": "相關文件", - "frontend": "frontend-ui", - "frontend_version": "Frontend 版本:{version} - {type}", - "home_assistant_logo": "Home Assistant logo", - "icons_by": "圖示使用", - "integrations": "整合", - "issues": "問題", - "license": "依據 Apache 2.0 授權許可發行", - "path_configuration": "configuration.yaml 路徑:{path}", - "server": "伺服器", - "source": "來源:", - "system_health_error": "系統健康元件未載入。請於 configuration.yaml 內加入「system_health:」", - "title": "資訊" - }, - "logs": { - "clear": "清除", - "details": "記錄詳細資料({level})", - "load_full_log": "載入完整 Home Assistant 記錄", - "loading_log": "載入錯誤記錄中...", - "multiple_messages": "訊息首次出現於 {time}、共顯示 {counter} 次", - "no_errors": "未回報任何錯誤。", - "no_issues": "沒有新問題!", - "refresh": "更新", - "title": "記錄" - }, "mqtt": { "description_listen": "監聽主題", "description_publish": "發佈封包", From ccc9b73f9bcefa743d6805ad3a688a4ffef6d61d Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Fri, 12 Jun 2020 00:32:44 +0000 Subject: [PATCH 30/39] [ci skip] Translation update --- translations/frontend/ca.json | 10 ++++++++++ translations/frontend/de.json | 15 ++++++++++++--- translations/frontend/es.json | 11 ++++++++++- translations/frontend/fr.json | 9 +++++++++ translations/frontend/it.json | 9 +++++++++ translations/frontend/ko.json | 13 +++++++++++++ translations/frontend/nb.json | 9 +++++++++ translations/frontend/pt.json | 4 ++++ translations/frontend/ru.json | 13 +++++++++++++ translations/frontend/zh-Hans.json | 13 +++++++++++++ translations/frontend/zh-Hant.json | 9 +++++++++ 11 files changed, 111 insertions(+), 4 deletions(-) diff --git a/translations/frontend/ca.json b/translations/frontend/ca.json index 523a19397a..e9639977d4 100644 --- a/translations/frontend/ca.json +++ b/translations/frontend/ca.json @@ -483,6 +483,7 @@ "menu": "Menú", "next": "Següent", "no": "No", + "overflow_menu": "Menú de desbordament", "previous": "Anterior", "refresh": "Actualitza", "save": "Desa", @@ -1372,7 +1373,9 @@ }, "info": { "built_using": "Creat utilitzant", + "caption": "Informació", "custom_uis": "Interfícies d'usuari personalitzades:", + "description": "Informació sobre la instal·lació de Home Assistant", "developed_by": "Desenvolupat per un munt de gent fantàstica.", "documentation": "Documentació", "frontend": "frontend-ui", @@ -1460,7 +1463,9 @@ }, "introduction": "Aquí pots configurar Home Assistant i els seus components. Encara no és possible configurar-ho tot des de la interfície d'usuari, però hi estem treballant.", "logs": { + "caption": "Registres", "clear": "Esborra", + "description": "Consulta els registres de Home Assistant", "details": "Detalls del registre ({level})", "load_full_log": "Carrega el registre complet de Home Assistant", "loading_log": "Carregant el registre d'errors...", @@ -1655,6 +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", "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", diff --git a/translations/frontend/de.json b/translations/frontend/de.json index 728b02c355..d3888be2aa 100644 --- a/translations/frontend/de.json +++ b/translations/frontend/de.json @@ -480,6 +480,7 @@ "delete": "Löschen", "error_required": "Benötigt", "loading": "Laden", + "menu": "Menü", "next": "Weiter", "no": "Nein", "previous": "Vorher", @@ -741,8 +742,8 @@ "notification_toast": { "connection_lost": "Verbindung getrennt. Verbinde erneut...", "service_call_failed": "Fehler beim Aufrufen des Service {service}.", - "started": "Home Assistant ist gestartet!", - "starting": "Home Assistant startet, es wird nicht alles verfügbar sein, bis es fertig ist.", + "started": "Home Assistant wurde vollständig gestartet!", + "starting": "Home Assistant startet, währenddessen kann es sein das nicht alles verfügbar ist.", "triggered": "{name} ausgelöst" }, "panel": { @@ -911,6 +912,8 @@ "introduction": "Benutze Automatisierungen, um deinem Zuhause Leben einzuhauchen", "load_error_not_editable": "Nur Automatisierungen in automations.yaml sind editierbar.", "load_error_unknown": "Fehler beim Laden der Automatisierung ({err_no}).", + "move_down": "Runterschieben", + "move_up": "Hochschieben", "save": "Speichern", "triggers": { "add": "Auslöser hinzufügen", @@ -1268,6 +1271,7 @@ "device_not_found": "Gerät nicht gefunden.", "entities": { "add_entities_lovelace": "Zu Lovelace hinzufügen", + "disabled_entities": "+{count} {count, plural,\n one {deaktivierte Entität}\n other {deaktivierte Entitäten}\n}", "entities": "Entitäten", "hide_disabled": "Ausblenden deaktiviert", "none": "Dieses Gerät hat keine Entitäten" @@ -1368,7 +1372,9 @@ }, "info": { "built_using": "Gebaut mit", + "caption": "Info", "custom_uis": "Benutzerdefinierte UIs:", + "description": "Informationen über deine Home Assistant Installation", "developed_by": "Entwickelt von einem Haufen toller Leute.", "documentation": "Dokumentation", "frontend": "Frontend-UI", @@ -1456,7 +1462,9 @@ }, "introduction": "Hier ist es möglich, deine Komponenten und Home Assistant zu konfigurieren. Noch ist nicht alles über die GUI einstellbar, aber wir arbeiten daran.", "logs": { + "caption": "Logs", "clear": "Leeren", + "description": "Die Home Assistant Logs anschauen", "details": "Protokolldetails ( {level} )", "load_full_log": "Vollständiges Home Assistant-Protokoll laden", "loading_log": "Fehlerprotokoll wird geladen...", @@ -1709,7 +1717,8 @@ "name": "Name", "system": "System" } - } + }, + "users_privileges_note": "Benutzergruppen sind derzeit noch nicht fertig entwickelt. Der Benutzer wird nicht in der Lage sein Änderungen an der Instanz über das UI vorzunehmen. Derzeit überprüfen wir noch alle API Endpunkte um sicherzustellen dass diese nur von Administratoren genutzt werden können." }, "zha": { "add_device_page": { diff --git a/translations/frontend/es.json b/translations/frontend/es.json index 2217c2818b..17e21f29e6 100644 --- a/translations/frontend/es.json +++ b/translations/frontend/es.json @@ -511,7 +511,7 @@ "device": "Dispositivo", "no_area": "Ningún área", "show_devices": "Mostrar dispositivos", - "toggle": "Alternar" + "toggle": "Interruptor" }, "entity": { "entity-picker": { @@ -1373,7 +1373,9 @@ }, "info": { "built_using": "Construido usando", + "caption": "Información", "custom_uis": "IU personalizadas:", + "description": "Información sobre tu instalación de Home Assistant", "developed_by": "Desarrollado por un montón de gente impresionante.", "documentation": "Documentación", "frontend": "interfaz de usuario", @@ -1461,7 +1463,9 @@ }, "introduction": "Aquí puedes configurar tus componentes y Home Assistant. Aún no es posible configurar todo desde la interfaz de usuario, pero estamos trabajando en ello.", "logs": { + "caption": "Registros", "clear": "Limpiar", + "description": "Ver los registros de Home Assistant", "details": "Detalles de registro ({level})", "load_full_log": "Cargar registro completo de Home Assistant", "loading_log": "Cargando registro de errores...", @@ -1656,6 +1660,11 @@ "core": "Recargar ubicación y personalizaciones", "group": "Recargar grupos", "heading": "Recargando la configuración YAML", + "input_boolean": "Recargar los campos booleanos", + "input_datetime": "Recargar los campos de fecha y hora", + "input_number": "Recargar los campos numéricos", + "input_select": "Recargar los campos desplegables", + "input_text": "Recargar los campos de texto", "introduction": "Algunas partes de Home Assistant pueden recargarse sin necesidad de reiniciar. Al pulsar en recargar se descartará la configuración YAML actual y se cargará la nueva.", "person": "Recargar personas", "scene": "Recargar escenas", diff --git a/translations/frontend/fr.json b/translations/frontend/fr.json index 06d1a657ba..3c1a91add7 100644 --- a/translations/frontend/fr.json +++ b/translations/frontend/fr.json @@ -1373,7 +1373,9 @@ }, "info": { "built_using": "Construit en utilisant", + "caption": "Info", "custom_uis": "Interfaces utilisateur personnalisées :", + "description": "Informations sur votre installation Home Assistant", "developed_by": "Développé par un groupe de personnes formidables.", "documentation": "Documentation", "frontend": "interface utilisateur", @@ -1461,7 +1463,9 @@ }, "introduction": "Ici, il est possible de configurer vos composants et Home Assistant. Tout n'est pas encore possible de configurer à partir de l'interface utilisateur, mais nous y travaillons.", "logs": { + "caption": "Journaux", "clear": "Nettoyer", + "description": "Afficher les journaux de Home Assistant", "details": "Détails du journal ( {level} )", "load_full_log": "Charger le journal complet de Home Assistant", "loading_log": "Chargement du journal des erreurs…", @@ -1656,6 +1660,11 @@ "core": "Recharger l'emplacement et les personnalisations", "group": "Recharger les groupes", "heading": "Rechargement de la configuration", + "input_boolean": "Recharger les booléens d'entrée", + "input_datetime": "Recharger les heures de date d'entrée", + "input_number": "Recharger les numéros d'entrée", + "input_select": "Recharger les sélections d'entrée", + "input_text": "Recharger les textes d'entrée", "introduction": "Certaines parties de Home Assistant peuvent être rechargées sans nécessiter de redémarrage. Le fait de cliquer sur recharger déchargera leur configuration actuelle et chargera la nouvelle.", "person": "Recharger les personnes", "scene": "Recharger les scènes", diff --git a/translations/frontend/it.json b/translations/frontend/it.json index 5f76c3c65f..800f058369 100644 --- a/translations/frontend/it.json +++ b/translations/frontend/it.json @@ -1373,7 +1373,9 @@ }, "info": { "built_using": "Costruito usando", + "caption": "Informazioni", "custom_uis": "Interfacce Utente personalizzate:", + "description": "Informazioni sulla tua installazione di Home Assistant", "developed_by": "Sviluppato da un gruppo di persone fantastiche.", "documentation": "Documentazione", "frontend": "frontend-ui", @@ -1461,7 +1463,9 @@ }, "introduction": "Qui è possibile configurare i componenti e Home Assistant. Non è ancora possibile configurare tutto dall'Interfaccia Utente, ma ci stiamo lavorando.", "logs": { + "caption": "Logs", "clear": "Pulisci", + "description": "Vedi i logs di Home Assistant", "details": "Dettagli registro ({level})", "load_full_log": "Carica il registro completo di Home Assistant", "loading_log": "Caricamento del registro errori...", @@ -1656,6 +1660,11 @@ "core": "Ricarica la Posizione e le Personalizzazioni", "group": "Ricarica i Gruppi", "heading": "Ricarica Configurazione YAML", + "input_boolean": "Ricarica input booleani", + "input_datetime": "Ricarica input data e/o tempo", + "input_number": "Ricarica input numerici", + "input_select": "Ricarica input a discesa", + "input_text": "Ricarica input testuali", "introduction": "Alcune parti di Home Assistant possono essere ricaricate senza richiedere un riavvio. Premendo su Ricarica si rimuoverà la loro Configurazione YAML attuale e si caricherà la versione aggiornata.", "person": "Ricarica persone", "scene": "Ricarica le Scene", diff --git a/translations/frontend/ko.json b/translations/frontend/ko.json index cf5675cfc4..ffb4a9299c 100644 --- a/translations/frontend/ko.json +++ b/translations/frontend/ko.json @@ -480,8 +480,10 @@ "delete": "삭제", "error_required": "필수 요소", "loading": "읽는 중", + "menu": "메뉴", "next": "다음", "no": "아니오", + "overflow_menu": "오버플로 메뉴", "previous": "이전", "refresh": "새로고침", "save": "저장", @@ -911,6 +913,8 @@ "introduction": "자동화를 사용하여 집에 생기를 불어넣으세요", "load_error_not_editable": "automations.yaml 의 자동화만 편집할 수 있습니다.", "load_error_unknown": "자동화를 읽어오는 도중 오류가 발생했습니다 ({err_no}).", + "move_down": "아래로 이동", + "move_up": "위로 이동", "save": "저장하기", "triggers": { "add": "트리거 추가", @@ -1369,7 +1373,9 @@ }, "info": { "built_using": "다음을 사용하여 제작", + "caption": "정보", "custom_uis": "사용자 UI :", + "description": "Home Assistant 설치에 대한 정보", "developed_by": "Home Assistant 는 수많은 멋진 사람들에 의해 개발되었습니다.", "documentation": "관련문서", "frontend": "프런트엔드-UI", @@ -1457,7 +1463,9 @@ }, "introduction": "여기에서 구성요소와 Home Assistant 를 설정할 수 있습니다. 아직 여기서 모두 설정할 수는 없지만, 모든 내용을 설정할 수 있도록 작업 중입니다.", "logs": { + "caption": "로그", "clear": "지우기", + "description": "Home Assistant 로그 보기", "details": "로그 상세정보 ({level})", "load_full_log": "Home Assistant 로그 전부 불러오기", "loading_log": "오류 로그를 읽는 중...", @@ -1652,6 +1660,11 @@ "core": "위치 및 사용자화 다시 읽어오기", "group": "그룹 다시 읽어오기", "heading": "YAML 구성 다시 읽어오기", + "input_boolean": "논리입력 다시 읽어오기", + "input_datetime": "날짜 / 시간입력 다시 읽어오기", + "input_number": "숫자입력 다시 읽어오기", + "input_select": "선택입력 다시 읽어오기", + "input_text": "문자입력 다시 읽어오기", "introduction": "Home Assistant 의 일부 구성 내용은 재시작 없이 다시 읽어 들일 수 있습니다. 다시 읽어오기를 누르면 현재 사용 중인 YAML 구성 내용을 내리고 새로운 구성 내용을 읽어 들입니다.", "person": "구성원 다시 읽어오기", "scene": "씬 다시 읽어오기", diff --git a/translations/frontend/nb.json b/translations/frontend/nb.json index 584d3610af..a1bb3ed50a 100644 --- a/translations/frontend/nb.json +++ b/translations/frontend/nb.json @@ -1373,7 +1373,9 @@ }, "info": { "built_using": "Bygget med", + "caption": "Informasjon", "custom_uis": "Tilpassede brukergrensesnitt:", + "description": "Informasjon om din Home Assistant-installasjon", "developed_by": "Utviklet av en gjeng med fantastiske mennesker.", "documentation": "Dokumentasjon", "frontend": "frontend", @@ -1461,7 +1463,9 @@ }, "introduction": "Her er det mulig å konfigurere dine komponenter og Home Assistant. Ikke alt er mulig å konfigurere fra brukergrensesnittet enda, men vi jobber med det.", "logs": { + "caption": "Logger", "clear": "Tøm", + "description": "Vis Home Assistant loggene", "details": "Loggdetaljer ({level})", "load_full_log": "Last inn fullstendig Home Assistant logg", "loading_log": "Laster inn feillogg ...", @@ -1656,6 +1660,11 @@ "core": "Last inn lokasjon og spesialtilpassinger på nytt", "group": "Last inn grupper på nytt", "heading": "YAML -Konfigurasjon lastes på nytt", + "input_boolean": "Last input booleans på nytt", + "input_datetime": "Last input date på nytt", + "input_number": "Las input numbers på nytt", + "input_select": "Last input selects på nytt ", + "input_text": "Last input texts på nytt", "introduction": "Noen deler av Home Assistant kan laste inn uten å kreve omstart. Hvis du trykker last på nytt, vil du bytte den nåværende konfigurasjonen med den nye.", "person": "Last inn personer på nytt", "scene": "Last inn scener på nytt", diff --git a/translations/frontend/pt.json b/translations/frontend/pt.json index a20a2f6a23..690ae5d243 100644 --- a/translations/frontend/pt.json +++ b/translations/frontend/pt.json @@ -480,6 +480,7 @@ "delete": "Apagar", "error_required": "Obrigatório", "loading": "A carregar", + "menu": "Menu", "next": "Seguinte", "no": "Não", "previous": "Anterior", @@ -910,6 +911,8 @@ "introduction": "Crie automações para dar vida à sua casa", "load_error_not_editable": "Apenas as automações em automations.yaml são editáveis.", "load_error_unknown": "Erro ao carregar a automação ({err_no}).", + "move_down": "Mover para baixo", + "move_up": "Mover para cima", "save": "Guardar", "triggers": { "add": "Acrescentar acionador", @@ -1879,6 +1882,7 @@ "add_node_secure": "Adicionar nó seguro", "cancel_command": "Cancelar comando", "heal_network": "Curar a Rede", + "node_info": "Informação do Nó", "refresh_entity": "Actualizar entidade", "remove_node": "Remover nó", "save_config": "Guardar configuração", diff --git a/translations/frontend/ru.json b/translations/frontend/ru.json index b46d4e2598..5786d3205b 100644 --- a/translations/frontend/ru.json +++ b/translations/frontend/ru.json @@ -480,8 +480,10 @@ "delete": "Удалить", "error_required": "Обязательное поле", "loading": "Загрузка", + "menu": "Меню", "next": "Далее", "no": "Нет", + "overflow_menu": "Выпадающее меню", "previous": "Назад", "refresh": "Обновить", "save": "Сохранить", @@ -911,6 +913,8 @@ "introduction": "Используйте автоматизацию, чтобы оживить Ваш дом.", "load_error_not_editable": "Доступны для редактирования только автоматизации из automations.yaml.", "load_error_unknown": "Ошибка загрузки автоматизации ({err_no}).", + "move_down": "Переместить ниже", + "move_up": "Переместить выше", "save": "Сохранить", "triggers": { "add": "Добавить триггер", @@ -1369,7 +1373,9 @@ }, "info": { "built_using": "Создано с использованием", + "caption": "О системе", "custom_uis": "Кастомные интерфейсы:", + "description": "Информация об установленном Home Assistant", "developed_by": "Разработано множеством замечательных людей.", "documentation": "Документация", "frontend": "пользовательский интерфейс", @@ -1457,7 +1463,9 @@ }, "introduction": "Здесь можно настроить Home Assistant. Пока что не все настройки доступны из интерфейса, но мы работаем над этим.", "logs": { + "caption": "Журнал работы сервера", "clear": "Очистить", + "description": "Просмотр журналов работы сервера Home Assistant", "details": "Уровень: {level}", "load_full_log": "Показать весь журнал", "loading_log": "Загрузка журнала…", @@ -1652,6 +1660,11 @@ "core": "Обновить местоположение и кастомизацию", "group": "Перезагрузить группы", "heading": "Перезагрузка конфигурации YAML", + "input_boolean": "Перезагрузить вспомогательные переключатели", + "input_datetime": "Перезагрузить вспомогательные элементы ввода даты и времени", + "input_number": "Перезагрузить вспомогательные элементы ввода чисел", + "input_select": "Перезагрузить вспомогательные выпадающие списки", + "input_text": "Перезагрузить вспомогательные элементы ввода текста", "introduction": "Некоторые компоненты Home Assistant можно перезагрузить без необходимости перезапуска всей системы. Перезагрузка выгружает текущую конфигурацию YAML и загружает новую.", "person": "Перезагрузить персоны", "scene": "Перезагрузить сцены", diff --git a/translations/frontend/zh-Hans.json b/translations/frontend/zh-Hans.json index 9ee8957d15..9a14d4687f 100644 --- a/translations/frontend/zh-Hans.json +++ b/translations/frontend/zh-Hans.json @@ -480,8 +480,10 @@ "delete": "删除", "error_required": "必填", "loading": "加载中", + "menu": "菜单", "next": "下一步", "no": "否", + "overflow_menu": "Overflow 菜单", "previous": "上一步", "refresh": "刷新", "save": "保存", @@ -911,6 +913,8 @@ "introduction": "使用自动化让你的家聪明起来", "load_error_not_editable": "只能编辑 automations.yaml 中的自动化。", "load_error_unknown": "加载自动化错误 ({err_no})。", + "move_down": "下移", + "move_up": "上移", "save": "保存", "triggers": { "add": "添加触发条件", @@ -1369,7 +1373,9 @@ }, "info": { "built_using": "建于", + "caption": "信息", "custom_uis": "自定义用户界面:", + "description": "关于您的 Home Assistant 安装的信息", "developed_by": "由一帮很 Awesome~~~ 的人开发。", "documentation": "文档", "frontend": "前端用户界面", @@ -1457,7 +1463,9 @@ }, "introduction": "您可以在此配置 Home Assistant 及组件。目前并非所有配置都能通过前端 UI 完成,但是我们在努力实现中。", "logs": { + "caption": "日志", "clear": "清除", + "description": "查看 Home Assistant 日志", "details": "日志详细信息( {level} )", "load_full_log": "加载完整 Home Assistant 日志", "loading_log": "正在加载错误日志...", @@ -1652,6 +1660,11 @@ "core": "重载位置和自定义", "group": "重载分组", "heading": "配置重载", + "input_boolean": "重载二元选择器", + "input_datetime": "重载日期选择器", + "input_number": "重载数值选择器", + "input_select": "重载多项选择器", + "input_text": "重载文字输入", "introduction": "Home Assistant 中的部分配置可以直接重载,而无需重启服务。点击重载按钮将重新载入新的配置。", "person": "重载人员", "scene": "重载场景", diff --git a/translations/frontend/zh-Hant.json b/translations/frontend/zh-Hant.json index f4e215974e..385567cb26 100644 --- a/translations/frontend/zh-Hant.json +++ b/translations/frontend/zh-Hant.json @@ -1373,7 +1373,9 @@ }, "info": { "built_using": "建置使用", + "caption": "更多資訊", "custom_uis": "自定介面:", + "description": "關於 Home Assistant 安裝資訊", "developed_by": "由一群充滿熱情的人們所開發。", "documentation": "相關文件", "frontend": "frontend-ui", @@ -1461,7 +1463,9 @@ }, "introduction": "此處為 Home Assistant 和元件相關配置區,目前尚未支援透過 UI 進行所有設定,我們正在努力改進中。", "logs": { + "caption": "記錄", "clear": "清除", + "description": "檢視 Home Assistant 紀錄", "details": "記錄詳細資料({level})", "load_full_log": "載入完整 Home Assistant 記錄", "loading_log": "載入錯誤記錄中...", @@ -1656,6 +1660,11 @@ "core": "重新載入座標與自訂化", "group": "重新載入群組", "heading": "YAML 設定新載入中", + "input_boolean": "重新載入輸入 boolean", + "input_datetime": "重新載入輸入日期時間", + "input_number": "重新載入輸入數字", + "input_select": "重先載入輸入選擇", + "input_text": "重新載入輸入文字", "introduction": "Home Assistant 中部分設定無須重啟即可重新載入生效。點選重新載入按鈕,即可解除目前 YAML 設定,並重新載入最新設定。", "person": "重新載入人員", "scene": "重新載入場景", From 4eb46bc2758fae6d16680399f47983759749a12b Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Fri, 12 Jun 2020 11:51:00 +0200 Subject: [PATCH 31/39] Move integration config panels to integrations (#6122) --- src/common/entity/valid_entity_id.ts | 2 +- src/components/data-table/ha-data-table.ts | 5 + src/components/ha-textarea.js | 46 -- .../dialog-zha-device-info.ts | 113 ---- .../show-dialog-zha-device-info.ts | 21 - .../ha-automation-action-wait_template.ts | 5 +- .../ha-automation-condition-numeric_state.ts | 6 +- .../types/ha-automation-condition-template.ts | 6 +- .../config/automation/ha-automation-editor.ts | 5 +- .../ha-automation-trigger-numeric_state.ts | 6 +- .../types/ha-automation-trigger-template.ts | 6 +- .../device-detail/ha-device-info-card.ts | 2 +- .../ha-device-actions-mqtt.ts} | 29 +- .../ha-device-actions-zha.ts | 128 ++++ .../ha-device-info-zha.ts | 93 +++ .../config/devices/ha-config-device-page.ts | 52 +- src/panels/config/ha-panel-config.ts | 18 +- .../integrations/ha-integration-card.ts | 32 +- .../integration-panels}/zha/functions.ts | 5 +- .../integration-panels}/zha/types.ts | 2 +- .../zha/zha-add-devices-page.ts | 186 +++--- .../zha/zha-add-group-page.ts | 18 +- .../zha/zha-cluster-attributes.ts | 16 +- .../zha/zha-cluster-commands.ts | 16 +- .../zha/zha-clusters-data-table.ts | 10 +- .../integration-panels}/zha/zha-clusters.ts | 22 +- .../zha/zha-config-dashboard-router.ts | 29 +- .../zha/zha-config-dashboard.ts | 132 ++++ .../zha/zha-device-binding.ts | 16 +- .../integration-panels/zha/zha-device-card.ts | 243 ++++++++ .../zha/zha-device-endpoint-data-table.ts | 43 +- .../zha/zha-group-binding.ts | 20 +- .../integration-panels}/zha/zha-group-page.ts | 70 ++- .../zha/zha-groups-dashboard.ts | 193 ++++++ .../zwave/ha-config-zwave.js | 30 +- .../integration-panels}/zwave/zwave-groups.js | 8 +- .../zwave/zwave-log-dialog.js | 6 +- .../integration-panels}/zwave/zwave-log.js | 12 +- .../zwave/zwave-network.ts | 20 +- .../zwave/zwave-node-config.ts | 10 +- .../zwave/zwave-node-protection.js | 6 +- .../zwave/zwave-usercodes.js | 6 +- .../integration-panels}/zwave/zwave-values.ts | 10 +- src/panels/config/zha/zha-config-dashboard.ts | 188 ------ src/panels/config/zha/zha-device-card.ts | 566 ------------------ src/panels/config/zha/zha-device-page.ts | 157 ----- src/panels/config/zha/zha-groups-dashboard.ts | 172 ------ .../config/zha/zha-groups-data-table.ts | 129 ---- src/panels/config/zha/zha-node.ts | 148 ----- src/state/hass-element.ts | 2 - src/state/zha-dialog-mixin.ts | 30 - src/translations/en.json | 18 +- 52 files changed, 1203 insertions(+), 1911 deletions(-) delete mode 100644 src/components/ha-textarea.js delete mode 100644 src/dialogs/zha-device-info-dialog/dialog-zha-device-info.ts delete mode 100644 src/dialogs/zha-device-info-dialog/show-dialog-zha-device-info.ts rename src/panels/config/devices/device-detail/{ha-device-card-mqtt.ts => integration-elements/ha-device-actions-mqtt.ts} (56%) create mode 100644 src/panels/config/devices/device-detail/integration-elements/ha-device-actions-zha.ts create mode 100644 src/panels/config/devices/device-detail/integration-elements/ha-device-info-zha.ts rename src/panels/config/{ => integrations/integration-panels}/zha/functions.ts (83%) rename src/panels/config/{ => integrations/integration-panels}/zha/types.ts (93%) rename src/panels/config/{ => integrations/integration-panels}/zha/zha-add-devices-page.ts (56%) rename src/panels/config/{ => integrations/integration-panels}/zha/zha-add-group-page.ts (91%) rename src/panels/config/{ => integrations/integration-panels}/zha/zha-cluster-attributes.ts (95%) rename src/panels/config/{ => integrations/integration-panels}/zha/zha-cluster-commands.ts (95%) rename src/panels/config/{ => integrations/integration-panels}/zha/zha-clusters-data-table.ts (88%) rename src/panels/config/{ => integrations/integration-panels}/zha/zha-clusters.ts (89%) rename src/panels/config/{ => integrations/integration-panels}/zha/zha-config-dashboard-router.ts (73%) create mode 100644 src/panels/config/integrations/integration-panels/zha/zha-config-dashboard.ts rename src/panels/config/{ => integrations/integration-panels}/zha/zha-device-binding.ts (93%) create mode 100644 src/panels/config/integrations/integration-panels/zha/zha-device-card.ts rename src/panels/config/{ => integrations/integration-panels}/zha/zha-device-endpoint-data-table.ts (78%) rename src/panels/config/{ => integrations/integration-panels}/zha/zha-group-binding.ts (93%) rename src/panels/config/{ => integrations/integration-panels}/zha/zha-group-page.ts (87%) create mode 100644 src/panels/config/integrations/integration-panels/zha/zha-groups-dashboard.ts rename src/panels/config/{ => integrations/integration-panels}/zwave/ha-config-zwave.js (95%) rename src/panels/config/{ => integrations/integration-panels}/zwave/zwave-groups.js (97%) rename src/panels/config/{ => integrations/integration-panels}/zwave/zwave-log-dialog.js (91%) rename src/panels/config/{ => integrations/integration-panels}/zwave/zwave-log.js (92%) rename src/panels/config/{ => integrations/integration-panels}/zwave/zwave-network.ts (94%) rename src/panels/config/{ => integrations/integration-panels}/zwave/zwave-node-config.ts (97%) rename src/panels/config/{ => integrations/integration-panels}/zwave/zwave-node-protection.js (96%) rename src/panels/config/{ => integrations/integration-panels}/zwave/zwave-usercodes.js (97%) rename src/panels/config/{ => integrations/integration-panels}/zwave/zwave-values.ts (90%) delete mode 100644 src/panels/config/zha/zha-config-dashboard.ts delete mode 100644 src/panels/config/zha/zha-device-card.ts delete mode 100755 src/panels/config/zha/zha-device-page.ts delete mode 100644 src/panels/config/zha/zha-groups-dashboard.ts delete mode 100644 src/panels/config/zha/zha-groups-data-table.ts delete mode 100644 src/panels/config/zha/zha-node.ts delete mode 100644 src/state/zha-dialog-mixin.ts diff --git a/src/common/entity/valid_entity_id.ts b/src/common/entity/valid_entity_id.ts index 4e8e6770f2..c9c8d9acb9 100644 --- a/src/common/entity/valid_entity_id.ts +++ b/src/common/entity/valid_entity_id.ts @@ -6,7 +6,7 @@ export const isValidEntityId = (entityId: string) => export const createValidEntityId = (input: string) => input .toLowerCase() - .replace(/\s|'/g, "_") // replace spaces and quotes with underscore + .replace(/\s|'|\./g, "_") // replace spaces, points and quotes with underscore .replace(/\W/g, "") // remove not allowed chars .replace(/_{2,}/g, "_") // replace multiple underscores with 1 .replace(/_$/, ""); // remove underscores at the end diff --git a/src/components/data-table/ha-data-table.ts b/src/components/data-table/ha-data-table.ts index ce957a0ee4..c1150236ca 100644 --- a/src/components/data-table/ha-data-table.ts +++ b/src/components/data-table/ha-data-table.ts @@ -619,6 +619,11 @@ export class HaDataTable extends LitElement { text-transform: inherit; } + .mdc-data-table__cell a { + color: inherit; + text-decoration: none; + } + .mdc-data-table__cell--numeric { text-align: right; } diff --git a/src/components/ha-textarea.js b/src/components/ha-textarea.js deleted file mode 100644 index 36aa884120..0000000000 --- a/src/components/ha-textarea.js +++ /dev/null @@ -1,46 +0,0 @@ -/* -Wrapper for paper-textarea. - -paper-textarea crashes on iOS when created programmatically. This only impacts -our automation and script editors as they are using Preact. Polymer is using -template elements and does not have this issue. - -paper-textarea issue: https://github.com/PolymerElements/paper-input/issues/556 -WebKit issue: https://bugs.webkit.org/show_bug.cgi?id=174629 -*/ - -import "@polymer/paper-input/paper-textarea"; -import { html } from "@polymer/polymer/lib/utils/html-tag"; -/* eslint-plugin-disable lit */ -import { PolymerElement } from "@polymer/polymer/polymer-element"; - -class HaTextarea extends PolymerElement { - static get template() { - return html` - - - `; - } - - static get properties() { - return { - name: String, - label: String, - placeholder: String, - value: { - type: String, - notify: true, - }, - }; - } -} - -customElements.define("ha-textarea", HaTextarea); diff --git a/src/dialogs/zha-device-info-dialog/dialog-zha-device-info.ts b/src/dialogs/zha-device-info-dialog/dialog-zha-device-info.ts deleted file mode 100644 index d61c9a9102..0000000000 --- a/src/dialogs/zha-device-info-dialog/dialog-zha-device-info.ts +++ /dev/null @@ -1,113 +0,0 @@ -import "@polymer/paper-dialog-scrollable/paper-dialog-scrollable"; -import { - css, - CSSResult, - customElement, - html, - LitElement, - property, - TemplateResult, -} from "lit-element"; -import "../../components/dialog/ha-paper-dialog"; -import type { HaPaperDialog } from "../../components/dialog/ha-paper-dialog"; -import { fetchZHADevice, ZHADevice } from "../../data/zha"; -import "../../panels/config/zha/zha-device-card"; -import type { PolymerChangedEvent } from "../../polymer-types"; -import { haStyleDialog } from "../../resources/styles"; -import type { HomeAssistant } from "../../types"; -import type { ZHADeviceInfoDialogParams } from "./show-dialog-zha-device-info"; - -@customElement("dialog-zha-device-info") -class DialogZHADeviceInfo extends LitElement { - @property() public hass!: HomeAssistant; - - @property() private _params?: ZHADeviceInfoDialogParams; - - @property() private _error?: string; - - @property() private _device?: ZHADevice; - - public async showDialog(params: ZHADeviceInfoDialogParams): Promise { - this._params = params; - this._device = await fetchZHADevice(this.hass, params.ieee); - await this.updateComplete; - this._dialog.open(); - } - - protected render(): TemplateResult { - if (!this._params || !this._device) { - return html``; - } - - return html` - - ${this._error - ? html`
${this._error}
` - : html` - - `} -
- `; - } - - private _openedChanged(ev: PolymerChangedEvent): void { - if (!ev.detail.value) { - this._params = undefined; - this._error = undefined; - this._device = undefined; - } - } - - private _onDeviceRemoved(): void { - this._closeDialog(); - } - - private get _dialog(): HaPaperDialog { - return this.shadowRoot!.querySelector("ha-paper-dialog")!; - } - - private _closeDialog() { - this._dialog.close(); - } - - static get styles(): CSSResult[] { - return [ - haStyleDialog, - css` - ha-paper-dialog > * { - margin: 0; - display: block; - padding: 0; - } - .card { - box-sizing: border-box; - display: flex; - flex: 1 0 300px; - min-width: 0; - max-width: 600px; - word-wrap: break-word; - } - .error { - color: var(--google-red-500); - } - `, - ]; - } -} - -declare global { - interface HTMLElementTagNameMap { - "dialog-zha-device-info": DialogZHADeviceInfo; - } -} diff --git a/src/dialogs/zha-device-info-dialog/show-dialog-zha-device-info.ts b/src/dialogs/zha-device-info-dialog/show-dialog-zha-device-info.ts deleted file mode 100644 index 6ddec9be44..0000000000 --- a/src/dialogs/zha-device-info-dialog/show-dialog-zha-device-info.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { fireEvent } from "../../common/dom/fire_event"; - -export interface ZHADeviceInfoDialogParams { - ieee: string; -} - -export const loadZHADeviceInfoDialog = () => - import( - /* webpackChunkName: "dialog-zha-device-info" */ "./dialog-zha-device-info" - ); - -export const showZHADeviceInfoDialog = ( - element: HTMLElement, - zhaDeviceInfoParams: ZHADeviceInfoDialogParams -): void => { - fireEvent(element, "show-dialog", { - dialogTag: "dialog-zha-device-info", - dialogImport: loadZHADeviceInfoDialog, - dialogParams: zhaDeviceInfoParams, - }); -}; diff --git a/src/panels/config/automation/action/types/ha-automation-action-wait_template.ts b/src/panels/config/automation/action/types/ha-automation-action-wait_template.ts index d785160071..6924787d4b 100644 --- a/src/panels/config/automation/action/types/ha-automation-action-wait_template.ts +++ b/src/panels/config/automation/action/types/ha-automation-action-wait_template.ts @@ -1,4 +1,5 @@ import "@polymer/paper-input/paper-input"; +import "@polymer/paper-input/paper-textarea"; import { customElement, LitElement, property } from "lit-element"; import { html } from "lit-html"; import { WaitAction } from "../../../../../data/script"; @@ -19,7 +20,7 @@ export class HaWaitAction extends LitElement implements ActionElement { const { wait_template, timeout } = this.action; return html` - + > - + > `; } diff --git a/src/panels/config/automation/condition/types/ha-automation-condition-template.ts b/src/panels/config/automation/condition/types/ha-automation-condition-template.ts index 4e79bc9004..c3d06a0355 100644 --- a/src/panels/config/automation/condition/types/ha-automation-condition-template.ts +++ b/src/panels/config/automation/condition/types/ha-automation-condition-template.ts @@ -1,5 +1,5 @@ import { customElement, html, LitElement, property } from "lit-element"; -import "../../../../../components/ha-textarea"; +import "@polymer/paper-input/paper-textarea"; import { TemplateCondition } from "../../../../../data/automation"; import { HomeAssistant } from "../../../../../types"; import { handleChangeEvent } from "../ha-automation-condition-row"; @@ -17,7 +17,7 @@ export class HaTemplateCondition extends LitElement { protected render() { const { value_template } = this.condition; return html` - + > `; } diff --git a/src/panels/config/automation/ha-automation-editor.ts b/src/panels/config/automation/ha-automation-editor.ts index 8203ee6d6c..70f60c5e0a 100644 --- a/src/panels/config/automation/ha-automation-editor.ts +++ b/src/panels/config/automation/ha-automation-editor.ts @@ -1,5 +1,6 @@ import "@polymer/app-layout/app-header/app-header"; import "@polymer/app-layout/app-toolbar/app-toolbar"; +import "@polymer/paper-input/paper-textarea"; import "../../../components/ha-icon-button"; import { css, @@ -117,7 +118,7 @@ export class HaAutomationEditor extends LitElement { @value-changed=${this._valueChanged} > - + >
${stateObj ? html` diff --git a/src/panels/config/automation/trigger/types/ha-automation-trigger-numeric_state.ts b/src/panels/config/automation/trigger/types/ha-automation-trigger-numeric_state.ts index 8c3b151a2b..b8d4cffd71 100644 --- a/src/panels/config/automation/trigger/types/ha-automation-trigger-numeric_state.ts +++ b/src/panels/config/automation/trigger/types/ha-automation-trigger-numeric_state.ts @@ -2,7 +2,7 @@ import "@polymer/paper-input/paper-input"; import { customElement, html, LitElement, property } from "lit-element"; import { fireEvent } from "../../../../../common/dom/fire_event"; import "../../../../../components/entity/ha-entity-picker"; -import "../../../../../components/ha-textarea"; +import "@polymer/paper-input/paper-textarea"; import { ForDict, NumericStateTrigger } from "../../../../../data/automation"; import { HomeAssistant } from "../../../../../types"; import { handleChangeEvent } from "../ha-automation-trigger-row"; @@ -61,7 +61,7 @@ export default class HaNumericStateTrigger extends LitElement { .value=${below} @value-changed=${this._valueChanged} > - + > + > `; } diff --git a/src/panels/config/devices/device-detail/ha-device-info-card.ts b/src/panels/config/devices/device-detail/ha-device-info-card.ts index 4e5c4692b6..8344df94fa 100644 --- a/src/panels/config/devices/device-detail/ha-device-info-card.ts +++ b/src/panels/config/devices/device-detail/ha-device-info-card.ts @@ -75,6 +75,7 @@ export class HaDeviceCard extends LitElement { : ""}
+
`; } @@ -100,7 +101,6 @@ export class HaDeviceCard extends LitElement { } ha-card { flex: 1 0 100%; - padding-bottom: 10px; min-width: 0; } .device { diff --git a/src/panels/config/devices/device-detail/ha-device-card-mqtt.ts b/src/panels/config/devices/device-detail/integration-elements/ha-device-actions-mqtt.ts similarity index 56% rename from src/panels/config/devices/device-detail/ha-device-card-mqtt.ts rename to src/panels/config/devices/device-detail/integration-elements/ha-device-actions-mqtt.ts index 3f0ac8561a..5ff0862c54 100644 --- a/src/panels/config/devices/device-detail/ha-device-card-mqtt.ts +++ b/src/panels/config/devices/device-detail/integration-elements/ha-device-actions-mqtt.ts @@ -5,16 +5,17 @@ import { LitElement, property, TemplateResult, + css, } from "lit-element"; -import { DeviceRegistryEntry } from "../../../../data/device_registry"; -import { removeMQTTDeviceEntry } from "../../../../data/mqtt"; -import { showConfirmationDialog } from "../../../../dialogs/generic/show-dialog-box"; -import { showMQTTDeviceDebugInfoDialog } from "../../../../dialogs/mqtt-device-debug-info-dialog/show-dialog-mqtt-device-debug-info"; -import { haStyle } from "../../../../resources/styles"; -import { HomeAssistant } from "../../../../types"; +import { DeviceRegistryEntry } from "../../../../../data/device_registry"; +import { removeMQTTDeviceEntry } from "../../../../../data/mqtt"; +import { showConfirmationDialog } from "../../../../../dialogs/generic/show-dialog-box"; +import { showMQTTDeviceDebugInfoDialog } from "../../../../../dialogs/mqtt-device-debug-info-dialog/show-dialog-mqtt-device-debug-info"; +import { haStyle } from "../../../../../resources/styles"; +import { HomeAssistant } from "../../../../../types"; -@customElement("ha-device-card-mqtt") -export class HaDeviceCardMqtt extends LitElement { +@customElement("ha-device-actions-mqtt") +export class HaDeviceActionsMqtt extends LitElement { @property() public hass!: HomeAssistant; @property() public device!: DeviceRegistryEntry; @@ -47,7 +48,15 @@ export class HaDeviceCardMqtt extends LitElement { await showMQTTDeviceDebugInfoDialog(this, { device }); } - static get styles(): CSSResult { - return haStyle; + static get styles(): CSSResult[] { + return [ + haStyle, + css` + :host { + display: flex; + justify-content: space-between; + } + `, + ]; } } diff --git a/src/panels/config/devices/device-detail/integration-elements/ha-device-actions-zha.ts b/src/panels/config/devices/device-detail/integration-elements/ha-device-actions-zha.ts new file mode 100644 index 0000000000..641209e782 --- /dev/null +++ b/src/panels/config/devices/device-detail/integration-elements/ha-device-actions-zha.ts @@ -0,0 +1,128 @@ +import { + CSSResult, + customElement, + html, + LitElement, + property, + TemplateResult, + css, + PropertyValues, +} from "lit-element"; +import { DeviceRegistryEntry } from "../../../../../data/device_registry"; +import { haStyle } from "../../../../../resources/styles"; +import { HomeAssistant } from "../../../../../types"; +import { + ZHADevice, + fetchZHADevice, + reconfigureNode, +} from "../../../../../data/zha"; +import { navigate } from "../../../../../common/navigate"; +import { showZHADeviceZigbeeInfoDialog } from "../../../../../dialogs/zha-device-zigbee-signature-dialog/show-dialog-zha-device-zigbee-info"; +import { showConfirmationDialog } from "../../../../../dialogs/generic/show-dialog-box"; + +@customElement("ha-device-actions-zha") +export class HaDeviceActionsZha extends LitElement { + @property() public hass!: HomeAssistant; + + @property() public device!: DeviceRegistryEntry; + + @property() private _zhaDevice?: ZHADevice; + + protected updated(changedProperties: PropertyValues) { + if (changedProperties.has("device")) { + const zigbeeConnection = this.device.connections.find( + (conn) => conn[0] === "zigbee" + ); + if (!zigbeeConnection) { + return; + } + fetchZHADevice(this.hass, zigbeeConnection[1]).then((device) => { + this._zhaDevice = device; + }); + } + } + + protected render(): TemplateResult { + if (!this._zhaDevice) { + return html``; + } + return html` + ${this._zhaDevice.device_type !== "Coordinator" + ? html` + + ${this.hass!.localize( + "ui.dialogs.zha_device_info.buttons.reconfigure" + )} + + ` + : ""} + ${this._zhaDevice.power_source === "Mains" && + (this._zhaDevice.device_type === "Router" || + this._zhaDevice.device_type === "Coordinator") + ? html` + + ${this.hass!.localize("ui.dialogs.zha_device_info.buttons.add")} + + ` + : ""} + ${this._zhaDevice.device_type !== "Coordinator" + ? html` + + ${this.hass!.localize( + "ui.dialogs.zha_device_info.buttons.zigbee_information" + )} + + + ${this.hass!.localize( + "ui.dialogs.zha_device_info.buttons.remove" + )} + + ` + : ""} + `; + } + + private async _onReconfigureNodeClick(): Promise { + if (!this.hass) { + return; + } + reconfigureNode(this.hass, this._zhaDevice!.ieee); + } + + private _onAddDevicesClick() { + navigate(this, "/config/zha/add/" + this._zhaDevice!.ieee); + } + + private async _handleZigbeeInfoClicked() { + showZHADeviceZigbeeInfoDialog(this, { device: this._zhaDevice! }); + } + + private async _removeDevice() { + const confirmed = await showConfirmationDialog(this, { + text: this.hass.localize( + "ui.dialogs.zha_device_info.confirmations.remove" + ), + }); + + if (!confirmed) { + return; + } + + this.hass.callService("zha", "remove", { + ieee_address: this._zhaDevice!.ieee, + }); + } + + static get styles(): CSSResult[] { + return [ + haStyle, + css` + :host { + display: flex; + flex-direction: column; + align-items: flex-start; + } + `, + ]; + } +} diff --git a/src/panels/config/devices/device-detail/integration-elements/ha-device-info-zha.ts b/src/panels/config/devices/device-detail/integration-elements/ha-device-info-zha.ts new file mode 100644 index 0000000000..822cbc0f82 --- /dev/null +++ b/src/panels/config/devices/device-detail/integration-elements/ha-device-info-zha.ts @@ -0,0 +1,93 @@ +import { + CSSResult, + customElement, + html, + LitElement, + property, + TemplateResult, + css, + PropertyValues, +} from "lit-element"; +import { DeviceRegistryEntry } from "../../../../../data/device_registry"; +import { haStyle } from "../../../../../resources/styles"; +import { HomeAssistant } from "../../../../../types"; +import { ZHADevice, fetchZHADevice } from "../../../../../data/zha"; +import { formatAsPaddedHex } from "../../../integrations/integration-panels/zha/functions"; + +@customElement("ha-device-info-zha") +export class HaDeviceActionsZha extends LitElement { + @property() public hass!: HomeAssistant; + + @property() public device!: DeviceRegistryEntry; + + @property() private _zhaDevice?: ZHADevice; + + protected updated(changedProperties: PropertyValues) { + if (changedProperties.has("device")) { + const zigbeeConnection = this.device.connections.find( + (conn) => conn[0] === "zigbee" + ); + if (!zigbeeConnection) { + return; + } + fetchZHADevice(this.hass, zigbeeConnection[1]).then((device) => { + this._zhaDevice = device; + }); + } + } + + protected render(): TemplateResult { + if (!this._zhaDevice) { + return html``; + } + return html` +

Zigbee info

+
IEEE: ${this._zhaDevice.ieee}
+
Nwk: ${formatAsPaddedHex(this._zhaDevice.nwk)}
+
Device Type: ${this._zhaDevice.device_type}
+
+ LQI: + ${this._zhaDevice.lqi || + this.hass!.localize("ui.dialogs.zha_device_info.unknown")} +
+
+ RSSI: + ${this._zhaDevice.rssi || + this.hass!.localize("ui.dialogs.zha_device_info.unknown")} +
+
+ ${this.hass!.localize("ui.dialogs.zha_device_info.last_seen")}: + ${this._zhaDevice.last_seen || + this.hass!.localize("ui.dialogs.zha_device_info.unknown")} +
+
+ ${this.hass!.localize("ui.dialogs.zha_device_info.power_source")}: + ${this._zhaDevice.power_source || + this.hass!.localize("ui.dialogs.zha_device_info.unknown")} +
+ ${this._zhaDevice.quirk_applied + ? html` +
+ ${this.hass!.localize("ui.dialogs.zha_device_info.quirk")}: + ${this._zhaDevice.quirk_class} +
+ ` + : ""} + `; + } + + static get styles(): CSSResult[] { + return [ + haStyle, + css` + h4 { + margin-bottom: 4px; + } + div { + word-break: break-all; + margin-top: 2px; + } + `, + ]; + } +} diff --git a/src/panels/config/devices/ha-config-device-page.ts b/src/panels/config/devices/ha-config-device-page.ts index 56772d3f06..8248cc0f29 100644 --- a/src/panels/config/devices/ha-config-device-page.ts +++ b/src/panels/config/devices/ha-config-device-page.ts @@ -6,6 +6,7 @@ import { html, LitElement, property, + TemplateResult, } from "lit-element"; import { ifDefined } from "lit-html/directives/if-defined"; import memoizeOne from "memoize-one"; @@ -38,13 +39,12 @@ import "../../../layouts/hass-tabs-subpage"; import { HomeAssistant, Route } from "../../../types"; import "../ha-config-section"; import { configSections } from "../ha-panel-config"; -import "./device-detail/ha-device-card-mqtt"; import "./device-detail/ha-device-entities-card"; import "./device-detail/ha-device-info-card"; import { showDeviceAutomationDialog } from "./device-detail/show-dialog-device-automation"; export interface EntityRegistryStateEntry extends EntityRegistryEntry { - stateName?: string; + stateName?: string | null; } @customElement("ha-config-device-page") @@ -226,16 +226,7 @@ export class HaConfigDevicePage extends LitElement { .devices=${this.devices} .device=${device} > - ${ - integrations.includes("mqtt") - ? html` - - ` - : html`` - } + ${this._renderIntegrationInfo(device, integrations)} ${ @@ -439,7 +430,7 @@ export class HaConfigDevicePage extends LitElement { `; } - private _computeEntityName(entity) { + private _computeEntityName(entity: EntityRegistryEntry) { if (entity.name) { return entity.name; } @@ -480,6 +471,41 @@ export class HaConfigDevicePage extends LitElement { }); } + private _renderIntegrationInfo( + device, + integrations: string[] + ): TemplateResult[] { + const templates: TemplateResult[] = []; + if (integrations.includes("mqtt")) { + import("./device-detail/integration-elements/ha-device-actions-mqtt"); + templates.push(html` +
+ +
+ `); + } + if (integrations.includes("zha")) { + import("./device-detail/integration-elements/ha-device-actions-zha"); + import("./device-detail/integration-elements/ha-device-info-zha"); + templates.push(html` + +
+ +
+ `); + } + return templates; + } + private async _showSettings() { const device = this._device(this.deviceId, this.devices)!; showDeviceRegistryDetailDialog(this, { diff --git a/src/panels/config/ha-panel-config.ts b/src/panels/config/ha-panel-config.ts index 7b344b9e5c..a2a7fc05ea 100644 --- a/src/panels/config/ha-panel-config.ts +++ b/src/panels/config/ha-panel-config.ts @@ -163,20 +163,6 @@ export const configSections: { [name: string]: PageNavigation[] } = { advancedOnly: true, }, ], - other: [ - { - component: "zha", - path: "/config/zha", - translationKey: "component.zha.title", - icon: "hass:zigbee", - }, - { - component: "zwave", - path: "/config/zwave", - translationKey: "component.zwave.title", - icon: "hass:z-wave", - }, - ], }; @customElement("ha-panel-config") @@ -327,14 +313,14 @@ class HaPanelConfig extends HassRouterPage { tag: "zha-config-dashboard-router", load: () => import( - /* webpackChunkName: "panel-config-zha" */ "./zha/zha-config-dashboard-router" + /* webpackChunkName: "panel-config-zha" */ "./integrations/integration-panels/zha/zha-config-dashboard-router" ), }, zwave: { tag: "ha-config-zwave", load: () => import( - /* webpackChunkName: "panel-config-zwave" */ "./zwave/ha-config-zwave" + /* webpackChunkName: "panel-config-zwave" */ "./integrations/integration-panels/zwave/ha-config-zwave" ), }, }, diff --git a/src/panels/config/integrations/ha-integration-card.ts b/src/panels/config/integrations/ha-integration-card.ts index a904ebc338..a23adbd43f 100644 --- a/src/panels/config/integrations/ha-integration-card.ts +++ b/src/panels/config/integrations/ha-integration-card.ts @@ -45,6 +45,17 @@ declare global { } } +const integrationsWithPanel = { + zha: { + buttonLocalizeKey: "ui.panel.config.zha.button", + path: "/config/zha/dashboard", + }, + zwave: { + buttonLocalizeKey: "ui.panel.config.zwave.button", + path: "/config/zwave", + }, +}; + @customElement("ha-integration-card") export class HaIntegrationCard extends LitElement { @property() public hass!: HomeAssistant; @@ -180,13 +191,24 @@ export class HaIntegrationCard extends LitElement { "ui.panel.config.integrations.config_entry.rename" )} - ${item.supports_options + ${item.domain in integrationsWithPanel + ? html` + ${this.hass.localize( + integrationsWithPanel[item.domain].buttonLocalizeKey + )} + ` + : item.supports_options ? html` - ${this.hass.localize( + + ${this.hass.localize( "ui.panel.config.integrations.config_entry.options" - )} + )} + ` : ""}

diff --git a/src/panels/config/zha/functions.ts b/src/panels/config/integrations/integration-panels/zha/functions.ts similarity index 83% rename from src/panels/config/zha/functions.ts rename to src/panels/config/integrations/integration-panels/zha/functions.ts index 065fe14ee9..7715d0badc 100644 --- a/src/panels/config/zha/functions.ts +++ b/src/panels/config/integrations/integration-panels/zha/functions.ts @@ -1,4 +1,4 @@ -import { Cluster, ZHADevice, ZHAGroup } from "../../../data/zha"; +import { Cluster, ZHADevice, ZHAGroup } from "../../../../../data/zha"; export const formatAsPaddedHex = (value: string | number): string => { let hex = value; @@ -8,6 +8,9 @@ export const formatAsPaddedHex = (value: string | number): string => { return "0x" + hex.toString(16).padStart(4, "0"); }; +export const getIeeeTail = (ieee: string) => + ieee.split(":").slice(-4).reverse().join(""); + export const sortZHADevices = (a: ZHADevice, b: ZHADevice): number => { const nameA = a.user_given_name ? a.user_given_name : a.name; const nameb = b.user_given_name ? b.user_given_name : b.name; diff --git a/src/panels/config/zha/types.ts b/src/panels/config/integrations/integration-panels/zha/types.ts similarity index 93% rename from src/panels/config/zha/types.ts rename to src/panels/config/integrations/integration-panels/zha/types.ts index 19bff74ff5..dd09861ad9 100644 --- a/src/panels/config/zha/types.ts +++ b/src/panels/config/integrations/integration-panels/zha/types.ts @@ -1,4 +1,4 @@ -import { Cluster, ZHADevice } from "../../../data/zha"; +import { Cluster, ZHADevice } from "../../../../../data/zha"; export interface PickerTarget extends EventTarget { selected: number; diff --git a/src/panels/config/zha/zha-add-devices-page.ts b/src/panels/config/integrations/integration-panels/zha/zha-add-devices-page.ts similarity index 56% rename from src/panels/config/zha/zha-add-devices-page.ts rename to src/panels/config/integrations/integration-panels/zha/zha-add-devices-page.ts index e77d8e7f4c..f39f60f90f 100644 --- a/src/panels/config/zha/zha-add-devices-page.ts +++ b/src/panels/config/integrations/integration-panels/zha/zha-add-devices-page.ts @@ -1,5 +1,5 @@ import "@material/mwc-button"; -import "../../../components/ha-icon-button"; +import "../../../../../components/ha-icon-button"; import "@polymer/paper-spinner/paper-spinner"; import { css, @@ -9,19 +9,24 @@ import { LitElement, property, TemplateResult, + PropertyValues, } from "lit-element"; -import "../../../components/ha-service-description"; -import "../../../components/ha-textarea"; -import { ZHADevice } from "../../../data/zha"; -import "../../../layouts/hass-subpage"; -import { haStyle } from "../../../resources/styles"; -import { HomeAssistant, Route } from "../../../types"; +import "../../../../../components/ha-service-description"; +import "@polymer/paper-input/paper-textarea"; +import { ZHADevice } from "../../../../../data/zha"; +import "../../../../../layouts/hass-tabs-subpage"; +import { haStyle } from "../../../../../resources/styles"; +import { HomeAssistant, Route } from "../../../../../types"; import "./zha-device-card"; +import { zhaTabs } from "./zha-config-dashboard"; +import { IronAutogrowTextareaElement } from "@polymer/iron-autogrow-textarea"; @customElement("zha-add-devices-page") class ZHAAddDevicesPage extends LitElement { @property() public hass!: HomeAssistant; + @property() public narrow?: boolean; + @property() public isWide?: boolean; @property() public route?: Route; @@ -36,6 +41,8 @@ class ZHAAddDevicesPage extends LitElement { @property() private _showHelp = false; + @property() private _showLogs = false; + private _ieeeAddress?: string; private _addDevicesTimeoutHandle: any = undefined; @@ -60,58 +67,63 @@ class ZHAAddDevicesPage extends LitElement { this._formattedEvents = ""; } + protected updated(changedProps: PropertyValues) { + super.updated(changedProps); + if ( + changedProps.has("hass") && + !this._active && + !changedProps.get("hass") + ) { + this._subscribe(); + } + } + protected render(): TemplateResult { return html` - - ${this._active - ? html` -

- - ${this.hass!.localize( - "ui.panel.config.zha.add_device_page.spinner" - )} -

- ` - : html` -
- + ${this._showLogs ? "Hide logs" : "Show logs"} +
+ ${this._active + ? html` +

${this.hass!.localize( - "ui.panel.config.zha.add_device_page.search_again" + "ui.panel.config.zha.add_device_page.spinner" )} - - - ${this._showHelp - ? html` - - ` - : ""} -

- `} +

+ + ` + : html` +
+ + ${this.hass!.localize( + "ui.panel.config.zha.add_device_page.search_again" + )} + +
+ `} + ${this._error ? html`
${this._error}
` : ""} -
${this._discoveredDevices.length < 1 ? html`

${this.hass!.localize( - "ui.panel.config.zha.add_device_page.discovery_text" + "ui.panel.config.zha.add_device_page.pairing_mode" + )} +

+

+ ${this.hass!.localize( + this._active + ? "ui.panel.config.zha.add_device_page.discovered_text" + : "ui.panel.config.zha.add_device_page.no_devices_found" )}

@@ -123,27 +135,38 @@ class ZHAAddDevicesPage extends LitElement { class="card" .hass=${this.hass} .device=${device} - .narrow=${!this.isWide} + .narrow=${this.narrow} .showHelp=${this._showHelp} - .showActions=${!this._active} - .showEntityDetail=${false} > ` )} `}
- - - + ${this._showLogs + ? html` + ` + : ""} + `; } + private _toggleLogs() { + this._showLogs = !this._showLogs; + } + private _handleMessage(message: any): void { if (message.type === "log_output") { this._formattedEvents += message.log_entry.message + "\n"; if (this.shadowRoot) { - const textArea = this.shadowRoot.querySelector("ha-textarea"); - if (textArea) { + const paperTextArea = this.shadowRoot.querySelector("paper-textarea"); + if (paperTextArea) { + const textArea = (paperTextArea.inputElement as IronAutogrowTextareaElement) + .textarea; textArea.scrollTop = textArea.scrollHeight; } } @@ -165,69 +188,58 @@ class ZHAAddDevicesPage extends LitElement { } private _subscribe(): void { + if (!this.hass) { + return; + } + this._active = true; const data: any = { type: "zha/devices/permit" }; if (this._ieeeAddress) { data.ieee = this._ieeeAddress; } - this._subscribed = this.hass!.connection.subscribeMessage( + this._subscribed = this.hass.connection.subscribeMessage( (message) => this._handleMessage(message), data ); - this._active = true; this._addDevicesTimeoutHandle = setTimeout( () => this._unsubscribe(), 120000 ); } - private _onHelpTap(): void { - this._showHelp = !this._showHelp; - } - static get styles(): CSSResult[] { return [ haStyle, css` - .discovery-text, - .content-header { - margin: 16px; + .discovery-text { + width: 100%; + padding: 16px; + display: flex; + flex-direction: column; + align-items: center; } .content { - border-top: 1px solid var(--light-primary-color); - min-height: 500px; display: flex; flex-wrap: wrap; padding: 4px; - justify-content: left; - overflow: scroll; + justify-content: center; } .error { color: var(--google-red-500); } paper-spinner { - display: none; - margin-right: 20px; - margin-left: 16px; + padding: 20px; } - paper-spinner[active] { - display: block; - float: left; - margin-right: 20px; - margin-left: 16px; + .searching { + margin-top: 20px; + display: flex; + flex-direction: column; + align-items: center; } .card { - margin-left: 16px; - margin-right: 16px; - margin-bottom: 0px; - margin-top: 10px; + margin: 8px; } - .events { - margin: 16px; - border-top: 1px solid var(--light-primary-color); - padding-top: 16px; - min-height: 200px; - max-height: 200px; - overflow: scroll; + .log { + padding: 16px; } .toggle-help-icon { position: absolute; diff --git a/src/panels/config/zha/zha-add-group-page.ts b/src/panels/config/integrations/integration-panels/zha/zha-add-group-page.ts similarity index 91% rename from src/panels/config/zha/zha-add-group-page.ts rename to src/panels/config/integrations/integration-panels/zha/zha-add-group-page.ts index eb85e899ab..cf1ba78960 100644 --- a/src/panels/config/zha/zha-add-group-page.ts +++ b/src/panels/config/integrations/integration-panels/zha/zha-add-group-page.ts @@ -12,20 +12,20 @@ import { PropertyValues, query, } from "lit-element"; -import type { HASSDomEvent } from "../../../common/dom/fire_event"; -import { navigate } from "../../../common/navigate"; -import type { SelectionChangedEvent } from "../../../components/data-table/ha-data-table"; +import type { HASSDomEvent } from "../../../../../common/dom/fire_event"; +import { navigate } from "../../../../../common/navigate"; +import type { SelectionChangedEvent } from "../../../../../components/data-table/ha-data-table"; import { addGroup, fetchGroupableDevices, ZHAGroup, ZHADeviceEndpoint, -} from "../../../data/zha"; -import "../../../layouts/hass-error-screen"; -import "../../../layouts/hass-subpage"; -import type { PolymerChangedEvent } from "../../../polymer-types"; -import type { HomeAssistant } from "../../../types"; -import "../ha-config-section"; +} from "../../../../../data/zha"; +import "../../../../../layouts/hass-error-screen"; +import "../../../../../layouts/hass-subpage"; +import type { PolymerChangedEvent } from "../../../../../polymer-types"; +import type { HomeAssistant } from "../../../../../types"; +import "../../../ha-config-section"; import "./zha-device-endpoint-data-table"; import type { ZHADeviceEndpointDataTable } from "./zha-device-endpoint-data-table"; diff --git a/src/panels/config/zha/zha-cluster-attributes.ts b/src/panels/config/integrations/integration-panels/zha/zha-cluster-attributes.ts similarity index 95% rename from src/panels/config/zha/zha-cluster-attributes.ts rename to src/panels/config/integrations/integration-panels/zha/zha-cluster-attributes.ts index db04e47114..b92a24269d 100644 --- a/src/panels/config/zha/zha-cluster-attributes.ts +++ b/src/panels/config/integrations/integration-panels/zha/zha-cluster-attributes.ts @@ -1,6 +1,6 @@ import "@material/mwc-button"; import "@polymer/paper-dropdown-menu/paper-dropdown-menu"; -import "../../../components/ha-icon-button"; +import "../../../../../components/ha-icon-button"; import "@polymer/paper-input/paper-input"; import "@polymer/paper-item/paper-item"; import "@polymer/paper-listbox/paper-listbox"; @@ -13,9 +13,9 @@ import { PropertyValues, TemplateResult, } from "lit-element"; -import "../../../components/buttons/ha-call-service-button"; -import "../../../components/ha-card"; -import "../../../components/ha-service-description"; +import "../../../../../components/buttons/ha-call-service-button"; +import "../../../../../components/ha-card"; +import "../../../../../components/ha-service-description"; import { Attribute, Cluster, @@ -23,10 +23,10 @@ import { ReadAttributeServiceData, readAttributeValue, ZHADevice, -} from "../../../data/zha"; -import { haStyle } from "../../../resources/styles"; -import { HomeAssistant } from "../../../types"; -import "../ha-config-section"; +} from "../../../../../data/zha"; +import { haStyle } from "../../../../../resources/styles"; +import { HomeAssistant } from "../../../../../types"; +import "../../../ha-config-section"; import { formatAsPaddedHex } from "./functions"; import { ChangeEvent, diff --git a/src/panels/config/zha/zha-cluster-commands.ts b/src/panels/config/integrations/integration-panels/zha/zha-cluster-commands.ts similarity index 95% rename from src/panels/config/zha/zha-cluster-commands.ts rename to src/panels/config/integrations/integration-panels/zha/zha-cluster-commands.ts index 5f5c572f56..6c3165776a 100644 --- a/src/panels/config/zha/zha-cluster-commands.ts +++ b/src/panels/config/integrations/integration-panels/zha/zha-cluster-commands.ts @@ -1,5 +1,5 @@ import "@polymer/paper-dropdown-menu/paper-dropdown-menu"; -import "../../../components/ha-icon-button"; +import "../../../../../components/ha-icon-button"; import "@polymer/paper-input/paper-input"; import "@polymer/paper-item/paper-item"; import "@polymer/paper-listbox/paper-listbox"; @@ -12,18 +12,18 @@ import { PropertyValues, TemplateResult, } from "lit-element"; -import "../../../components/buttons/ha-call-service-button"; -import "../../../components/ha-card"; -import "../../../components/ha-service-description"; +import "../../../../../components/buttons/ha-call-service-button"; +import "../../../../../components/ha-card"; +import "../../../../../components/ha-service-description"; import { Cluster, Command, fetchCommandsForCluster, ZHADevice, -} from "../../../data/zha"; -import { haStyle } from "../../../resources/styles"; -import { HomeAssistant } from "../../../types"; -import "../ha-config-section"; +} from "../../../../../data/zha"; +import { haStyle } from "../../../../../resources/styles"; +import { HomeAssistant } from "../../../../../types"; +import "../../../ha-config-section"; import { formatAsPaddedHex } from "./functions"; import { ChangeEvent, diff --git a/src/panels/config/zha/zha-clusters-data-table.ts b/src/panels/config/integrations/integration-panels/zha/zha-clusters-data-table.ts similarity index 88% rename from src/panels/config/zha/zha-clusters-data-table.ts rename to src/panels/config/integrations/integration-panels/zha/zha-clusters-data-table.ts index e5750edcd3..54cad8cf74 100644 --- a/src/panels/config/zha/zha-clusters-data-table.ts +++ b/src/panels/config/integrations/integration-panels/zha/zha-clusters-data-table.ts @@ -7,14 +7,14 @@ import { TemplateResult, } from "lit-element"; import memoizeOne from "memoize-one"; -import "../../../components/data-table/ha-data-table"; +import "../../../../../components/data-table/ha-data-table"; import type { DataTableColumnContainer, HaDataTable, -} from "../../../components/data-table/ha-data-table"; -import "../../../components/entity/ha-state-icon"; -import type { Cluster } from "../../../data/zha"; -import type { HomeAssistant } from "../../../types"; +} from "../../../../../components/data-table/ha-data-table"; +import "../../../../../components/entity/ha-state-icon"; +import type { Cluster } from "../../../../../data/zha"; +import type { HomeAssistant } from "../../../../../types"; import { formatAsPaddedHex } from "./functions"; export interface ClusterRowData extends Cluster { diff --git a/src/panels/config/zha/zha-clusters.ts b/src/panels/config/integrations/integration-panels/zha/zha-clusters.ts similarity index 89% rename from src/panels/config/zha/zha-clusters.ts rename to src/panels/config/integrations/integration-panels/zha/zha-clusters.ts index 5c1d6a33e1..c47232bf71 100644 --- a/src/panels/config/zha/zha-clusters.ts +++ b/src/panels/config/integrations/integration-panels/zha/zha-clusters.ts @@ -1,5 +1,5 @@ import "@polymer/paper-dropdown-menu/paper-dropdown-menu"; -import "../../../components/ha-icon-button"; +import "../../../../../components/ha-icon-button"; import "@polymer/paper-item/paper-item"; import "@polymer/paper-listbox/paper-listbox"; import { @@ -11,14 +11,18 @@ import { PropertyValues, TemplateResult, } from "lit-element"; -import { fireEvent } from "../../../common/dom/fire_event"; -import "../../../components/buttons/ha-call-service-button"; -import "../../../components/ha-card"; -import "../../../components/ha-service-description"; -import { Cluster, fetchClustersForZhaNode, ZHADevice } from "../../../data/zha"; -import { haStyle } from "../../../resources/styles"; -import { HomeAssistant } from "../../../types"; -import "../ha-config-section"; +import { fireEvent } from "../../../../../common/dom/fire_event"; +import "../../../../../components/buttons/ha-call-service-button"; +import "../../../../../components/ha-card"; +import "../../../../../components/ha-service-description"; +import { + Cluster, + fetchClustersForZhaNode, + ZHADevice, +} from "../../../../../data/zha"; +import { haStyle } from "../../../../../resources/styles"; +import { HomeAssistant } from "../../../../../types"; +import "../../../ha-config-section"; import { computeClusterKey } from "./functions"; import { ItemSelectedEvent } from "./types"; diff --git a/src/panels/config/zha/zha-config-dashboard-router.ts b/src/panels/config/integrations/integration-panels/zha/zha-config-dashboard-router.ts similarity index 73% rename from src/panels/config/zha/zha-config-dashboard-router.ts rename to src/panels/config/integrations/integration-panels/zha/zha-config-dashboard-router.ts index fe71707a75..b6e72c457f 100644 --- a/src/panels/config/zha/zha-config-dashboard-router.ts +++ b/src/panels/config/integrations/integration-panels/zha/zha-config-dashboard-router.ts @@ -2,8 +2,9 @@ import { customElement, property } from "lit-element"; import { HassRouterPage, RouterOptions, -} from "../../../layouts/hass-router-page"; -import { HomeAssistant } from "../../../types"; +} from "../../../../../layouts/hass-router-page"; +import { HomeAssistant } from "../../../../../types"; +import { navigate } from "../../../../../common/navigate"; @customElement("zha-config-dashboard-router") class ZHAConfigDashboardRouter extends HassRouterPage { @@ -13,6 +14,10 @@ class ZHAConfigDashboardRouter extends HassRouterPage { @property() public narrow!: boolean; + private _configEntry = new URLSearchParams(window.location.search).get( + "config_entry" + ); + protected routerOptions: RouterOptions = { defaultPage: "dashboard", showLoading: true, @@ -24,13 +29,6 @@ class ZHAConfigDashboardRouter extends HassRouterPage { /* webpackChunkName: "zha-config-dashboard" */ "./zha-config-dashboard" ), }, - device: { - tag: "zha-device-page", - load: () => - import( - /* webpackChunkName: "zha-devices-page" */ "./zha-device-page" - ), - }, add: { tag: "zha-add-devices-page", load: () => @@ -65,11 +63,24 @@ class ZHAConfigDashboardRouter extends HassRouterPage { el.hass = this.hass; el.isWide = this.isWide; el.narrow = this.narrow; + el.configEntryId = this._configEntry; if (this._currentPage === "group") { el.groupId = this.routeTail.path.substr(1); } else if (this._currentPage === "device") { el.ieee = this.routeTail.path.substr(1); } + + const searchParams = new URLSearchParams(window.location.search); + if (this._configEntry && !searchParams.has("config_entry")) { + searchParams.append("config_entry", this._configEntry); + navigate( + this, + `${this.routeTail.prefix}${ + this.routeTail.path + }?${searchParams.toString()}`, + true + ); + } } } diff --git a/src/panels/config/integrations/integration-panels/zha/zha-config-dashboard.ts b/src/panels/config/integrations/integration-panels/zha/zha-config-dashboard.ts new file mode 100644 index 0000000000..7000ba3f75 --- /dev/null +++ b/src/panels/config/integrations/integration-panels/zha/zha-config-dashboard.ts @@ -0,0 +1,132 @@ +import "@polymer/paper-item/paper-item"; +import "@polymer/paper-item/paper-item-body"; +import "@material/mwc-fab"; +import { + css, + CSSResultArray, + customElement, + html, + LitElement, + property, + TemplateResult, +} from "lit-element"; +import "../../../../../components/ha-card"; +import "../../../../../components/ha-icon-next"; +import { haStyle } from "../../../../../resources/styles"; +import type { HomeAssistant, Route } from "../../../../../types"; +import "../../../ha-config-section"; +import { mdiNetwork, mdiFolderMultipleOutline, mdiPlus } from "@mdi/js"; +import "../../../../../layouts/hass-tabs-subpage"; +import type { PageNavigation } from "../../../../../layouts/hass-tabs-subpage"; +import { computeRTL } from "../../../../../common/util/compute_rtl"; + +export const zhaTabs: PageNavigation[] = [ + { + translationKey: "ui.panel.config.zha.network.caption", + path: `/config/zha/dashboard`, + iconPath: mdiNetwork, + }, + { + translationKey: "ui.panel.config.zha.groups.caption", + path: `/config/zha/groups`, + iconPath: mdiFolderMultipleOutline, + }, +]; + +@customElement("zha-config-dashboard") +class ZHAConfigDashboard extends LitElement { + @property({ type: Object }) public hass!: HomeAssistant; + + @property({ type: Object }) public route!: Route; + + @property({ type: Boolean }) public narrow!: boolean; + + @property({ type: Boolean }) public isWide!: boolean; + + @property() public configEntryId?: string; + + protected render(): TemplateResult { + return html` + + +
+ Network info/settings for specific config entry +
+ ${this.configEntryId + ? html`` + : ""} +
+ + + + + +
+ `; + } + + static get styles(): CSSResultArray { + return [ + haStyle, + css` + ha-card { + margin: auto; + margin-top: 16px; + max-width: 500px; + } + mwc-fab { + position: fixed; + bottom: 16px; + right: 16px; + z-index: 1; + } + + mwc-fab[is-wide] { + bottom: 24px; + right: 24px; + } + mwc-fab[narrow] { + bottom: 84px; + } + mwc-fab[rtl] { + right: auto; + left: 16px; + } + + mwc-fab[rtl][is-wide] { + bottom: 24px; + right: auto; + left: 24px; + } + `, + ]; + } +} + +declare global { + interface HTMLElementTagNameMap { + "zha-config-dashboard": ZHAConfigDashboard; + } +} diff --git a/src/panels/config/zha/zha-device-binding.ts b/src/panels/config/integrations/integration-panels/zha/zha-device-binding.ts similarity index 93% rename from src/panels/config/zha/zha-device-binding.ts rename to src/panels/config/integrations/integration-panels/zha/zha-device-binding.ts index 15acf51c37..fc688b1f8c 100644 --- a/src/panels/config/zha/zha-device-binding.ts +++ b/src/panels/config/integrations/integration-panels/zha/zha-device-binding.ts @@ -1,6 +1,6 @@ import "@material/mwc-button/mwc-button"; import "@polymer/paper-dropdown-menu/paper-dropdown-menu"; -import "../../../components/ha-icon-button"; +import "../../../../../components/ha-icon-button"; import "@polymer/paper-item/paper-item"; import "@polymer/paper-listbox/paper-listbox"; import { @@ -13,13 +13,13 @@ import { PropertyValues, TemplateResult, } from "lit-element"; -import "../../../components/buttons/ha-call-service-button"; -import "../../../components/ha-card"; -import "../../../components/ha-service-description"; -import { bindDevices, unbindDevices, ZHADevice } from "../../../data/zha"; -import { haStyle } from "../../../resources/styles"; -import { HomeAssistant } from "../../../types"; -import "../ha-config-section"; +import "../../../../../components/buttons/ha-call-service-button"; +import "../../../../../components/ha-card"; +import "../../../../../components/ha-service-description"; +import { bindDevices, unbindDevices, ZHADevice } from "../../../../../data/zha"; +import { haStyle } from "../../../../../resources/styles"; +import { HomeAssistant } from "../../../../../types"; +import "../../../ha-config-section"; import { ItemSelectedEvent } from "./types"; @customElement("zha-device-binding-control") diff --git a/src/panels/config/integrations/integration-panels/zha/zha-device-card.ts b/src/panels/config/integrations/integration-panels/zha/zha-device-card.ts new file mode 100644 index 0000000000..0da4c4e0bf --- /dev/null +++ b/src/panels/config/integrations/integration-panels/zha/zha-device-card.ts @@ -0,0 +1,243 @@ +import "@polymer/paper-input/paper-input"; +import "@polymer/paper-listbox/paper-listbox"; +import { UnsubscribeFunc } from "home-assistant-js-websocket"; +import { + css, + CSSResult, + customElement, + html, + LitElement, + property, + TemplateResult, +} from "lit-element"; +import { fireEvent } from "../../../../../common/dom/fire_event"; +import { computeStateName } from "../../../../../common/entity/compute_state_name"; +import "../../../../../components/buttons/ha-call-service-button"; +import "../../../../../components/entity/state-badge"; +import "../../../../../components/ha-card"; +import "../../../../../components/ha-service-description"; +import { updateDeviceRegistryEntry } from "../../../../../data/device_registry"; +import { ZHADevice } from "../../../../../data/zha"; +import { haStyle } from "../../../../../resources/styles"; +import { HomeAssistant } from "../../../../../types"; +import "../../../../../components/ha-area-picker"; +import { showAlertDialog } from "../../../../../dialogs/generic/show-dialog-box"; +import { SubscribeMixin } from "../../../../../mixins/subscribe-mixin"; +import { + subscribeEntityRegistry, + EntityRegistryEntry, + updateEntityRegistryEntry, +} from "../../../../../data/entity_registry"; +import { createValidEntityId } from "../../../../../common/entity/valid_entity_id"; +import memoizeOne from "memoize-one"; +import { EntityRegistryStateEntry } from "../../../devices/ha-config-device-page"; +import { compare } from "../../../../../common/string/compare"; +import { getIeeeTail } from "./functions"; + +@customElement("zha-device-card") +class ZHADeviceCard extends SubscribeMixin(LitElement) { + @property() public hass!: HomeAssistant; + + @property() public device?: ZHADevice; + + @property({ type: Boolean }) public narrow?: boolean; + + @property() private _entities: EntityRegistryEntry[] = []; + + private _deviceEntities = memoizeOne( + ( + deviceId: string, + entities: EntityRegistryEntry[] + ): EntityRegistryStateEntry[] => + entities + .filter((entity) => entity.device_id === deviceId) + .map((entity) => { + return { ...entity, stateName: this._computeEntityName(entity) }; + }) + .sort((ent1, ent2) => + compare( + ent1.stateName || `zzz${ent1.entity_id}`, + ent2.stateName || `zzz${ent2.entity_id}` + ) + ) + ); + + public hassSubscribe(): UnsubscribeFunc[] { + return [ + subscribeEntityRegistry(this.hass.connection, (entities) => { + this._entities = entities; + }), + ]; + } + + protected render(): TemplateResult { + if (!this.hass || !this.device) { + return html``; + } + const entities = this._deviceEntities( + this.device.device_reg_id, + this._entities + ); + + return html` + +
+
+
${this.device.model}
+
+ ${this.hass.localize( + "ui.dialogs.zha_device_info.manuf", + "manufacturer", + this.device.manufacturer + )} +
+
+ +
+ ${entities.map( + (entity) => html` + + ` + )} +
+ + +
+
+ `; + } + + private async _rename(event): Promise { + if (!this.hass || !this.device) { + return; + } + const device = this.device; + + const oldDeviceName = device.user_given_name || device.name; + const newDeviceName = event.target.value; + this.device.user_given_name = newDeviceName; + await updateDeviceRegistryEntry(this.hass, device.device_reg_id, { + name_by_user: newDeviceName, + }); + + if (!oldDeviceName || !newDeviceName || oldDeviceName === newDeviceName) { + return; + } + const entities = this._deviceEntities(device.device_reg_id, this._entities); + + const oldDeviceEntityId = createValidEntityId(oldDeviceName); + const newDeviceEntityId = createValidEntityId(newDeviceName); + const ieeeTail = getIeeeTail(device.ieee); + + const updateProms = entities.map((entity) => { + const name = entity.name || entity.stateName; + let newEntityId: string | null = null; + let newName: string | null = null; + + if (name && name.includes(oldDeviceName)) { + newName = name.replace(` ${ieeeTail}`, ""); + newName = newName.replace(oldDeviceName, newDeviceName); + newEntityId = entity.entity_id.replace(`_${ieeeTail}`, ""); + newEntityId = newEntityId.replace(oldDeviceEntityId, newDeviceEntityId); + } + + if (!newName && !newEntityId) { + return new Promise((resolve) => resolve()); + } + + return updateEntityRegistryEntry(this.hass!, entity.entity_id, { + name: newName || name, + disabled_by: entity.disabled_by, + new_entity_id: newEntityId || entity.entity_id, + }); + }); + await Promise.all(updateProms); + } + + private _openMoreInfo(ev: MouseEvent): void { + fireEvent(this, "hass-more-info", { + entityId: (ev.currentTarget as any).stateObj.entity_id, + }); + } + + private _computeEntityName(entity: EntityRegistryEntry): string { + if (this.hass.states[entity.entity_id]) { + return computeStateName(this.hass.states[entity.entity_id]); + } + return entity.name; + } + + private async _areaPicked(ev: CustomEvent) { + const picker = ev.currentTarget as any; + + const area = ev.detail.value; + try { + await updateDeviceRegistryEntry(this.hass, this.device!.device_reg_id, { + area_id: area, + }); + this.device!.area_id = area; + } catch (err) { + showAlertDialog(this, { + text: this.hass.localize( + "ui.panel.config.integrations.config_flow.error_saving_area", + "error", + err.message + ), + }); + picker.value = null; + } + } + + static get styles(): CSSResult[] { + return [ + haStyle, + css` + .device-entities { + display: flex; + flex-wrap: wrap; + padding: 4px; + justify-content: left; + min-height: 48px; + } + .device { + width: 30%; + } + .device .name { + font-weight: bold; + } + .device .manuf { + color: var(--secondary-text-color); + margin-bottom: 20px; + } + .extra-info { + margin-top: 8px; + } + state-badge { + cursor: pointer; + } + `, + ]; + } +} + +declare global { + interface HTMLElementTagNameMap { + "zha-device-card": ZHADeviceCard; + } +} diff --git a/src/panels/config/zha/zha-device-endpoint-data-table.ts b/src/panels/config/integrations/integration-panels/zha/zha-device-endpoint-data-table.ts similarity index 78% rename from src/panels/config/zha/zha-device-endpoint-data-table.ts rename to src/panels/config/integrations/integration-panels/zha/zha-device-endpoint-data-table.ts index e758bb79e0..e1c926b74e 100644 --- a/src/panels/config/zha/zha-device-endpoint-data-table.ts +++ b/src/panels/config/integrations/integration-panels/zha/zha-device-endpoint-data-table.ts @@ -9,16 +9,18 @@ import { CSSResult, } from "lit-element"; import memoizeOne from "memoize-one"; -import "../../../components/data-table/ha-data-table"; +import "../../../../../components/data-table/ha-data-table"; import type { DataTableColumnContainer, HaDataTable, DataTableRowData, -} from "../../../components/data-table/ha-data-table"; -import "../../../components/entity/ha-state-icon"; -import type { ZHADeviceEndpoint, ZHAEntityReference } from "../../../data/zha"; -import { showZHADeviceInfoDialog } from "../../../dialogs/zha-device-info-dialog/show-dialog-zha-device-info"; -import type { HomeAssistant } from "../../../types"; +} from "../../../../../components/data-table/ha-data-table"; +import "../../../../../components/entity/ha-state-icon"; +import type { + ZHADeviceEndpoint, + ZHAEntityReference, +} from "../../../../../data/zha"; +import type { HomeAssistant } from "../../../../../types"; export interface DeviceEndpointRowData extends DataTableRowData { id: string; @@ -55,6 +57,7 @@ export class ZHADeviceEndpointDataTable extends LitElement { ieee: deviceEndpoint.device.ieee, endpoint_id: deviceEndpoint.endpoint_id, entities: deviceEndpoint.entities, + dev_id: deviceEndpoint.device.device_reg_id, }); }); @@ -72,14 +75,10 @@ export class ZHADeviceEndpointDataTable extends LitElement { filterable: true, direction: "asc", grows: true, - template: (name) => html` -
+ template: (name, device: any) => html` + ${name} -
+ `, }, endpoint_id: { @@ -95,14 +94,10 @@ export class ZHADeviceEndpointDataTable extends LitElement { filterable: true, direction: "asc", grows: true, - template: (name) => html` -
+ template: (name, device: any) => html` + ${name} -
+ `, }, endpoint_id: { @@ -156,14 +151,6 @@ export class ZHADeviceEndpointDataTable extends LitElement { `; } - private async _handleClicked(ev: CustomEvent) { - const rowId = ((ev.target as HTMLElement).closest( - ".mdc-data-table__row" - ) as any).rowId; - const ieee = rowId.substring(0, rowId.indexOf("_")); - showZHADeviceInfoDialog(this, { ieee }); - } - static get styles(): CSSResult[] { return [ css` diff --git a/src/panels/config/zha/zha-group-binding.ts b/src/panels/config/integrations/integration-panels/zha/zha-group-binding.ts similarity index 93% rename from src/panels/config/zha/zha-group-binding.ts rename to src/panels/config/integrations/integration-panels/zha/zha-group-binding.ts index 64d8969831..884d6f727a 100644 --- a/src/panels/config/zha/zha-group-binding.ts +++ b/src/panels/config/integrations/integration-panels/zha/zha-group-binding.ts @@ -1,6 +1,6 @@ import "@material/mwc-button/mwc-button"; import "@polymer/paper-dropdown-menu/paper-dropdown-menu"; -import "../../../components/ha-icon-button"; +import "../../../../../components/ha-icon-button"; import "@polymer/paper-item/paper-item"; import "@polymer/paper-listbox/paper-listbox"; import { @@ -14,11 +14,11 @@ import { query, TemplateResult, } from "lit-element"; -import type { HASSDomEvent } from "../../../common/dom/fire_event"; -import "../../../components/buttons/ha-call-service-button"; -import { SelectionChangedEvent } from "../../../components/data-table/ha-data-table"; -import "../../../components/ha-card"; -import "../../../components/ha-service-description"; +import type { HASSDomEvent } from "../../../../../common/dom/fire_event"; +import "../../../../../components/buttons/ha-call-service-button"; +import { SelectionChangedEvent } from "../../../../../components/data-table/ha-data-table"; +import "../../../../../components/ha-card"; +import "../../../../../components/ha-service-description"; import { bindDeviceToGroup, Cluster, @@ -26,10 +26,10 @@ import { unbindDeviceFromGroup, ZHADevice, ZHAGroup, -} from "../../../data/zha"; -import { haStyle } from "../../../resources/styles"; -import type { HomeAssistant } from "../../../types"; -import "../ha-config-section"; +} from "../../../../../data/zha"; +import { haStyle } from "../../../../../resources/styles"; +import type { HomeAssistant } from "../../../../../types"; +import "../../../ha-config-section"; import { ItemSelectedEvent } from "./types"; import "./zha-clusters-data-table"; import type { ZHAClustersDataTable } from "./zha-clusters-data-table"; diff --git a/src/panels/config/zha/zha-group-page.ts b/src/panels/config/integrations/integration-panels/zha/zha-group-page.ts similarity index 87% rename from src/panels/config/zha/zha-group-page.ts rename to src/panels/config/integrations/integration-panels/zha/zha-group-page.ts index 461df7d9fd..9e798f5832 100644 --- a/src/panels/config/zha/zha-group-page.ts +++ b/src/panels/config/integrations/integration-panels/zha/zha-group-page.ts @@ -1,5 +1,5 @@ import "@material/mwc-button"; -import "../../../components/ha-icon-button"; +import "../../../../../components/ha-icon-button"; import "@polymer/paper-spinner/paper-spinner"; import { css, @@ -11,9 +11,9 @@ import { PropertyValues, query, } from "lit-element"; -import { HASSDomEvent } from "../../../common/dom/fire_event"; -import { navigate } from "../../../common/navigate"; -import { SelectionChangedEvent } from "../../../components/data-table/ha-data-table"; +import { HASSDomEvent } from "../../../../../common/dom/fire_event"; +import { navigate } from "../../../../../common/navigate"; +import { SelectionChangedEvent } from "../../../../../components/data-table/ha-data-table"; import { addMembersToGroup, fetchGroup, @@ -22,13 +22,12 @@ import { removeMembersFromGroup, ZHAGroup, ZHADeviceEndpoint, -} from "../../../data/zha"; -import "../../../layouts/hass-error-screen"; -import "../../../layouts/hass-subpage"; -import { HomeAssistant } from "../../../types"; -import "../ha-config-section"; +} from "../../../../../data/zha"; +import "../../../../../layouts/hass-error-screen"; +import "../../../../../layouts/hass-subpage"; +import { HomeAssistant } from "../../../../../types"; +import "../../../ha-config-section"; import { formatAsPaddedHex } from "./functions"; -import "./zha-device-card"; import "./zha-device-endpoint-data-table"; import type { ZHADeviceEndpointDataTable } from "./zha-device-endpoint-data-table"; @@ -122,25 +121,26 @@ export class ZHAGroupPage extends LitElement {
${this.hass.localize("ui.panel.config.zha.groups.members")}
- - ${this.group.members.length - ? this.group.members.map( - (member) => html` - - ` - ) - : html` -

- This group has no members -

- `} + + ${this.group.members.length + ? this.group.members.map( + (member) => + html` + ${member.device.user_given_name || + member.device.name} + ` + ) + : html` + + This group has no members + + `} + ${this.group.members.length ? html`
@@ -285,6 +285,9 @@ export class ZHAGroupPage extends LitElement { static get styles(): CSSResult[] { return [ css` + hass-subpage { + --app-header-text-color: var(--sidebar-icon-color); + } .header { font-family: var(--paper-font-display1_-_font-family); -webkit-font-smoothing: var( @@ -297,14 +300,15 @@ export class ZHAGroupPage extends LitElement { opacity: var(--dark-primary-opacity); } - ha-config-section *:last-child { - padding-bottom: 24px; - } - .button { float: right; } + a { + color: var(--primary-color); + text-decoration: none; + } + mwc-button paper-spinner { width: 14px; height: 14px; diff --git a/src/panels/config/integrations/integration-panels/zha/zha-groups-dashboard.ts b/src/panels/config/integrations/integration-panels/zha/zha-groups-dashboard.ts new file mode 100644 index 0000000000..a344750e00 --- /dev/null +++ b/src/panels/config/integrations/integration-panels/zha/zha-groups-dashboard.ts @@ -0,0 +1,193 @@ +import "@material/mwc-button"; +import "@material/mwc-fab"; +import "../../../../../components/ha-icon-button"; +import memoizeOne from "memoize-one"; +import { + customElement, + html, + LitElement, + property, + PropertyValues, + TemplateResult, + CSSResultArray, + css, +} from "lit-element"; +import { HASSDomEvent } from "../../../../../common/dom/fire_event"; +import { navigate } from "../../../../../common/navigate"; +import { + DataTableColumnContainer, + RowClickedEvent, +} from "../../../../../components/data-table/ha-data-table"; +import { fetchGroups, ZHAGroup, ZHADevice } from "../../../../../data/zha"; +import "../../../../../layouts/hass-tabs-subpage-data-table"; +import { HomeAssistant, Route } from "../../../../../types"; +import { sortZHAGroups, formatAsPaddedHex } from "./functions"; +import { zhaTabs } from "./zha-config-dashboard"; +import { computeRTL } from "../../../../../common/util/compute_rtl"; +import { mdiPlus } from "@mdi/js"; +import { haStyle } from "../../../../../resources/styles"; + +export interface GroupRowData extends ZHAGroup { + group?: GroupRowData; + id?: string; +} + +@customElement("zha-groups-dashboard") +export class ZHAGroupsDashboard extends LitElement { + @property() public hass!: HomeAssistant; + + @property({ type: Object }) public route!: Route; + + @property({ type: Boolean }) public narrow!: boolean; + + @property({ type: Boolean }) public isWide!: boolean; + + @property() public _groups: ZHAGroup[] = []; + + private _firstUpdatedCalled = false; + + public connectedCallback(): void { + super.connectedCallback(); + if (this.hass && this._firstUpdatedCalled) { + this._fetchGroups(); + } + } + + protected firstUpdated(changedProperties: PropertyValues): void { + super.firstUpdated(changedProperties); + if (this.hass) { + this._fetchGroups(); + } + this._firstUpdatedCalled = true; + } + + private _formattedGroups = memoizeOne((groups: ZHAGroup[]) => { + let outputGroups: GroupRowData[] = groups; + + outputGroups = outputGroups.map((group) => { + return { + ...group, + id: String(group.group_id), + }; + }); + + return outputGroups; + }); + + private _columns = memoizeOne( + (narrow: boolean): DataTableColumnContainer => + narrow + ? { + name: { + title: "Group", + sortable: true, + filterable: true, + direction: "asc", + grows: true, + }, + } + : { + name: { + title: this.hass.localize("ui.panel.config.zha.groups.groups"), + sortable: true, + filterable: true, + direction: "asc", + grows: true, + }, + group_id: { + title: this.hass.localize("ui.panel.config.zha.groups.group_id"), + type: "numeric", + width: "15%", + template: (groupId: number) => { + return html` ${formatAsPaddedHex(groupId)} `; + }, + sortable: true, + }, + members: { + title: this.hass.localize("ui.panel.config.zha.groups.members"), + type: "numeric", + width: "15%", + template: (members: ZHADevice[]) => { + return html` ${members.length} `; + }, + sortable: true, + }, + } + ); + + protected render(): TemplateResult { + return html` + + + + + + + + `; + } + + private async _fetchGroups() { + this._groups = (await fetchGroups(this.hass!)).sort(sortZHAGroups); + } + + private _handleRowClicked(ev: HASSDomEvent) { + const groupId = ev.detail.id; + navigate(this, `/config/zha/group/${groupId}`); + } + + static get styles(): CSSResultArray { + return [ + haStyle, + css` + mwc-fab { + position: fixed; + bottom: 16px; + right: 16px; + z-index: 1; + } + + mwc-fab[is-wide] { + bottom: 24px; + right: 24px; + } + mwc-fab[narrow] { + bottom: 84px; + } + mwc-fab[rtl] { + right: auto; + left: 16px; + } + + mwc-fab[rtl][is-wide] { + bottom: 24px; + right: auto; + left: 24px; + } + + a { + color: var(--primary-color); + } + `, + ]; + } +} + +declare global { + interface HTMLElementTagNameMap { + "zha-groups-dashboard": ZHAGroupsDashboard; + } +} diff --git a/src/panels/config/zwave/ha-config-zwave.js b/src/panels/config/integrations/integration-panels/zwave/ha-config-zwave.js similarity index 95% rename from src/panels/config/zwave/ha-config-zwave.js rename to src/panels/config/integrations/integration-panels/zwave/ha-config-zwave.js index bcaf952720..a292ccab6f 100644 --- a/src/panels/config/zwave/ha-config-zwave.js +++ b/src/panels/config/integrations/integration-panels/zwave/ha-config-zwave.js @@ -1,27 +1,27 @@ import "@polymer/app-layout/app-header/app-header"; import "@polymer/app-layout/app-toolbar/app-toolbar"; import "@polymer/paper-dropdown-menu/paper-dropdown-menu"; -import "../../../components/ha-icon-button"; +import "../../../../../components/ha-icon-button"; import "@polymer/paper-input/paper-input"; import "@polymer/paper-item/paper-item"; import "@polymer/paper-listbox/paper-listbox"; import { html } from "@polymer/polymer/lib/utils/html-tag"; /* eslint-plugin-disable lit */ import { PolymerElement } from "@polymer/polymer/polymer-element"; -import { computeStateDomain } from "../../../common/entity/compute_state_domain"; -import { computeStateName } from "../../../common/entity/compute_state_name"; -import { sortStatesByName } from "../../../common/entity/states_sort_by_name"; -import "../../../components/buttons/ha-call-service-button"; -import "../../../components/ha-card"; -import "../../../components/ha-menu-button"; -import "../../../components/ha-icon-button-arrow-prev"; -import "../../../components/ha-service-description"; -import "../../../layouts/ha-app-layout"; -import { EventsMixin } from "../../../mixins/events-mixin"; -import LocalizeMixin from "../../../mixins/localize-mixin"; -import "../../../styles/polymer-ha-style"; -import "../ha-config-section"; -import "../ha-form-style"; +import { computeStateDomain } from "../../../../../common/entity/compute_state_domain"; +import { computeStateName } from "../../../../../common/entity/compute_state_name"; +import { sortStatesByName } from "../../../../../common/entity/states_sort_by_name"; +import "../../../../../components/buttons/ha-call-service-button"; +import "../../../../../components/ha-card"; +import "../../../../../components/ha-menu-button"; +import "../../../../../components/ha-icon-button-arrow-prev"; +import "../../../../../components/ha-service-description"; +import "../../../../../layouts/ha-app-layout"; +import { EventsMixin } from "../../../../../mixins/events-mixin"; +import LocalizeMixin from "../../../../../mixins/localize-mixin"; +import "../../../../../styles/polymer-ha-style"; +import "../../../ha-config-section"; +import "../../../ha-form-style"; import "./zwave-groups"; import "./zwave-log"; import "./zwave-network"; diff --git a/src/panels/config/zwave/zwave-groups.js b/src/panels/config/integrations/integration-panels/zwave/zwave-groups.js similarity index 97% rename from src/panels/config/zwave/zwave-groups.js rename to src/panels/config/integrations/integration-panels/zwave/zwave-groups.js index a2d0dd2585..102567a289 100644 --- a/src/panels/config/zwave/zwave-groups.js +++ b/src/panels/config/integrations/integration-panels/zwave/zwave-groups.js @@ -4,10 +4,10 @@ import "@polymer/paper-listbox/paper-listbox"; import { html } from "@polymer/polymer/lib/utils/html-tag"; /* eslint-plugin-disable lit */ import { PolymerElement } from "@polymer/polymer/polymer-element"; -import { computeStateName } from "../../../common/entity/compute_state_name"; -import "../../../components/buttons/ha-call-service-button"; -import "../../../components/ha-card"; -import "../../../styles/polymer-ha-style"; +import { computeStateName } from "../../../../../common/entity/compute_state_name"; +import "../../../../../components/buttons/ha-call-service-button"; +import "../../../../../components/ha-card"; +import "../../../../../styles/polymer-ha-style"; class ZwaveGroups extends PolymerElement { static get template() { diff --git a/src/panels/config/zwave/zwave-log-dialog.js b/src/panels/config/integrations/integration-panels/zwave/zwave-log-dialog.js similarity index 91% rename from src/panels/config/zwave/zwave-log-dialog.js rename to src/panels/config/integrations/integration-panels/zwave/zwave-log-dialog.js index f3e16d2c63..14fe3153f3 100644 --- a/src/panels/config/zwave/zwave-log-dialog.js +++ b/src/panels/config/integrations/integration-panels/zwave/zwave-log-dialog.js @@ -2,9 +2,9 @@ import "@polymer/paper-dialog-scrollable/paper-dialog-scrollable"; import { html } from "@polymer/polymer/lib/utils/html-tag"; /* eslint-plugin-disable lit */ import { PolymerElement } from "@polymer/polymer/polymer-element"; -import "../../../components/dialog/ha-paper-dialog"; -import { EventsMixin } from "../../../mixins/events-mixin"; -import "../../../styles/polymer-ha-style-dialog"; +import "../../../../../components/dialog/ha-paper-dialog"; +import { EventsMixin } from "../../../../../mixins/events-mixin"; +import "../../../../../styles/polymer-ha-style-dialog"; class ZwaveLogDialog extends EventsMixin(PolymerElement) { static get template() { diff --git a/src/panels/config/zwave/zwave-log.js b/src/panels/config/integrations/integration-panels/zwave/zwave-log.js similarity index 92% rename from src/panels/config/zwave/zwave-log.js rename to src/panels/config/integrations/integration-panels/zwave/zwave-log.js index 05ea015bb6..4dd0ac2d55 100755 --- a/src/panels/config/zwave/zwave-log.js +++ b/src/panels/config/integrations/integration-panels/zwave/zwave-log.js @@ -4,12 +4,12 @@ import "@polymer/paper-input/paper-input"; import { html } from "@polymer/polymer/lib/utils/html-tag"; /* eslint-plugin-disable lit */ import { PolymerElement } from "@polymer/polymer/polymer-element"; -import isPwa from "../../../common/config/is_pwa"; -import "../../../components/ha-card"; -import { EventsMixin } from "../../../mixins/events-mixin"; -import LocalizeMixin from "../../../mixins/localize-mixin"; -import "../ha-config-section"; -import "../../../styles/polymer-ha-style"; +import isPwa from "../../../../../common/config/is_pwa"; +import "../../../../../components/ha-card"; +import { EventsMixin } from "../../../../../mixins/events-mixin"; +import LocalizeMixin from "../../../../../mixins/localize-mixin"; +import "../../../ha-config-section"; +import "../../../../../styles/polymer-ha-style"; let registeredDialog = false; diff --git a/src/panels/config/zwave/zwave-network.ts b/src/panels/config/integrations/integration-panels/zwave/zwave-network.ts similarity index 94% rename from src/panels/config/zwave/zwave-network.ts rename to src/panels/config/integrations/integration-panels/zwave/zwave-network.ts index 570d12d512..c0dbc7bbbc 100644 --- a/src/panels/config/zwave/zwave-network.ts +++ b/src/panels/config/integrations/integration-panels/zwave/zwave-network.ts @@ -1,4 +1,4 @@ -import "../../../components/ha-icon-button"; +import "../../../../../components/ha-icon-button"; import "@polymer/paper-spinner/paper-spinner"; import { UnsubscribeFunc } from "home-assistant-js-websocket"; import { @@ -10,11 +10,11 @@ import { property, TemplateResult, } from "lit-element"; -import "../../../components/buttons/ha-call-api-button"; -import "../../../components/buttons/ha-call-service-button"; -import "../../../components/ha-card"; -import "../../../components/ha-icon"; -import "../../../components/ha-service-description"; +import "../../../../../components/buttons/ha-call-api-button"; +import "../../../../../components/buttons/ha-call-service-button"; +import "../../../../../components/ha-card"; +import "../../../../../components/ha-icon"; +import "../../../../../components/ha-service-description"; import { fetchNetworkStatus, ZWaveNetworkStatus, @@ -22,10 +22,10 @@ import { ZWAVE_NETWORK_STATE_READY, ZWAVE_NETWORK_STATE_STARTED, ZWAVE_NETWORK_STATE_STOPPED, -} from "../../../data/zwave"; -import { haStyle } from "../../../resources/styles"; -import { HomeAssistant } from "../../../types"; -import "../ha-config-section"; +} from "../../../../../data/zwave"; +import { haStyle } from "../../../../../resources/styles"; +import { HomeAssistant } from "../../../../../types"; +import "../../../ha-config-section"; @customElement("zwave-network") export class ZwaveNetwork extends LitElement { diff --git a/src/panels/config/zwave/zwave-node-config.ts b/src/panels/config/integrations/integration-panels/zwave/zwave-node-config.ts similarity index 97% rename from src/panels/config/zwave/zwave-node-config.ts rename to src/panels/config/integrations/integration-panels/zwave/zwave-node-config.ts index b50ef6f2c7..831ee5a86b 100644 --- a/src/panels/config/zwave/zwave-node-config.ts +++ b/src/panels/config/integrations/integration-panels/zwave/zwave-node-config.ts @@ -12,16 +12,16 @@ import { PropertyValues, TemplateResult, } from "lit-element"; -import "../../../components/buttons/ha-call-service-button"; -import "../../../components/ha-card"; +import "../../../../../components/buttons/ha-call-service-button"; +import "../../../../../components/ha-card"; import { fetchNodeConfig, ZWaveConfigItem, ZWaveConfigServiceData, ZWaveNode, -} from "../../../data/zwave"; -import { haStyle } from "../../../resources/styles"; -import { HomeAssistant } from "../../../types"; +} from "../../../../../data/zwave"; +import { haStyle } from "../../../../../resources/styles"; +import { HomeAssistant } from "../../../../../types"; @customElement("zwave-node-config") export class ZwaveNodeConfig extends LitElement { diff --git a/src/panels/config/zwave/zwave-node-protection.js b/src/panels/config/integrations/integration-panels/zwave/zwave-node-protection.js similarity index 96% rename from src/panels/config/zwave/zwave-node-protection.js rename to src/panels/config/integrations/integration-panels/zwave/zwave-node-protection.js index 292fb80bfe..0c6d1a464a 100644 --- a/src/panels/config/zwave/zwave-node-protection.js +++ b/src/panels/config/integrations/integration-panels/zwave/zwave-node-protection.js @@ -5,9 +5,9 @@ import "@polymer/paper-listbox/paper-listbox"; import { html } from "@polymer/polymer/lib/utils/html-tag"; /* eslint-plugin-disable lit */ import { PolymerElement } from "@polymer/polymer/polymer-element"; -import "../../../components/buttons/ha-call-api-button"; -import "../../../components/ha-card"; -import "../../../styles/polymer-ha-style"; +import "../../../../../components/buttons/ha-call-api-button"; +import "../../../../../components/ha-card"; +import "../../../../../styles/polymer-ha-style"; class ZwaveNodeProtection extends PolymerElement { static get template() { diff --git a/src/panels/config/zwave/zwave-usercodes.js b/src/panels/config/integrations/integration-panels/zwave/zwave-usercodes.js similarity index 97% rename from src/panels/config/zwave/zwave-usercodes.js rename to src/panels/config/integrations/integration-panels/zwave/zwave-usercodes.js index 316bc5e7f6..fcdd099185 100644 --- a/src/panels/config/zwave/zwave-usercodes.js +++ b/src/panels/config/integrations/integration-panels/zwave/zwave-usercodes.js @@ -5,9 +5,9 @@ import "@polymer/paper-listbox/paper-listbox"; import { html } from "@polymer/polymer/lib/utils/html-tag"; /* eslint-plugin-disable lit */ import { PolymerElement } from "@polymer/polymer/polymer-element"; -import "../../../components/buttons/ha-call-service-button"; -import "../../../components/ha-card"; -import "../../../styles/polymer-ha-style"; +import "../../../../../components/buttons/ha-call-service-button"; +import "../../../../../components/ha-card"; +import "../../../../../styles/polymer-ha-style"; class ZwaveUsercodes extends PolymerElement { static get template() { diff --git a/src/panels/config/zwave/zwave-values.ts b/src/panels/config/integrations/integration-panels/zwave/zwave-values.ts similarity index 90% rename from src/panels/config/zwave/zwave-values.ts rename to src/panels/config/integrations/integration-panels/zwave/zwave-values.ts index 20b5eeec35..5e60dd8c2b 100644 --- a/src/panels/config/zwave/zwave-values.ts +++ b/src/panels/config/integrations/integration-panels/zwave/zwave-values.ts @@ -10,11 +10,11 @@ import { property, TemplateResult, } from "lit-element"; -import "../../../components/buttons/ha-call-service-button"; -import "../../../components/ha-card"; -import { ZWaveValue } from "../../../data/zwave"; -import { haStyle } from "../../../resources/styles"; -import { HomeAssistant } from "../../../types"; +import "../../../../../components/buttons/ha-call-service-button"; +import "../../../../../components/ha-card"; +import { ZWaveValue } from "../../../../../data/zwave"; +import { haStyle } from "../../../../../resources/styles"; +import { HomeAssistant } from "../../../../../types"; @customElement("zwave-values") export class ZwaveValues extends LitElement { diff --git a/src/panels/config/zha/zha-config-dashboard.ts b/src/panels/config/zha/zha-config-dashboard.ts deleted file mode 100644 index 88422f56c8..0000000000 --- a/src/panels/config/zha/zha-config-dashboard.ts +++ /dev/null @@ -1,188 +0,0 @@ -import "@polymer/paper-item/paper-item"; -import "@polymer/paper-item/paper-item-body"; -import { - css, - CSSResultArray, - customElement, - html, - LitElement, - property, - PropertyValues, - TemplateResult, -} from "lit-element"; -import memoizeOne from "memoize-one"; -import { navigate } from "../../../common/navigate"; -import "../../../components/data-table/ha-data-table"; -import type { - DataTableColumnContainer, - RowClickedEvent, - DataTableRowData, -} from "../../../components/data-table/ha-data-table"; -import "../../../components/ha-card"; -import "../../../components/ha-icon-next"; -import { fetchDevices } from "../../../data/zha"; -import type { ZHADevice } from "../../../data/zha"; -import "../../../layouts/hass-subpage"; -import { haStyle } from "../../../resources/styles"; -import type { HomeAssistant, Route } from "../../../types"; -import "../ha-config-section"; -import { formatAsPaddedHex, sortZHADevices } from "./functions"; - -export interface DeviceRowData extends DataTableRowData { - device?: DeviceRowData; -} - -@customElement("zha-config-dashboard") -class ZHAConfigDashboard extends LitElement { - @property({ type: Object }) public hass!: HomeAssistant; - - @property({ type: Object }) public route!: Route; - - @property({ type: Boolean }) public narrow!: boolean; - - @property({ type: Boolean }) public isWide!: boolean; - - @property() private _devices: ZHADevice[] = []; - - private pages: string[] = ["add", "groups"]; - - private _firstUpdatedCalled = false; - - private _memoizeDevices = memoizeOne((devices: ZHADevice[]) => { - let outputDevices: DeviceRowData[] = devices; - - outputDevices = outputDevices.map((device) => { - return { - ...device, - name: device.user_given_name ? device.user_given_name : device.name, - nwk: formatAsPaddedHex(device.nwk), - }; - }); - - return outputDevices; - }); - - private _columns = memoizeOne( - (narrow: boolean): DataTableColumnContainer => - narrow - ? { - name: { - title: "Devices", - sortable: true, - filterable: true, - direction: "asc", - grows: true, - }, - } - : { - name: { - title: "Name", - sortable: true, - filterable: true, - direction: "asc", - grows: true, - }, - nwk: { - title: "Nwk", - sortable: true, - filterable: true, - width: "15%", - }, - ieee: { - title: "IEEE", - sortable: true, - filterable: true, - width: "30%", - }, - } - ); - - public connectedCallback(): void { - super.connectedCallback(); - if (this.hass && this._firstUpdatedCalled) { - this._fetchDevices(); - } - } - - protected firstUpdated(changedProperties: PropertyValues): void { - super.firstUpdated(changedProperties); - if (this.hass) { - this._fetchDevices(); - } - this._firstUpdatedCalled = true; - } - - protected render(): TemplateResult { - return html` - - -
- ${this.hass.localize("ui.panel.config.zha.header")} -
- -
- ${this.hass.localize("ui.panel.config.zha.introduction")} -
- - - ${this.pages.map((page) => { - return html` - - - - ${this.hass.localize( - `ui.panel.config.zha.${page}.caption` - )} -
- ${this.hass.localize( - `ui.panel.config.zha.${page}.description` - )} -
-
- -
-
- `; - })} -
- - - -
-
- `; - } - - private async _fetchDevices() { - this._devices = (await fetchDevices(this.hass!)).sort(sortZHADevices); - } - - private async _handleDeviceClicked(ev: CustomEvent) { - const deviceId = (ev.detail as RowClickedEvent).id; - navigate(this, `/config/zha/device/${deviceId}`); - } - - static get styles(): CSSResultArray { - return [ - haStyle, - css` - a { - text-decoration: none; - color: var(--primary-text-color); - } - `, - ]; - } -} - -declare global { - interface HTMLElementTagNameMap { - "zha-config-dashboard": ZHAConfigDashboard; - } -} diff --git a/src/panels/config/zha/zha-device-card.ts b/src/panels/config/zha/zha-device-card.ts deleted file mode 100644 index 1bac828040..0000000000 --- a/src/panels/config/zha/zha-device-card.ts +++ /dev/null @@ -1,566 +0,0 @@ -import "@material/mwc-button"; -import "@polymer/paper-dropdown-menu/paper-dropdown-menu"; -import "@polymer/paper-input/paper-input"; -import "@polymer/paper-item/paper-icon-item"; -import "@polymer/paper-item/paper-item"; -import "@polymer/paper-item/paper-item-body"; -import "@polymer/paper-listbox/paper-listbox"; -import { HassEvent, UnsubscribeFunc } from "home-assistant-js-websocket"; -import { - css, - CSSResult, - customElement, - html, - LitElement, - property, - PropertyValues, - TemplateResult, -} from "lit-element"; -import { fireEvent } from "../../../common/dom/fire_event"; -import { computeStateName } from "../../../common/entity/compute_state_name"; -import { navigate } from "../../../common/navigate"; -import "../../../components/buttons/ha-call-service-button"; -import "../../../components/entity/state-badge"; -import "../../../components/ha-card"; -import "../../../components/ha-service-description"; -import { - AreaRegistryEntry, - subscribeAreaRegistry, -} from "../../../data/area_registry"; -import { - DeviceRegistryEntryMutableParams, - updateDeviceRegistryEntry, -} from "../../../data/device_registry"; -import { - reconfigureNode, - ZHADevice, - ZHAEntityReference, -} from "../../../data/zha"; -import { showZHADeviceZigbeeInfoDialog } from "../../../dialogs/zha-device-zigbee-signature-dialog/show-dialog-zha-device-zigbee-info"; -import { haStyle } from "../../../resources/styles"; -import { HomeAssistant } from "../../../types"; -import { addEntitiesToLovelaceView } from "../../lovelace/editor/add-entities-to-view"; -import { formatAsPaddedHex } from "./functions"; -import { ItemSelectedEvent, NodeServiceData } from "./types"; - -declare global { - // for fire event - interface HASSDomEvents { - "zha-device-removed": { - device?: ZHADevice; - }; - } -} - -@customElement("zha-device-card") -class ZHADeviceCard extends LitElement { - @property() public hass!: HomeAssistant; - - @property() public device?: ZHADevice; - - @property({ type: Boolean }) public narrow?: boolean; - - @property({ type: Boolean }) public showHelp?: boolean = false; - - @property({ type: Boolean }) public showActions?: boolean = true; - - @property({ type: Boolean }) public showName?: boolean = true; - - @property({ type: Boolean }) public showEntityDetail?: boolean = true; - - @property({ type: Boolean }) public showModelInfo?: boolean = true; - - @property({ type: Boolean }) public showEditableInfo?: boolean = true; - - @property() private _serviceData?: NodeServiceData; - - @property() private _areas: AreaRegistryEntry[] = []; - - @property() private _selectedAreaIndex = -1; - - @property() private _userGivenName?: string; - - private _unsubAreas?: UnsubscribeFunc; - - private _unsubEntities?: UnsubscribeFunc; - - public disconnectedCallback() { - super.disconnectedCallback(); - if (this._unsubAreas) { - this._unsubAreas(); - } - if (this._unsubEntities) { - this._unsubEntities(); - } - } - - public connectedCallback() { - super.connectedCallback(); - this._unsubAreas = subscribeAreaRegistry(this.hass.connection, (areas) => { - this._areas = areas; - if (this.device) { - this._selectedAreaIndex = - this._areas.findIndex( - (area) => area.area_id === this.device!.area_id - ) + 1; // account for the no area selected index - } - }); - this.hass.connection - .subscribeEvents((event: HassEvent) => { - if (this.device) { - this.device!.entities.forEach((deviceEntity) => { - if (event.data.old_entity_id === deviceEntity.entity_id) { - deviceEntity.entity_id = event.data.entity_id; - } - }); - } - }, "entity_registry_updated") - .then((unsub) => { - this._unsubEntities = unsub; - }); - } - - protected firstUpdated(changedProperties: PropertyValues): void { - super.firstUpdated(changedProperties); - this.addEventListener("hass-service-called", (ev) => - this.serviceCalled(ev) - ); - } - - protected updated(changedProperties: PropertyValues): void { - if (changedProperties.has("device")) { - if (!this._areas || !this.device || !this.device.area_id) { - this._selectedAreaIndex = 0; - } else { - this._selectedAreaIndex = - this._areas.findIndex( - (area) => area.area_id === this.device!.area_id - ) + 1; - } - this._userGivenName = this.device!.user_given_name; - this._serviceData = { - ieee_address: this.device!.ieee, - }; - } - super.update(changedProperties); - } - - protected serviceCalled(ev): void { - // Check if this is for us - if (ev.detail.success && ev.detail.service === "remove") { - fireEvent(this, "zha-device-removed", { - device: this.device, - }); - } - } - - protected render(): TemplateResult { - return html` - - ${ - this.showModelInfo - ? html` -
-
${this.device!.model}
-
- ${this.hass!.localize( - "ui.dialogs.zha_device_info.manuf", - "manufacturer", - this.device!.manufacturer - )} -
-
- ` - : "" - } -
-
-
IEEE:
-
${this.device!.ieee}
-
Nwk:
-
${formatAsPaddedHex(this.device!.nwk)}
-
Device Type:
-
${this.device!.device_type}
-
LQI:
-
${ - this.device!.lqi || - this.hass!.localize("ui.dialogs.zha_device_info.unknown") - }
-
RSSI:
-
${ - this.device!.rssi || - this.hass!.localize("ui.dialogs.zha_device_info.unknown") - }
-
${this.hass!.localize( - "ui.dialogs.zha_device_info.last_seen" - )}:
-
${ - this.device!.last_seen || - this.hass!.localize("ui.dialogs.zha_device_info.unknown") - }
-
${this.hass!.localize( - "ui.dialogs.zha_device_info.power_source" - )}:
-
${ - this.device!.power_source || - this.hass!.localize("ui.dialogs.zha_device_info.unknown") - }
- ${ - this.device!.quirk_applied - ? html` -
- ${this.hass!.localize( - "ui.dialogs.zha_device_info.quirk" - )}: -
-
${this.device!.quirk_class}
- ` - : "" - } -
-
- -
- ${this.device!.entities.map( - (entity) => html` - - - ${this.showEntityDetail - ? html` - -
- ${this._computeEntityName(entity)} -
-
- ${entity.entity_id} -
-
- ` - : ""} -
- ` - )} -
- ${ - this.device!.entities && this.device!.entities.length > 0 - ? html` -
- - ${this.hass.localize( - "ui.panel.config.devices.entities.add_entities_lovelace" - )} - -
- ` - : "" - } - ${ - this.showEditableInfo - ? html` -
- -
-
- - - - ${this.hass!.localize( - "ui.dialogs.zha_device_info.no_area" - )} - - - ${this._areas.map( - (entry) => html` - ${entry.name} - ` - )} - - -
- ` - : "" - } - ${ - this.showActions - ? html` -
- ${this.device!.device_type !== "Coordinator" - ? html` - - ${this.hass!.localize( - "ui.dialogs.zha_device_info.buttons.reconfigure" - )} - - ${this.showHelp - ? html` -
- ${this.hass!.localize( - "ui.dialogs.zha_device_info.services.reconfigure" - )} -
- ` - : ""} - - - ${this.hass!.localize( - "ui.dialogs.zha_device_info.buttons.remove" - )} - - ${this.showHelp - ? html` -
- ${this.hass!.localize( - "ui.dialogs.zha_device_info.services.remove" - )} -
- ` - : ""} - ` - : ""} - ${this.device!.power_source === "Mains" && - (this.device!.device_type === "Router" || - this.device!.device_type === "Coordinator") - ? html` - - ${this.hass!.localize( - "ui.panel.config.zha.common.add_devices" - )} - - ${this.showHelp - ? html` - - ` - : ""} - ` - : ""} - ${this.device!.device_type !== "Coordinator" - ? html` - - ${this.hass!.localize( - "ui.dialogs.zha_device_info.buttons.zigbee_information" - )} - - ${this.showHelp - ? html` -
- ${this.hass!.localize( - "ui.dialogs.zha_device_info.services.zigbee_information" - )} -
- ` - : ""} - ` - : ""} -
- ` - : "" - } -
- - `; - } - - private async _onReconfigureNodeClick(): Promise { - if (this.hass) { - await reconfigureNode(this.hass, this.device!.ieee); - } - } - - private _computeEntityName(entity: ZHAEntityReference): string { - if (this.hass.states[entity.entity_id]) { - return computeStateName(this.hass.states[entity.entity_id]); - } - return entity.name; - } - - private async _saveCustomName(event): Promise { - if (this.hass) { - const values: DeviceRegistryEntryMutableParams = { - name_by_user: event.target.value, - area_id: this.device!.area_id ? this.device!.area_id : undefined, - }; - - await updateDeviceRegistryEntry( - this.hass, - this.device!.device_reg_id, - values - ); - - this.device!.user_given_name = event.target.value; - } - } - - private _openMoreInfo(ev: MouseEvent): void { - fireEvent(this, "hass-more-info", { - entityId: (ev.currentTarget as any).entity.entity_id, - }); - } - - private async _selectedAreaChanged(event: ItemSelectedEvent) { - if (!this.device || !this._areas) { - return; - } - this._selectedAreaIndex = event!.target!.selected; - const area = this._areas[this._selectedAreaIndex - 1]; // account for No Area - if ( - (!area && !this.device.area_id) || - (area && area.area_id === this.device.area_id) - ) { - return; - } - - const newAreaId = area ? area.area_id : undefined; - await updateDeviceRegistryEntry(this.hass!, this.device.device_reg_id, { - area_id: newAreaId, - name_by_user: this.device!.user_given_name, - }); - this.device!.area_id = newAreaId; - } - - private _onAddDevicesClick() { - navigate(this, "/config/zha/add/" + this.device!.ieee); - } - - private async _handleZigbeeInfoClicked() { - showZHADeviceZigbeeInfoDialog(this, { device: this.device! }); - } - - private _addToLovelaceView(): void { - addEntitiesToLovelaceView( - this, - this.hass, - this.device!.entities.map((entity) => entity.entity_id) - ); - } - - static get styles(): CSSResult[] { - return [ - haStyle, - css` - :host(:not([narrow])) .device-entities { - max-height: 225px; - overflow-y: auto; - display: flex; - flex-wrap: wrap; - padding: 4px; - justify-content: left; - } - ha-card { - flex: 1 0 100%; - padding-bottom: 10px; - min-width: 300px; - } - .device { - width: 30%; - } - .device .name { - font-weight: bold; - } - .device .manuf { - color: var(--secondary-text-color); - margin-bottom: 20px; - } - .extra-info { - margin-top: 8px; - } - .manuf, - .zha-info, - .name { - text-overflow: ellipsis; - } - .entity-id { - text-overflow: ellipsis; - color: var(--secondary-text-color); - } - .info { - margin-left: 16px; - } - dl { - display: flex; - flex-wrap: wrap; - width: 100%; - } - dl dt { - display: inline-block; - width: 30%; - padding-left: 12px; - float: left; - text-align: left; - } - dl dd { - width: 60%; - overflow-wrap: break-word; - margin-inline-start: 20px; - } - paper-icon-item { - overflow-x: hidden; - cursor: pointer; - padding-top: 4px; - padding-bottom: 4px; - } - .editable { - padding-left: 28px; - padding-right: 28px; - padding-bottom: 10px; - } - .help-text { - color: grey; - padding: 16px; - } - .menu { - width: 100%; - } - .node-picker { - align-items: center; - padding-left: 28px; - padding-right: 28px; - padding-bottom: 10px; - } - .buttons .icon { - margin-right: 16px; - } - `, - ]; - } -} - -declare global { - interface HTMLElementTagNameMap { - "zha-device-card": ZHADeviceCard; - } -} diff --git a/src/panels/config/zha/zha-device-page.ts b/src/panels/config/zha/zha-device-page.ts deleted file mode 100755 index 8eea9949fe..0000000000 --- a/src/panels/config/zha/zha-device-page.ts +++ /dev/null @@ -1,157 +0,0 @@ -import { - css, - CSSResult, - customElement, - html, - LitElement, - property, - PropertyValues, - TemplateResult, -} from "lit-element"; -import { HASSDomEvent } from "../../../common/dom/fire_event"; -import { - Cluster, - fetchBindableDevices, - fetchGroups, - fetchZHADevice, - ZHADevice, - ZHAGroup, -} from "../../../data/zha"; -import "../../../layouts/hass-subpage"; -import { haStyle } from "../../../resources/styles"; -import { HomeAssistant } from "../../../types"; -import { sortZHADevices, sortZHAGroups } from "./functions"; -import { ZHAClusterSelectedParams } from "./types"; -import "./zha-cluster-attributes"; -import "./zha-cluster-commands"; -import "./zha-clusters"; -import "./zha-device-binding"; -import "./zha-group-binding"; -import "./zha-node"; - -@customElement("zha-device-page") -export class ZHADevicePage extends LitElement { - @property() public hass?: HomeAssistant; - - @property() public isWide?: boolean; - - @property() public ieee?: string; - - @property() public device?: ZHADevice; - - @property() public narrow?: boolean; - - @property() private _selectedCluster?: Cluster; - - @property() private _bindableDevices: ZHADevice[] = []; - - @property() private _groups: ZHAGroup[] = []; - - protected updated(changedProperties: PropertyValues): void { - if (changedProperties.has("ieee")) { - this._fetchData(); - } - super.update(changedProperties); - } - - protected render(): TemplateResult { - return html` - - - - ${this.device && this.device.device_type !== "Coordinator" - ? html` - - ${this._selectedCluster - ? html` - - - - ` - : ""} - ${this._bindableDevices.length > 0 - ? html` - - ` - : ""} - ${this.device && this._groups.length > 0 - ? html` - - ` - : ""} - ` - : ""} -
-
- `; - } - - private _onClusterSelected( - selectedClusterEvent: HASSDomEvent - ): void { - this._selectedCluster = selectedClusterEvent.detail.cluster; - } - - private async _fetchData(): Promise { - if (this.ieee && this.hass) { - this.device = await fetchZHADevice(this.hass, this.ieee); - this._bindableDevices = - this.device && this.device.device_type !== "Coordinator" - ? (await fetchBindableDevices(this.hass, this.ieee)).sort( - sortZHADevices - ) - : []; - this._groups = (await fetchGroups(this.hass!)).sort(sortZHAGroups); - } - } - - static get styles(): CSSResult[] { - return [ - haStyle, - css` - .spacer { - height: 50px; - } - `, - ]; - } -} - -declare global { - interface HTMLElementTagNameMap { - "zha-device-page": ZHADevicePage; - } -} diff --git a/src/panels/config/zha/zha-groups-dashboard.ts b/src/panels/config/zha/zha-groups-dashboard.ts deleted file mode 100644 index b8e3674974..0000000000 --- a/src/panels/config/zha/zha-groups-dashboard.ts +++ /dev/null @@ -1,172 +0,0 @@ -import "@material/mwc-button"; -import "../../../components/ha-icon-button"; -import "@polymer/paper-spinner/paper-spinner"; -import { - css, - CSSResult, - customElement, - html, - LitElement, - property, - PropertyValues, - TemplateResult, -} from "lit-element"; -import { HASSDomEvent } from "../../../common/dom/fire_event"; -import { navigate } from "../../../common/navigate"; -import { SelectionChangedEvent } from "../../../components/data-table/ha-data-table"; -import { fetchGroups, removeGroups, ZHAGroup } from "../../../data/zha"; -import "../../../layouts/hass-subpage"; -import { HomeAssistant } from "../../../types"; -import { sortZHAGroups } from "./functions"; -import "./zha-groups-data-table"; - -@customElement("zha-groups-dashboard") -export class ZHAGroupsDashboard extends LitElement { - @property() public hass!: HomeAssistant; - - @property() public narrow = false; - - @property() public _groups?: ZHAGroup[]; - - @property() private _processingRemove = false; - - @property() private _selectedGroupsToRemove: number[] = []; - - private _firstUpdatedCalled = false; - - public connectedCallback(): void { - super.connectedCallback(); - if (this.hass && this._firstUpdatedCalled) { - this._fetchGroups(); - } - } - - protected firstUpdated(changedProperties: PropertyValues): void { - super.firstUpdated(changedProperties); - if (this.hass) { - this._fetchGroups(); - } - this._firstUpdatedCalled = true; - } - - protected render(): TemplateResult { - return html` - - - -
- ${this._groups - ? html` - - ` - : html` - - `} -
-
- - - ${this.hass!.localize( - "ui.panel.config.zha.groups.remove_groups" - )} -
-
- `; - } - - private async _fetchGroups() { - this._groups = (await fetchGroups(this.hass!)).sort(sortZHAGroups); - } - - private _handleRemoveSelectionChanged( - ev: HASSDomEvent - ): void { - this._selectedGroupsToRemove = ev.detail.value.map((value) => - Number(value) - ); - } - - private async _removeGroup(): Promise { - this._processingRemove = true; - this._groups = await removeGroups(this.hass, this._selectedGroupsToRemove); - this._selectedGroupsToRemove = []; - this._processingRemove = false; - } - - private async _addGroup(): Promise { - navigate(this, `/config/zha/group-add`); - } - - static get styles(): CSSResult[] { - return [ - css` - .content { - padding: 4px; - } - zha-groups-data-table { - width: 100%; - } - .button { - float: right; - } - .table { - height: 200px; - overflow: auto; - } - mwc-button paper-spinner { - width: 14px; - height: 14px; - margin-right: 20px; - } - paper-spinner { - display: none; - } - paper-spinner[active] { - display: block; - } - .paper-dialog-buttons { - align-items: flex-end; - padding: 8px; - } - .paper-dialog-buttons .warning { - --mdc-theme-primary: var(--google-red-500); - } - `, - ]; - } -} - -declare global { - interface HTMLElementTagNameMap { - "zha-groups-dashboard": ZHAGroupsDashboard; - } -} diff --git a/src/panels/config/zha/zha-groups-data-table.ts b/src/panels/config/zha/zha-groups-data-table.ts deleted file mode 100644 index ead1a9f20a..0000000000 --- a/src/panels/config/zha/zha-groups-data-table.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { - customElement, - html, - LitElement, - property, - query, - TemplateResult, -} from "lit-element"; -import memoizeOne from "memoize-one"; -import { navigate } from "../../../common/navigate"; -import "../../../components/data-table/ha-data-table"; -import type { - DataTableColumnContainer, - HaDataTable, -} from "../../../components/data-table/ha-data-table"; -import "../../../components/entity/ha-state-icon"; -import type { ZHADevice, ZHAGroup } from "../../../data/zha"; -import type { HomeAssistant } from "../../../types"; -import { formatAsPaddedHex } from "./functions"; - -export interface GroupRowData extends ZHAGroup { - group?: GroupRowData; - id?: string; -} - -@customElement("zha-groups-data-table") -export class ZHAGroupsDataTable extends LitElement { - @property() public hass!: HomeAssistant; - - @property() public narrow = false; - - @property() public groups: ZHAGroup[] = []; - - @property() public selectable = false; - - @query("ha-data-table") private _dataTable!: HaDataTable; - - private _groups = memoizeOne((groups: ZHAGroup[]) => { - let outputGroups: GroupRowData[] = groups; - - outputGroups = outputGroups.map((group) => { - return { - ...group, - id: String(group.group_id), - }; - }); - - return outputGroups; - }); - - private _columns = memoizeOne( - (narrow: boolean): DataTableColumnContainer => - narrow - ? { - name: { - title: "Group", - sortable: true, - filterable: true, - direction: "asc", - grows: true, - template: (name) => html` -
- ${name} -
- `, - }, - } - : { - name: { - title: this.hass.localize("ui.panel.config.zha.groups.groups"), - sortable: true, - filterable: true, - direction: "asc", - grows: true, - template: (name) => html` -
- ${name} -
- `, - }, - group_id: { - title: this.hass.localize("ui.panel.config.zha.groups.group_id"), - type: "numeric", - width: "15%", - template: (groupId: number) => { - return html` ${formatAsPaddedHex(groupId)} `; - }, - sortable: true, - }, - members: { - title: this.hass.localize("ui.panel.config.zha.groups.members"), - type: "numeric", - width: "15%", - template: (members: ZHADevice[]) => { - return html` ${members.length} `; - }, - sortable: true, - }, - } - ); - - public clearSelection() { - this._dataTable.clearSelection(); - } - - protected render(): TemplateResult { - return html` - - `; - } - - private _handleRowClicked(ev: CustomEvent) { - const groupId = ((ev.target as HTMLElement).closest( - ".mdc-data-table__row" - ) as any).rowId; - navigate(this, `/config/zha/group/${groupId}`); - } -} - -declare global { - interface HTMLElementTagNameMap { - "zha-groups-data-table": ZHAGroupsDataTable; - } -} diff --git a/src/panels/config/zha/zha-node.ts b/src/panels/config/zha/zha-node.ts deleted file mode 100644 index 4968675463..0000000000 --- a/src/panels/config/zha/zha-node.ts +++ /dev/null @@ -1,148 +0,0 @@ -import "../../../components/ha-icon-button"; -import { - css, - CSSResult, - customElement, - html, - LitElement, - property, - TemplateResult, -} from "lit-element"; -import { navigate } from "../../../common/navigate"; -import "../../../components/buttons/ha-call-service-button"; -import "../../../components/ha-card"; -import "../../../components/ha-service-description"; -import { ZHADevice } from "../../../data/zha"; -import { haStyle } from "../../../resources/styles"; -import { HomeAssistant } from "../../../types"; -import "../ha-config-section"; -import "./zha-device-card"; - -@customElement("zha-node") -export class ZHANode extends LitElement { - @property() public hass?: HomeAssistant; - - @property() public isWide?: boolean; - - @property() public device?: ZHADevice; - - @property() private _showHelp = false; - - protected render(): TemplateResult { - return html` - -
- ${this.hass!.localize( - "ui.panel.config.zha.node_management.header" - )} - -
- - ${this.hass!.localize( - "ui.panel.config.zha.node_management.introduction" - )} -

- ${this.hass!.localize( - "ui.panel.config.zha.node_management.hint_battery_devices" - )} -

- ${this.hass!.localize( - "ui.panel.config.zha.node_management.hint_wakeup" - )} -
-
- ${this.device - ? html` - - ` - : html` - - `} -
-
- `; - } - - private _onHelpTap(): void { - this._showHelp = !this._showHelp; - } - - private _onDeviceRemoved(): void { - this.device = undefined; - navigate(this, `/config/zha`, true); - } - - static get styles(): CSSResult[] { - return [ - haStyle, - css` - .node-info { - margin-left: 16px; - } - - .help-text { - color: grey; - padding-left: 28px; - padding-right: 28px; - padding-bottom: 16px; - } - - .content { - max-width: 680px; - } - - .card { - padding: 28px 20px 0; - margin-top: 24px; - } - - ha-service-description { - display: block; - color: grey; - } - - [hidden] { - display: none; - } - - .header { - flex-grow: 1; - } - - .toggle-help-icon { - float: right; - top: 6px; - right: 0; - padding-right: 0px; - color: var(--primary-color); - } - `, - ]; - } -} - -declare global { - interface HTMLElementTagNameMap { - "zha-node": ZHANode; - } -} diff --git a/src/state/hass-element.ts b/src/state/hass-element.ts index 977ee68f9d..a5cb0992ae 100644 --- a/src/state/hass-element.ts +++ b/src/state/hass-element.ts @@ -12,7 +12,6 @@ import SidebarMixin from "./sidebar-mixin"; import ThemesMixin from "./themes-mixin"; import TranslationsMixin from "./translations-mixin"; import { urlSyncMixin } from "./url-sync-mixin"; -import ZHADialogMixin from "./zha-dialog-mixin"; const ext = (baseClass: T, mixins): T => mixins.reduceRight((base, mixin) => mixin(base), baseClass); @@ -28,7 +27,6 @@ export class HassElement extends ext(HassBaseEl, [ NotificationMixin, dialogManagerMixin, urlSyncMixin, - ZHADialogMixin, hapticMixin, panelTitleMixin, ]) {} diff --git a/src/state/zha-dialog-mixin.ts b/src/state/zha-dialog-mixin.ts deleted file mode 100644 index 82721b8e80..0000000000 --- a/src/state/zha-dialog-mixin.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { UpdatingElement } from "lit-element"; -import { HASSDomEvent } from "../common/dom/fire_event"; -import { - showZHADeviceInfoDialog, - ZHADeviceInfoDialogParams, -} from "../dialogs/zha-device-info-dialog/show-dialog-zha-device-info"; -import { Constructor } from "../types"; -import { HassBaseEl } from "./hass-base-mixin"; - -declare global { - // for fire event - interface HASSDomEvents { - "zha-show-device-dialog": { - ieee: string; - }; - } -} - -export default (superClass: Constructor) => - class extends superClass { - protected firstUpdated(changedProps) { - super.firstUpdated(changedProps); - this.addEventListener("zha-show-device-dialog", (e) => - showZHADeviceInfoDialog( - e.target as HTMLElement, - (e as HASSDomEvent).detail - ) - ); - } - }; diff --git a/src/translations/en.json b/src/translations/en.json index a57584da22..637832b9fa 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -441,10 +441,10 @@ "no_area": "No Area", "device_signature": "Zigbee device signature", "buttons": { - "add": "Add Devices", + "add": "Add Devices via this device", "remove": "Remove Device", "reconfigure": "Reconfigure Device", - "zigbee_information": "Zigbee Information" + "zigbee_information": "Zigbee device signature" }, "services": { "reconfigure": "Reconfigure ZHA device (heal device). Use this if you are having issues with the device. If the device in question is a battery powered device please ensure it is awake and accepting commands when you use this service.", @@ -460,9 +460,7 @@ "power_source": "Power Source", "unknown": "Unknown", "zha_device_card": { - "device_name_placeholder": "User given name", - "area_picker_label": "Area", - "update_name_button": "Update Name" + "device_name_placeholder": "Change device name" } }, "domain_toggler": { @@ -1504,6 +1502,7 @@ } }, "zha": { + "button": "Configure", "header": "Configure Zigbee Home Automation", "introduction": "Here it is possible to configure the ZHA component. Not everything is possible to configure from the UI yet, but we're working on it.", "description": "Zigbee Home Automation network management", @@ -1515,9 +1514,10 @@ "value": "Value" }, "add_device_page": { - "header": "Zigbee Home Automation - Add Devices", "spinner": "Searching for ZHA Zigbee devices...", - "discovery_text": "Discovered devices will show up here. Follow the instructions for your device(s) and place the device(s) in pairing mode.", + "pairing_mode": "Make sure your devices are in pairing mode. Check the instructions of your device on how to do this.", + "discovered_text": "Devices will show up here once discovered.", + "no_devices_found": "No devices where found, make sure they are in paring mode and keep them awake while discovering is running.", "search_again": "Search Again" }, "network_management": { @@ -1560,6 +1560,9 @@ "issue_zigbee_command": "Issue Zigbee Command", "help_command_dropdown": "Select a command to interact with." }, + "network": { + "caption": "Network" + }, "groups": { "caption": "Groups", "description": "Create and modify Zigbee groups", @@ -1600,6 +1603,7 @@ } }, "zwave": { + "button": "Configure", "description": "Manage your Z-Wave network", "learn_more": "Learn more about Z-Wave", "common": { From a822c1eb2f73515ec19a67e5862dc9eb9d2b8690 Mon Sep 17 00:00:00 2001 From: marawan31 Date: Fri, 12 Jun 2020 08:01:48 -0400 Subject: [PATCH 32/39] Reduce HLS buffer length to 1 minute instead of the default infinity (#6134) Co-authored-by: Bram Kragten --- src/components/ha-camera-stream.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/ha-camera-stream.ts b/src/components/ha-camera-stream.ts index 90330b04cd..592e020a54 100644 --- a/src/components/ha-camera-stream.ts +++ b/src/components/ha-camera-stream.ts @@ -176,7 +176,9 @@ class HaCameraStream extends LitElement { Hls: HLSModule, url: string ) { - const hls = new Hls(); + const hls = new Hls({ + liveBackBufferLength: 60, + }); this._hlsPolyfillInstance = hls; hls.attachMedia(videoEl); hls.on(Hls.Events.MEDIA_ATTACHED, () => { From 33af3de4a3d0d5448ba5bffa78ab9349f81f82a1 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Fri, 12 Jun 2020 20:44:22 +0200 Subject: [PATCH 33/39] Disconnect panel after 5 minutes hidden (#6152) --- src/layouts/partial-panel-resolver.ts | 35 +++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/layouts/partial-panel-resolver.ts b/src/layouts/partial-panel-resolver.ts index 755584f0c2..e8383d1a45 100644 --- a/src/layouts/partial-panel-resolver.ts +++ b/src/layouts/partial-panel-resolver.ts @@ -91,6 +91,20 @@ class PartialPanelResolver extends HassRouterPage { private _waitForStart = false; + private _disconnectedPanel?: ChildNode; + + private _hiddenTimeout?: number; + + protected firstUpdated(changedProps: PropertyValues) { + super.firstUpdated(changedProps); + + document.addEventListener( + "visibilitychange", + () => this._handleVisibilityChange(), + false + ); + } + protected updated(changedProps: PropertyValues) { super.updated(changedProps); @@ -141,6 +155,27 @@ class PartialPanelResolver extends HassRouterPage { } } + private _handleVisibilityChange() { + if (document.hidden) { + this._hiddenTimeout = window.setTimeout(() => { + this._hiddenTimeout = undefined; + if (this.lastChild) { + this._disconnectedPanel = this.lastChild; + this.removeChild(this.lastChild); + } + }, 300000); + } else { + if (this._hiddenTimeout) { + clearTimeout(this._hiddenTimeout); + this._hiddenTimeout = undefined; + } + if (this._disconnectedPanel) { + this.appendChild(this._disconnectedPanel); + this._disconnectedPanel = undefined; + } + } + } + private async _updateRoutes(oldPanels?: HomeAssistant["panels"]) { this.routerOptions = getRoutes(this.hass.panels); From 65b16c763e45a5ec3f91ed20d9692a5eef22ee08 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Sat, 13 Jun 2020 00:32:26 +0000 Subject: [PATCH 34/39] [ci skip] Translation update --- translations/frontend/ar.json | 217 ++++++++++++++++++++++++++++-- translations/frontend/en.json | 14 +- translations/frontend/es-419.json | 81 ++++++++++- translations/frontend/pl.json | 2 +- translations/frontend/pt.json | 2 + translations/frontend/sv.json | 3 +- 6 files changed, 297 insertions(+), 22 deletions(-) diff --git a/translations/frontend/ar.json b/translations/frontend/ar.json index d06868f61f..16ba0f349a 100644 --- a/translations/frontend/ar.json +++ b/translations/frontend/ar.json @@ -353,6 +353,9 @@ "script": { "execute": "نفذ" }, + "service": { + "run": "تشغيل" + }, "vacuum": { "actions": { "resume_cleaning": "استئناف التنظيف", @@ -384,16 +387,37 @@ } }, "common": { + "and": "و", + "back": "عودة", "cancel": "إلغاء", "delete": "حذف", + "error_required": "مطلوب", "loading": "جار التحميل", + "menu": "القائمه", "next": "التالى", + "overflow_menu": "قائمة تجاوز السعة", "previous": "السابق", "refresh": "تحديث", "successfully_deleted": "تم الحذف بنجاح", "undo": "تراجع" }, "components": { + "area-picker": { + "add_dialog": { + "add": "إضافة", + "name": "الاسم", + "text": "أدخل اسم المنطقة الجديدة.", + "title": "أضف منطقة جديدة" + }, + "add_new": "إضافة منطقة جديدة ...", + "area": "المنطقة", + "clear": "مسح", + "show_areas": "إظهار المناطق" + }, + "device-picker": { + "no_area": "لا مجال", + "toggle": "تبديل" + }, "entity": { "entity-picker": { "entity": "الجهاز" @@ -411,8 +435,21 @@ } }, "dialogs": { + "config_entry_system_options": { + "update": "تحديث" + }, + "entity_registry": { + "editor": { + "confirm_delete": "هل أنت متأكد أنك تريد حذف هذا الإدخال؟", + "delete": "حذف", + "update": "تحديث" + } + }, "generic": { - "close": "إغلاق" + "cancel": "إلغاء الأمر", + "close": "إغلاق", + "default_confirmation_title": "هل أنت متأكد؟", + "ok": "موافق" }, "helper_settings": { "generic": { @@ -434,6 +471,15 @@ "more_info_control": { "sun": { "setting": "ضبط" + }, + "vacuum": { + "fan_speed": "سرعة المروحة", + "pause": "إيقاف مؤقت", + "return_home": "العودة للرئيسية", + "start": "بدء", + "start_pause": "بدء/إيقاف مؤقت", + "status": "الحالة", + "stop": "توقف" } }, "mqtt_device_debug_info": { @@ -473,7 +519,9 @@ "title": "إشعارات" }, "notification_toast": { - "connection_lost": "انقطع الاتصال. جارٍ إعادة الاتصال ..." + "connection_lost": "انقطع الاتصال. جارٍ إعادة الاتصال ...", + "started": "Home Assistant بدأ!", + "starting": "يبدأ برنامج Home Assistant ، ولن يكون كل شيء متاحًا حتى الانتهاء." }, "panel": { "calendar": { @@ -489,6 +537,12 @@ "delete": { "confirmation_text": "سيتم إلغاء تعيين جميع الأجهزة في هذه المنطقة.", "confirmation_title": "هل أنت متأكد أنك تريد حذف هذه المنطقة؟" + }, + "editor": { + "area_id": "المنطقة", + "name": "اسم", + "name_required": "الاسم مطلوب", + "unknown_error": "خطأ غير معروف" } }, "automation": { @@ -512,6 +566,9 @@ "delay": "تأخير", "label": "التأخير" }, + "device_id": { + "action": "أضف إجراء" + }, "event": { "event": "الحدث", "label": "إجراء الحريق", @@ -540,6 +597,9 @@ "learn_more": "معرفة المزيد عن الشروط", "type_select": "نوع الشرط", "type": { + "device": { + "condition": "الشرط" + }, "not": { "label": "ليس" }, @@ -580,7 +640,10 @@ "unsupported_condition": "شرط غير مدعوم: {condition}" }, "default_name": "متحكم آلي جديد", + "enable_disable": "تمكين/تعطيل التنفيذ التلقائي", "introduction": "استخدم المتحكمات الآلية لتجعل منزلك ينبض بالحياة", + "move_down": "تحرك لأسفل", + "move_up": "تحريك لأعلى", "save": "حفظ", "triggers": { "add": "أضف مشغل", @@ -592,6 +655,9 @@ "learn_more": "معرفة المزيد عن المشغلات", "type_select": "نوع المشغل", "type": { + "device": { + "trigger": "نوع المشغل" + }, "event": { "event_data": "بيانات الحدث", "event_type": "نوع الحدث", @@ -686,19 +752,31 @@ }, "customize": { "caption": "التخصيص", - "description": "تخصيص الكيانات الخاصة بك" + "description": "تخصيص الكيانات الخاصة بك", + "picker": { + "entity": "الكيان" + } }, "devices": { "confirm_delete": "هل أنت متأكد أنك تريد حذف هذا الجهاز؟", "data_table": { + "no_area": "لا مجال", "no_devices": "لا توجد أجهزة" }, "delete": "حذف", "device_info": "معلومات الجهاز", + "entities": { + "disabled_entities": "{count} {count, plural,\n one {كيان}\n other {كيانات}\n}", + "hide_disabled": "إخفاء معطل" + }, "no_devices": "لا توجد أجهزة" }, "entities": { "picker": { + "remove_selected": { + "confirm_partly_text": "يمكنك فقط إزالة {removable} من الكيانات {selected} . لا يمكن إزالة الكيانات إلا عندما يتوقف التكامل عن توفير الكيانات. في بعض الأحيان ، يتعين عليك إعادة تشغيل Home Assistant قبل أن تتمكن من إزالة كيانات التكامل الذي تمت إزالته. هل أنت متأكد من أنك تريد إزالة الكيانات القابلة للإزالة؟", + "confirm_partly_title": "يمكن فقط إزالة {number} الكيانات المحددة." + }, "status": { "restored": "مستعاد" } @@ -727,6 +805,13 @@ "input_text": "النص" } }, + "info": { + "caption": "معلومات", + "description": "معلومات حول تثبيت Home Assistant", + "documentation": "الوثائق", + "integrations": "تكاملات", + "issues": "الاعطال" + }, "integrations": { "add_integration": "أضف integration", "caption": "تكاملات", @@ -745,7 +830,8 @@ "options": "خيارات", "rename": "إعادة تسمية", "restart_confirm": "اعادة تشغيل هوم اسيستينت لإنهاء حذف هذه التكامل", - "system_options": "خيارات النظام" + "system_options": "خيارات النظام", + "unnamed_entry": "إدخال بدون اسم" }, "config_flow": { "loading_first_time": "يرجى الانتظار بينما يتم تثبيت الـintegration" @@ -765,27 +851,52 @@ "new": "إعداد تكامل جديد", "no_integrations": "يبدوأن ليس هناك أي integations بعد. انقر على الزر أدناه لإضافة واحدة!", "none": "لم يتم الإعداد بعد", + "none_found": "لم يتم العثور على عمليات تكامل", "none_found_detail": "اضبط معايير البحث.", "rename_dialog": "تعديل الاسم", "rename_input_label": "الاسم" }, "introduction": "يمكنك هنا برمجة المكونات الخاصة بك و إعداد نظام مساعد البيت. ليس كل شيء متاح للبرمجة من خلال واجهة المستخدم حتى الآن، ولكننا نعمل على ذلك.", + "logs": { + "caption": "السجلات", + "description": "عرض سجلات Home Assistant" + }, "lovelace": { "dashboards": { "cant_edit_default": "لا يمكن تعديل لوحة تحكم لوفليس القياسية من واجهة المستخدم. يمكنك إخفائه عن طريق تعيين لوحة تحكم أخرى كإعداد افتراضي.", + "caption": "لوحات التحكم", + "confirm_delete": "هل أنت متأكد أنك تريد حذف لوحة التحكم ؟", "default_dashboard": "هذه هي لوحة المعلومات الافتراضية", "detail": { + "create": "إضافة", + "delete": "حذف", + "dismiss": "اغلاق", + "edit_dashboard": "تعديل لوحة التحكم", + "icon": "أيقونة", + "new_dashboard": "أضف لوحة تحكم جديدة", "remove_default": "إزالة كإعداد افتراضي على هذا الجهاز", + "require_admin": "المسؤول فقط", "set_default": "تعيين إعداد افتراضي على هذا الجهاز", - "title_required": "العنوان مطلوب." + "show_sidebar": "إظهار في الشريط الجانبي", + "title": "عنوان", + "title_required": "العنوان مطلوب.", + "update": "تحديث", + "url": "عنوان Url" }, "picker": { + "add_dashboard": "أضافة لوحة تحكم جديدة", "headers": { - "default": "الافتراضي" - } + "default": "الافتراضي", + "filename": "اسم الملف", + "require_admin": "المسؤول فقط", + "sidebar": "إظهار في الشريط الجانبي", + "title": "عنوان" + }, + "open": "فتح" } }, "resources": { + "confirm_delete": "هل أنت متأكد أنك تريد حذف هذا المورد؟", "detail": { "create": "إنشاء", "delete": "حذف", @@ -796,7 +907,16 @@ "url_error_msg": "عنوان URL هو حقل مطلوب" }, "picker": { + "add_resource": "إضافة مورد", + "headers": { + "type": "النوع", + "url": "عنوان Url" + }, "no_resources": "لا توجد موارد" + }, + "refresh_header": "هل تريد التحديث؟", + "types": { + "module": "وحدة جافا سكريبت" } } }, @@ -825,6 +945,17 @@ "show_info": "عرض معلومات حول السكربت" } }, + "server_control": { + "section": { + "reloading": { + "input_boolean": "إعادة تحميل مدخلات منطقية", + "input_datetime": "إعادة تحميل أوقات تاريخ الإدخال", + "input_number": "إعادة تحميل أرقام الإدخال", + "input_select": "إعادة تحميل تحديدات الإدخال", + "input_text": "إعادة تحميل النصوص المدخلة" + } + } + }, "users": { "add_user": { "caption": "أضف مستخدم", @@ -852,6 +983,17 @@ "name": "الاسم", "system": "نظام" } + }, + "users_privileges_note": "مجموعة المستخدمين هي عمل قيد التقدم. لن يتمكن المستخدم من إدارة المثيل عبر واجهة المستخدم. ما زلنا نقوم بتدقيق جميع نقاط نهاية واجهة برمجة تطبيقات الإدارة للتأكد من أنها تحد من الوصول إلى المسؤولين بشكل صحيح." + }, + "zone": { + "detail": { + "create": "إضافة", + "delete": "حذف", + "icon": "أيقونة", + "name": "الاسم", + "required_error_msg": "العنوان مطلوب.", + "update": "تحديث" } }, "zwave": { @@ -859,6 +1001,42 @@ "description": "إدارة شبكة Z-Wave", "node_config": { "set_config_parameter": "تعيين معلمة التكوين" + }, + "node_management": { + "add_to_group": "إضافة إلى المجموعة", + "entities": "كيانات هذه العقدة", + "entity_info": "معلومات الكيان", + "exclude_entity": "تحكم بسيرفر Home Assistant ... من Home Assistant.", + "group": "مجموعة", + "header": "إدارة العقدة Z-Wave", + "introduction": "قم بتشغيل أوامر Z-Wave التي تؤثر على عقدة واحدة. اختر عقدة لترى قائمة بالأوامر المتاحة.", + "max_associations": "اعلى رقم للجمعيات:", + "node_group_associations": "ارتباطات مجموعة العقدة", + "node_protection": "حماية العقدة", + "node_to_control": "تحكم للعقدة", + "nodes": "العقد", + "nodes_hint": "تحديد عقدة لعرض خيارات كل عقدة", + "nodes_in_group": "العقد الأخرى في هذه المجموعة:", + "pooling_intensity": "كثافة الاقتراع", + "protection": "الحماية", + "remove_broadcast": "إزالة البث", + "remove_from_group": "إزالة من المجموعة", + "set_protection": "تعيين الحماية" + }, + "ozw_log": { + "last_log_lines": "عدد أسطر السجل الأخيرة", + "load": "حمل", + "tail": "الذيل" + }, + "services": { + "heal_node": "اختبار عقدة", + "node_info": "معلومات العقدة", + "print_node": "طباعة عقدة", + "refresh_entity": "تحديث الكيان", + "refresh_node": "تحديث العقدة", + "remove_failed_node": "إزالة العقدة الفاشلة", + "replace_failed_node": "استبدال العقدة الفاشلة", + "test_node": "اختبار عقدة" } } }, @@ -889,13 +1067,20 @@ "showing_entries": "عرض الأحداث لـ" }, "lovelace": { + "cards": { + "starting": { + "description": "Home Assistant يبدأ، يرجى الانتظار...", + "header": "يبدأ مساعد المنزل ..." + } + }, "editor": { "card": { "alarm-panel": { "description": "تسمح لك بطاقة لوحة الإنذار بتفعيل وتعطيل لوحة التحكم الخاصة بالانذار ." }, "button": { - "description": "تتيح لك بطاقة الأزرار إضافة أزرار لأداء المهام." + "description": "تتيح لك بطاقة الأزرار إضافة أزرار لأداء المهام.", + "name": "زر" }, "conditional": { "card": "بطاقة", @@ -926,6 +1111,7 @@ "manual": "يدويا", "manual_description": "هل تريد إضافة بطاقة مخصصة أو ترغب فقط في كتابة yaml يدويًا؟", "no_theme": "لا توجد تصاميم متاحة", + "secondary_info_attribute": "سمة المعلومات الثانوية", "state": "الحالة" }, "glance": { @@ -981,7 +1167,8 @@ "description": "تسمح لك بطاقة التكديس الرأسي بتجميع بطاقات متعددة بحيث تكون دائمًا في نفس العمود." }, "weather-forecast": { - "description": "تعرض بطاقة توقعات الطقس حالة الطقس. من المفيد جدًا تضمينه في الواجهات التي يعرضها الأشخاص على الحائط." + "description": "تعرض بطاقة توقعات الطقس حالة الطقس. من المفيد جدًا تضمينه في الواجهات التي يعرضها الأشخاص على الحائط.", + "show_forecast": "التوقعات" } }, "cardpicker": { @@ -1009,7 +1196,8 @@ "save_config": { "cancel": "لا يهم", "close": "إغلاق", - "empty_config": "ابدأ بلوحة معلومات فارغة" + "empty_config": "ابدأ بلوحة معلومات فارغة", + "yaml_mode": "أنت تستخدم وضع YAML للوحة البيانات هذه ، مما يعني أنه لا يمكنك تغيير تكوين Lovelace من واجهة المستخدم. إذا كنت تريد إدارة لوحة التحكم هذه من واجهة المستخدم ، فقم بإزالة \"الوضع: yaml\" من تكوين Lovelace في \"config.yaml.\"." }, "view": { "panel_mode": { @@ -1032,7 +1220,8 @@ "warning": { "attribute_not_found": "السمة {attribute} غير متاحة في: {entity}", "entity_not_found": "الجهاز غير متوفر: {entity}", - "entity_unavailable": "العنصر غير متوفر" + "entity_unavailable": "العنصر غير متوفر", + "starting": "يبدأ مساعد المنزل ، قد لا يكون كل شيء متاح حتى الآن" } }, "mailbox": { @@ -1044,6 +1233,8 @@ "page-authorize": { "abort_intro": "إلغاء الدخول", "form": { + "error": "خطأ: {error}", + "next": "التالى", "providers": { "command_line": { "step": { @@ -1056,6 +1247,7 @@ } } }, + "start_over": "البدء من جديد", "working": "الرجاء الانتظار" }, "initializing": "جار التهيئة" @@ -1074,6 +1266,9 @@ } }, "profile": { + "advanced_mode": { + "link_promo": "معرفة المزيد" + }, "change_password": { "confirm_new_password": "تأكيد كلمة السر الجديدة", "current_password": "كلمة السر الحالية", diff --git a/translations/frontend/en.json b/translations/frontend/en.json index 65bfb5d650..e4c67bec94 100644 --- a/translations/frontend/en.json +++ b/translations/frontend/en.json @@ -694,10 +694,10 @@ }, "zha_device_info": { "buttons": { - "add": "Add Devices", + "add": "Add Devices via this device", "reconfigure": "Reconfigure Device", "remove": "Remove Device", - "zigbee_information": "Zigbee Information" + "zigbee_information": "Zigbee device signature" }, "confirmations": { "remove": "Are you sure that you want to remove the device?" @@ -717,7 +717,7 @@ "unknown": "Unknown", "zha_device_card": { "area_picker_label": "Area", - "device_name_placeholder": "User given name", + "device_name_placeholder": "Change device name", "update_name_button": "Update Name" } } @@ -1728,8 +1728,11 @@ }, "zha": { "add_device_page": { + "discovered_text": "Devices will show up here once discovered.", "discovery_text": "Discovered devices will show up here. Follow the instructions for your device(s) and place the device(s) in pairing mode.", "header": "Zigbee Home Automation - Add Devices", + "no_devices_found": "No devices where found, make sure they are in paring mode and keep them awake while discovering is running.", + "pairing_mode": "Make sure your devices are in pairing mode. Check the instructions of your device on how to do this.", "search_again": "Search Again", "spinner": "Searching for ZHA Zigbee devices..." }, @@ -1737,6 +1740,7 @@ "caption": "Add Devices", "description": "Add devices to the Zigbee network" }, + "button": "Configure", "caption": "ZHA", "cluster_attributes": { "attributes_of_cluster": "Attributes of the selected cluster", @@ -1815,6 +1819,9 @@ "header": "Network Management", "introduction": "Commands that affect the entire network" }, + "network": { + "caption": "Network" + }, "node_management": { "header": "Device Management", "help_node_dropdown": "Select a device to view per-device options.", @@ -1854,6 +1861,7 @@ "no_zones_created_yet": "Looks like you have not created any zones yet." }, "zwave": { + "button": "Configure", "caption": "Z-Wave", "common": { "index": "Index", diff --git a/translations/frontend/es-419.json b/translations/frontend/es-419.json index acc5baf3e8..6e7529c3ae 100644 --- a/translations/frontend/es-419.json +++ b/translations/frontend/es-419.json @@ -474,10 +474,13 @@ }, "common": { "and": "y", + "back": "Atrás", "cancel": "Cancelar", "close": "Cerrar", "delete": "Eliminar", + "error_required": "Requerido", "loading": "Cargando", + "menu": "Menú", "next": "Siguiente", "no": "No", "previous": "Anterior", @@ -505,6 +508,7 @@ "device-picker": { "clear": "Limpiar", "device": "Dispositivo", + "no_area": "Sin área", "show_devices": "Mostrar dispositivos", "toggle": "Alternar" }, @@ -738,6 +742,8 @@ "notification_toast": { "connection_lost": "Conexión perdida. Reconectando...", "service_call_failed": "Error al llamar al servicio {service} .", + "started": "¡Home Assistant ha iniciado!", + "starting": "Home Assistant está iniciando, no todo estará disponible hasta que termine.", "triggered": "{name} activado" }, "panel": { @@ -762,9 +768,13 @@ }, "description": "Visión general de todas las áreas de su casa.", "editor": { + "area_id": "Identificador del área", "create": "Crear", "default_name": "Nueva Área", "delete": "Eliminar", + "name": "Nombre", + "name_required": "Se requiere el nombre", + "unknown_error": "Error desconocido", "update": "Actualizar" }, "picker": { @@ -799,6 +809,7 @@ "label": "Retrasar" }, "device_id": { + "action": "Acción", "extra_fields": { "code": "Código" }, @@ -840,6 +851,7 @@ "label": "Y" }, "device": { + "condition": "Condición", "extra_fields": { "above": "Por encima de", "below": "Por debajo de", @@ -900,6 +912,8 @@ "introduction": "Use automatizaciones para darle vida a su hogar.", "load_error_not_editable": "Solo las automatizaciones en automations.yaml son editables.", "load_error_unknown": "Error al cargar la automatización ({err_no}).", + "move_down": "Mover hacia abajo", + "move_up": "Mover hacia arriba", "save": "Guardar", "triggers": { "add": "Agregar desencadenador", @@ -918,7 +932,8 @@ "below": "Por debajo de", "for": "Duración" }, - "label": "Dispositivo" + "label": "Dispositivo", + "trigger": "Desencadenar" }, "event": { "event_data": "Datos del evento", @@ -1210,6 +1225,7 @@ "different_include": "Posiblemente a través de un dominio, un globo o una inclusión diferente.", "pick_attribute": "Elija un atributo para sobrescribir", "picker": { + "entity": "Entidad", "header": "Personalizaciones", "introduction": "Ajustar los atributos por entidad. Las personalizaciones agregadas/editadas tendrán efecto inmediatamente. Las personalizaciones eliminadas entrarán en vigor cuando se actualice la entidad." }, @@ -1246,6 +1262,7 @@ "integration": "Integración", "manufacturer": "Fabricante", "model": "Modelo", + "no_area": "Sin area", "no_devices": "Sin dispositivos" }, "delete": "Eliminar", @@ -1254,7 +1271,9 @@ "device_not_found": "Dispositivo no encontrado.", "entities": { "add_entities_lovelace": "Agregar a Lovelace", + "disabled_entities": "+{count} {count, plural,\n one {entidad deshabilitada}\n other {entidades deshabilitadas}\n}", "entities": "Entidades", + "hide_disabled": "Ocultar deshabilitadas", "none": "Este dispositivo no tiene entidades" }, "name": "Nombre", @@ -1353,7 +1372,9 @@ }, "info": { "built_using": "Construido usando", + "caption": "Información", "custom_uis": "Interfaces de usuario personalizadas:", + "description": "Información sobre la instalación de Home Assistant", "developed_by": "Desarrollado por un grupo de personas increíbles.", "documentation": "Documentación", "frontend": "frontend-ui", @@ -1392,7 +1413,8 @@ "restart_confirm": "Reinicie Home Assistant para terminar de eliminar esta integración.", "settings_button": "Editar configuración para {integration}", "system_options": "Opciones de Sistema", - "system_options_button": "Opciones del sistema para {integration}" + "system_options_button": "Opciones del sistema para {integration}", + "unnamed_entry": "Entrada sin nombre" }, "config_flow": { "aborted": "Abortado", @@ -1440,7 +1462,9 @@ }, "introduction": "Aquí es posible configurar sus componentes y Home Assistant. Todavía no es posible configurar todo desde la interfaz de usuario, pero estamos trabajando en ello.", "logs": { + "caption": "Registros", "clear": "Limpiar", + "description": "Ver los registros de Home Assistant", "details": "Detalles del registro ({level})", "load_full_log": "Cargar registro completo de Home Assistant", "loading_log": "Cargando registro de errores ...", @@ -1635,6 +1659,11 @@ "core": "Recargar ubicación y personalizaciones", "group": "Recargar grupos", "heading": "Recarga de configuración YAML", + "input_boolean": "Recargar controles booleanos", + "input_datetime": "Recargar controles de fechas", + "input_number": "Recargar controles numéricos", + "input_select": "Recargar controles de selección", + "input_text": "Recargar controles de texto", "introduction": "Algunas partes de Home Assistant pueden recargarse sin requerir un reinicio. Al presionar recargar se descargará su configuración YAML actual y se cargará la nueva.", "person": "Recargar personas", "scene": "Recargar escenas", @@ -1693,7 +1722,8 @@ "name": "Nombre", "system": "Sistema" } - } + }, + "users_privileges_note": "El grupo de usuarios es un trabajo en progreso. El usuario no podrá administrar la instancia a través de la interfaz de usuario. Todavía estamos auditando todos los puntos finales de la API de administración para garantizar que limiten correctamente el acceso a los administradores." }, "zha": { "add_device_page": { @@ -1855,21 +1885,52 @@ "set_wakeup": "Establecer intervalo de activación", "true": "Verdadero" }, + "node_management": { + "add_to_group": "Agregar al grupo", + "entities": "Entidades de este nodo", + "entity_info": "Información de la entidad", + "exclude_entity": "Excluir esta entidad de Home Assistant", + "group": "Grupo", + "header": "Gestión del nodo Z-Wave", + "introduction": "Ejecute comandos de Z-Wave que afectan a un solo nodo. Elija un nodo para ver una lista de comandos disponibles.", + "max_associations": "Asociaciones máximas:", + "node_group_associations": "Asociaciones de grupos de nodos", + "node_protection": "Protección del nodo", + "node_to_control": "Nodo a controlar", + "nodes": "Nodos", + "nodes_hint": "Seleccione el nodo para ver las opciones por nodo", + "nodes_in_group": "Otros nodos en este grupo:", + "pooling_intensity": "Intensidad de sondeo", + "protection": "Protección", + "remove_broadcast": "Eliminar difusión", + "remove_from_group": "Eliminar del grupo", + "set_protection": "Establecer protección" + }, "ozw_log": { "header": "Registro de OZW", - "introduction": "Ver el registro. 0 es el mínimo (carga el registro completo) y 1000 es el máximo. L carga mostrará un registro estático y la cola se actualizará automáticamente con el último número especificado de líneas del registro." + "introduction": "Ver el registro. 0 es el mínimo (carga el registro completo) y 1000 es el máximo. L carga mostrará un registro estático y la cola se actualizará automáticamente con el último número especificado de líneas del registro.", + "last_log_lines": "Número de últimas líneas de registro", + "load": "Cargar", + "tail": "Cola" }, "services": { "add_node": "Agregar nodo", "add_node_secure": "Agregar nodo seguro", "cancel_command": "Cancelar comando", "heal_network": "Red de sanación", + "node_info": "Información de nodo", + "print_node": "Nodo de impresión", + "refresh_entity": "Actualizar entidad", + "refresh_node": "Actualizar nodo", + "remove_failed_node": "Eliminar nodo fallido", "remove_node": "Eliminar nodo", + "replace_failed_node": "Reemplazar nodo fallido", "save_config": "Guardar configuración", "soft_reset": "Reinicio suave", "start_network": "Iniciar red", "stop_network": "Detener red", - "test_network": "Red de prueba" + "test_network": "Red de prueba", + "test_node": "Nodo de prueba" }, "values": { "header": "Valores del nodo" @@ -1999,6 +2060,10 @@ "add_item": "Agregar elemento", "checked_items": "lementos marcados", "clear_items": "Borrar elementos marcados" + }, + "starting": { + "description": "Home Assistant está iniciando, por favor espere ...", + "header": "Home Assistant está iniciando ..." } }, "changed_toast": { @@ -2291,7 +2356,8 @@ "attribute_not_found": "El atributo {attribute} no está disponible en: {entity}", "entity_non_numeric": "Entidad no es numérica: {entity}", "entity_not_found": "Entidad no disponible: {entity}", - "entity_unavailable": "{entidad} no se encuentra disponible" + "entity_unavailable": "{entidad} no se encuentra disponible", + "starting": "Home Assistant está comenzando, no todo puede estar disponible aún" } }, "mailbox": { @@ -2304,6 +2370,8 @@ "abort_intro": "Inicio de sesión cancelado", "authorizing_client": "Está por dar acceso a {clientId} a su instancia de Home Assistant.", "form": { + "error": "Error: {error}", + "next": "Siguiente", "providers": { "command_line": { "abort": { @@ -2389,6 +2457,7 @@ } } }, + "start_over": "Comenzar de nuevo", "unknown_error": "Algo salió mal", "working": "Por favor, espere" }, diff --git a/translations/frontend/pl.json b/translations/frontend/pl.json index 316ca6c59c..7bd461cc15 100644 --- a/translations/frontend/pl.json +++ b/translations/frontend/pl.json @@ -1561,7 +1561,7 @@ "link_presence_detection_integrations": "Integracje wykrywania obecności", "linked_user": "Połączony użytkownik", "name": "Imię", - "name_error_msg": "Nazwa jest wymagana", + "name_error_msg": "Imię jest wymagane", "new_person": "Nowa osoba", "no_device_tracker_available_intro": "Jeśli masz urządzenia wskazujące obecność osoby, możesz tutaj przypisać ją do tej osoby. Możesz dodać swoje pierwsze urządzenie, dodając integrację wykrywania obecności ze strony integracji.", "update": "Aktualizuj" diff --git a/translations/frontend/pt.json b/translations/frontend/pt.json index 690ae5d243..4d1e6c3c2f 100644 --- a/translations/frontend/pt.json +++ b/translations/frontend/pt.json @@ -1650,6 +1650,8 @@ "core": "Recarregar localização e personalizações", "group": "Recarregar grupos", "heading": "A recarregar a configuração YAML", + "input_datetime": "Recarregar input date times", + "input_select": "Recarregar da", "introduction": "Algumas partes do Home Assistant podem ser recarregadas sem a necessidade de reiniciar. Ao carregar em Recarregar a configuração irá descartar a configuração atual e carregar a nova.", "person": "Recarregar pessoas", "scene": "Recarregar cenas", diff --git a/translations/frontend/sv.json b/translations/frontend/sv.json index 48852dd9d5..10d8332153 100644 --- a/translations/frontend/sv.json +++ b/translations/frontend/sv.json @@ -543,7 +543,7 @@ "second": "{count} {count, plural,\n one {sekund}\n other {sekunder}\n}", "week": "{count} {count, plural,\none {vecka}\nother {veckor}\n}" }, - "future": "Om {time}", + "future": "{time} sedan", "never": "Aldrig", "past": "{time} sedan" }, @@ -1656,6 +1656,7 @@ "core": "Ladda om plats & anpassningar", "group": "Ladda om grupper", "heading": "YAML-konfiguration laddas om", + "input_datetime": "Ladda om inmatningsdatum/tid", "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", From ffff4dc03d7ea379d2030221155f8afd5341f455 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Sat, 13 Jun 2020 06:00:37 +0200 Subject: [PATCH 35/39] Add z index to dialog (#6145) --- src/components/ha-dialog.ts | 3 +++ src/dialogs/generic/dialog-box.ts | 13 ++++--------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/components/ha-dialog.ts b/src/components/ha-dialog.ts index 92c17b0fa8..6a6d35a031 100644 --- a/src/components/ha-dialog.ts +++ b/src/components/ha-dialog.ts @@ -25,6 +25,9 @@ export class HaDialog extends MwcDialog { return [ style, css` + .mdc-dialog { + z-index: var(--dialog-z-index, 7); + } .mdc-dialog__actions { justify-content: var(--justify-action-buttons, flex-end); } diff --git a/src/dialogs/generic/dialog-box.ts b/src/dialogs/generic/dialog-box.ts index 3194332822..17e784e8c2 100644 --- a/src/dialogs/generic/dialog-box.ts +++ b/src/dialogs/generic/dialog-box.ts @@ -132,15 +132,6 @@ class DialogBox extends LitElement { pointer-events: initial !important; cursor: initial !important; } - ha-paper-dialog { - min-width: 400px; - max-width: 500px; - } - @media (max-width: 400px) { - ha-paper-dialog { - min-width: initial; - } - } a { color: var(--primary-color); } @@ -156,6 +147,10 @@ class DialogBox extends LitElement { .secondary { color: var(--secondary-text-color); } + ha-dialog { + /* Place above other dialogs */ + --dialog-z-index: 104; + } `, ]; } From 71137032dfb5fec7d3db01693d7adf6eb15f534c Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 12 Jun 2020 21:01:09 -0700 Subject: [PATCH 36/39] Custom Panel to allow passing two builds (#6104) --- src/panels/custom/ha-panel-custom.ts | 8 ++- src/util/custom-panel/load-custom-panel.ts | 65 +++++++++++++++++----- 2 files changed, 57 insertions(+), 16 deletions(-) diff --git a/src/panels/custom/ha-panel-custom.ts b/src/panels/custom/ha-panel-custom.ts index b7b2a10c3c..9739c79c7e 100644 --- a/src/panels/custom/ha-panel-custom.ts +++ b/src/panels/custom/ha-panel-custom.ts @@ -3,7 +3,10 @@ import { navigate } from "../../common/navigate"; import { CustomPanelInfo } from "../../data/panel_custom"; import { HomeAssistant, Route } from "../../types"; import { createCustomPanelElement } from "../../util/custom-panel/create-custom-panel-element"; -import { loadCustomPanel } from "../../util/custom-panel/load-custom-panel"; +import { + loadCustomPanel, + getUrl, +} from "../../util/custom-panel/load-custom-panel"; import { setCustomPanelProperties } from "../../util/custom-panel/set-custom-panel-properties"; declare global { @@ -74,9 +77,10 @@ export class HaPanelCustom extends UpdatingElement { private _createPanel(panel: CustomPanelInfo) { const config = panel.config!._panel_custom; + const panelUrl = getUrl(config); const tempA = document.createElement("a"); - tempA.href = config.html_url || config.js_url || config.module_url || ""; + tempA.href = panelUrl.url; if ( !config.trust_external && diff --git a/src/util/custom-panel/load-custom-panel.ts b/src/util/custom-panel/load-custom-panel.ts index d04f386e6b..c674e0f4ed 100644 --- a/src/util/custom-panel/load-custom-panel.ts +++ b/src/util/custom-panel/load-custom-panel.ts @@ -1,34 +1,71 @@ import { loadJS, loadModule } from "../../common/dom/load_resource"; +import { CustomPanelConfig } from "../../data/panel_custom"; // Make sure we only import every JS-based panel once (HTML import has this built-in) const JS_CACHE = {}; -export const loadCustomPanel = (panelConfig): Promise => { +export const getUrl = ( + panelConfig: CustomPanelConfig +): { type: "module" | "html" | "js"; url: string } => { if (panelConfig.html_url) { + return { + type: "html", + url: panelConfig.html_url, + }; + } + + // if both module and JS provided, base url on frontend build + if (panelConfig.module_url && panelConfig.js_url) { + if (__BUILD__ === "latest") { + return { + type: "module", + url: panelConfig.module_url, + }; + } + + return { + type: "js", + url: panelConfig.js_url, + }; + } + + if (panelConfig.module_url) { + return { + type: "module", + url: panelConfig.module_url, + }; + } + + return { + type: "js", + url: panelConfig.js_url!, + }; +}; + +export const loadCustomPanel = ( + panelConfig: CustomPanelConfig +): Promise => { + const panelSource = getUrl(panelConfig); + + if (panelSource.type === "html") { const toLoad = [ import( /* webpackChunkName: "import-href-polyfill" */ "../../resources/html-import/import-href" ), ]; - if (!panelConfig.embed_iframe) { - toLoad.push( - import(/* webpackChunkName: "legacy-support" */ "../legacy-support") - ); - } - return Promise.all(toLoad).then(([{ importHrefPromise }]) => - importHrefPromise(panelConfig.html_url) + importHrefPromise(panelSource.url) ); } - if (panelConfig.js_url) { - if (!(panelConfig.js_url in JS_CACHE)) { - JS_CACHE[panelConfig.js_url] = loadJS(panelConfig.js_url); + if (panelSource.type === "js") { + if (!(panelSource.url in JS_CACHE)) { + JS_CACHE[panelSource.url] = loadJS(panelSource.url); } - return JS_CACHE[panelConfig.js_url]; + return JS_CACHE[panelSource.url]; } - if (panelConfig.module_url) { - return loadModule(panelConfig.module_url); + if (panelSource.type === "module") { + return loadModule(panelSource.url); } return Promise.reject("No valid url found in panel config."); }; From 6d6eef4e9776e45257c7d0583f1282616f2163e9 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Sat, 13 Jun 2020 08:58:21 +0200 Subject: [PATCH 37/39] Disable pointer events when disabled (#6155) --- src/components/ha-icon-button.ts | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/src/components/ha-icon-button.ts b/src/components/ha-icon-button.ts index 311e4fb368..1c645b50cd 100644 --- a/src/components/ha-icon-button.ts +++ b/src/components/ha-icon-button.ts @@ -24,28 +24,21 @@ export class HaIconButton extends LitElement { protected render(): TemplateResult { return html` - + `; } - private _handleClick(ev) { - if (this.disabled) { - ev.stopPropagation(); - } - } - static get styles(): CSSResult { return css` :host { display: inline-block; outline: none; } + :host([disabled]) { + pointer-events: none; + } mwc-icon-button { --mdc-theme-on-primary: currentColor; --mdc-theme-text-disabled-on-light: var(--disabled-text-color); From 6f5e3c2711f8835c181b3d257ab54e6822b38b15 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Sat, 13 Jun 2020 11:00:22 +0200 Subject: [PATCH 38/39] Close websocket connection after being hidden for 5 minutes (#6149) Co-authored-by: Paulus Schoutsen --- package.json | 2 +- src/state/hass-element.ts | 2 ++ src/state/suspend-mixin.ts | 48 ++++++++++++++++++++++++++++++++++++++ yarn.lock | 8 +++---- 4 files changed, 55 insertions(+), 5 deletions(-) create mode 100644 src/state/suspend-mixin.ts diff --git a/package.json b/package.json index 43658529fa..78d0f054ff 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,7 @@ "fuse.js": "^6.0.0", "google-timezones-json": "^1.0.2", "hls.js": "^0.12.4", - "home-assistant-js-websocket": "^5.2.1", + "home-assistant-js-websocket": "^5.3.0", "idb-keyval": "^3.2.0", "intl-messageformat": "^8.3.9", "js-yaml": "^3.13.1", diff --git a/src/state/hass-element.ts b/src/state/hass-element.ts index a5cb0992ae..3b702e7bb1 100644 --- a/src/state/hass-element.ts +++ b/src/state/hass-element.ts @@ -12,6 +12,7 @@ import SidebarMixin from "./sidebar-mixin"; import ThemesMixin from "./themes-mixin"; import TranslationsMixin from "./translations-mixin"; import { urlSyncMixin } from "./url-sync-mixin"; +import { suspendMixin } from "./suspend-mixin"; const ext = (baseClass: T, mixins): T => mixins.reduceRight((base, mixin) => mixin(base), baseClass); @@ -24,6 +25,7 @@ export class HassElement extends ext(HassBaseEl, [ SidebarMixin, DisconnectToastMixin, connectionMixin, + suspendMixin, NotificationMixin, dialogManagerMixin, urlSyncMixin, diff --git a/src/state/suspend-mixin.ts b/src/state/suspend-mixin.ts new file mode 100644 index 0000000000..774a77a45f --- /dev/null +++ b/src/state/suspend-mixin.ts @@ -0,0 +1,48 @@ +import { Constructor } from "../types"; +import { HassBaseEl } from "./hass-base-mixin"; + +export const suspendMixin = >( + superClass: T +) => + class extends superClass { + private __hiddenTimeout?: number; + + private __visiblePromiseResolve?: () => void; + + protected hassConnected() { + super.hassConnected(); + + document.addEventListener( + "visibilitychange", + () => this.__handleVisibilityChange(), + false + ); + } + + private __handleVisibilityChange() { + if (document.hidden) { + // If the document is hidden, we will prevent reconnects until we are visible again + this.hass!.connection.suspendReconnectUntil( + new Promise((resolve) => { + this.__visiblePromiseResolve = resolve; + }) + ); + // We close the connection to Home Assistant after being hidden for 5 minutes + this.__hiddenTimeout = window.setTimeout(() => { + this.__hiddenTimeout = undefined; + this.hass!.connection.suspend(); + }, 300000); + } else { + // Clear timer to close the connection + if (this.__hiddenTimeout) { + clearTimeout(this.__hiddenTimeout); + this.__hiddenTimeout = undefined; + } + // Unsuspend the reconnect + if (this.__visiblePromiseResolve) { + this.__visiblePromiseResolve(); + this.__visiblePromiseResolve = undefined; + } + } + } + }; diff --git a/yarn.lock b/yarn.lock index 40e0b87b48..14318d7282 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6613,10 +6613,10 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -home-assistant-js-websocket@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/home-assistant-js-websocket/-/home-assistant-js-websocket-5.2.1.tgz#88c06738416e041dfd805f2543722458d9c3a391" - integrity sha512-azPiR+KABxaow1sMS70+Jk12KOaKSJY9KSKSGljkAArJmbWum3PEMNXXaG+XJnYmNuDnyzLAwi3/e1cwvVqocA== +home-assistant-js-websocket@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/home-assistant-js-websocket/-/home-assistant-js-websocket-5.3.0.tgz#261d371c72746ec8b0eb8768b286d4f865e408b7" + integrity sha512-treEjeKpHB7JNrLddOf4FJudcm7hf9y23bNv/9GKiOvmmWIbblKt7UN+2V0WjPmBkSRvLmGprA/xxh5cgS8S1g== homedir-polyfill@^1.0.1: version "1.0.3" From 17352ea5bd69108da1314d1a0e09424e37edbc96 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Sat, 13 Jun 2020 11:41:18 +0200 Subject: [PATCH 39/39] Bumped version to 20200613.0 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 03c5157ae6..173b315ffa 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name="home-assistant-frontend", - version="20200603.1", + version="20200613.0", description="The Home Assistant frontend", url="https://github.com/home-assistant/home-assistant-polymer", author="The Home Assistant Authors",