From 0889f42a0096fcb24e34a3783ad529cf66c2e387 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Tue, 8 Sep 2020 00:32:39 +0000 Subject: [PATCH 01/17] [ci skip] Translation update --- translations/frontend/ar.json | 22 +++++ translations/frontend/bs.json | 51 ++++++++++- translations/frontend/ca.json | 41 ++++++++- translations/frontend/cs.json | 2 + translations/frontend/cy.json | 13 ++- translations/frontend/en.json | 25 +++++- translations/frontend/eo.json | 52 +++++++++++- translations/frontend/es-419.json | 11 ++- translations/frontend/es.json | 49 +++++++++-- translations/frontend/et.json | 4 + translations/frontend/fa.json | 3 + translations/frontend/fr.json | 2 + translations/frontend/fy.json | 2 + translations/frontend/gl.json | 20 ++++- translations/frontend/gsw.json | 46 +++++++++- translations/frontend/hi.json | 60 ++++++++++++- translations/frontend/ja.json | 3 + translations/frontend/lt.json | 18 +++- translations/frontend/nb.json | 130 +++++++++++++++++++++++------ translations/frontend/nl.json | 2 + translations/frontend/pt-BR.json | 3 + translations/frontend/pt.json | 12 ++- translations/frontend/sr-Latn.json | 124 +++++++++++++++++++++++++++ translations/frontend/sr.json | 120 +++++++++++++++++++++++++- translations/frontend/sv.json | 11 ++- translations/frontend/ta.json | 49 ++++++++++- translations/frontend/te.json | 25 +++++- translations/frontend/tr.json | 6 +- translations/frontend/ur.json | 52 ++++++++++++ translations/frontend/zh-Hant.json | 2 + 30 files changed, 902 insertions(+), 58 deletions(-) diff --git a/translations/frontend/ar.json b/translations/frontend/ar.json index 15f0aca0ea..bb67ab7519 100644 --- a/translations/frontend/ar.json +++ b/translations/frontend/ar.json @@ -1469,12 +1469,34 @@ "next": "التالى", "providers": { "command_line": { + "abort": { + "login_expired": "" + }, + "error": { + "invalid_auth": "" + }, "step": { "init": { "data": { "password": "كلمة السر", "username": "اسم المستخدم" } + }, + "mfa": { + "data": { + "code": "" + }, + "description": "" + } + } + }, + "legacy_api_password": { + "step": { + "mfa": { + "data": { + "code": "" + }, + "description": "" } } }, diff --git a/translations/frontend/bs.json b/translations/frontend/bs.json index f3a2c84456..e85972507c 100644 --- a/translations/frontend/bs.json +++ b/translations/frontend/bs.json @@ -36,7 +36,8 @@ "unknown": "Nepoznat" }, "device_tracker": { - "home": "Kod kuće" + "home": "Kod kuće", + "not_home": "" }, "person": { "home": "Kod kuće" @@ -93,6 +94,7 @@ "on": "Otvoren" }, "presence": { + "off": "", "on": "Kod kuće" }, "problem": { @@ -159,6 +161,7 @@ "closing": "Zatvoreno", "home": "Kod kuće", "locked": "Zaključan", + "not_home": "", "off": "Isključen", "ok": "OK", "on": "Uključen", @@ -242,6 +245,13 @@ "config": { "automation": { "editor": { + "conditions": { + "type": { + "zone": { + "entity": "" + } + } + }, "triggers": { "type": { "mqtt": { @@ -293,6 +303,45 @@ "empty": "Nemate poruke", "playback_title": "Poruku preslušati" }, + "page-authorize": { + "form": { + "providers": { + "command_line": { + "abort": { + "login_expired": "" + }, + "error": { + "invalid_auth": "", + "invalid_code": "" + }, + "step": { + "init": { + "data": { + "password": "", + "username": "" + } + }, + "mfa": { + "data": { + "code": "" + }, + "description": "" + } + } + }, + "legacy_api_password": { + "step": { + "mfa": { + "data": { + "code": "" + }, + "description": "" + } + } + } + } + } + }, "shopping-list": { "add_item": "Dodajte objekat", "clear_completed": "Čišćenje završeno", diff --git a/translations/frontend/ca.json b/translations/frontend/ca.json index 5e49c1fdd1..9e2888ab08 100644 --- a/translations/frontend/ca.json +++ b/translations/frontend/ca.json @@ -19,6 +19,7 @@ "logbook": "Diari de registre", "mailbox": "Bústia", "map": "Mapa", + "media_browser": "Navegador multimèdia", "profile": "Perfil", "shopping_list": "Llista de compres", "states": "Visualització general" @@ -505,6 +506,7 @@ "back": "Torna", "cancel": "Cancel·la", "close": "Tanca", + "continue": "Continua", "delete": "Elimina", "error_required": "Obligatori", "loading": "Carregant", @@ -562,6 +564,8 @@ "no_history_found": "No s'ha trobat cap historial d'estats." }, "media-browser": { + "audio_not_supported": "El teu navegador no és compatible amb l'element d'àudio.", + "choose_player": "Tria el reproductor", "choose-source": "Tria la font", "content-type": { "album": "Àlbum", @@ -570,12 +574,17 @@ "playlist": "Llista de reproducció", "server": "Servidor" }, + "media_browsing_error": "Error de navegació multimèdia", + "media_not_supported": "El reproductor multimèdia de navegador no és compatible amb aquest tipus de mitjà", + "media_player": "Reproductor multimèdia", "media-player-browser": "Navegador del reproductor multimèdia", "no_items": "Sense elements", "pick": "Escull", "pick-media": "Tria mitjans", "play": "Reprodueix", - "play-media": "Reprodueix mitjans" + "play-media": "Reprodueix mitjans", + "video_not_supported": "El teu navegador no és compatible amb l'element de vídeo.", + "web-browser": "Navegador web" }, "picture-upload": { "label": "Imatge", @@ -689,8 +698,10 @@ "crop": "Retalla" }, "more_info_control": { + "controls": "Controls", "dismiss": "Desestimar el diàleg", "edit": "Edita entitat", + "history": "Historial", "person": { "create_zone": "Crea una zona a partir de la ubicació actual" }, @@ -1543,6 +1554,7 @@ "reload_restart_confirm": "Reinicia Home Assistant per acabar de carregar aquesta integració", "rename": "Canvia el nom", "restart_confirm": "Reinicia Home Assistant per acabar d'eliminar aquesta integració", + "services": "{count} {count, plural,\n one {servei}\n other {serveis}\n}", "settings_button": "Edita la configuració de {integration}", "system_options": "Opcions de sistema", "system_options_button": "Opcions de sistema de {integration}", @@ -1762,8 +1774,21 @@ "versions": "Obtenint informació de programari i versions de classes de comandes", "wakeup": "Configurant el suport per a cues i missatges" }, + "node": { + "button": "Detalls del node", + "not_found": "No s'ha trobat el node" + }, + "nodes_table": { + "failed": "Ha fallat", + "id": "ID", + "manufacturer": "Fabricant", + "model": "Model", + "query_stage": "Fase de consulta", + "zwave_plus": "Z-Wave Plus" + }, "refresh_node": { "battery_note": "Si el node funciona amb bateria, assegura't de que estigui actiu abans de continuar", + "button": "Actualitza node", "complete": "Actualització del node completa", "description": "Això farà que OpenZWave torni a consultar el node i n'actualitzi les classes de comandes, funcions i valors.", "node_status": "Estat del node", @@ -1912,7 +1937,7 @@ "filter": "Torna a carregar entitats de filtre", "generic": "Torna a carregar entitats genèriques de càmera IP", "generic_thermostat": "Torna a carregar entitats genèriques de termòstat", - "group": "Actualitza grups", + "group": "Torna a carregar grups, grups d'entitats i serveis de notificació", "heading": "Tornant a carregar la configuració", "history_stats": "Torna a carregar entitats d'estadístiques històriques", "homekit": "Torna a carregar HomeKit", @@ -1923,12 +1948,17 @@ "input_text": "Actualitza entrades de text", "introduction": "Algunes parts de Home Assistant es poden actualitzar sense necessitat reiniciar-lo. Si prems actualitza s'esborrarà la configuració YAML actual i se'n carregarà la nova.", "min_max": "Torna a carregar entitats min/max", + "mqtt": "Torna a carregar entitats MQTT", "person": "Actualitza persones", "ping": "Torna a carregar entitats de sensors binaris de ping", - "rest": "Torna a carregar entitats de repòs", + "reload": "Torna a carregar {domain}", + "rest": "Torna a carregar entitats de repòs i serveis de notificació", + "rpi_gpio": "Torna a carregar entitats GPIO de la Raspberry Pi", "scene": "Actualitza escenes", "script": "Actualitza programes", + "smtp": "Torna a carregar serveis de notificació SMTP", "statistics": "Torna a carregar entitats estadístiques", + "telegram": "Torna a carregar serveis de notificació de Telegram", "template": "Torna a carregar entitats de plantilla", "trend": "Torna a carregar entitats de tendència", "universal": "Torna a carregar entitats del reproductor universal", @@ -2549,7 +2579,11 @@ } }, "cardpicker": { + "by_card": "Per targeta", + "by_entity": "Per entitat", "custom_card": "Personalitzada", + "domain": "Domini", + "entity": "Entitat", "no_description": "No hi ha cap descripció disponible." }, "edit_card": { @@ -2563,6 +2597,7 @@ "options": "Més opcions", "pick_card": "Quina targeta vols afegir?", "pick_card_view_title": "Quina targeta vols afegir a la visualització {name}?", + "search_cards": "Cerca targetes", "show_code_editor": "Mostra l'editor de codi", "show_visual_editor": "Mostra l'editor visual", "toggle_editor": "Commutar l'editor", diff --git a/translations/frontend/cs.json b/translations/frontend/cs.json index cea97f6d86..e8048e50a0 100644 --- a/translations/frontend/cs.json +++ b/translations/frontend/cs.json @@ -19,6 +19,7 @@ "logbook": "Záznamy", "mailbox": "Schránka", "map": "Mapa", + "media_browser": "Prohlížeč médií", "profile": "Profil", "shopping_list": "Nákupní seznam", "states": "Přehled" @@ -573,6 +574,7 @@ "playlist": "Seznam skladeb", "server": "Server" }, + "media_browsing_error": "Chyba při procházení médií", "media_not_supported": "Přehrávač médií v prohlížeči nepodporuje tento typ média", "media_player": "Přehrávač médií", "media-player-browser": "Prohlížeč přehrávače médií", diff --git a/translations/frontend/cy.json b/translations/frontend/cy.json index 15f461bf91..abd54bda52 100644 --- a/translations/frontend/cy.json +++ b/translations/frontend/cy.json @@ -1283,7 +1283,18 @@ "mfa": { "data": { "code": "Cod dilysu dwy-ffactor" - } + }, + "description": "" + } + } + }, + "legacy_api_password": { + "step": { + "mfa": { + "data": { + "code": "" + }, + "description": "" } } } diff --git a/translations/frontend/en.json b/translations/frontend/en.json index 2eac397f6b..250666624b 100644 --- a/translations/frontend/en.json +++ b/translations/frontend/en.json @@ -553,6 +553,10 @@ "toggle": "Toggle" }, "entity": { + "entity-attribute-picker": { + "attribute": "Attribute", + "show_attributes": "Show attributes" + }, "entity-picker": { "clear": "Clear", "entity": "Entity", @@ -929,7 +933,13 @@ "label": "Call service", "service_data": "Service data" }, + "wait_for_trigger": { + "continue_timeout": "Continue on timeout", + "label": "Wait for trigger", + "timeout": "Timeout (optional)" + }, "wait_template": { + "continue_timeout": "Continue on timeout", "label": "Wait", "timeout": "Timeout (optional)", "wait_template": "Wait Template" @@ -993,7 +1003,9 @@ "time": { "after": "After", "before": "Before", - "label": "Time" + "label": "Time", + "type_input": "Value of a date/time helper", + "type_value": "Fixed time" }, "zone": { "entity": "Entity with location", @@ -1081,6 +1093,7 @@ "value_template": "Value template (optional)" }, "state": { + "attribute": "Attribute (Optional)", "for": "For", "from": "From", "label": "State", @@ -1107,8 +1120,10 @@ "seconds": "Seconds" }, "time": { - "at": "At", - "label": "Time" + "at": "At time", + "label": "Time", + "type_input": "Value of a date/time helper", + "type_value": "Fixed time" }, "webhook": { "label": "Webhook", @@ -1131,6 +1146,8 @@ "add_automation": "Add automation", "delete_automation": "Delete automation", "delete_confirm": "Are you sure you want to delete this automation?", + "duplicate": "Duplicate", + "duplicate_automation": "Duplicate automation", "edit_automation": "Edit automation", "header": "Automation Editor", "headers": { @@ -1531,6 +1548,7 @@ }, "integrations": { "add_integration": "Add integration", + "attention": "Attention required", "caption": "Integrations", "config_entry": { "area": "In {area}", @@ -1601,6 +1619,7 @@ "none_found_detail": "Adjust your search criteria.", "note_about_integrations": "Not all integrations can be configured via the UI yet.", "note_about_website_reference": "More are available on the ", + "reconfigure": "Reconfigure", "rename_dialog": "Edit the name of this config entry", "rename_input_label": "Entry name", "search": "Search integrations" diff --git a/translations/frontend/eo.json b/translations/frontend/eo.json index 23fc03e9a9..8b05489328 100644 --- a/translations/frontend/eo.json +++ b/translations/frontend/eo.json @@ -1,4 +1,49 @@ { + "state_badge": { + "device_tracker": { + "home": "" + } + }, + "state": { + "automation": { + "off": "" + }, + "binary_sensor": { + "default": { + "on": "" + }, + "presence": { + "on": "" + } + }, + "calendar": { + "on": "" + }, + "group": { + "home": "", + "off": "", + "on": "" + }, + "input_boolean": { + "on": "" + }, + "light": { + "off": "", + "on": "" + }, + "media_player": { + "off": "" + }, + "script": { + "off": "" + }, + "sensor": { + "off": "" + }, + "switch": { + "on": "" + } + }, "ui": { "card": { "climate": { @@ -79,7 +124,12 @@ "edit_ui": "Redakti kun UI", "edit_yaml": "Redakti kiel YAML", "triggers": { - "name": "Ellasilo" + "name": "Ellasilo", + "type": { + "mqtt": { + "label": "" + } + } } }, "picker": { diff --git a/translations/frontend/es-419.json b/translations/frontend/es-419.json index 62e01af2d6..ced016f2a1 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": { @@ -994,6 +1000,7 @@ "start": "Inicio" }, "mqtt": { + "label": "", "payload": "Payload (opcional)", "topic": "Topic" }, @@ -1609,6 +1616,7 @@ "start_listening": "Comenzar a escuchar", "stop_listening": "Deja de escuchar", "subscribe_to": "Tema para suscribirse", + "title": "", "topic": "tema" }, "person": { @@ -1939,6 +1947,7 @@ }, "zwave": { "button": "Configurar", + "caption": "", "common": { "index": "Índice", "instance": "Instancia", diff --git a/translations/frontend/es.json b/translations/frontend/es.json index 1b45b58764..9b22dc0cde 100644 --- a/translations/frontend/es.json +++ b/translations/frontend/es.json @@ -19,6 +19,7 @@ "logbook": "Registro", "mailbox": "Buzón", "map": "Mapa", + "media_browser": "Navegador de medios", "profile": "Perfil", "shopping_list": "Lista de la compra", "states": "Resumen" @@ -505,6 +506,7 @@ "back": "Volver", "cancel": "Cancelar", "close": "Cerrar", + "continue": "Continuar", "delete": "Eliminar", "error_required": "Obligatorio", "loading": "Cargando", @@ -562,6 +564,8 @@ "no_history_found": "No se encontró historial de estado." }, "media-browser": { + "audio_not_supported": "Tu navegador no es compatible con el elemento de audio.", + "choose_player": "Elige reproductor", "choose-source": "Elige la fuente", "content-type": { "album": "Álbum", @@ -570,12 +574,17 @@ "playlist": "Lista de reproducción", "server": "Servidor" }, + "media_browsing_error": "Error de navegación de medios", + "media_not_supported": "El Reproductor multimedia del navegador no es compatible con este tipo de medio", + "media_player": "Reproductor multimedia", "media-player-browser": "Navegador del Reproductor Multimedia", "no_items": "No hay elementos", "pick": "Elegir", "pick-media": "Elegir medio", "play": "Reproducir", - "play-media": "Reproducir medio" + "play-media": "Reproducir medio", + "video_not_supported": "Tu navegador no es compatible con el elemento de vídeo.", + "web-browser": "Navegador web" }, "picture-upload": { "label": "Imagen", @@ -689,8 +698,10 @@ "crop": "Recortar" }, "more_info_control": { + "controls": "Controles", "dismiss": "Descartar diálogo", "edit": "Editar entidad", + "history": "Historial", "person": { "create_zone": "Crear zona a partir de la ubicación actual" }, @@ -1543,6 +1554,7 @@ "reload_restart_confirm": "Reinicia Home Assistant para terminar de recargar esta integración", "rename": "Renombrar", "restart_confirm": "Reinicia Home Assistant para terminar de eliminar esta integración.", + "services": "{count} {count, plural,\n one {servicio}\n other {servicios}\n}", "settings_button": "Editar configuración para {integration}", "system_options": "Opciones del sistema", "system_options_button": "Opciones del sistema para {integration}", @@ -1762,8 +1774,21 @@ "versions": "Obteniendo información sobre versiones de firmware y clases de órdenes", "wakeup": "Configurando soporte para colas de despertador y mensajes" }, + "node": { + "button": "Detalles del nodo", + "not_found": "Nodo no encontrado" + }, + "nodes_table": { + "failed": "Ha fallado", + "id": "ID", + "manufacturer": "Fabricante", + "model": "Modelo", + "query_stage": "Etapa de consulta", + "zwave_plus": "Z-Wave Plus" + }, "refresh_node": { "battery_note": "Si el nodo funciona con batería, asegúrate de despertarlo antes de continuar", + "button": "Actualizar nodo", "complete": "Refresco del Nodo Finalizado", "description": "Esto le indicará a OpenZWave que vuelva a entrevistar un nodo y actualice las clases de órdenes, las capacidades y los valores del mismo.", "node_status": "Estado del Nodo", @@ -1912,7 +1937,7 @@ "filter": "Recargar entidades de filtro", "generic": "Recargar entidades de cámara IP genéricas", "generic_thermostat": "Recargar entidades de termostato genéricas", - "group": "Recargar grupos", + "group": "Recargar grupos, entidades de grupo, y notificar servicios", "heading": "Recargando la configuración YAML", "history_stats": "Recargar entidades de estadísticas del historial", "homekit": "Recargar HomeKit", @@ -1923,12 +1948,17 @@ "input_text": "Recargar los campos de texto", "introduction": "Algunas partes de Home Assistant pueden recargarse sin necesidad de reiniciar. Al pulsar en recargar se descartará la configuración YAML actual y se cargará la nueva.", "min_max": "Recargar entidades min/max", + "mqtt": "Recargar entidades mqtt", "person": "Recargar personas", "ping": "Recargar entidades de sensor binario de ping", - "rest": "Recargar entidades rest", + "reload": "Recargar {domain}", + "rest": "Recargar entidades rest y notificar servicios", + "rpi_gpio": "Recargar entidades GPIO de Raspberry Pi", "scene": "Recargar escenas", "script": "Recargar scripts", + "smtp": "Recargar servicios de notificación smtp", "statistics": "Recargar entidades de estadísticas", + "telegram": "Recargar servicios de notificación de telegram", "template": "Recargar entidades de plantilla", "trend": "Recargar entidades de tendencia", "universal": "Recargar entidades de reproductor multimedia universal", @@ -2017,7 +2047,7 @@ "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." + "users_privileges_note": "El grupo de usuarios es un trabajo en progreso. El usuario no podrá administrar la instancia a través de la IU. 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": { @@ -2055,7 +2085,7 @@ "clusters": { "header": "Clústeres", "help_cluster_dropdown": "Selecciona un clúster para ver atributos y comandos.", - "introduction": "Los clústeres son los bloques de construcción para la funcionalidad de Zigbee. Separan la funcionalidad en unidades lógicas. Hay tipos de cliente y servidor y se componen de atributos y comandos." + "introduction": "Los clústeres son los bloques de construcción para la funcionalidad de Zigbee. Separan la funcionalidad en unidades lógicas. Hay tipos de cliente y de servidor y se componen de atributos y comandos." }, "common": { "add_devices": "Añadir dispositivos", @@ -2188,7 +2218,7 @@ "true": "Verdadero" }, "node_management": { - "add_to_group": "Añadir al grupo", + "add_to_group": "Añadir al Grupo", "entities": "Entidades de este nodo", "entity_info": "Información de la entidad", "exclude_entity": "Excluir esta entidad de Home Assistant", @@ -2205,7 +2235,7 @@ "pooling_intensity": "Intensidad de sondeo", "protection": "Protección", "remove_broadcast": "Eliminar difusión", - "remove_from_group": "Eliminar del grupo", + "remove_from_group": "Eliminar del Grupo", "set_protection": "Establecer protección" }, "ozw_log": { @@ -2549,7 +2579,11 @@ } }, "cardpicker": { + "by_card": "Por tarjeta", + "by_entity": "Por entidad", "custom_card": "Personalizado", + "domain": "Dominio", + "entity": "Entidad", "no_description": "No hay descripción disponible." }, "edit_card": { @@ -2563,6 +2597,7 @@ "options": "Más opciones", "pick_card": "¿Qué tarjeta te gustaría añadir?", "pick_card_view_title": "¿Qué tarjeta te gustaría añadir a tu vista {name} ?", + "search_cards": "Buscar tarjetas", "show_code_editor": "Mostrar editor de código", "show_visual_editor": "Mostrar editor visual", "toggle_editor": "Alternar editor", diff --git a/translations/frontend/et.json b/translations/frontend/et.json index 4b3c342d9b..51e3f2f620 100644 --- a/translations/frontend/et.json +++ b/translations/frontend/et.json @@ -923,6 +923,10 @@ "at": "Kell", "label": "Aeg" }, + "webhook": { + "label": "", + "webhook_id": "" + }, "zone": { "enter": "Sisenemine", "entity": "Asukohaga olem", diff --git a/translations/frontend/fa.json b/translations/frontend/fa.json index 28992b49cb..2fc44ddc5d 100644 --- a/translations/frontend/fa.json +++ b/translations/frontend/fa.json @@ -1689,6 +1689,9 @@ }, "step": { "mfa": { + "data": { + "code": "" + }, "description": "باز کردن **{mfa_module_name}** * * * در دستگاه خود را برای مشاهده شما دو فاکتور تأیید هویت کد و هویت خود را تایید کنید:" } } diff --git a/translations/frontend/fr.json b/translations/frontend/fr.json index 40a60cb610..8af22d4ab6 100644 --- a/translations/frontend/fr.json +++ b/translations/frontend/fr.json @@ -19,6 +19,7 @@ "logbook": "Journal", "mailbox": "Boîtes aux lettres", "map": "Carte", + "media_browser": "Navigateur multimédia", "profile": "Profil", "shopping_list": "Liste de courses", "states": "Aperçu" @@ -573,6 +574,7 @@ "playlist": "Liste de lecture", "server": "Serveur" }, + "media_browsing_error": "Erreur de navigation multimédia", "media_not_supported": "Le Browser Media Player ne prend pas en charge ce type de média", "media_player": "Lecteur multimédia", "media-player-browser": "Lecteur multimédia", diff --git a/translations/frontend/fy.json b/translations/frontend/fy.json index 1f8841d202..918eb995c3 100644 --- a/translations/frontend/fy.json +++ b/translations/frontend/fy.json @@ -195,8 +195,10 @@ }, "triggers": { "add": "Trigger tafoegje", + "header": "", "type": { "homeassistant": { + "label": "", "shutdown": "Ofslúte", "start": "Opstarte" }, diff --git a/translations/frontend/gl.json b/translations/frontend/gl.json index 9e26dfeeb6..15018eec65 100644 --- a/translations/frontend/gl.json +++ b/translations/frontend/gl.json @@ -1 +1,19 @@ -{} \ No newline at end of file +{ + "ui": { + "panel": { + "config": { + "automation": { + "editor": { + "triggers": { + "type": { + "mqtt": { + "label": "" + } + } + } + } + } + } + } + } +} \ No newline at end of file diff --git a/translations/frontend/gsw.json b/translations/frontend/gsw.json index b4e756236a..2e0d098575 100644 --- a/translations/frontend/gsw.json +++ b/translations/frontend/gsw.json @@ -37,7 +37,8 @@ "unknown": "Unbekannt" }, "device_tracker": { - "home": "Dahei" + "home": "Dahei", + "not_home": "" }, "person": { "home": "Dahei" @@ -96,6 +97,7 @@ "on": "Offä" }, "presence": { + "off": "", "on": "Dahei" }, "problem": { @@ -417,6 +419,9 @@ "time": { "after": "Nachhär", "before": "Vorhär" + }, + "zone": { + "entity": "" } } }, @@ -510,6 +515,45 @@ "mailbox": { "delete_button": "Lösche" }, + "page-authorize": { + "form": { + "providers": { + "command_line": { + "abort": { + "login_expired": "" + }, + "error": { + "invalid_auth": "", + "invalid_code": "" + }, + "step": { + "init": { + "data": { + "password": "", + "username": "" + } + }, + "mfa": { + "data": { + "code": "" + }, + "description": "" + } + } + }, + "legacy_api_password": { + "step": { + "mfa": { + "data": { + "code": "" + }, + "description": "" + } + } + } + } + } + }, "profile": { "change_password": { "confirm_new_password": "Nöis Passwort bestätige", diff --git a/translations/frontend/hi.json b/translations/frontend/hi.json index f71427a683..0f06beb774 100644 --- a/translations/frontend/hi.json +++ b/translations/frontend/hi.json @@ -19,6 +19,9 @@ }, "state_badge": { "alarm_control_panel": { + "armed_away": "", + "armed_custom_bypass": "", + "armed_night": "", "pending": "अपूर्ण" }, "default": { @@ -28,7 +31,8 @@ "unknown": "अज्ञात" }, "device_tracker": { - "home": "घर" + "home": "घर", + "not_home": "" }, "person": { "home": "घर" @@ -75,16 +79,27 @@ "off": "विशद", "on": "अनुसन्धानित" }, + "occupancy": { + "off": "", + "on": "" + }, "opening": { "on": "खुला" }, "presence": { + "off": "", "on": "घर" }, "safety": { "off": "सुरक्षित", "on": "असुरक्षित" }, + "smoke": { + "off": "" + }, + "vibration": { + "on": "" + }, "window": { "off": "बंद", "on": "खुली" @@ -115,10 +130,15 @@ "on": "चालू" }, "group": { + "closing": "", "home": "घर", + "not_home": "", "off": "बंद", + "ok": "", "on": "चालू", - "problem": "समस्या" + "open": "", + "problem": "समस्या", + "stopped": "" }, "input_boolean": { "off": "बंद", @@ -234,6 +254,9 @@ "time": { "after": "बाद", "before": "पहले" + }, + "zone": { + "entity": "" } } }, @@ -405,6 +428,39 @@ "form": { "next": "अगला", "providers": { + "command_line": { + "abort": { + "login_expired": "" + }, + "error": { + "invalid_auth": "", + "invalid_code": "" + }, + "step": { + "init": { + "data": { + "password": "", + "username": "" + } + }, + "mfa": { + "data": { + "code": "" + }, + "description": "" + } + } + }, + "legacy_api_password": { + "step": { + "mfa": { + "data": { + "code": "" + }, + "description": "" + } + } + }, "trusted_networks": { "step": { "init": { diff --git a/translations/frontend/ja.json b/translations/frontend/ja.json index f0d6e46475..19aaf17e50 100644 --- a/translations/frontend/ja.json +++ b/translations/frontend/ja.json @@ -65,7 +65,10 @@ }, "state_badge": { "alarm_control_panel": { + "armed_away": "", + "armed_custom_bypass": "", "armed_home": "アームしました", + "armed_night": "", "disarmed": "解除", "disarming": "解除", "pending": "保留", diff --git a/translations/frontend/lt.json b/translations/frontend/lt.json index 567cd131d2..08fc0028b0 100644 --- a/translations/frontend/lt.json +++ b/translations/frontend/lt.json @@ -189,6 +189,7 @@ "ok": "Ok", "on": "Įjungta", "open": "Atidarytas", + "problem": "", "stopped": "Sustabdytas", "unlocked": "Atrakinta" }, @@ -408,6 +409,7 @@ "label": "Laikas" }, "zone": { + "entity": "", "label": "Vieta", "zone": "Vieta" } @@ -688,6 +690,9 @@ "form": { "providers": { "command_line": { + "abort": { + "login_expired": "" + }, "error": { "invalid_auth": "Netinkamas vartotojo vardas arba slaptažodis", "invalid_code": "Netinkamas autentifikacijos kodas" @@ -702,7 +707,18 @@ "mfa": { "data": { "code": "Dvieju lygiu autentifikacija" - } + }, + "description": "" + } + } + }, + "legacy_api_password": { + "step": { + "mfa": { + "data": { + "code": "" + }, + "description": "" } } } diff --git a/translations/frontend/nb.json b/translations/frontend/nb.json index db02e1f81a..523a9a2718 100644 --- a/translations/frontend/nb.json +++ b/translations/frontend/nb.json @@ -19,6 +19,7 @@ "logbook": "Loggbok", "mailbox": "Postkasse", "map": "Kart", + "media_browser": "Medieleser", "profile": "Profil", "shopping_list": "Handleliste", "states": "Oversikt" @@ -26,6 +27,7 @@ "state_attributes": { "climate": { "fan_mode": { + "auto": "", "off": "Av", "on": "På" }, @@ -50,11 +52,14 @@ }, "humidifier": { "mode": { + "auto": "", "away": "Borte", + "baby": "", "boost": "Øke", "comfort": "Komfort", "eco": "Øko", "home": "Hjem", + "normal": "", "sleep": "Sove" } } @@ -110,6 +115,7 @@ "on": "Lavt" }, "cold": { + "off": "", "on": "Kald" }, "connectivity": { @@ -160,6 +166,10 @@ "off": "Borte", "on": "Hjemme" }, + "problem": { + "off": "", + "on": "" + }, "safety": { "off": "Sikker", "on": "Usikker" @@ -229,6 +239,7 @@ "locked": "Låst", "not_home": "Borte", "off": "Av", + "ok": "", "on": "På", "open": "Åpen", "opening": "Åpner", @@ -260,6 +271,7 @@ "home": "Hjemme" }, "plant": { + "ok": "", "problem": "Problem" }, "remote": { @@ -365,6 +377,7 @@ "low": "lav", "on_off": "På / av", "operation": "Operasjon", + "preset_mode": "", "swing_mode": "Svingmodus", "target_humidity": "Ønsket luftfuktighet", "target_temperature": "Ønsket temperatur", @@ -409,7 +422,7 @@ "media_player": { "browse_media": "Bla gjennom medier", "media_next_track": "Neste", - "media_play": "Spille", + "media_play": "Spill av", "media_play_pause": "Spill av/pause", "media_previous_track": "Forrige", "sound_mode": "Lydmodus", @@ -435,7 +448,9 @@ "timer": { "actions": { "cancel": "Avbryt", - "finish": "Ferdig" + "finish": "Ferdig", + "pause": "", + "start": "" } }, "vacuum": { @@ -467,10 +482,12 @@ "e": "Ø", "ene": "ØNØ", "ese": "ØSØ", + "n": "", "ne": "NØ", "nne": "NNØ", "nnw": "NNV", "nw": "NV", + "s": "", "se": "SØ", "sse": "SSØ", "ssw": "SSV", @@ -547,6 +564,8 @@ "no_history_found": "Ingen statushistorikk funnet." }, "media-browser": { + "audio_not_supported": "Nettleseren din støtter ikke lydelementet.", + "choose_player": "Velg spiller", "choose-source": "Velg kilde", "content-type": { "album": "Album", @@ -555,12 +574,17 @@ "playlist": "Spilleliste", "server": "Server" }, + "media_browsing_error": "Feil ved medievisning", + "media_not_supported": "Browser Media Player støtter ikke denne typen medier", + "media_player": "Mediaspiller", "media-player-browser": "Nettleser for Mediespiller", "no_items": "Ingen elementer", "pick": "Velg", "pick-media": "Velg Media", - "play": "Spille", - "play-media": "Spill media" + "play": "Spill av", + "play-media": "Spill media", + "video_not_supported": "Nettleseren din støtter ikke videoelementet.", + "web-browser": "Nettleser" }, "picture-upload": { "label": "Bilde", @@ -618,7 +642,7 @@ "icon": "Overstyring av ikon", "icon_error": "Ikoner bør være i formatet 'prefiks:ikonnavn', f.eks 'mdi:home'", "name": "Overstyr Navn", - "note": "Merk: dette fungerer kanskje ikke med alle integrasjoner ennå .", + "note": "Merk: Dette fungerer kanskje ikke ennå med alle integrasjoner.", "unavailable": "Denne entiteten er ikke tilgjengelig for øyeblikket.", "update": "Oppdater" }, @@ -629,7 +653,8 @@ "generic": { "cancel": "Avbryt", "close": "Lukk", - "default_confirmation_title": "Er du sikker?" + "default_confirmation_title": "Er du sikker?", + "ok": "" }, "helper_settings": { "generic": { @@ -705,8 +730,11 @@ "commands": "Støvsugerkommandoer:", "fan_speed": "Viftehastighet", "locate": "Lokaliser", + "pause": "", "return_home": "Returner hjem", + "start": "", "start_pause": "Start / Pause", + "status": "", "stop": "Stopp" } }, @@ -753,6 +781,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.", @@ -881,7 +910,7 @@ "type_select": "Gjenta type", "type": { "count": { - "label": "Telle" + "label": "Antall" }, "until": { "conditions": "Inntil forholdene", @@ -1036,7 +1065,9 @@ }, "homeassistant": { "event": "Hendelse:", - "shutdown": "Slå av" + "label": "", + "shutdown": "Slå av", + "start": "" }, "mqtt": { "label": "MQTT", @@ -1050,6 +1081,7 @@ "value_template": "Verdi fra mal (valgfritt)" }, "state": { + "for": "", "from": "Fra", "label": "Tilstand", "to": "Til" @@ -1078,6 +1110,10 @@ "at": "Klokken", "label": "Tid" }, + "webhook": { + "label": "", + "webhook_id": "" + }, "zone": { "enter": "Ankommer", "entity": "Entitet med posisjon", @@ -1121,7 +1157,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", @@ -1139,7 +1176,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.", @@ -1168,7 +1206,8 @@ "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": { @@ -1181,8 +1220,10 @@ "follow_domain": "Følg domenet", "manage_domains": "Administrer domener", "not_exposed": "{selected} ikke eksponert", - "not_exposed_entities": "Ikke eksponerte enheter" + "not_exposed_entities": "Ikke eksponerte enheter", + "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", @@ -1225,7 +1266,8 @@ "manage_domains": "Administrer domener", "not_exposed": "{selected} ikke eksponert", "not_exposed_entities": "Ikke eksponerte enheter", - "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.", @@ -1399,6 +1441,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" @@ -1407,7 +1450,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.", @@ -1422,6 +1466,7 @@ "selected": "{number} valgte", "status": { "disabled": "Deaktivert", + "ok": "", "readonly": "Skrivebeskyttet", "restored": "Gjennopprettet", "unavailable": "Utilgjengelig" @@ -1446,7 +1491,8 @@ "headers": { "editable": "Redigerbare", "entity_id": "Entitets-ID", - "name": "Navn" + "name": "Navn", + "type": "" }, "no_helpers": "Det ser ut som om du ikke har noen hjelpere ennå!" }, @@ -1454,6 +1500,7 @@ "input_boolean": "Veksle", "input_datetime": "Dato og/eller klokkeslett", "input_number": "Nummer", + "input_select": "", "input_text": "Tekst" } }, @@ -1466,6 +1513,7 @@ "documentation": "Dokumentasjon", "frontend": "frontend", "frontend_version": "Brukergrensesnittet-versjon: {version} - {type}", + "home_assistant_logo": "", "icons_by": "Ikoner fra", "integrations": "Integrasjoner", "issues": "Problemer", @@ -1506,6 +1554,7 @@ "reload_restart_confirm": "Start Home Assistant på nytt for å fullføre omlastingen av denne integrasjonen", "rename": "Gi nytt navn", "restart_confirm": "Start Home Assistant på nytt for å fullføre fjerningen av denne integrasjonen", + "services": "{count} {count, plural,\n one {service}\n other {services}\n}", "settings_button": "Rediger innstillinger for {integration}", "system_options": "Systemalternativer", "system_options_button": "Systemalternativer for {integration}", @@ -1596,6 +1645,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": { @@ -1623,12 +1673,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å?", @@ -1719,8 +1774,21 @@ "versions": "Hente informasjon om fastvare- og kommandoklasseversjoner", "wakeup": "Sette opp støtte for vekkingskøer og meldinger" }, + "node": { + "button": "Node Detaljer", + "not_found": "Finner ikke noden" + }, + "nodes_table": { + "failed": "Mislyktes", + "id": "ID", + "manufacturer": "Produsent", + "model": "Modell", + "query_stage": "Spørringsstadiet", + "zwave_plus": "Z-Wave Plus" + }, "refresh_node": { "battery_note": "Hvis noden er batteridrevet, må du passe på å vekke den før du fortsetter", + "button": "Oppdater node", "complete": "Node oppdatering fullført", "description": "Dette vil fortelle OpenZWave å re-intervjue en node og oppdatere nodens kommandoklasser, evner og verdier.", "node_status": "Node-status", @@ -1954,6 +2022,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} ?", @@ -1974,10 +2043,11 @@ "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 reviderer fortsatt alle API-endepunkter for å sikre at de begrenser tilgangen til administratorer på riktig måte." + "users_privileges_note": "Brukergruppefunksjonen er et pågående arbeid. Brukeren vil ikke kunne administrere forekomsten via brukergrensesnittet. Vi overvåker fortsatt alle administrasjons-API-endepunkter for å sikre at de begrenser tilgangen til administratorer på riktig måte." }, "zha": { "add_device_page": { @@ -1994,6 +2064,7 @@ "description": "Legg til enheter i Zigbee-nettverket" }, "button": "Konfigurer", + "caption": "", "cluster_attributes": { "attributes_of_cluster": "Attributter for den valgte klyngen", "get_zigbee_attribute": "Hent ZigBee-attributt", @@ -2014,7 +2085,7 @@ "clusters": { "header": "Klynger", "help_cluster_dropdown": "Velg en klynge for å vise attributter og kommandoer.", - "introduction": "Klynger er byggesteinene for ZigBee-funksjonalitet. De skiller funksjonalitet i logiske enheter. Det finnes klient og server typer som består av attributter og kommandoer." + "introduction": "Klynger er byggesteinene for Zigbee-funksjonalitet. De skiller funksjonalitet i logiske enheter. Det finnes klient- og servertyper, og som består av attributter og kommandoer." }, "common": { "add_devices": "Legg til enheter", @@ -2101,6 +2172,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" }, @@ -2146,7 +2218,7 @@ "true": "Sant" }, "node_management": { - "add_to_group": "Legg til i gruppe", + "add_to_group": "Legg til gruppe", "entities": "Entiteter fra denne noden", "entity_info": "Entitetsinformasjon", "exclude_entity": "Ekskluder denne entiteten fra Home Assistant", @@ -2163,7 +2235,7 @@ "pooling_intensity": "Intensitet for polling", "protection": "Beskyttelse", "remove_broadcast": "Fjern kringkasting", - "remove_from_group": "Fjern fra gruppe", + "remove_from_group": "Fjern fra gruppen", "set_protection": "Angi beskyttelse" }, "ozw_log": { @@ -2230,6 +2302,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", @@ -2305,6 +2378,7 @@ }, "picture-elements": { "call_service": "Tilkall tjeneste {name}", + "hold": "", "more_info": "Vis mer info: {name}", "navigate_to": "Naviger til {location}", "tap": "Trykk:", @@ -2399,6 +2473,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", @@ -2412,7 +2487,8 @@ "tap_action": "Trykk handling", "theme": "Tema", "title": "Tittel", - "unit": "Betegnelse" + "unit": "Betegnelse", + "url": "" }, "glance": { "columns": "Kolonner", @@ -2450,7 +2526,8 @@ }, "markdown": { "content": "Innhold", - "description": "Markdown-kortet brukes til å gjengi Markdown." + "description": "Markdown-kortet brukes til å gjengi Markdown.", + "name": "" }, "media-control": { "description": "Mediekontroll kortet brukes til å vise mediespillerenheter på et grensesnitt med brukervennlige kontroller.", @@ -2479,7 +2556,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å handlelistekortet kan du legge til, redigere, sjekke av og fjerne gjenstander fra handlelisten din.", @@ -2519,6 +2597,7 @@ "options": "Flere alternativer", "pick_card": "Hvilket kort vil du legge til?", "pick_card_view_title": "Hvilket kort vil du legge til i {name} visningen?", + "search_cards": "Søk på kort", "show_code_editor": "Vis koderedigering", "show_visual_editor": "Vis visuell redigering", "toggle_editor": "Bytt redigering", @@ -2786,6 +2865,7 @@ "upstairs": "Oppe" }, "unit": { + "minutes_abbr": "", "watching": "Ser på" } } @@ -2839,7 +2919,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 8e3ce0ba70..8e5aaece5d 100644 --- a/translations/frontend/nl.json +++ b/translations/frontend/nl.json @@ -1023,6 +1023,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", @@ -1052,6 +1053,7 @@ }, "homeassistant": { "event": "Gebeurtenis:", + "label": "", "shutdown": "Afsluiten", "start": "Opstarten" }, diff --git a/translations/frontend/pt-BR.json b/translations/frontend/pt-BR.json index 078f61a7fc..8326daffff 100644 --- a/translations/frontend/pt-BR.json +++ b/translations/frontend/pt-BR.json @@ -1039,6 +1039,7 @@ }, "homeassistant": { "event": "Evento:", + "label": "", "shutdown": "Desligar", "start": "Iniciar" }, @@ -1664,6 +1665,7 @@ "start_listening": "Começar a ouvir", "stop_listening": "Parar de ouvir", "subscribe_to": "Evento para se inscrever", + "title": "", "topic": "tópico" }, "ozw": { @@ -2040,6 +2042,7 @@ }, "zwave": { "button": "Configurar", + "caption": "", "common": { "index": "Índice", "instance": "Instância", diff --git a/translations/frontend/pt.json b/translations/frontend/pt.json index 302d98036b..2d315f637e 100644 --- a/translations/frontend/pt.json +++ b/translations/frontend/pt.json @@ -1152,7 +1152,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", @@ -1170,7 +1171,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.", @@ -1199,7 +1201,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": { @@ -1233,6 +1236,7 @@ }, "forgot_password": { "check_your_email": "Verifique o seu e-mail para obter instruções sobre como redefinir a sua palavra-passe.", + "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", @@ -1252,6 +1256,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 palavra-passe?", "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.", @@ -1489,6 +1494,7 @@ "description": "Ver informações sobre a instalação do Home Assistant", "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/sr-Latn.json b/translations/frontend/sr-Latn.json index 7f497faa5b..11f7af24b5 100644 --- a/translations/frontend/sr-Latn.json +++ b/translations/frontend/sr-Latn.json @@ -8,7 +8,85 @@ "shopping_list": "Lista za kupovinu", "states": "Pregled" }, + "state_badge": { + "alarm_control_panel": { + "armed_away": "", + "armed_custom_bypass": "", + "armed_night": "" + }, + "device_tracker": { + "home": "", + "not_home": "" + } + }, "state": { + "automation": { + "off": "", + "on": "" + }, + "binary_sensor": { + "default": { + "off": "", + "on": "" + }, + "motion": { + "on": "" + }, + "occupancy": { + "off": "" + }, + "opening": { + "on": "" + }, + "presence": { + "off": "", + "on": "" + }, + "vibration": { + "off": "", + "on": "" + } + }, + "calendar": { + "off": "", + "on": "" + }, + "fan": { + "off": "", + "on": "" + }, + "group": { + "home": "", + "not_home": "", + "off": "", + "on": "", + "problem": "" + }, + "input_boolean": { + "on": "" + }, + "light": { + "off": "", + "on": "" + }, + "media_player": { + "off": "", + "on": "" + }, + "remote": { + "on": "" + }, + "script": { + "off": "", + "on": "" + }, + "sensor": { + "off": "", + "on": "" + }, + "switch": { + "on": "" + }, "weather": { "clear-night": "Vedra noć", "cloudy": "Oblačno", @@ -73,6 +151,13 @@ "config": { "automation": { "editor": { + "conditions": { + "type": { + "zone": { + "entity": "" + } + } + }, "triggers": { "type": { "mqtt": { @@ -107,6 +192,45 @@ "set_config_parameter": "Подесите параметар Цонфиг" } } + }, + "page-authorize": { + "form": { + "providers": { + "command_line": { + "abort": { + "login_expired": "" + }, + "error": { + "invalid_auth": "", + "invalid_code": "" + }, + "step": { + "init": { + "data": { + "password": "", + "username": "" + } + }, + "mfa": { + "data": { + "code": "" + }, + "description": "" + } + } + }, + "legacy_api_password": { + "step": { + "mfa": { + "data": { + "code": "" + }, + "description": "" + } + } + } + } + } } } } diff --git a/translations/frontend/sr.json b/translations/frontend/sr.json index 2a32b3aca6..b5debac397 100644 --- a/translations/frontend/sr.json +++ b/translations/frontend/sr.json @@ -11,21 +11,93 @@ }, "state_badge": { "alarm_control_panel": { + "armed_away": "", + "armed_custom_bypass": "", + "armed_night": "", "arming": "Aktiviranje", "disarming": "Deaktiviraj" }, "default": { "entity_not_found": "Вредност није пронађена", "error": "Грешка" + }, + "device_tracker": { + "home": "", + "not_home": "" } }, "state": { + "automation": { + "off": "", + "on": "" + }, + "binary_sensor": { + "default": { + "off": "", + "on": "" + }, + "motion": { + "on": "" + }, + "occupancy": { + "off": "" + }, + "opening": { + "on": "" + }, + "presence": { + "off": "", + "on": "" + }, + "vibration": { + "off": "", + "on": "" + } + }, + "calendar": { + "off": "", + "on": "" + }, + "fan": { + "off": "", + "on": "" + }, + "group": { + "home": "", + "not_home": "", + "off": "", + "on": "", + "problem": "" + }, + "input_boolean": { + "on": "" + }, + "light": { + "off": "", + "on": "" + }, + "media_player": { + "off": "", + "on": "" + }, + "remote": { + "on": "" + }, + "script": { + "off": "", + "on": "" + }, + "sensor": { + "off": "", + "on": "" + }, "sun": { "above_horizon": "Iznad horizonta", "below_horizon": "Ispod horizonta" }, "switch": { - "off": "Isključen" + "off": "Isključen", + "on": "" }, "timer": { "active": "укључен", @@ -56,6 +128,13 @@ "config": { "automation": { "editor": { + "conditions": { + "type": { + "zone": { + "entity": "" + } + } + }, "triggers": { "learn_more": "Сазнајте више о окидачима", "type": { @@ -113,6 +192,45 @@ } } }, + "page-authorize": { + "form": { + "providers": { + "command_line": { + "abort": { + "login_expired": "" + }, + "error": { + "invalid_auth": "", + "invalid_code": "" + }, + "step": { + "init": { + "data": { + "password": "", + "username": "" + } + }, + "mfa": { + "data": { + "code": "" + }, + "description": "" + } + } + }, + "legacy_api_password": { + "step": { + "mfa": { + "data": { + "code": "" + }, + "description": "" + } + } + } + } + } + }, "page-onboarding": { "integration": { "finish": "Крај" diff --git a/translations/frontend/sv.json b/translations/frontend/sv.json index f684b51098..cf1615ecc1 100644 --- a/translations/frontend/sv.json +++ b/translations/frontend/sv.json @@ -1145,7 +1145,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", @@ -1193,14 +1194,16 @@ "no_hooks_yet": "Det verkar 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.", @@ -2375,6 +2378,8 @@ "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", "no_theme": "Inget tema", "refresh_interval": "Uppdateringsintervall", diff --git a/translations/frontend/ta.json b/translations/frontend/ta.json index 7445b2d66a..9043c84c30 100644 --- a/translations/frontend/ta.json +++ b/translations/frontend/ta.json @@ -35,7 +35,8 @@ "unknown": "தெரியாத" }, "device_tracker": { - "home": "முகப்பு" + "home": "முகப்பு", + "not_home": "" }, "person": { "home": "முகப்பு" @@ -239,6 +240,13 @@ "config": { "automation": { "editor": { + "conditions": { + "type": { + "zone": { + "entity": "" + } + } + }, "triggers": { "type": { "mqtt": { @@ -257,6 +265,45 @@ "set_config_parameter": "கட்டமைப்பு அளவுருவை அமைக்கவும்" } } + }, + "page-authorize": { + "form": { + "providers": { + "command_line": { + "abort": { + "login_expired": "" + }, + "error": { + "invalid_auth": "", + "invalid_code": "" + }, + "step": { + "init": { + "data": { + "password": "", + "username": "" + } + }, + "mfa": { + "data": { + "code": "" + }, + "description": "" + } + } + }, + "legacy_api_password": { + "step": { + "mfa": { + "data": { + "code": "" + }, + "description": "" + } + } + } + } + } } } } diff --git a/translations/frontend/te.json b/translations/frontend/te.json index 1bddd1e80b..50cf3c0969 100644 --- a/translations/frontend/te.json +++ b/translations/frontend/te.json @@ -37,7 +37,8 @@ "unknown": "తెలియదు" }, "device_tracker": { - "home": "ఇంట" + "home": "ఇంట", + "not_home": "" }, "person": { "home": "ఇంట" @@ -410,6 +411,9 @@ "time": { "after": "తరువాత", "before": "ముందు" + }, + "zone": { + "entity": "" } } }, @@ -531,7 +535,8 @@ "login_expired": "సెషన్ గడువు ముగిసింది, మళ్ళీ లాగిన్ అవ్వండి." }, "error": { - "invalid_auth": "తప్పు యూజర్ పేరు లేదా తప్పు పాస్ వర్డ్" + "invalid_auth": "తప్పు యూజర్ పేరు లేదా తప్పు పాస్ వర్డ్", + "invalid_code": "" }, "step": { "init": { @@ -539,6 +544,12 @@ "password": "పాస్వర్డ్", "username": "యూజర్ పేరు" } + }, + "mfa": { + "data": { + "code": "" + }, + "description": "" } } }, @@ -558,6 +569,16 @@ } } }, + "legacy_api_password": { + "step": { + "mfa": { + "data": { + "code": "" + }, + "description": "" + } + } + }, "trusted_networks": { "abort": { "not_whitelisted": "మీ కంప్యూటర్ అనుమతి జాబితాలో లేదు." diff --git a/translations/frontend/tr.json b/translations/frontend/tr.json index 13376adc80..f0e477f212 100644 --- a/translations/frontend/tr.json +++ b/translations/frontend/tr.json @@ -2434,7 +2434,8 @@ "mfa": { "data": { "code": "İki adımlı kimlik doğrulama kodu" - } + }, + "description": "" } } }, @@ -2479,7 +2480,8 @@ "mfa": { "data": { "code": "İki adımlı kimlik doğrulama kodu" - } + }, + "description": "" } } }, diff --git a/translations/frontend/ur.json b/translations/frontend/ur.json index c130104798..2f7a214405 100644 --- a/translations/frontend/ur.json +++ b/translations/frontend/ur.json @@ -1,4 +1,49 @@ { + "state_badge": { + "device_tracker": { + "home": "" + } + }, + "state": { + "automation": { + "off": "" + }, + "binary_sensor": { + "default": { + "on": "" + }, + "presence": { + "on": "" + } + }, + "calendar": { + "on": "" + }, + "group": { + "home": "", + "off": "", + "on": "" + }, + "input_boolean": { + "on": "" + }, + "light": { + "off": "", + "on": "" + }, + "media_player": { + "off": "" + }, + "script": { + "off": "" + }, + "sensor": { + "off": "" + }, + "switch": { + "on": "" + } + }, "ui": { "card": { "fan": { @@ -39,6 +84,13 @@ "label": "آلہ" } } + }, + "triggers": { + "type": { + "mqtt": { + "label": "" + } + } } } }, diff --git a/translations/frontend/zh-Hant.json b/translations/frontend/zh-Hant.json index a805c1b832..30f780c639 100644 --- a/translations/frontend/zh-Hant.json +++ b/translations/frontend/zh-Hant.json @@ -19,6 +19,7 @@ "logbook": "日誌", "mailbox": "郵箱", "map": "地圖", + "media_browser": "媒體瀏覽器", "profile": "個人設定", "shopping_list": "購物清單", "states": "總覽" @@ -573,6 +574,7 @@ "playlist": "播放列表", "server": "伺服器" }, + "media_browsing_error": "媒體瀏覽錯誤", "media_not_supported": "瀏覽器媒體播放器不支援此類型媒體", "media_player": "媒體播放器", "media-player-browser": "媒體播放器瀏覽器", From 30c47a65f4f28273f4a133cbcc9957894349546d Mon Sep 17 00:00:00 2001 From: Zack Arnett Date: Mon, 7 Sep 2020 19:47:25 -0500 Subject: [PATCH 02/17] fix more info content --- src/dialogs/more-info/ha-more-info-dialog.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/dialogs/more-info/ha-more-info-dialog.ts b/src/dialogs/more-info/ha-more-info-dialog.ts index 086040ddef..7738ee7349 100644 --- a/src/dialogs/more-info/ha-more-info-dialog.ts +++ b/src/dialogs/more-info/ha-more-info-dialog.ts @@ -274,6 +274,7 @@ export class MoreInfoDialog extends LitElement { --mdc-theme-on-primary: var(--primary-text-color); --mdc-theme-primary: var(--mdc-theme-surface); flex-shrink: 0; + display: block; } @media all and (max-width: 450px), all and (max-height: 500px) { From 7edc9064d9ddfedce2ab384ccb96818c094b104e Mon Sep 17 00:00:00 2001 From: Zack Arnett Date: Mon, 7 Sep 2020 20:49:53 -0500 Subject: [PATCH 03/17] Fix light extra attributes start fix for history --- src/dialogs/more-info/controls/more-info-light.ts | 8 ++++---- src/dialogs/more-info/ha-more-info-tab-history.ts | 13 ++++++++++++- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/dialogs/more-info/controls/more-info-light.ts b/src/dialogs/more-info/controls/more-info-light.ts index 6b0bba5572..a87316e874 100644 --- a/src/dialogs/more-info/controls/more-info-light.ts +++ b/src/dialogs/more-info/controls/more-info-light.ts @@ -105,12 +105,12 @@ class MoreInfoLight extends LitElement { ? html`
`; diff --git a/src/dialogs/more-info/ha-more-info-tab-history.ts b/src/dialogs/more-info/ha-more-info-tab-history.ts index 18624a11ef..eeb00cef33 100644 --- a/src/dialogs/more-info/ha-more-info-tab-history.ts +++ b/src/dialogs/more-info/ha-more-info-tab-history.ts @@ -85,7 +85,18 @@ export class MoreInfoTabHistoryDialog extends LitElement { clearInterval(this._historyRefreshInterval); } - if (changedProps.has("entityId")) { + if (!this.hass) { + return; + } + + const oldHass = changedProps.get("hass") as HomeAssistant; + const newStateObj = this.hass.states[this.entityId]; + const oldStateObj = oldHass?.states[this.entityId]; + + if ( + changedProps.has("entityId") || + (oldHass && newStateObj !== oldStateObj) + ) { this._stateHistory = undefined; this._entries = undefined; From 8b1801f378dc5174186dad7db8843a1c9312d9d8 Mon Sep 17 00:00:00 2001 From: Zack Barett Date: Tue, 8 Sep 2020 02:14:34 -0500 Subject: [PATCH 04/17] Fix header on media browser in safari (#6838) --- src/components/media-player/ha-media-player-browse.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/components/media-player/ha-media-player-browse.ts b/src/components/media-player/ha-media-player-browse.ts index 8f54e1204c..0d9cde1946 100644 --- a/src/components/media-player/ha-media-player-browse.ts +++ b/src/components/media-player/ha-media-player-browse.ts @@ -172,6 +172,7 @@ export class HaMediaPlayerBrowse extends LitElement {
@@ -543,6 +544,7 @@ export class HaMediaPlayerBrowse extends LitElement { .header { background-color: var(--card-background-color); position: sticky; + position: -webkit-sticky; top: 0; z-index: 5; padding: 20px 24px 10px; @@ -740,6 +742,10 @@ export class HaMediaPlayerBrowse extends LitElement { padding: 0; } + :host([narrow]) .header.no-dialog { + display: block; + } + :host([narrow]) .header_button { position: absolute; top: 14px; From d7448ecb952afef1509d33c15e7061312c508120 Mon Sep 17 00:00:00 2001 From: Zack Barett Date: Tue, 8 Sep 2020 02:17:49 -0500 Subject: [PATCH 05/17] Fix Calendar Card in Add Card dialog (#6833) --- src/panels/lovelace/cards/hui-calendar-card.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/panels/lovelace/cards/hui-calendar-card.ts b/src/panels/lovelace/cards/hui-calendar-card.ts index 2351454829..ee94fb807c 100644 --- a/src/panels/lovelace/cards/hui-calendar-card.ts +++ b/src/panels/lovelace/cards/hui-calendar-card.ts @@ -76,11 +76,11 @@ export class HuiCalendarCard extends LitElement implements LovelaceCard { private _resizeObserver?: ResizeObserver; public setConfig(config: CalendarCardConfig): void { - if (!config.entities) { + if (!config.entities?.length) { throw new Error("Entities must be defined"); } - if (config.entities && !Array.isArray(config.entities)) { + if (!Array.isArray(config.entities)) { throw new Error("Entities need to be an array"); } From 100ba8edfaa6e37c73e69c4603e58988ca1f897a Mon Sep 17 00:00:00 2001 From: Zack Barett Date: Tue, 8 Sep 2020 04:37:49 -0500 Subject: [PATCH 06/17] Add allowed options to entities struct so UI editor can still be used (#6823) --- src/panels/lovelace/editor/types.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/panels/lovelace/editor/types.ts b/src/panels/lovelace/editor/types.ts index 04a2755a4b..5d9a335a10 100644 --- a/src/panels/lovelace/editor/types.ts +++ b/src/panels/lovelace/editor/types.ts @@ -5,7 +5,7 @@ import { ShowViewConfig, } from "../../../data/lovelace"; import { EntityConfig } from "../entity-rows/types"; -import { optional, string, object, union } from "superstruct"; +import { optional, string, object, union, boolean } from "superstruct"; import { EntityId } from "../common/structs/is-entity-id"; import { Icon } from "../common/structs/is-icon"; @@ -81,6 +81,10 @@ export const entitiesConfigStruct = union([ entity: EntityId, name: optional(string()), icon: optional(Icon), + image: optional(string()), + secondary_info: optional(string()), + format: optional(string()), + state_color: optional(boolean()), }), EntityId, ]); From 6e0e169b6e89b2b85a217843f04c7fbe729e3420 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Tue, 8 Sep 2020 13:27:59 +0200 Subject: [PATCH 07/17] Add reload for platforms with reload service (#6851) --- .../server_control/ha-config-server-control.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/panels/config/server_control/ha-config-server-control.ts b/src/panels/config/server_control/ha-config-server-control.ts index 7cd8e63160..04fbc5b237 100644 --- a/src/panels/config/server_control/ha-config-server-control.ts +++ b/src/panels/config/server_control/ha-config-server-control.ts @@ -23,6 +23,8 @@ import { HomeAssistant, Route } from "../../../types"; import "../ha-config-section"; import { configSections } from "../ha-panel-config"; +const platformsWithReload = ["template"]; + @customElement("ha-config-server-control") export class HaConfigServerControl extends LitElement { @property({ attribute: false }) public hass!: HomeAssistant; @@ -49,11 +51,13 @@ export class HaConfigServerControl extends LitElement { changedProperties.has("hass") && (!oldHass || oldHass.config.components !== this.hass.config.components) ) { - this._reloadableDomains = this.hass.config.components.filter( - (component) => - !component.includes(".") && - isServiceLoaded(this.hass, component, "reload") - ); + this._reloadableDomains = this.hass.config.components + .concat(platformsWithReload) + .filter( + (component) => + !component.includes(".") && + isServiceLoaded(this.hass, component, "reload") + ); } } From 67b46881684a9e061029c2a6448a3602dfeb2062 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 8 Sep 2020 13:28:29 +0200 Subject: [PATCH 08/17] Make time wider in logbook (#6854) Fixes #6842 --- src/panels/logbook/ha-logbook.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/panels/logbook/ha-logbook.ts b/src/panels/logbook/ha-logbook.ts index 1270db9619..cf49dd24ba 100644 --- a/src/panels/logbook/ha-logbook.ts +++ b/src/panels/logbook/ha-logbook.ts @@ -216,7 +216,7 @@ class HaLogbook extends LitElement { display: flex; justify-content: center; flex-direction: column; - width: 70px; + width: 75px; flex-shrink: 0; font-size: 12px; color: var(--secondary-text-color); From 82e91783209f8b96c7184b99c34b9adac8f9e491 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Tue, 8 Sep 2020 13:56:51 +0200 Subject: [PATCH 09/17] Add warning class to delete (#6852) * Add error class to delete * Apply suggestions from code review Co-authored-by: Bram Kragten * Add missing haStyle Co-authored-by: Bram Kragten --- .../action/ha-automation-action-row.ts | 2 +- .../condition/ha-automation-condition-row.ts | 34 +++++++++++-------- .../trigger/ha-automation-trigger-row.ts | 2 +- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/panels/config/automation/action/ha-automation-action-row.ts b/src/panels/config/automation/action/ha-automation-action-row.ts index 420d339e28..d9cf65ce8c 100644 --- a/src/panels/config/automation/action/ha-automation-action-row.ts +++ b/src/panels/config/automation/action/ha-automation-action-row.ts @@ -173,7 +173,7 @@ export default class HaAutomationActionRow extends LitElement { "ui.panel.config.automation.editor.actions.duplicate" )} - + ${this.hass.localize( "ui.panel.config.automation.editor.actions.delete" )} diff --git a/src/panels/config/automation/condition/ha-automation-condition-row.ts b/src/panels/config/automation/condition/ha-automation-condition-row.ts index 1f51b47f13..89bbfcab54 100644 --- a/src/panels/config/automation/condition/ha-automation-condition-row.ts +++ b/src/panels/config/automation/condition/ha-automation-condition-row.ts @@ -19,6 +19,7 @@ import { Condition } from "../../../../data/automation"; import { showConfirmationDialog } from "../../../../dialogs/generic/show-dialog-box"; import { HomeAssistant } from "../../../../types"; import "./ha-automation-condition-editor"; +import { haStyle } from "../../../../resources/styles"; export interface ConditionElement extends LitElement { condition: Condition; @@ -86,7 +87,7 @@ export default class HaAutomationConditionRow extends LitElement { "ui.panel.config.automation.editor.actions.duplicate" )} - + ${this.hass.localize( "ui.panel.config.automation.editor.actions.delete" )} @@ -134,20 +135,23 @@ export default class HaAutomationConditionRow extends LitElement { this._yamlMode = !this._yamlMode; } - static get styles(): CSSResult { - return css` - .card-menu { - float: right; - z-index: 3; - --mdc-theme-text-primary-on-background: var(--primary-text-color); - } - .rtl .card-menu { - float: left; - } - mwc-list-item[disabled] { - --mdc-theme-text-primary-on-background: var(--disabled-text-color); - } - `; + static get styles(): CSSResult[] { + return [ + haStyle, + css` + .card-menu { + float: right; + z-index: 3; + --mdc-theme-text-primary-on-background: var(--primary-text-color); + } + .rtl .card-menu { + float: left; + } + mwc-list-item[disabled] { + --mdc-theme-text-primary-on-background: var(--disabled-text-color); + } + `, + ]; } } diff --git a/src/panels/config/automation/trigger/ha-automation-trigger-row.ts b/src/panels/config/automation/trigger/ha-automation-trigger-row.ts index feeda91773..aa80ff1a96 100644 --- a/src/panels/config/automation/trigger/ha-automation-trigger-row.ts +++ b/src/panels/config/automation/trigger/ha-automation-trigger-row.ts @@ -118,7 +118,7 @@ export default class HaAutomationTriggerRow extends LitElement { "ui.panel.config.automation.editor.actions.duplicate" )} - + ${this.hass.localize( "ui.panel.config.automation.editor.actions.delete" )} From 4631994f2041b48385dce589bd94fa0e87c5d662 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 8 Sep 2020 14:10:34 +0200 Subject: [PATCH 10/17] Fix sidebar issues (#6853) * Fix sidebar issues * fix navigate in demo --- src/components/ha-sidebar.ts | 26 ++++++++++++++----- .../directives/action-handler-directive.ts | 9 ++++--- src/resources/ha-sortable-style.ts | 2 -- 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/components/ha-sidebar.ts b/src/components/ha-sidebar.ts index 1226fffbc4..d02c7bbd60 100644 --- a/src/components/ha-sidebar.ts +++ b/src/components/ha-sidebar.ts @@ -322,7 +322,7 @@ class HaSidebar extends LitElement { )} href="#external-app-configuration" tabindex="-1" - @click=${this._handleExternalAppConfiguration} + @panel-tap=${this._handleExternalAppConfiguration} @mouseenter=${this._itemMouseEnter} @mouseleave=${this._itemMouseLeave} > @@ -479,7 +479,8 @@ class HaSidebar extends LitElement { } private async _handleAction(ev: CustomEvent) { - if (ev.detail.action !== "hold") { + if (ev.detail.action === "tap") { + fireEvent(ev.target as HTMLElement, "panel-tap"); return; } @@ -497,6 +498,10 @@ class HaSidebar extends LitElement { } this._editMode = true; + if (!this.expanded) { + fireEvent(this, "hass-toggle-menu"); + } + await this.updateComplete; this._createSortable(); @@ -655,8 +660,11 @@ class HaSidebar extends LitElement { ); } - private _handlePanelTap(ev: Event) { - navigate(this, (ev.currentTarget as HTMLAnchorElement).href); + private async _handlePanelTap(ev: Event) { + const path = __DEMO__ + ? (ev.currentTarget as HTMLAnchorElement).getAttribute("href")! + : (ev.currentTarget as HTMLAnchorElement).href; + navigate(this, path); } private _renderPanel( @@ -668,10 +676,10 @@ class HaSidebar extends LitElement { return html` @@ -980,4 +988,8 @@ declare global { interface HTMLElementTagNameMap { "ha-sidebar": HaSidebar; } + + interface HASSDomEvents { + "panel-tap": undefined; + } } diff --git a/src/panels/lovelace/common/directives/action-handler-directive.ts b/src/panels/lovelace/common/directives/action-handler-directive.ts index 0c245a4764..3b0ea378c8 100644 --- a/src/panels/lovelace/common/directives/action-handler-directive.ts +++ b/src/panels/lovelace/common/directives/action-handler-directive.ts @@ -154,6 +154,7 @@ class ActionHandler extends HTMLElement implements ActionHandler { if (["touchend", "touchcancel"].includes(ev.type) && this.cancelled) { return; } + const target = ev.target as HTMLElement; // Prevent mouse event if touch event if (ev.cancelable) { ev.preventDefault(); @@ -164,7 +165,7 @@ class ActionHandler extends HTMLElement implements ActionHandler { this.timer = undefined; } if (options.hasHold && this.held) { - fireEvent(element, "action", { action: "hold" }); + fireEvent(target, "action", { action: "hold" }); } else if (options.hasDoubleClick) { if ( (ev.type === "click" && (ev as MouseEvent).detail < 2) || @@ -172,15 +173,15 @@ class ActionHandler extends HTMLElement implements ActionHandler { ) { this.dblClickTimeout = window.setTimeout(() => { this.dblClickTimeout = undefined; - fireEvent(element, "action", { action: "tap" }); + fireEvent(target, "action", { action: "tap" }); }, 250); } else { clearTimeout(this.dblClickTimeout); this.dblClickTimeout = undefined; - fireEvent(element, "action", { action: "double_tap" }); + fireEvent(target, "action", { action: "double_tap" }); } } else { - fireEvent(element, "action", { action: "tap" }); + fireEvent(target, "action", { action: "tap" }); } }; diff --git a/src/resources/ha-sortable-style.ts b/src/resources/ha-sortable-style.ts index aa5ffe7789..5751f54819 100644 --- a/src/resources/ha-sortable-style.ts +++ b/src/resources/ha-sortable-style.ts @@ -20,8 +20,6 @@ export const sortableStyles = css` #sortable { outline: none; - display: flex; - flex-direction: column; } .sortable-ghost { From 9149bb9333b3ec7b191671bf4128138282664cca Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 8 Sep 2020 15:41:17 +0200 Subject: [PATCH 11/17] Remove deprecated HTML support (#6858) --- src/entrypoints/app.ts | 2 - src/html/index.html.template | 4 - src/panels/lovelace/common/load-resources.ts | 6 - src/resources/html-import/import-href.js | 101 ----- src/resources/html-import/polyfill.js | 451 ------------------- src/util/custom-panel/load-custom-panel.ts | 11 - 6 files changed, 575 deletions(-) delete mode 100644 src/resources/html-import/import-href.js delete mode 100644 src/resources/html-import/polyfill.js diff --git a/src/entrypoints/app.ts b/src/entrypoints/app.ts index bb4b54b6e7..a4dd8580d4 100644 --- a/src/entrypoints/app.ts +++ b/src/entrypoints/app.ts @@ -7,5 +7,3 @@ import "../util/legacy-support"; setPassiveTouchGestures(true); (window as any).frontendVersion = __VERSION__; - -import("../resources/html-import/polyfill"); diff --git a/src/html/index.html.template b/src/html/index.html.template index fe4271c0fb..f5d8be97d1 100644 --- a/src/html/index.html.template +++ b/src/html/index.html.template @@ -100,9 +100,5 @@ {% endfor -%} } - - {% for extra_url in extra_urls -%} - - {% endfor -%} diff --git a/src/panels/lovelace/common/load-resources.ts b/src/panels/lovelace/common/load-resources.ts index c996f25562..5b9fb6d316 100644 --- a/src/panels/lovelace/common/load-resources.ts +++ b/src/panels/lovelace/common/load-resources.ts @@ -30,12 +30,6 @@ export const loadLovelaceResources = ( loadModule(normalizedUrl); break; - case "html": - import( - /* webpackChunkName: "import-href-polyfill" */ "../../../resources/html-import/import-href" - ).then(({ importHref }) => importHref(normalizedUrl)); - break; - default: // eslint-disable-next-line console.warn(`Unknown resource type specified: ${resource.type}`); diff --git a/src/resources/html-import/import-href.js b/src/resources/html-import/import-href.js deleted file mode 100644 index 32083338c3..0000000000 --- a/src/resources/html-import/import-href.js +++ /dev/null @@ -1,101 +0,0 @@ -/* eslint-disable */ -import "./polyfill"; -/** -@license -Copyright (c) 2017 The Polymer Project Authors. All rights reserved. -This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt -The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt -The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt -Code distributed by Google as part of the polymer project is also -subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt -*/ - -// run a callback when HTMLImports are ready or immediately if -// this api is not available. -function whenImportsReady(cb) { - if (window.HTMLImports) { - HTMLImports.whenReady(cb); - } else { - cb(); - } -} - -/** - * Convenience method for importing an HTML document imperatively. - * - * This method creates a new `` element with - * the provided URL and appends it to the document to start loading. - * In the `onload` callback, the `import` property of the `link` - * element will contain the imported document contents. - * - * @param {string} href URL to document to load. - * @param {?function(!Event):void=} onload Callback to notify when an import successfully - * loaded. - * @param {?function(!ErrorEvent):void=} onerror Callback to notify when an import - * unsuccessfully loaded. - * @param {boolean=} optAsync True if the import should be loaded `async`. - * Defaults to `false`. - * @return {!HTMLLinkElement} The link element for the URL to be loaded. - */ -export const importHref = function (href, onload, onerror, optAsync) { - let link /** @type {HTMLLinkElement} */ = document.head.querySelector( - 'link[href="' + href + '"][import-href]' - ); - if (!link) { - link = /** @type {HTMLLinkElement} */ (document.createElement("link")); - link.rel = "import"; - link.href = href; - link.setAttribute("import-href", ""); - } - // always ensure link has `async` attribute if user specified one, - // even if it was previously not async. This is considered less confusing. - if (optAsync) { - link.setAttribute("async", ""); - } - // NOTE: the link may now be in 3 states: (1) pending insertion, - // (2) inflight, (3) already loaded. In each case, we need to add - // event listeners to process callbacks. - const cleanup = function () { - link.removeEventListener("load", loadListener); - link.removeEventListener("error", errorListener); - }; - let loadListener = function (event) { - cleanup(); - // In case of a successful load, cache the load event on the link so - // that it can be used to short-circuit this method in the future when - // it is called with the same href param. - link.__dynamicImportLoaded = true; - if (onload) { - whenImportsReady(() => { - onload(event); - }); - } - }; - let errorListener = function (event) { - cleanup(); - // In case of an error, remove the link from the document so that it - // will be automatically created again the next time `importHref` is - // called. - if (link.parentNode) { - link.parentNode.removeChild(link); - } - if (onerror) { - whenImportsReady(() => { - onerror(event); - }); - } - }; - link.addEventListener("load", loadListener); - link.addEventListener("error", errorListener); - if (link.parentNode == null) { - document.head.appendChild(link); - // if the link already loaded, dispatch a fake load event - // so that listeners are called and get a proper event argument. - } else if (link.__dynamicImportLoaded) { - link.dispatchEvent(new Event("load")); - } - return link; -}; - -export const importHrefPromise = (href) => - new Promise((resolve, reject) => importHref(href, resolve, reject)); diff --git a/src/resources/html-import/polyfill.js b/src/resources/html-import/polyfill.js deleted file mode 100644 index 51844ed272..0000000000 --- a/src/resources/html-import/polyfill.js +++ /dev/null @@ -1,451 +0,0 @@ -/* eslint-disable */ -/* - Copyright (c) 2016 The Polymer Project Authors. All rights reserved. - This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt - The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt - The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt - Code distributed by Google as part of the polymer project is also - subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt -*/ -(function (q) { - function y(a, b) { - if ("function" === typeof window.CustomEvent) return new CustomEvent(a, b); - var c = document.createEvent("CustomEvent"); - c.initCustomEvent(a, !!b.bubbles, !!b.cancelable, b.detail); - return c; - } - function m(a) { - if (u) return a.ownerDocument !== document ? a.ownerDocument : null; - var b = a.__importDoc; - if (!b && a.parentNode) { - b = a.parentNode; - if ("function" === typeof b.closest) b = b.closest("link[rel=import]"); - else for (; !r(b) && (b = b.parentNode); ); - a.__importDoc = b; - } - return b; - } - function D(a) { - var b = k(document, "link[rel=import]:not([import-dependency])"), - c = b.length; - c - ? g(b, function (b) { - return t(b, function () { - 0 === --c && a(); - }); - }) - : a(); - } - function z(a) { - function b() { - "loading" !== document.readyState && - document.body && - (document.removeEventListener("readystatechange", b), a()); - } - document.addEventListener("readystatechange", b); - b(); - } - function A(a) { - z(function () { - return D(function () { - return a && a(); - }); - }); - } - function t(a, b) { - if (a.__loaded) b && b(); - else if ( - ("script" === a.localName && !a.src) || - ("style" === a.localName && !a.firstChild) - ) - (a.__loaded = !0), b && b(); - else { - var c = function (d) { - a.removeEventListener(d.type, c); - a.__loaded = !0; - b && b(); - }; - a.addEventListener("load", c); - (v && "style" === a.localName) || a.addEventListener("error", c); - } - } - function r(a) { - return ( - a.nodeType === Node.ELEMENT_NODE && - "link" === a.localName && - "import" === a.rel - ); - } - function h() { - var a = this; - this.a = {}; - this.b = 0; - this.g = new MutationObserver(function (b) { - return a.w(b); - }); - this.g.observe(document.head, { childList: !0, subtree: !0 }); - this.loadImports(document); - } - function B(a) { - g(k(a, "template"), function (a) { - g( - k( - a.content, - 'script:not([type]),script[type="application/javascript"],script[type="text/javascript"]' - ), - function (a) { - var b = document.createElement("script"); - g(a.attributes, function (a) { - return b.setAttribute(a.name, a.value); - }); - b.textContent = a.textContent; - a.parentNode.replaceChild(b, a); - } - ); - B(a.content); - }); - } - function k(a, b) { - return a.childNodes.length ? a.querySelectorAll(b) : E; - } - function g(a, b, c) { - var d = a ? a.length : 0, - f = c ? -1 : 1; - for (c = c ? d - 1 : 0; c < d && 0 <= c; c += f) b(a[c], c); - } - var n = document.createElement("link"), - u = "import" in n, - E = n.querySelectorAll("*"), - w = null; - !1 === "currentScript" in document && - Object.defineProperty(document, "currentScript", { - get: function () { - return ( - w || - ("complete" !== document.readyState - ? document.scripts[document.scripts.length - 1] - : null) - ); - }, - configurable: !0, - }); - var F = /(url\()([^)]*)(\))/g, - G = /(@import[\s]+(?!url\())([^;]*)(;)/g, - H = /(]*)(rel=['|"]?stylesheet['|"]?[^>]*>)/g, - e = { - u: function (a, b) { - a.href && a.setAttribute("href", e.c(a.getAttribute("href"), b)); - a.src && a.setAttribute("src", e.c(a.getAttribute("src"), b)); - if ("style" === a.localName) { - var c = e.o(a.textContent, b, F); - a.textContent = e.o(c, b, G); - } - }, - o: function (a, b, c) { - return a.replace(c, function (a, c, l, g) { - a = l.replace(/["']/g, ""); - b && (a = e.c(a, b)); - return c + "'" + a + "'" + g; - }); - }, - c: function (a, b) { - if (void 0 === e.f) { - e.f = !1; - try { - var c = new URL("b", "http://a"); - c.pathname = "c%20d"; - e.f = "http://a/c%20d" === c.href; - } catch (d) {} - } - if (e.f) return new URL(a, b).href; - c = e.s; - c || - ((c = document.implementation.createHTMLDocument("temp")), - (e.s = c), - (c.i = c.createElement("base")), - c.head.appendChild(c.i), - (c.h = c.createElement("a"))); - c.i.href = b; - c.h.href = a; - return c.h.href || a; - }, - }, - C = { - async: !0, - load: function (a, b, c) { - if (a) - if (a.match(/^data:/)) { - a = a.split(","); - var d = a[1]; - d = -1 < a[0].indexOf(";base64") ? atob(d) : decodeURIComponent(d); - b(d); - } else { - var f = new XMLHttpRequest(); - f.open("GET", a, C.async); - f.onload = function () { - var a = f.responseURL || f.getResponseHeader("Location"); - a && - 0 === a.indexOf("/") && - (a = - (location.origin || - location.protocol + "//" + location.host) + a); - var d = f.response || f.responseText; - 304 === f.status || - 0 === f.status || - (200 <= f.status && 300 > f.status) - ? b(d, a) - : c(d); - }; - f.send(); - } - else c("error: href must be specified"); - }, - }, - v = - /Trident/.test(navigator.userAgent) || - /Edge\/\d./i.test(navigator.userAgent); - h.prototype.loadImports = function (a) { - var b = this; - g(k(a, "link[rel=import]"), function (a) { - return b.l(a); - }); - }; - h.prototype.l = function (a) { - var b = this, - c = a.href; - if (void 0 !== this.a[c]) { - var d = this.a[c]; - d && d.__loaded && ((a.__import = d), this.j(a)); - } else - this.b++, - (this.a[c] = "pending"), - C.load( - c, - function (a, d) { - a = b.A(a, d || c); - b.a[c] = a; - b.b--; - b.loadImports(a); - b.m(); - }, - function () { - b.a[c] = null; - b.b--; - b.m(); - } - ); - }; - h.prototype.A = function (a, b) { - if (!a) return document.createDocumentFragment(); - v && - (a = a.replace(H, function (a, b, c) { - return -1 === a.indexOf("type=") ? b + " type=import-disable " + c : a; - })); - var c = document.createElement("template"); - c.innerHTML = a; - if (c.content) (a = c.content), B(a); - else - for (a = document.createDocumentFragment(); c.firstChild; ) - a.appendChild(c.firstChild); - if ((c = a.querySelector("base"))) - (b = e.c(c.getAttribute("href"), b)), c.removeAttribute("href"); - var d = 0; - g( - k( - a, - 'link[rel=import],link[rel=stylesheet][href][type=import-disable],style:not([type]),link[rel=stylesheet][href]:not([type]),script:not([type]),script[type="application/javascript"],script[type="text/javascript"]' - ), - function (a) { - t(a); - e.u(a, b); - a.setAttribute("import-dependency", ""); - "script" === a.localName && - !a.src && - a.textContent && - (a.setAttribute( - "src", - "data:text/javascript;charset=utf-8," + - encodeURIComponent( - a.textContent + - ("\n//# sourceURL=" + b + (d ? "-" + d : "") + ".js\n") - ) - ), - (a.textContent = ""), - d++); - } - ); - return a; - }; - h.prototype.m = function () { - var a = this; - if (!this.b) { - this.g.disconnect(); - this.flatten(document); - var b = !1, - c = !1, - d = function () { - c && - b && - (a.loadImports(document), - a.b || - (a.g.observe(document.head, { childList: !0, subtree: !0 }), - a.v())); - }; - this.C(function () { - c = !0; - d(); - }); - this.B(function () { - b = !0; - d(); - }); - } - }; - h.prototype.flatten = function (a) { - var b = this; - g(k(a, "link[rel=import]"), function (a) { - var c = b.a[a.href]; - (a.__import = c) && - c.nodeType === Node.DOCUMENT_FRAGMENT_NODE && - ((b.a[a.href] = a), - (a.readyState = "loading"), - (a.__import = a), - b.flatten(c), - a.appendChild(c)); - }); - }; - h.prototype.B = function (a) { - function b(f) { - if (f < d) { - var l = c[f], - e = document.createElement("script"); - l.removeAttribute("import-dependency"); - g(l.attributes, function (a) { - return e.setAttribute(a.name, a.value); - }); - w = e; - l.parentNode.replaceChild(e, l); - t(e, function () { - w = null; - b(f + 1); - }); - } else a(); - } - var c = k(document, "script[import-dependency]"), - d = c.length; - b(0); - }; - h.prototype.C = function (a) { - var b = k( - document, - "style[import-dependency],link[rel=stylesheet][import-dependency]" - ), - c = b.length; - if (c) { - var d = - v && - !!document.querySelector( - "link[rel=stylesheet][href][type=import-disable]" - ); - g(b, function (b) { - t(b, function () { - b.removeAttribute("import-dependency"); - 0 === --c && a(); - }); - if (d && b.parentNode !== document.head) { - var e = document.createElement(b.localName); - e.__appliedElement = b; - e.setAttribute("type", "import-placeholder"); - b.parentNode.insertBefore(e, b.nextSibling); - for (e = m(b); e && m(e); ) e = m(e); - e.parentNode !== document.head && (e = null); - document.head.insertBefore(b, e); - b.removeAttribute("type"); - } - }); - } else a(); - }; - h.prototype.v = function () { - var a = this; - g( - k(document, "link[rel=import]"), - function (b) { - return a.j(b); - }, - !0 - ); - }; - h.prototype.j = function (a) { - a.__loaded || - ((a.__loaded = !0), - a.import && (a.import.readyState = "complete"), - a.dispatchEvent( - y(a.import ? "load" : "error", { - bubbles: !1, - cancelable: !1, - detail: void 0, - }) - )); - }; - h.prototype.w = function (a) { - var b = this; - g(a, function (a) { - return g(a.addedNodes, function (a) { - a && - a.nodeType === Node.ELEMENT_NODE && - (r(a) ? b.l(a) : b.loadImports(a)); - }); - }); - }; - var x = null; - if (u) - g(k(document, "link[rel=import]"), function (a) { - (a.import && "loading" === a.import.readyState) || (a.__loaded = !0); - }), - (n = function (a) { - a = a.target; - r(a) && (a.__loaded = !0); - }), - document.addEventListener("load", n, !0), - document.addEventListener("error", n, !0); - else { - var p = Object.getOwnPropertyDescriptor(Node.prototype, "baseURI"); - Object.defineProperty( - (!p || p.configurable ? Node : Element).prototype, - "baseURI", - { - get: function () { - var a = r(this) ? this : m(this); - return a - ? a.href - : p && p.get - ? p.get.call(this) - : (document.querySelector("base") || window.location).href; - }, - configurable: !0, - enumerable: !0, - } - ); - Object.defineProperty(HTMLLinkElement.prototype, "import", { - get: function () { - return this.__import || null; - }, - configurable: !0, - enumerable: !0, - }); - z(function () { - x = new h(); - }); - } - A(function () { - return document.dispatchEvent( - y("HTMLImportsLoaded", { cancelable: !0, bubbles: !0, detail: void 0 }) - ); - }); - q.useNative = u; - q.whenReady = A; - q.importForElement = m; - q.loadImports = function (a) { - x && x.loadImports(a); - }; -})((window.HTMLImports = window.HTMLImports || {})); diff --git a/src/util/custom-panel/load-custom-panel.ts b/src/util/custom-panel/load-custom-panel.ts index c674e0f4ed..1286b6588f 100644 --- a/src/util/custom-panel/load-custom-panel.ts +++ b/src/util/custom-panel/load-custom-panel.ts @@ -47,17 +47,6 @@ export const loadCustomPanel = ( ): Promise => { const panelSource = getUrl(panelConfig); - if (panelSource.type === "html") { - const toLoad = [ - import( - /* webpackChunkName: "import-href-polyfill" */ "../../resources/html-import/import-href" - ), - ]; - - return Promise.all(toLoad).then(([{ importHrefPromise }]) => - importHrefPromise(panelSource.url) - ); - } if (panelSource.type === "js") { if (!(panelSource.url in JS_CACHE)) { JS_CACHE[panelSource.url] = loadJS(panelSource.url); From 4e676b1dba0854c5fc0303c735ca618af78a8c5c Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 8 Sep 2020 16:17:01 +0200 Subject: [PATCH 12/17] Fix light more info (#6855) --- src/components/ha-color-picker.js | 11 +++++++++++ src/dialogs/more-info/controls/more-info-light.ts | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/components/ha-color-picker.js b/src/components/ha-color-picker.js index 49fce6c7f5..a50601c0ea 100644 --- a/src/components/ha-color-picker.js +++ b/src/components/ha-color-picker.js @@ -176,6 +176,11 @@ class HaColorPicker extends EventsMixin(PolymerElement) { this.drawColorWheel(); this.drawMarker(); + if (this.desiredHsColor) { + this.setMarkerOnColor(this.desiredHsColor); + this.applyColorToCanvas(this.desiredHsColor); + } + this.interactionLayer.addEventListener("mousedown", (ev) => this.onMouseDown(ev) ); @@ -319,6 +324,9 @@ class HaColorPicker extends EventsMixin(PolymerElement) { // set marker position to the given color setMarkerOnColor(hs) { + if (!this.marker || !this.tooltip) { + return; + } const dist = hs.s * this.radius; const theta = ((hs.h - 180) / 180) * Math.PI; const markerdX = -dist * Math.cos(theta); @@ -330,6 +338,9 @@ class HaColorPicker extends EventsMixin(PolymerElement) { // apply given color to interface elements applyColorToCanvas(hs) { + if (!this.interactionLayer) { + return; + } // we're not really converting hs to hsl here, but we keep it cheap // setting the color on the interactionLayer, the svg elements can inherit this.interactionLayer.style.color = `hsl(${hs.h}, 100%, ${ diff --git a/src/dialogs/more-info/controls/more-info-light.ts b/src/dialogs/more-info/controls/more-info-light.ts index 6b0bba5572..772d0ea29d 100644 --- a/src/dialogs/more-info/controls/more-info-light.ts +++ b/src/dialogs/more-info/controls/more-info-light.ts @@ -134,7 +134,7 @@ class MoreInfoLight extends LitElement { attr-for-selected="item-name" >${this.stateObj.attributes.effect_list.map( (effect: string) => html` - ${effect} ` @@ -170,7 +170,7 @@ class MoreInfoLight extends LitElement { } private _effectChanged(ev: CustomEvent) { - const newVal = ev.detail.value; + const newVal = ev.detail.item.itemName; if (!newVal || this.stateObj!.attributes.effect === newVal) { return; From 909cff215836cf69cd10f2fd1dfff62d38150882 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 8 Sep 2020 17:01:04 +0200 Subject: [PATCH 13/17] Fix timer entity display (#6849) --- src/common/entity/timer_time_remaining.ts | 7 ++++++- src/dialogs/more-info/controls/more-info-timer.ts | 13 +++++-------- .../lovelace/entity-rows/hui-timer-entity-row.ts | 6 ++++-- src/state-summary/state-card-timer.js | 8 +++++--- 4 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/common/entity/timer_time_remaining.ts b/src/common/entity/timer_time_remaining.ts index cd7c90ef8f..5b2f54654d 100644 --- a/src/common/entity/timer_time_remaining.ts +++ b/src/common/entity/timer_time_remaining.ts @@ -1,7 +1,12 @@ import { HassEntity } from "home-assistant-js-websocket"; import durationToSeconds from "../datetime/duration_to_seconds"; -export const timerTimeRemaining = (stateObj: HassEntity) => { +export const timerTimeRemaining = ( + stateObj: HassEntity +): undefined | number => { + if (!stateObj.attributes.remaining) { + return undefined; + } let timeRemaining = durationToSeconds(stateObj.attributes.remaining); if (stateObj.state === "active") { diff --git a/src/dialogs/more-info/controls/more-info-timer.ts b/src/dialogs/more-info/controls/more-info-timer.ts index 809d697c70..c06f549896 100644 --- a/src/dialogs/more-info/controls/more-info-timer.ts +++ b/src/dialogs/more-info/controls/more-info-timer.ts @@ -26,15 +26,12 @@ class MoreInfoTimer extends LitElement { return html`
${this.stateObj.state === "idle" || this.stateObj.state === "paused" ? html` - + ${this.hass!.localize("ui.card.timer.actions.start")} ` @@ -42,7 +39,7 @@ class MoreInfoTimer extends LitElement { ${this.stateObj.state === "active" ? html` ${this.hass!.localize("ui.card.timer.actions.pause")} @@ -52,13 +49,13 @@ class MoreInfoTimer extends LitElement { ${this.stateObj.state === "active" || this.stateObj.state === "paused" ? html` ${this.hass!.localize("ui.card.timer.actions.cancel")} ${this.hass!.localize("ui.card.timer.actions.finish")} diff --git a/src/panels/lovelace/entity-rows/hui-timer-entity-row.ts b/src/panels/lovelace/entity-rows/hui-timer-entity-row.ts index e744313f26..b77225c28d 100644 --- a/src/panels/lovelace/entity-rows/hui-timer-entity-row.ts +++ b/src/panels/lovelace/entity-rows/hui-timer-entity-row.ts @@ -2,9 +2,9 @@ import { HassEntity } from "home-assistant-js-websocket"; import { customElement, html, + internalProperty, LitElement, property, - internalProperty, PropertyValues, TemplateResult, } from "lit-element"; @@ -125,7 +125,9 @@ class HuiTimerEntityRow extends LitElement { } if (stateObj.state === "idle" || this._timeRemaining === 0) { - return this.hass!.localize("state.timer." + stateObj.state); + return ( + this.hass!.localize(`state.timer.${stateObj.state}`) || stateObj.state + ); } let display = secondsToDuration(this._timeRemaining || 0); diff --git a/src/state-summary/state-card-timer.js b/src/state-summary/state-card-timer.js index 96586e8804..17d39fde5c 100644 --- a/src/state-summary/state-card-timer.js +++ b/src/state-summary/state-card-timer.js @@ -23,7 +23,7 @@ class StateCardTimer extends PolymerElement {
${this.stateInfoTemplate} -
[[_secondsToDuration(timeRemaining)]]
+
[[_displayState(timeRemaining, stateObj)]]
`; } @@ -90,8 +90,10 @@ class StateCardTimer extends PolymerElement { this.timeRemaining = timerTimeRemaining(stateObj); } - _secondsToDuration(time) { - return secondsToDuration(time); + _displayState(time, stateObj) { + return time + ? secondsToDuration(time) + : this.hass.localize(`state.timer.${stateObj.state}`) || stateObj.state; } } customElements.define("state-card-timer", StateCardTimer); From 4d0d1ed2a1d8705abb9f9d936a996ca6e3d0ecef Mon Sep 17 00:00:00 2001 From: Zack Barett Date: Tue, 8 Sep 2020 13:52:21 -0500 Subject: [PATCH 14/17] Undo my commit into dev (#6864) --- src/dialogs/more-info/controls/more-info-light.ts | 6 +++--- src/dialogs/more-info/ha-more-info-tab-history.ts | 13 +------------ 2 files changed, 4 insertions(+), 15 deletions(-) diff --git a/src/dialogs/more-info/controls/more-info-light.ts b/src/dialogs/more-info/controls/more-info-light.ts index 605e3210f5..772d0ea29d 100644 --- a/src/dialogs/more-info/controls/more-info-light.ts +++ b/src/dialogs/more-info/controls/more-info-light.ts @@ -105,12 +105,12 @@ class MoreInfoLight extends LitElement { ? html`
`; diff --git a/src/dialogs/more-info/ha-more-info-tab-history.ts b/src/dialogs/more-info/ha-more-info-tab-history.ts index eeb00cef33..18624a11ef 100644 --- a/src/dialogs/more-info/ha-more-info-tab-history.ts +++ b/src/dialogs/more-info/ha-more-info-tab-history.ts @@ -85,18 +85,7 @@ export class MoreInfoTabHistoryDialog extends LitElement { clearInterval(this._historyRefreshInterval); } - if (!this.hass) { - return; - } - - const oldHass = changedProps.get("hass") as HomeAssistant; - const newStateObj = this.hass.states[this.entityId]; - const oldStateObj = oldHass?.states[this.entityId]; - - if ( - changedProps.has("entityId") || - (oldHass && newStateObj !== oldStateObj) - ) { + if (changedProps.has("entityId")) { this._stateHistory = undefined; this._entries = undefined; From 869b7c85cafddefa81da4ba47702de1dd4a25bc9 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 8 Sep 2020 13:56:45 -0500 Subject: [PATCH 15/17] Ensure we pickup all the reloadable domains (#6861) --- src/common/config/components_with_service.ts | 9 ++++ .../ha-config-server-control.ts | 50 ++++++++----------- 2 files changed, 31 insertions(+), 28 deletions(-) create mode 100644 src/common/config/components_with_service.ts diff --git a/src/common/config/components_with_service.ts b/src/common/config/components_with_service.ts new file mode 100644 index 0000000000..9775b8c6f6 --- /dev/null +++ b/src/common/config/components_with_service.ts @@ -0,0 +1,9 @@ +import { HomeAssistant } from "../../types"; + +/** Return an array of domains with the service. */ +export const componentsWithService = ( + hass: HomeAssistant, + service: string +): Array => + hass && + Object.keys(hass.services).filter((key) => service in hass.services[key]); diff --git a/src/panels/config/server_control/ha-config-server-control.ts b/src/panels/config/server_control/ha-config-server-control.ts index 04fbc5b237..62622baeab 100644 --- a/src/panels/config/server_control/ha-config-server-control.ts +++ b/src/panels/config/server_control/ha-config-server-control.ts @@ -12,7 +12,7 @@ import { property, TemplateResult, } from "lit-element"; -import { isServiceLoaded } from "../../../common/config/is_service_loaded"; +import { componentsWithService } from "../../../common/config/components_with_service"; import "../../../components/buttons/ha-call-service-button"; import "../../../components/ha-card"; import { checkCoreConfig } from "../../../data/core"; @@ -23,8 +23,6 @@ import { HomeAssistant, Route } from "../../../types"; import "../ha-config-section"; import { configSections } from "../ha-panel-config"; -const platformsWithReload = ["template"]; - @customElement("ha-config-server-control") export class HaConfigServerControl extends LitElement { @property({ attribute: false }) public hass!: HomeAssistant; @@ -51,13 +49,10 @@ export class HaConfigServerControl extends LitElement { changedProperties.has("hass") && (!oldHass || oldHass.config.components !== this.hass.config.components) ) { - this._reloadableDomains = this.hass.config.components - .concat(platformsWithReload) - .filter( - (component) => - !component.includes(".") && - isServiceLoaded(this.hass, component, "reload") - ); + this._reloadableDomains = componentsWithService( + this.hass, + "reload" + ).sort(); } } @@ -207,24 +202,23 @@ export class HaConfigServerControl extends LitElement { )}
- ${this._reloadableDomains.map((domain) => - isServiceLoaded(this.hass, domain, "reload") - ? html`
- ${this.hass.localize( - `ui.panel.config.server_control.section.reloading.${domain}` - ) || - this.hass.localize( - "ui.panel.config.server_control.section.reloading.reload", - "domain", - domainToName(this.hass.localize, domain) - )} - -
` - : "" + ${this._reloadableDomains.map( + (domain) => + html`
+ ${this.hass.localize( + `ui.panel.config.server_control.section.reloading.${domain}` + ) || + this.hass.localize( + "ui.panel.config.server_control.section.reloading.reload", + "domain", + domainToName(this.hass.localize, domain) + )} + +
` )} ` From b30ee884a72fe39f87e75fbe80aceeba7714c2ac Mon Sep 17 00:00:00 2001 From: Zack Barett Date: Tue, 8 Sep 2020 13:57:17 -0500 Subject: [PATCH 16/17] Fix for Camera streams that don't support stream (#6863) --- src/components/ha-camera-stream.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ha-camera-stream.ts b/src/components/ha-camera-stream.ts index a8d34c8a18..51794b3ad3 100644 --- a/src/components/ha-camera-stream.ts +++ b/src/components/ha-camera-stream.ts @@ -66,7 +66,7 @@ class HaCameraStream extends LitElement { } protected updated(changedProps: PropertyValues): void { - if (changedProps.has("stateObj")) { + if (changedProps.has("stateObj") && !this._shouldRenderMJPEG) { this._forceMJPEG = undefined; this._getStreamUrl(); } From 0e021e7d7def0c84f557f1dfec4562bbaf9d4d7d Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 8 Sep 2020 20:58:47 +0200 Subject: [PATCH 17/17] Bumped version to 20200908.0 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index b1a1ef7a73..8bec01eb50 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name="home-assistant-frontend", - version="20200907.0", + version="20200908.0", description="The Home Assistant frontend", url="https://github.com/home-assistant/home-assistant-polymer", author="The Home Assistant Authors",