From 33d9bf466087d59a810c4052d5367835ca7d079b Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Fri, 31 Jan 2020 00:32:34 +0000 Subject: [PATCH 01/64] [ci skip] Translation update --- translations/en.json | 1 + translations/es.json | 100 ++++++++++++++++++++++++++++--------------- translations/fr.json | 20 ++++----- translations/nl.json | 89 ++++++++++++++++++++++++++++++++++++-- translations/pl.json | 32 ++++++++++---- translations/ru.json | 6 +-- 6 files changed, 189 insertions(+), 59 deletions(-) diff --git a/translations/en.json b/translations/en.json index 0a4140aed3..be8650aed3 100644 --- a/translations/en.json +++ b/translations/en.json @@ -1232,6 +1232,7 @@ }, "create": "Create automation with device", "no_automations": "No automations", + "no_device_automations": "There are no automations available for this device.", "triggers": { "caption": "Do something when..." } diff --git a/translations/es.json b/translations/es.json index 72f1429aea..832ed70c21 100644 --- a/translations/es.json +++ b/translations/es.json @@ -544,10 +544,24 @@ "yes": "Sí" }, "components": { + "area-picker": { + "add_dialog": { + "add": "Añadir", + "failed_create_area": "No se pudo crear el área.", + "name": "Nombre", + "text": "Introduce el nombre del área nueva.", + "title": "Añadir nueva área" + }, + "add_new": "Añade una nueva área ...", + "area": "Área", + "clear": "Limpiar", + "show_areas": "Mostrar áreas" + }, "device-picker": { "clear": "Limpiar", "device": "Dispositivo", - "show_devices": "Mostrar dispositivos" + "show_devices": "Mostrar dispositivos", + "toggle": "Alternar" }, "entity": { "entity-picker": { @@ -604,13 +618,13 @@ "control": "Control", "dismiss": "Descartar", "editor": { - "confirm_delete": "¿Estás seguro de que quieres borrar este elemento?", - "delete": "BORRAR", + "confirm_delete": "¿Estás seguro de que quieres eliminar este elemento?", + "delete": "ELIMINAR", "enabled_cause": "Desactivado por {cause}.", "enabled_description": "Las entidades deshabilitadas no se agregarán a Home Assistant.", "enabled_label": "Activar entidad", "entity_id": "ID de la entidad", - "name": "Forzar el nombre", + "name": "Cambio de nombre", "note": "Nota: puede que esto no funcione todavía con todas las integraciones", "unavailable": "Esta entidad no está disponible actualmente.", "update": "ACTUALIZAR" @@ -735,7 +749,7 @@ "editor": { "create": "CREAR", "default_name": "Área Nueva", - "delete": "BORRAR", + "delete": "ELIMINAR", "update": "ACTUALIZAR" }, "no_areas": "¡Parece que aún no tienes áreas!", @@ -982,10 +996,10 @@ "config_documentation": "Documentación de configuración", "disable": "deshabilitar", "enable": "activar", - "enable_ha_skill": "Habilita la skill Home Assistant para Alexa", - "enable_state_reporting": "Habilitar informes de estado", + "enable_ha_skill": "Activa la skill Home Assistant para Alexa", + "enable_state_reporting": "Activar informes de estado", "info": "Con la integración de Alexa para Home Assistant Cloud podrás controlar todos tus dispositivos Home Assistant a través de cualquier dispositivo habilitado para Alexa.", - "info_state_reporting": "Si habilitas los informes de estado, Home Assistant enviará todos los cambios de estado de las entidades expuestas a Amazon. Esto te permite ver siempre los estados más recientes en la aplicación Alexa y usar los cambios de estado para crear rutinas.", + "info_state_reporting": "Si activas los informes de estado, Home Assistant enviará todos los cambios de estado de las entidades expuestas a Amazon. Esto te permite ver siempre los estados más recientes en la aplicación Alexa y usar los cambios de estado para crear rutinas.", "manage_entities": "Administrar entidades", "state_reporting_error": "No se puede {enable_disable} informar el estado.", "sync_entities": "Sincronizar entidades", @@ -999,12 +1013,12 @@ "config_documentation": "Documentación de configuración", "devices_pin": "Pin de dispositivos de seguridad", "enable_ha_skill": "Activa la skill de Home Assistant para el Asistente de Google", - "enable_state_reporting": "Habilitar informes de estado", + "enable_state_reporting": "Activar informes de estado", "enter_pin_error": "No se puede almacenar el pin:", "enter_pin_hint": "Introduce un PIN para utilizar dispositivos de seguridad", "enter_pin_info": "Por favor, introduce un pin para interactuar con los dispositivos de seguridad. Los dispositivos de seguridad son puertas, puertas de garaje y cerraduras. Se te pedirá que digas/introduzcas este pin cuando interactúes con dichos dispositivos a través del Asistente de Google.", "info": "Con la integración del Asistente de Google para Home Assistant Cloud, podrás controlar todos tus dispositivos Home Assistant a través de cualquier dispositivo habilitado para Asistente de Google.", - "info_state_reporting": "Si habilitas los informes de estado, Home Assistant enviará todos los cambios de estado de las entidades expuestas a Google. Esto te permite ver siempre los últimos estados en la aplicación de Google.", + "info_state_reporting": "Si activas los informes de estado, Home Assistant enviará todos los cambios de estado de las entidades expuestas a Google. Esto te permite ver siempre los últimos estados en la aplicación de Google.", "manage_entities": "Administrar entidades", "security_devices": "Dispositivos de seguridad", "sync_entities": "Sincronizar entidades con Google", @@ -1212,14 +1226,18 @@ "actions": { "caption": "Cuando algo se activa...." }, + "automations": "Automatizaciones", "conditions": { "caption": "Sólo hacer algo si..." }, + "create": "Crear automatización con el dispositivo", + "no_automations": "Sin automatizaciones", "triggers": { "caption": "Hacer algo cuando..." } }, "automations": "Automatizaciones", + "cant_edit": "Solo puedes editar los elementos que se crean en la interfaz de usuario.", "caption": "Dispositivos", "confirm_rename_entity_ids": "¿También quieres cambiar el nombre de los identificadores de entidad de tus entidades?", "data_table": { @@ -1234,13 +1252,27 @@ "details": "Aquí están todos los detalles de tu dispositivo.", "device_not_found": "Dispositivo no encontrado.", "entities": { - "add_entities_lovelace": "Agregar todas las entidades del dispositivo a Lovelace", + "add_entities_lovelace": "Añadir a Lovelace", "entities": "Entidades", "none": "Este dispositivo no tiene entidades" }, "info": "Información del dispositivo", + "name": "Nombre", + "scene": { + "create": "Crear escena con el dispositivo", + "no_scenes": "Sin escenas", + "scenes": "Escenas" + }, + "scenes": "Escenas", + "script": { + "create": "Crear script con el dispositivo", + "no_scripts": "Sin scripts", + "scripts": "Scripts" + }, + "scripts": "Scripts", "unknown_error": "Error desconocido", - "unnamed_device": "Dispositivo sin nombre" + "unnamed_device": "Dispositivo sin nombre", + "update": "Actualizar" }, "entities": { "caption": "Entidades", @@ -1249,12 +1281,12 @@ "confirm_delete": "¿Estás seguro de que deseas eliminar esta entrada?", "confirm_delete2": "Eliminar una entrada no eliminará la entidad de Home Assistant. Para hacer esto, deberás eliminar la integración \"{platform}\" de Home Assistant.", "default_name": "Área Nueva", - "delete": "BORRAR", + "delete": "ELIMINAR", "enabled_cause": "Desactivado por {cause}.", "enabled_description": "Las entidades desactivadas no se añadirán a Home Assistant.", "enabled_label": "Activar entidad", "entity_id": "ID de entidad", - "name": "Forzar el nombre", + "name": "Cambio de nombre", "note": "Nota: es posible que esto no funcione aún con todas las integraciones.", "unavailable": "Esta entidad no está disponible actualmente.", "update": "ACTUALIZAR" @@ -1266,9 +1298,9 @@ "confirm_title": "¿Deseas deshabilitar {number} entidades?" }, "enable_selected": { - "button": "Habilitar seleccionadas", + "button": "Activar seleccionadas", "confirm_text": "Esto las hará disponibles en Home Assistant de nuevo si ahora están deshabilitadas.", - "confirm_title": "¿Deseas habilitar {number} entidades?" + "confirm_title": "¿Deseas activar {number} entidades?" }, "filter": { "filter": "Filtrar", @@ -1277,7 +1309,7 @@ }, "header": "Entidades", "headers": { - "enabled": "Habilitado", + "enabled": "Activado", "entity_id": "ID de entidad", "integration": "Integración", "name": "Nombre", @@ -1504,7 +1536,7 @@ "change_password": "Cambiar la contraseña", "confirm_user_deletion": "¿Seguro que quieres eliminar {name}?", "deactivate_user": "Desactivar usuario", - "delete_user": "Borrar usuario", + "delete_user": "Eliminar usuario", "enter_new_name": "Introduzca un nuevo nombre", "group": "Grupo", "group_update_failed": "La actualización del grupo falló:", @@ -1638,7 +1670,7 @@ "description": "Gestiona las zonas en las que deseas realizar un seguimiento de las personas.", "detail": { "create": "Crear", - "delete": "Borrar", + "delete": "Eliminar", "icon": "Icono", "icon_error_msg": "El icono debe estar en el formato prefijo:nombre_del_icono, por ejemplo: mdi:home", "latitude": "Latitud", @@ -1836,9 +1868,9 @@ }, "lovelace": { "add_entities": { - "generated_unsupported": "Solo puedes usar esta función cuando hayas tomado el control de Lovelace.", - "saving_failed": "Error al guardar la configuración de Lovelace.", - "yaml_unsupported": "No puedes usar esta función cuando usas Lovelace en modo YAML." + "generated_unsupported": "Solo puedes usar esta función cuando hayas tomado el control de la IU Lovelace.", + "saving_failed": "Error al guardar la configuración de la IU Lovelace.", + "yaml_unsupported": "No puedes usar esta función cuando usas la IU Lovelace en modo YAML." }, "cards": { "confirm_delete": "¿Seguro que quieres eliminar esta tarjeta?", @@ -1866,7 +1898,7 @@ } }, "changed_toast": { - "message": "La configuración de Lovelace se actualizó, ¿te gustaría volver a cargarla?", + "message": "La configuración de la IU Lovelace se actualizó, ¿te gustaría volver a cargarla?", "refresh": "Actualizar" }, "editor": { @@ -2009,12 +2041,12 @@ }, "edit_lovelace": { "edit_title": "Editar título", - "explanation": "Este título se muestra sobre todas tus vistas en Lovelace.", + "explanation": "Este título se muestra sobre todas tus vistas en la IU Lovelace.", "header": "Título de tu interfaz de usuario de Lovelace" }, "edit_view": { "add": "Añadir vista", - "delete": "Borrar vista", + "delete": "Eliminar vista", "edit": "Editar vista", "header": "Ver configuración", "header_name": "{name} Ver configuración", @@ -2023,7 +2055,7 @@ }, "header": "Editar la interfaz de usuario", "menu": { - "open": "Abrir el menú de Lovelace", + "open": "Abrir el menú de la IU Lovelace", "raw_editor": "Editor de configuración en bruto" }, "migrate": { @@ -2033,8 +2065,8 @@ "para_no_id": "Este elemento no tiene un ID. Por favor añade uno a este elemento en 'ui-lovelace.yaml'." }, "raw_editor": { - "confirm_remove_config_text": "Generaremos automáticamente tus vistas de Lovelace con tus áreas y dispositivos si eliminas tu configuración de Lovelace.", - "confirm_remove_config_title": "¿Estás seguro de que deseas eliminar tu configuración de Lovelace? Generaremos automáticamente tus vistas de Lovelace con tus áreas y dispositivos.", + "confirm_remove_config_text": "Generaremos automáticamente tus vistas de la IU Lovelace con tus áreas y dispositivos si eliminas tu configuración de Lovelace.", + "confirm_remove_config_title": "¿Estás seguro de que deseas eliminar tu configuración de la IU Lovelace? Generaremos automáticamente tus vistas de la IU Lovelace con tus áreas y dispositivos.", "confirm_unsaved_changes": "Tienes cambios sin guardar, ¿estás seguro de que quieres salir?", "confirm_unsaved_comments": "Tu configuración contiene comentarios, estos no serán guardados. ¿Quieres continuar?", "error_invalid_config": "Tu configuración no es válida: {error}", @@ -2054,7 +2086,7 @@ "save": "Tomar el control" }, "suggest_card": { - "add": "Añadir a Lovelace", + "add": "Añadir a la IU Lovelace", "create_own": "Elige una tarjeta diferente", "header": "Hemos creado una sugerencia para ti" }, @@ -2073,7 +2105,7 @@ "refresh": "Actualizar", "unused_entities": "Entidades no utilizadas" }, - "reload_lovelace": "Recargar Lovelace", + "reload_lovelace": "Recargar la IU Lovelace", "unused_entities": { "available_entities": "Estas son las entidades que tienes disponibles, pero aún no están en la interfaz de usuario de Lovelace.", "domain": "Dominio", @@ -2271,7 +2303,7 @@ }, "profile": { "advanced_mode": { - "description": "Home Assistant oculta las funciones y opciones avanzadas de forma predeterminada. Puedes hacer que estas funciones sean accesibles marcando esta opción. Esta es una configuración específica del usuario y no afecta a otros usuarios que usan Home Assistant.", + "description": "Desbloquea las funciones avanzadas.", "link_promo": "Saber más", "title": "Modo avanzado" }, @@ -2322,13 +2354,13 @@ "mfa": { "confirm_disable": "¿Estás seguro de que deseas deshabilitar {name}?", "disable": "Deshabilitar", - "enable": "Habilitar", + "enable": "Activar", "header": "Módulos de autenticación multifactor" }, "push_notifications": { "description": "Enviar notificaciones a este dispositivo", "error_load_platform": "Configurar notify.html5.", - "error_use_https": "Requiere SSL habilitado para frontend.", + "error_use_https": "Requiere SSL activado para frontend.", "header": "Notificaciones push", "link_promo": "Aprender más", "push_notifications": "Notificaciones push" @@ -2351,7 +2383,7 @@ "link_promo": "Aprende sobre los temas" }, "vibrate": { - "description": "Habilitar o deshabilitar la vibración en este dispositivo al controlar dispositivos.", + "description": "Activar o deshabilitar la vibración en este dispositivo al controlar dispositivos.", "header": "Vibrar" } }, diff --git a/translations/fr.json b/translations/fr.json index 68919c29ea..b20378afcd 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -772,7 +772,7 @@ "delete_confirm": "Voulez-vous vraiment effacer ?", "duplicate": "Dupliquer", "header": "Actions", - "introduction": "Les actions sont ce que Home Assistant fera quand une automatisation est déclenchée.", + "introduction": "Les actions sont ce que Home Assistant fera quand une automation est déclenchée.", "learn_more": "En savoir plus sur les actions", "name": "Action", "type_select": "Type d'action", @@ -981,9 +981,9 @@ "delete_automation": "Supprimer l'automation", "delete_confirm": "Êtes-vous sûr de vouloir supprimer cette automation ?", "edit_automation": "Modifier l'automation", - "header": "Éditeur d'automatisation", + "header": "Éditeur d'automation", "introduction": "L'éditeur d'automations vous permet de créer et modifier des automations. Veuillez lire les instructions ci-dessous pour vous assurer d'avoir configuré Home Assistant correctement.", - "learn_more": "En savoir plus sur les automatisations", + "learn_more": "En savoir plus sur les automations", "no_automations": "Il n'y a aucune automation modifiable.", "only_editable": "Seules les automations définies dans automations.yaml sont modifiables.", "pick_automation": "Choisissez l'automation à modifier", @@ -1046,7 +1046,7 @@ "webhooks": { "disable_hook_error_msg": "Impossible de désactiver le Webhook:", "info": "Tout ce qui est configuré pour être déclenché par un Webhook peut recevoir une URL accessible publiquement pour vous permettre de renvoyer des données à Home Assistant de n’importe où, sans exposer votre instance à Internet.", - "link_learn_more": "En savoir plus sur la création d'automatisations basées sur Webhook.", + "link_learn_more": "En savoir plus sur la création d'automations basées sur Webhook.", "loading": "Chargement ...", "manage": "Gérer", "no_hooks_yet": "Il semble que vous n'ayez pas encore de Webhooks. Commencez en configurer un ", @@ -1226,12 +1226,12 @@ "actions": { "caption": "Quand quelque chose est déclenché ..." }, - "automations": "Automatisations", + "automations": "Automations", "conditions": { "caption": "Ne faire quelque chose que si ..." }, - "create": "Créer une automatisation avec l'appareil", - "no_automations": "Aucune automatisation", + "create": "Créer une automation avec l'appareil", + "no_automations": "Aucune automation", "triggers": { "caption": "Faire quelque chose quand ..." } @@ -1678,13 +1678,13 @@ "name": "Nom", "new_zone": "Nouvelle zone", "passive": "Passif", - "passive_note": "Les zones passives sont cachées dans le frontend et ne sont pas utilisées comme emplacement pour les traceurs de périphériques. C'est utile si vous voulez seulement les utiliser pour des automatisations.", + "passive_note": "Les zones passives sont cachées dans le frontend et ne sont pas utilisées comme emplacement pour les traceurs de périphériques. C'est utile si vous voulez seulement les utiliser pour des automations.", "radius": "Rayon", "required_error_msg": "Ce champ est requis", "update": "Mettre à jour" }, "edit_home_zone": "L'emplacement de votre maison peut être modifié dans la configuration générale.", - "introduction": "Les zones vous permettent de spécifier certaines régions sur la terre. Lorsqu'une personne se trouve dans une zone, l'état prend le nom de la zone. Les zones peuvent également être utilisées comme déclencheur ou condition dans les configurations d'automatisation.", + "introduction": "Les zones vous permettent de spécifier certaines régions sur la terre. Lorsqu'une personne se trouve dans une zone, l'état prend le nom de la zone. Les zones peuvent également être utilisées comme déclencheur ou condition dans les configurations d'automation.", "no_zones_created_yet": "Il semble que vous n'ayez pas encore créé de zones." }, "zwave": { @@ -2032,7 +2032,7 @@ "header": "Configuration de la carte", "move": "Déplacer", "options": "Plus d'options", - "pick_card": "Choisissez l'automatisation à ajouter", + "pick_card": "Choisissez l'automation à ajouter", "pick_card_view_title": "Quelle carte souhaitez-vous ajouter à votre vue {name} ?", "save": "Enregistrer", "show_code_editor": "Afficher l'éditeur de code", diff --git a/translations/nl.json b/translations/nl.json index 7ade4fa053..9b4509a5dc 100644 --- a/translations/nl.json +++ b/translations/nl.json @@ -478,6 +478,9 @@ "script": { "execute": "Uitvoeren" }, + "service": { + "run": "Uitvoeren" + }, "timer": { "actions": { "cancel": "annuleren", @@ -541,6 +544,19 @@ "yes": "Ja" }, "components": { + "area-picker": { + "add_dialog": { + "add": "Toevoegen", + "failed_create_area": "Kan het gebied niet maken.", + "name": "Naam", + "text": "Geef de naam op van het nieuwe gebied.", + "title": "Gebied toevoegen" + }, + "add_new": "Gebied toevoegen...", + "area": "Gebied", + "clear": "Wis", + "show_areas": "Toon gebieden" + }, "device-picker": { "clear": "Wis", "device": "Apparaat", @@ -557,6 +573,9 @@ "loading_history": "Geschiedenis laden ...", "no_history_found": "Geen geschiedenis gevonden" }, + "related-items": { + "area": "Gebied" + }, "relative_time": { "duration": { "day": "{count} {count, plural,\none {dag}\nother {dagen}\n}", @@ -587,6 +606,25 @@ "domain_toggler": { "title": "Domeinen in- en uitschakelen" }, + "entity_registry": { + "editor": { + "confirm_delete": "Weet je zeker dat je dit item wilt verwijderen?", + "delete": "VERWIJDEREN", + "enabled_cause": "Uitgeschakeld vanwege {cause}", + "enabled_description": "Uitgeschakelde entiteiten zullen niet aan Home Assistant worden toegevoegd", + "enabled_label": "Schakel entiteit in", + "entity_id": "Entiteits-ID", + "name": "Naam overschrijven", + "note": "Nota bene: dit werkt mogelijk nog niet met alle integraties.", + "unavailable": "Deze entiteit is momenteel niet beschikbaar.", + "update": "BIJWERKEN" + } + }, + "generic": { + "cancel": "Annuleren", + "default_confirmation_title": "Weet je het zeker?", + "ok": "OK" + }, "more_info_control": { "dismiss": "Dialoogvenster sluiten", "restored": { @@ -1169,14 +1207,18 @@ "actions": { "caption": "Wanneer iets wordt getriggerd..." }, + "automations": "Automatiseringen", "conditions": { "caption": "Doe alleen iets als..." }, + "create": "Maak een automatisering aan met het apparaat", + "no_automations": "Geen automatiseringen", "triggers": { "caption": "Doe iets wanneer..." } }, "automations": "Automatiseringen", + "cant_edit": "Je kunt alleen items bewerken die in de gebruikersinterface zijn gemaakt.", "caption": "Apparaten", "confirm_rename_entity_ids": "Wil je ook de entiteits-ID's van je entiteiten hernoemen?", "data_table": { @@ -1191,13 +1233,27 @@ "details": "Hier zijn alle details van uw apparaat", "device_not_found": "Apparaat niet gevonden.", "entities": { - "add_entities_lovelace": "Voeg alle apparaatentiteiten toe aan Lovelace", + "add_entities_lovelace": "Voeg toe aan de Lovelace gebruikersinterface", "entities": "Entiteiten", "none": "Dit apparaat heeft geen entiteiten" }, "info": "Apparaat info", + "name": "Naam", + "scene": { + "create": "Maak een scène aan met het apparaat", + "no_scenes": "Geen scènes", + "scenes": "Scènes" + }, + "scenes": "Scènes", + "script": { + "create": "Maak een script aan met het apparaat", + "no_scripts": "Geen scripts", + "scripts": "Scripts" + }, + "scripts": "Scripts", "unknown_error": "Onbekende fout", - "unnamed_device": "Naamloos apparaat" + "unnamed_device": "Naamloos apparaat", + "update": "Bijwerken" }, "entities": { "caption": "Entiteiten", @@ -1299,7 +1355,7 @@ "new": "Stel een nieuwe integratie in", "none": "Er is nog niets geconfigureerd", "note_about_integrations": "Nog niet alle integraties kunnen via de UI worden geconfigureerd.", - "note_about_website_reference": "Meer zijn beschikbaar op de" + "note_about_website_reference": "Meer zijn beschikbaar op de " }, "introduction": "Hier kun je je componenten en Home Assistant configureren. Het is nog niet mogelijk om alles te configureren vanuit de interface, maar we werken er aan.", "person": { @@ -1500,10 +1556,11 @@ "update_name_button": "Naam bijwerken" }, "groups": { + "create_group": "Zigbee Home Automation - Aanmaken groep", "group_id": "Groep", "group_info": "Groepsinformatie", "groups": "groepen", - "header": "Zigbee groep management", + "header": "Zigbee Home Automation - Groepsbeheer", "introduction": "Maak en verwijder zigbee groepen", "members": "Leden", "remove_groups": "verwijder groepen", @@ -1526,6 +1583,18 @@ "updateDeviceName": "Stel een aangepaste naam in voor dit apparaat in het apparaatregister." } }, + "zone": { + "configured_in_yaml": "Zones die via configuration.yaml zijn geconfigureerd kunnen niet worden bewerkt in de gebruikrs", + "detail": { + "create": "Aanmaken", + "delete": "Verwijder", + "passive": "Passief", + "passive_note": "Passieve zones zijn verborgen in het frontend en worden niet gebruikt als locaties voor apparaat trackers. Dit is handig als je de zone wilt gebruiken voor automatiseringen.", + "required_error_msg": "Dit veld is verplicht", + "update": "Bijwerken" + }, + "edit_home_zone": "De locatie van je huis kan worden gewijzigd bij de algemene configuratie" + }, "zwave": { "caption": "Z-Wave", "common": { @@ -1706,6 +1775,11 @@ "showing_entries": "Toont gegevens van" }, "lovelace": { + "add_entities": { + "generated_unsupported": "Je kan deze functie alleen gebruiken als je de controle over de Lovelace gebruikersinterface hebt overgenomen", + "saving_failed": "Opslaan van de Lovelace gebruikersinterface is mislukt.", + "yaml_unsupported": "Je kan deze functie niet gebruiken wanneer je de Lovelace gebruikersinterface gebruikt in YAML modus" + }, "cards": { "confirm_delete": "Weet je zeker dat je deze kaart wilt verwijderen?", "empty_state": { @@ -1895,6 +1969,8 @@ "para_no_id": "Dit element heeft geen ID. Voeg een ID toe aan dit element in 'ui-lovelace.yaml'." }, "raw_editor": { + "confirm_remove_config_text": "We zullen je Lovelace gebruikersinterface automatisch genereren met je gebieden en apparaten als je de huidige Lovelace gebruikersinterface verwijdert.", + "confirm_remove_config_title": "Weet je zeker dat je de huidige Lovelace gebruikersinterface wilt verwijderen? We zullen automatisch een nieuwe Lovelace gebruikersinterface genereren op basis van je gebieden en apparaten.", "confirm_unsaved_changes": "Er zijn nog niet-opgeslagen wijzigingen, weet u zeker dat u wilt afsluiten?", "confirm_unsaved_comments": "Uw configuratie bevat commentaren, deze worden niet opgeslagen. Wil je doorgaan?", "error_invalid_config": "Uw configuratie is niet geldig: {error}", @@ -1912,6 +1988,10 @@ "para_sure": "Weet je zeker dat je de controle wilt over je gebruikersinterface?", "save": "Neem over" }, + "suggest_card": { + "add": "Voeg toe aan de Lovelace gebruikersinterface", + "create_own": "Kies een andere kaart" + }, "view": { "panel_mode": { "description": "Hierdoor wordt de eerste kaart op volledige breedte weergegeven; andere kaarten in deze weergave worden niet weergegeven.", @@ -2126,6 +2206,7 @@ "profile": { "advanced_mode": { "description": "Home Assistant verbergt standaard geavanceerde functies en opties. U kunt deze functies toegankelijk maken door deze schakelaar aan te zetten. Dit is een gebruikersspecifieke instelling en heeft geen invloed op andere gebruikers die Home Assistant gebruiken.", + "link_promo": "Meer informatie", "title": "Geavanceerde modus" }, "change_password": { diff --git a/translations/pl.json b/translations/pl.json index de9b9d8fe1..7760c865e5 100644 --- a/translations/pl.json +++ b/translations/pl.json @@ -1226,14 +1226,18 @@ "actions": { "caption": "Wykonaj akcje..." }, + "automations": "Automatyzacje", "conditions": { "caption": "Jeśli..." }, + "create": "Utwórz automatyzację z urządzeniem", + "no_automations": "Brak automatyzacji", "triggers": { "caption": "Gdy..." } }, "automations": "Automatyzacje", + "cant_edit": "Możesz edytować tylko elementy utworzone w interfejsie użytkownika.", "caption": "Urządzenia", "confirm_rename_entity_ids": "Czy chcesz także zmienić identyfikatory encji?", "data_table": { @@ -1248,12 +1252,24 @@ "details": "Oto wszystkie szczegóły dotyczące twojego urządzenia.", "device_not_found": "Urządzenie nie zostało znalezione.", "entities": { - "add_entities_lovelace": "Dodaj wszystkie encje urządzenia do interfejsu użytkownika Lovelace", + "add_entities_lovelace": "Dodaj do interfejsu użytkownika Lovelace", "entities": "Encje", "none": "To urządzenie nie ma żadnych encji" }, "info": "Informacje o urządzeniu", "name": "Nazwa", + "scene": { + "create": "Utwórz scenę z urządzeniem", + "no_scenes": "Brak scen", + "scenes": "Sceny" + }, + "scenes": "Sceny", + "script": { + "create": "Utwórz skrypt z urządzeniem", + "no_scripts": "Bez skryptów", + "scripts": "Skrypty" + }, + "scripts": "Skrypty", "unknown_error": "Nieznany błąd", "unnamed_device": "Nienazwane urządzenie", "update": "Aktualizuj" @@ -1307,7 +1323,7 @@ "confirm_text": "Encje mogą zostać usunięte tylko wtedy, gdy ich integracja na to zezwala.", "confirm_title": "Czy chcesz usunąć {number} encj(-e/-i)?" }, - "selected": "wybrano {numer}", + "selected": "wybrano {number}", "show_disabled": "Wyświetlaj nieużywane encje", "status": { "disabled": "Wyłączone", @@ -1477,7 +1493,7 @@ "section": { "reloading": { "automation": "Automatyzacje", - "core": "Rdzeń", + "core": "Lokacje i dostosowywanie", "group": "Grupy", "heading": "Ponowne wczytanie konfiguracji", "introduction": "Niektóre części konfiguracji można wczytać od nowa bez konieczności ponownego uruchamiania Home Assistant'a. Naciśnięcie poniższych przycisków wczyta ponownie daną część konfiguracji.", @@ -1651,7 +1667,7 @@ "configured_in_yaml": "Stref skonfigurowanych za pomocą pliku configuration.yaml nie można edytować za pomocą interfejsu użytkownika.", "confirm_delete": "Na pewno chcesz usunąć tę strefę?", "create_zone": "Utwórz strefę", - "description": "Zarządzaj strefami, w których chcesz śledzić osoby.", + "description": "Zarządzaj strefami, w których chcesz śledzić osoby", "detail": { "create": "Utwórz", "delete": "Usuń", @@ -1882,7 +1898,7 @@ } }, "changed_toast": { - "message": "Zaktualizowano konfigurację interfejsu użytkownika, czy chcesz ją wczytać ponownie?", + "message": "Zaktualizowano konfigurację interfejsu użytkownika Lovelace, czy chcesz ją wczytać ponownie?", "refresh": "Wczytaj ponownie" }, "editor": { @@ -2025,8 +2041,8 @@ }, "edit_lovelace": { "edit_title": "Edytuj tytuł", - "explanation": "Tytuł jest wyświetlany ponad wszystkimi widokami interfejsu użytkownika", - "header": "Tytuł interfejsu użytkownika" + "explanation": "Tytuł jest wyświetlany ponad wszystkimi widokami interfejsu użytkownika Lovelace", + "header": "Tytuł interfejsu użytkownika Lovelace" }, "edit_view": { "add": "Dodaj widok", @@ -2065,7 +2081,7 @@ "save_config": { "cancel": "Nieważne", "header": "Przejmij kontrolę nad interfejsem użytkownika Lovelace", - "para": "Domyślnie asystent domowy będzie utrzymywał interfejs użytkownika, aktualizując go, gdy pojawią się nowe elementy lub komponenty Lovelace. Jeśli przejmiesz kontrolę, nie będziemy już dokonywać zmian automatycznie.", + "para": "Domyślnie Home Assistant będzie zarządzać interfejsem użytkownika, aktualizując go, gdy pojawią się nowe encje lub komponenty Lovelace. Jeśli przejmiesz kontrolę, Home Assistant nie będzie już automatycznie wprowadzać dla ciebie zmian.", "para_sure": "Na pewno chcesz przejąć kontrolę nad interfejsem użytkownika?", "save": "Przejmuję kontrolę" }, diff --git a/translations/ru.json b/translations/ru.json index 198397eb60..277ba6d0a0 100644 --- a/translations/ru.json +++ b/translations/ru.json @@ -635,7 +635,7 @@ "generic": { "cancel": "Отмена", "default_confirmation_title": "Вы уверены?", - "ok": "Да" + "ok": "ОК" }, "more_info_control": { "dismiss": "Закрыть диалог", @@ -1252,7 +1252,7 @@ "details": "Здесь приведена вся доступная информация об этом устройстве.", "device_not_found": "Устройство не найдено.", "entities": { - "add_entities_lovelace": "Добавить объекты этого устройства в Lovelace", + "add_entities_lovelace": "Добавить объекты в Lovelace UI", "entities": "Объекты", "none": "У этого устройства нет объектов" }, @@ -2329,7 +2329,7 @@ "created_at": "Создан {date}", "delete_failed": "Не удалось удалить токен доступа.", "description": "Создайте долгосрочные токены доступа, чтобы Ваши скрипты могли взаимодействовать с Home Assistant. Каждый токен будет действителен в течение 10 лет с момента создания. Ниже Вы можете просмотреть долгосрочные токены доступа, которые в настоящее время активны.", - "empty_state": "У вас еще нет долгосрочных токенов доступа.", + "empty_state": "У Вас еще нет долгосрочных токенов доступа.", "header": "Долгосрочные токены доступа", "last_used": "Последнее использование {date} из {location}", "learn_auth_requests": "Узнайте, как выполнять аутентифицированные запросы.", From edfdd0da895067d01f74c545c8c427828b734728 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Fri, 31 Jan 2020 12:14:21 +0100 Subject: [PATCH 02/64] Styling zone menu (#4684) * Styling zone menu * Update ha-device-entities-card.ts --- .../config/devices/device-detail/ha-device-entities-card.ts | 2 +- src/panels/config/zone/ha-config-zone.ts | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/panels/config/devices/device-detail/ha-device-entities-card.ts b/src/panels/config/devices/device-detail/ha-device-entities-card.ts index b8540b6309..60c9301c51 100644 --- a/src/panels/config/devices/device-detail/ha-device-entities-card.ts +++ b/src/panels/config/devices/device-detail/ha-device-entities-card.ts @@ -179,7 +179,7 @@ export class HaDeviceEntitiesCard extends LitElement { color: var(--secondary-text-color); } #entities > * { - margin: 8px; + margin: 8px 16px 8px 8px; } paper-icon-item { min-height: 40px; diff --git a/src/panels/config/zone/ha-config-zone.ts b/src/panels/config/zone/ha-config-zone.ts index 1b9560b691..d35928dced 100644 --- a/src/panels/config/zone/ha-config-zone.ts +++ b/src/panels/config/zone/ha-config-zone.ts @@ -436,6 +436,8 @@ ${this.hass!.localize("ui.panel.config.zone.confirm_delete2")}`) .flex .empty { border-left: 1px solid var(--divider-color); width: 250px; + min-height: 100%; + box-sizing: border-box; } paper-icon-item { padding-top: 4px; From f82b62f45c46e08f37b12151c9622392e531125b Mon Sep 17 00:00:00 2001 From: Ian Richardson Date: Fri, 31 Jan 2020 10:19:08 -0600 Subject: [PATCH 03/64] =?UTF-8?q?=F0=9F=90=9B=20fix=20tabindex=20for=20def?= =?UTF-8?q?ault=20entity=20more-info=20actions=20(#4697)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 🐛 fix tabindex for default entity more-info actions * Update hui-state-label-badge.ts --- src/panels/lovelace/badges/hui-state-label-badge.ts | 4 +++- src/panels/lovelace/cards/hui-picture-entity-card.ts | 4 +++- src/panels/lovelace/components/hui-generic-entity-row.ts | 4 +--- .../lovelace/entity-rows/hui-input-select-entity-row.ts | 4 +--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/panels/lovelace/badges/hui-state-label-badge.ts b/src/panels/lovelace/badges/hui-state-label-badge.ts index 5ebea58d8b..25b7f3c8fa 100644 --- a/src/panels/lovelace/badges/hui-state-label-badge.ts +++ b/src/panels/lovelace/badges/hui-state-label-badge.ts @@ -49,7 +49,9 @@ export class HuiStateLabelBadge extends LitElement implements LovelaceBadge { hasDoubleClick: hasAction(this._config!.double_tap_action), })} tabindex=${ifDefined( - hasAction(this._config.tap_action) ? "0" : undefined + hasAction(this._config.tap_action) || this._config.entity + ? "0" + : undefined )} > `; diff --git a/src/panels/lovelace/cards/hui-picture-entity-card.ts b/src/panels/lovelace/cards/hui-picture-entity-card.ts index 8e47402538..187da7ec35 100644 --- a/src/panels/lovelace/cards/hui-picture-entity-card.ts +++ b/src/panels/lovelace/cards/hui-picture-entity-card.ts @@ -158,7 +158,9 @@ class HuiPictureEntityCard extends LitElement implements LovelaceCard { hasDoubleClick: hasAction(this._config!.double_tap_action), })} tabindex=${ifDefined( - hasAction(this._config.tap_action) ? "0" : undefined + hasAction(this._config.tap_action) || this._config.entity + ? "0" + : undefined )} class=${classMap({ clickable: stateObj.state !== UNAVAILABLE, diff --git a/src/panels/lovelace/components/hui-generic-entity-row.ts b/src/panels/lovelace/components/hui-generic-entity-row.ts index e0e61d4639..50fa3cb1ed 100644 --- a/src/panels/lovelace/components/hui-generic-entity-row.ts +++ b/src/panels/lovelace/components/hui-generic-entity-row.ts @@ -74,9 +74,7 @@ class HuiGenericEntityRow extends LitElement { hasHold: hasAction(this.config!.hold_action), hasDoubleClick: hasAction(this.config!.double_tap_action), })} - tabindex=${ifDefined( - hasAction(this.config.tap_action) ? "0" : undefined - )} + tabindex=${ifDefined(pointer ? "0" : undefined)} >
Date: Sat, 1 Feb 2020 00:32:28 +0000 Subject: [PATCH 04/64] [ci skip] Translation update --- translations/da.json | 1 + translations/de.json | 316 +++++++++++++++++++++++++------------- translations/es.json | 1 + translations/fr.json | 1 + translations/gsw.json | 3 + translations/hu.json | 27 +++- translations/it.json | 2 +- translations/nb.json | 1 + translations/pl.json | 1 + translations/ru.json | 7 +- translations/tr.json | 79 +++++++++- translations/zh-Hans.json | 83 +++++++++- 12 files changed, 402 insertions(+), 120 deletions(-) diff --git a/translations/da.json b/translations/da.json index 338ae15b3c..e0b62f0132 100644 --- a/translations/da.json +++ b/translations/da.json @@ -1232,6 +1232,7 @@ }, "create": "Opret automatisering med enhed", "no_automations": "Ingen automatiseringer", + "no_device_automations": "Der er ingen automatiseringer til rådighed for denne enhed.", "triggers": { "caption": "Gør noget, når..." } diff --git a/translations/de.json b/translations/de.json index fc9a24ee1c..323dd4d2ea 100644 --- a/translations/de.json +++ b/translations/de.json @@ -394,7 +394,7 @@ }, "ui": { "auth_store": { - "ask": "Möchtest du diesen Login speichern?", + "ask": "Möchten Sie diesen Login speichern?", "confirm": "Login speichern", "decline": "Nein Danke" }, @@ -478,6 +478,9 @@ "script": { "execute": "Ausführen" }, + "service": { + "run": "Ausführen" + }, "timer": { "actions": { "cancel": "Abbrechen", @@ -541,10 +544,24 @@ "yes": "Ja" }, "components": { + "area-picker": { + "add_dialog": { + "add": "Hinzufügen", + "failed_create_area": "Der Bereich konnte nicht erstellt werden.", + "name": "Name", + "text": "Geben Sie den Namen des neuen Bereichs ein.", + "title": "Neuen Bereich hinzufügen" + }, + "add_new": "Neuen Bereich hinzufügen...", + "area": "Bereich", + "clear": "Löschen", + "show_areas": "Bereiche anzeigen" + }, "device-picker": { "clear": "Löschen", "device": "Gerät", - "show_devices": "Geräte anzeigen" + "show_devices": "Geräte anzeigen", + "toggle": "Umschalten" }, "entity": { "entity-picker": { @@ -557,6 +574,16 @@ "loading_history": "Lade Zustandsverlauf...", "no_history_found": "Kein Zustandsverlauf gefunden." }, + "related-items": { + "area": "Bereich", + "automation": "Teil der folgenden Automatisierungen", + "device": "Gerät", + "entity": "Verwandte Entitäten", + "group": "Teil der folgenden Gruppen", + "integration": "Integration", + "scene": "Teil der folgenden Szenen", + "script": "Teil der folgenden Skripte" + }, "relative_time": { "duration": { "day": "{count} {count, plural,\none {Tag}\nother {Tagen}\n}", @@ -582,23 +609,47 @@ "confirmation": { "cancel": "Abbrechen", "ok": "OK", - "title": "Bist du sicher?" + "title": "Bist Sie sicher?" }, "domain_toggler": { "title": "Domänen umschalten" }, + "entity_registry": { + "control": "Steuerung", + "dismiss": "Ausblenden", + "editor": { + "confirm_delete": "Möchten Sie diesen Eintrag wirklich löschen?", + "delete": "LÖSCHEN", + "enabled_cause": "Deaktiviert durch {cause}.", + "enabled_description": "Deaktivierte Entitäten werden nicht zu Home Assistant hinzugefügt.", + "enabled_label": "Entität aktivieren", + "entity_id": "Entitäts-ID", + "name": "Namen überschreiben", + "note": "Hinweis: Dies funktioniert möglicherweise noch nicht bei allen Integrationen.", + "unavailable": "Diese Entität ist derzeit nicht verfügbar.", + "update": "AKTUALISIEREN" + }, + "related": "Verwandte", + "settings": "Einstellungen" + }, + "generic": { + "cancel": "Abbrechen", + "default_confirmation_title": "Sind Sie sicher?", + "ok": "OK" + }, "more_info_control": { "dismiss": "Dialog ausblenden", "edit": "Entität bearbeiten", "restored": { - "confirm_remove_text": "Bist du dir sicher, dass du diese Entität löschen möchtest?", + "confirm_remove_text": "Sind Sie sicher, dass Sie diese Entität löschen möchten?", "confirm_remove_title": "Entität entfernen?", "not_provided": "Diese Entität ist derzeit nicht verfügbar und ist verwitwet für eine entfernte, geänderte oder gestörte Integration oder ein Gerät.", "remove_action": "Entität entfernen", - "remove_intro": "Wenn die Entität nicht mehr verwendet wird, kannst du sie bereinigen, indem du sie entfernst." + "remove_intro": "Wenn die Entität nicht mehr verwendet wird, können Sie sie bereinigen, indem Sie sie entfernen." }, "script": { - "last_action": "Letzte Aktion" + "last_action": "Letzte Aktion", + "last_triggered": "Zuletzt ausgelöst" }, "settings": "Entitätseinstellungen", "sun": { @@ -701,14 +752,14 @@ "delete": "LÖSCHEN", "update": "AKTUALISIEREN" }, - "no_areas": "Sieht aus, als hättest du noch keine Bereiche!", + "no_areas": "Sieht aus, als hätten Sie noch keine Bereiche!", "picker": { "create_area": "BEREICH ERSTELLEN", "header": "Bereiche", "integrations_page": "Integrationsseite", - "introduction": "In Bereichen wird festgelegt, wo sich Geräte befinden. Diese Informationen werden in Home Assistant verwendet, um dich bei der Organisation deiner Benutzeroberfläche, Berechtigungen und Integrationen mit anderen Systemen zu unterstützen.", + "introduction": "In Bereichen wird festgelegt, wo sich Geräte befinden. Diese Informationen werden in Home Assistant verwendet, um Sie bei der Organisation Ihrer Benutzeroberfläche, Berechtigungen und Integrationen mit anderen Systemen zu unterstützen.", "introduction2": "Um Geräte in einem Bereich zu platzieren, navigieren Sie mit dem Link unten zur Integrationsseite und klicken Sie dann auf eine konfigurierte Integration, um zu den Gerätekarten zu gelangen.", - "no_areas": "Sieht aus, als hättest du noch keine Bereiche!" + "no_areas": "Sieht aus, als hätten Sie noch keine Bereiche!" } }, "automation": { @@ -718,7 +769,7 @@ "actions": { "add": "Aktion hinzufügen", "delete": "Löschen", - "delete_confirm": "Möchtest du das wirklich löschen?", + "delete_confirm": "Möchten Sie das wirklich löschen?", "duplicate": "Duplizieren", "header": "Aktionen", "introduction": "Aktionen werden von Home Assistant ausgeführt, wenn Automatisierungen ausgelöst werden.", @@ -763,7 +814,7 @@ "conditions": { "add": "Bedingung hinzufügen", "delete": "Löschen", - "delete_confirm": "Möchtest du das wirklich löschen?", + "delete_confirm": "Möchten Sie das wirklich löschen?", "duplicate": "Duplizieren", "header": "Bedingungen", "introduction": "Bedingungen sind ein optionaler Bestandteil bei automatisierten Abläufen und können das Ausführen einer Aktion verhindern. Bedingungen sind Auslösern ähnlich, aber dennoch verschieden. Ein Auslöser beobachtet im System ablaufende Ereignisse, wohingegen Bedingungen nur den aktuellen Systemzustand betrachten. Ein Auslöser kann beobachten, ob ein Schalter aktiviert wird. Eine Bedingung kann lediglich sehen, ob ein Schalter aktuell an oder aus ist.", @@ -835,7 +886,7 @@ "triggers": { "add": "Auslöser hinzufügen", "delete": "Löschen", - "delete_confirm": "Möchtest du das wirklich löschen?", + "delete_confirm": "Möchten Sie das wirklich löschen?", "duplicate": "Duplizieren", "header": "Auslöser", "introduction": "Auslöser starten automatisierte Abläufe. Es ist möglich, mehrere Auslöser für dieselbe Abfolge zu definieren. Wenn ein Auslöser aktiviert wird, prüft Home Assistant die Bedingungen, sofern vorhanden, und führt die Aktion aus.", @@ -923,15 +974,15 @@ }, "unsupported_platform": "Nicht unterstützte Plattform: {platform}" }, - "unsaved_confirm": "Du hast ungespeicherte Änderungen. Bist du dir sicher, dass du den Editor verlassen möchtest?" + "unsaved_confirm": "Sie haben ungespeicherte Änderungen. Sind Sie sicher, dass Sie den Editor verlassen möchten?" }, "picker": { "add_automation": "Automatisierung hinzufügen", "delete_automation": "Automatisierung löschen", - "delete_confirm": "Bist du sicher, dass du diese Automatisierung löschen willst?", + "delete_confirm": "Sind Sie sicher, dass Sie diese Automatisierung löschen wollen?", "edit_automation": "Automatisierung bearbeiten", "header": "Automatisierungseditor", - "introduction": "Mit dem Automationseditor können Automatisierungen erstellt und bearbeitet werden. Bitte folge dem nachfolgenden Link, um die Anleitung zu lesen, um sicherzustellen, dass du Home Assistant richtig konfiguriert hast.", + "introduction": "Mit dem Automations-Editor können Automatisierungen erstellt und bearbeitet werden. Bitte folgen Sie dem nachfolgenden Link, um die Anleitung zu lesen und um sicherzustellen, dass Sie Home Assistant richtig konfiguriert haben.", "learn_more": "Erfahre mehr über Automatisierungen", "no_automations": "Wir konnten keine editierbaren Automatisierungen finden", "only_editable": "Nur Automatisierungen in automations.yaml sind editierbar.", @@ -947,7 +998,7 @@ "enable": "aktiviert", "enable_ha_skill": "Aktiviere den Home Assistant-Skill für Alexa", "enable_state_reporting": "Statusberichterstattung aktivieren", - "info": "Mit der Alexa-Integration für Home Assistant Cloud kannst du alle deine Home Assistant-Geräte über jedes Alexa-fähige Gerät steuern.", + "info": "Mit der Alexa-Integration für Home Assistant Cloud können Sie alle Ihre Home Assistant-Geräte über jedes Alexa-fähige Gerät steuern.", "info_state_reporting": "Wenn die Statusberichterstellung aktiviert wird, sendet Home Assistant alle Statusänderungen exponierter Entitäten an Amazon. So wird in der Alexa-App immer der neueste Status angezeigt.", "manage_entities": "Entitäten verwalten", "state_reporting_error": "Der Berichtsstatus kann nicht {enable_disable} werden.", @@ -965,8 +1016,8 @@ "enable_state_reporting": "Statusberichterstattung aktivieren", "enter_pin_error": "PIN kann nicht gespeichert werden:", "enter_pin_hint": "Gib eine PIN ein, um Sicherheitsgeräte zu verwenden", - "enter_pin_info": "Bitte gib eine PIN ein, um mit Sicherheitsgeräten zu interagieren. Sicherheitsgeräte sind Türen, Garagentore und Schlösser. Du wirst aufgefordert, diese PIN zu sagen / einzugeben, wenn du mit solchen Geräten über Google Assistant interagierst.", - "info": "Mit der Google Assistant-Integration für Home Assistant Cloud kannst du alle deine Home Assistant-Geräte über jedes Google Assistant-fähige Gerät steuern.", + "enter_pin_info": "Bitte geben Sie eine PIN ein, um mit Sicherheitsgeräten zu interagieren. Sicherheitsgeräte sind Türen, Garagentore und Schlösser. Sie werden aufgefordert, diese PIN zu sagen/einzugeben, wenn Sie mit solchen Geräten über Google Assistant interagierst.", + "info": "Mit der Google Assistant-Integration für Home Assistant Cloud können Sie alle Ihre Home Assistant-Geräte über jedes Google Assistant-fähige Gerät steuern.", "info_state_reporting": "Wenn die Statusberichterstellung aktiviert wird, sendet Home Assistant alle Statusänderungen exponierter Entitäten an Google. So wird in der Google-App immer der neueste Status angezeigt.", "manage_entities": "Entitäten verwalten", "security_devices": "Sicherheitsgeräte", @@ -975,7 +1026,7 @@ "title": "Google Assistant" }, "integrations": "Integrationen", - "integrations_introduction": "Mit den Integrationen der Home Assistant Cloud können Diensten in der Cloud verbunden werden, ohne dass die Home Assistant Instalation öffentlich im Internet erreichbar sein muss.", + "integrations_introduction": "Mit den Integrationen der Home Assistant Cloud können Diensten in der Cloud verbunden werden, ohne dass die Home Assistant-Installation öffentlich im Internet erreichbar sein muss.", "integrations_introduction2": "Überprüfe die Website für ", "integrations_link_all_features": " alle verfügbaren Funktionen", "manage_account": "Konto verwalten", @@ -984,7 +1035,7 @@ "remote": { "access_is_being_prepared": "Der Fernzugriff wird vorbereitet. Wir werden dich benachrichtigen, wenn alles fertig ist.", "certificate_info": "Zertifikatsinformationen", - "info": "Home Assistant Cloud bietet eine sichere Remote-Verbindung zu deiner Instanz, wenn du nicht zu Hause bist.", + "info": "Home Assistant Cloud bietet eine sichere Remote-Verbindung zu Ihrer Instanz, wenn Sie nicht zu Hause sind.", "instance_is_available": "Ihre Instanz ist verfügbar unter", "instance_will_be_available": "Ihre Instanz wird verfügbar sein unter", "link_learn_how_it_works": "Lerne, wie es funktioniert", @@ -1026,9 +1077,9 @@ "dialog_cloudhook": { "available_at": "Der Webhook ist unter der folgenden URL verfügbar:", "close": "Schließen", - "confirm_disable": "Möchtest du diesen Webhook wirklich deaktivieren?", + "confirm_disable": "Möchten Sie diesen Webhook wirklich deaktivieren?", "copied_to_clipboard": "In die Zwischenablage kopiert", - "info_disable_webhook": "Wenn du diesen Webhook nicht mehr nutzen willst, kannst du", + "info_disable_webhook": "Wenn Sie diesen Webhook nicht mehr nutzen wollen, können Sie ", "link_disable_webhook": "deaktiviere es", "managed_by_integration": "Dieser Webhook wird von einer Integration verwaltet und kann nicht deaktiviert werden.", "view_documentation": "Dokumentation anzeigen", @@ -1135,14 +1186,14 @@ }, "server_management": { "heading": "Serververwaltung", - "introduction": "Verwalte den Home Assistant Server", + "introduction": "Verwalten Sie Ihren Home Assistant-Server", "restart": "Neu starten", "stop": "Stoppen" }, "validation": { "check_config": "Konfiguration prüfen", "heading": "Konfiguration überprüfen", - "introduction": "Überprüfe deine Konfiguration, wenn du kürzlich Änderungen vorgenommen hast und sicherstellen möchtest, dass alles ordnungsgemäß ist", + "introduction": "Überprüfen der Konfiguration, wenn Sie kürzlich Änderungen vorgenommen haben und sicherstellen möchten, dass alles ordnungsgemäß ist", "invalid": "Konfiguration fehlerhaft", "valid": "Konfiguration in Ordnung" } @@ -1151,9 +1202,9 @@ }, "customize": { "attributes_customize": "Folgende Attribute sind bereits in customize.yaml gesetzt", - "attributes_not_set": "Die folgenden Attribute wurden nicht gesetzt. Setze sie, wenn du möchtest.", + "attributes_not_set": "Die folgenden Attribute wurden nicht gesetzt. Setzen Sie sie, wenn Sie möchten.", "attributes_outside": "Die folgenden Attribute werden außerhalb von customize.yaml angepasst.", - "attributes_override": "Du kannst sie überschreiben, wenn du möchtest.", + "attributes_override": "Sie können sie überschreiben, wenn Sie möchten.", "attributes_set": "Die folgenden Attribute der Entität sind programmatisch festgelegt.", "caption": "Anpassung", "description": "Elemente anpassen", @@ -1161,7 +1212,7 @@ "pick_attribute": "Wähle ein Attribut zum Überschreiben aus.", "picker": { "header": "Anpassungen", - "introduction": "Optimieren Sie die Entitätenattribute. Hinzugefügte / bearbeitete Anpassungen werden sofort wirksam. Entfernte Anpassungen werden wirksam, wenn die Entität aktualisiert wird." + "introduction": "Optimieren Sie die Entitätenattribute. Hinzugefügte/bearbeitete Anpassungen werden sofort wirksam. Entfernte Anpassungen werden wirksam, wenn die Entität aktualisiert wird." }, "warning": { "include_link": "binde customize.yaml ein", @@ -1175,16 +1226,21 @@ "actions": { "caption": "Wenn etwas ausgelöst wird ..." }, + "automations": "Automatisierungen", "conditions": { "caption": "Tue nur dann etwas, wenn....." }, + "create": "Automatisierung mit Gerät erstellen", + "no_automations": "Keine Automatisierungen", + "no_device_automations": "Für dieses Gerät sind keine Automatisierungen verfügbar.", "triggers": { "caption": "Tue etwas, wenn..." } }, "automations": "Automatisierungen", + "cant_edit": "Sie können nur Elemente bearbeiten, die in der Benutzeroberfläche erstellt wurden.", "caption": "Geräte", - "confirm_rename_entity_ids": "Möchtest du auch die Entitäts-ID's deiner Entitäten umbenennen?", + "confirm_rename_entity_ids": "Möchten Sie auch die Entitäts-IDs Ihrer Entitäten umbenennen?", "data_table": { "area": "Bereich", "battery": "Batterie", @@ -1202,8 +1258,22 @@ "none": "Dieses Gerät hat keine Entitäten" }, "info": "Geräteinformationen", + "name": "Name", + "scene": { + "create": "Szene mit Gerät erstellen", + "no_scenes": "Keine Szenen", + "scenes": "Szenen" + }, + "scenes": "Szenen", + "script": { + "create": "Szene mit Gerät erstellen", + "no_scripts": "Keine Skripte", + "scripts": "Skripte" + }, + "scripts": "Skripte", "unknown_error": "Unbekannter Fehler", - "unnamed_device": "Unbenanntes Gerät" + "unnamed_device": "Unbenanntes Gerät", + "update": "Aktualisieren" }, "entities": { "caption": "Entitäten", @@ -1216,6 +1286,8 @@ "enabled_cause": "Deaktiviert durch {cause}.", "enabled_description": "Deaktivierte Entitäten werden in Home Assistant nicht hinzugefügt.", "enabled_label": "Entität aktivieren", + "entity_id": "Entitäts-ID", + "name": "Namen überschreiben", "note": "Hinweis: Dies funktioniert möglicherweise noch nicht bei allen Integrationen.", "unavailable": "Diese Entität ist derzeit nicht verfügbar.", "update": "UPDATE" @@ -1224,12 +1296,12 @@ "disable_selected": { "button": "Ausgewählte deaktivieren", "confirm_text": "Deaktivierte Entitäten werden Home Assistant nicht hinzugefügt.", - "confirm_title": "Willst du {number} Entitäten deaktivieren?" + "confirm_title": "Willen Sie {number} Entitäten deaktivieren?" }, "enable_selected": { "button": "Ausgewählte aktivieren", "confirm_text": "Dadurch stehen sie in Home Assistant wieder zur Verfügung, wenn sie jetzt deaktiviert sind.", - "confirm_title": "Willst du {number} Entitäten aktivieren?" + "confirm_title": "Willen Sie {number} Entitäten aktivieren?" }, "filter": { "filter": "Filter", @@ -1245,12 +1317,12 @@ "status": "Status" }, "integrations_page": "Integrationsseite", - "introduction": "Der Home Assistant führt eine Registrierung aller Entitäten, die er je gesehen hat und die eindeutig identifiziert werden können. Jeder dieser Entitäten wird eine Entitäts-ID zugewiesen, die nur für diese Entität reserviert ist.", - "introduction2": "Verwende die Entitätsregistrierung, um den Namen zu überschreiben, die Entität-ID zu ändern oder den Eintrag aus dem Home Assistant zu entfernen. Beachte, dass das Entfernen des Entitätsregistrierungseintrags die Entität nicht löscht. Folge dazu dem Link unten und entferne ihn in der Integrationsseite.", + "introduction": "Home Assistant führt eine Registrierung aller Entitäten, die er je gesehen hat und die eindeutig identifiziert werden können. Jeder dieser Entitäten wird eine Entitäts-ID zugewiesen, die nur für diese Entität reserviert ist.", + "introduction2": "Verwenden Sie die Entitätsregistrierung, um den Namen zu überschreiben, die Entität-ID zu ändern oder den Eintrag aus Home Assistant zu entfernen. Beachten Sie, dass das Entfernen des Entitätsregistrierungs-Eintrags die Entität nicht löscht. Folgen Sie dazu dem Link unten und entfernen Sie ihn in der Integrationsseite.", "remove_selected": { "button": "Ausgewählte entfernen", "confirm_text": "Entitäten können nur entfernt werden, wenn die Integration die Entitäten nicht mehr bereitstellt.", - "confirm_title": "Willst du {number} Entitäten entfernen?" + "confirm_title": "Willen Sie {number} Entitäten entfernen?" }, "selected": "{number} ausgewählt", "show_disabled": "Anzeigen deaktivierter Entitäten", @@ -1268,7 +1340,7 @@ "config_entry": { "area": "In {area}", "delete_button": "{integration} löschen", - "delete_confirm": "Möchtest du diese Integration wirklich löschen?", + "delete_confirm": "Möchten Sie diese Integration wirklich löschen?", "device_unavailable": "Gerät nicht verfügbar", "entity_unavailable": "Entität nicht verfügbar", "firmware": "Firmware: {version}", @@ -1291,7 +1363,7 @@ "dismiss": "Dialog schließen", "error_saving_area": "Fehler beim Speichern des Bereichs: {error}", "external_step": { - "description": "Für diesen Schritt musst du eine externe Website besuchen, um den Vorgang abzuschließen.", + "description": "Für diesen Schritt müssen Sie eine externe Website besuchen, um den Vorgang abzuschließen.", "open_site": "Website öffnen" }, "failed_create_area": "Der Bereich konnte nicht erstellt werden.", @@ -1309,7 +1381,7 @@ "ignore": { "confirm_delete_ignore": "Dies wird die Integration in deinen entdeckten Integrationen wieder erscheinen lassen, wenn sie entdeckt wird. Dies kann einen Neustart erfordern oder einige Zeit dauern.", "confirm_delete_ignore_title": "{name} nicht mehr ignorieren?", - "confirm_ignore": "Bist du sicher, dass du diese Integration nicht einrichten willst? Du kannst dies rückgängig machen, indem du im Kontextmenü oben rechts auf 'Ignorierte Integrationen anzeigen' klickst.", + "confirm_ignore": "Sind Sie sicher, dass Sie diese Integration nicht einrichten wollen? Sie können dies rückgängig machen, indem Sie im Kontextmenü oben rechts auf 'Ignorierte Integrationen anzeigen' klicken.", "confirm_ignore_title": "Ignoriere die Entdeckung von {name}?", "hide_ignored": "Ignorierte Integrationen ausblenden", "ignore": "Ignorieren", @@ -1321,13 +1393,13 @@ "new": "Richte eine neue Integration ein", "none": "Noch nichts konfiguriert", "note_about_integrations": "Nicht alle Integrationen können über die Benutzeroberfläche konfiguriert werden.", - "note_about_website_reference": "Weitere Informationen findest du auf der " + "note_about_website_reference": "Weitere Informationen finden Sie auf der " }, "introduction": "Hier ist es möglich, deine Komponenten und Home Assistant zu konfigurieren. Noch ist nicht alles über die GUI einstellbar, aber wir arbeiten daran.", "person": { "add_person": "Person hinzufügen", "caption": "Personen", - "confirm_delete": "Möchtest du diese Person wirklich löschen?", + "confirm_delete": "Möchten Sie diese Person wirklich löschen?", "confirm_delete2": "Alle Geräte, die zu dieser Person gehören, werden nicht mehr zugeordnet.", "create_person": "Person erstellen", "description": "Verwalte die Personen, die Home Assistant verfolgt.", @@ -1343,11 +1415,11 @@ "name": "Name", "name_error_msg": "Name erforderlich", "new_person": "Neue Person", - "no_device_tracker_available_intro": "Wenn du Geräte hast, die die Anwesenheit einer Person anzeigen, kannst du diese hier einer Person zuordnen. Du kannst dein erstes Gerät hinzufügen, indem du eine Integration zur Anwesenheitserkennung auf der Integrationsseite hinzufügst.", + "no_device_tracker_available_intro": "Wenn Sie Geräte haben, die die Anwesenheit einer Person anzeigen, können Sie diese hier einer Person zuordnen. Sie können Ihr erstes Gerät hinzufügen, indem Sie eine Integration zur Anwesenheitserkennung auf der Integrationsseite hinzufügen.", "update": "Aktualisieren" }, - "introduction": "Hier kannst du jede Person von Interesse in Home Assistant definieren.", - "no_persons_created_yet": "Sieht so aus, als hättest du noch keine Personen angelegt.", + "introduction": "Hier können Sie jede Person von Interesse in Home Assistant definieren.", + "no_persons_created_yet": "Sieht so aus, als hätten Sie noch keine Personen angelegt.", "note_about_persons_configured_in_yaml": "Hinweis: Personen, die über configuration.yaml konfiguriert wurden, können nicht über die Benutzeroberfläche bearbeitet werden." }, "scene": { @@ -1360,17 +1432,17 @@ "add": "Ein Gerät hinzufügen", "delete": "Gerät löschen", "header": "Geräte", - "introduction": "Füge die Geräte hinzu, die in deine Szene aufgenommen werden sollen. Stelle alle Geräte so ein, wie sie in der Szene sein sollen." + "introduction": "Fügen Sie die Geräte hinzu, die in Ihrer Szene aufgenommen werden sollen. Stellen Sie alle Geräte so ein, wie sie in der Szene sein sollen." }, "entities": { "add": "Eine Entität hinzufügen", "delete": "Entität löschen", - "device_entities": "Wenn du eine Entität hinzufügst, die zu einem Gerät gehört, wird das Gerät hinzugefügt.", + "device_entities": "Wenn Sie eine Entität hinzufügen, die zu einem Gerät gehört, wird das Gerät hinzugefügt.", "header": "Entitäten", "introduction": "Entitäten, die nicht zu einem Gerät gehören, können hier festgelegt werden.", "without_device": "Entitäten ohne Gerät" }, - "introduction": "Benutze Szenen, um deinem Zuhause Leben einzuhauchen", + "introduction": "Benutzen Sie Szenen, um Ihrem Zuhause Leben einzuhauchen.", "load_error_not_editable": "Nur Szenen in der scenes.yaml sind editierbar.", "load_error_unknown": "Fehler beim Laden der Szene ({err_no}).", "name": "Name", @@ -1379,7 +1451,7 @@ }, "picker": { "add_scene": "Szene hinzufügen", - "delete_confirm": "Bist du dir sicher, dass du diese Szene löschen möchtest?", + "delete_confirm": "Sind Sie sicher, dass Sie diese Szene löschen möchten?", "delete_scene": "Szene löschen", "edit_scene": "Szene bearbeiten", "header": "Szenen-Editor", @@ -1426,8 +1498,10 @@ "group": "Gruppen neu laden", "heading": "Konfiguration neu laden", "introduction": "Einige Komponenten von Home Assistant können ohne einen Neustart neu geladen werden. \"Neu laden\" entlädt dabei die aktuelle Konfiguration und lädt die neue Konfiguration.", + "person": "Personen neu laden", "scene": "Szenen neu laden", - "script": "Skripte neu laden" + "script": "Skripte neu laden", + "zone": "Zonen neu laden" }, "server_management": { "confirm_restart": "Möchten Sie Home Assistant wirklich neu starten?", @@ -1440,7 +1514,7 @@ "validation": { "check_config": "Konfiguration prüfen", "heading": "Konfiguration überprüfen", - "introduction": "Überprüfe deine Konfiguration, wenn du kürzlich Änderungen vorgenommen hast und sicherstellen möchtest, dass alle Änderungen gültig sind", + "introduction": "Überprüfen Sie Ihre Konfiguration, wenn Sie kürzlich Änderungen vorgenommen haben und sicherstellen möchten, dass alle Änderungen gültig sind", "invalid": "Konfiguration ungültig", "valid": "Konfiguration in Ordnung" } @@ -1461,7 +1535,7 @@ "active": "Aktiv", "caption": "Benutzer anzeigen", "change_password": "Passwort ändern", - "confirm_user_deletion": "Möchtest du {name} wirklich löschen?", + "confirm_user_deletion": "Möchten Sie {name} wirklich löschen?", "deactivate_user": "Benutzer deaktivieren", "delete_user": "Benutzer löschen", "enter_new_name": "Neuen Namen eingeben", @@ -1499,14 +1573,14 @@ "help_attribute_dropdown": "Wähle ein Attribut aus, um dessen Wert anzuzeigen oder festzulegen.", "help_get_zigbee_attribute": "Ruft den Wert für das ausgewählte Attribut ab.", "help_set_zigbee_attribute": "Setzt den Attributwert für den angegebenen Cluster auf der angegebenen Entität.", - "introduction": "Anzeigen und Bearbeiten von Clusterattributen.", + "introduction": "Anzeigen und Bearbeiten von Cluster-Attributen.", "set_zigbee_attribute": "Zigbee-Attribut setzen" }, "cluster_commands": { "commands_of_cluster": "Befehle des ausgewählten Clusters", "header": "Cluster-Befehle", "help_command_dropdown": "Wähle einen Befehl zur Interaktion aus.", - "introduction": "Anzeigen und Ausgeben von Clusterbefehlen.", + "introduction": "Anzeigen und Ausgeben von Cluster-Befehlen.", "issue_zigbee_command": "Zigbee-Kommando absetzen" }, "clusters": { @@ -1534,7 +1608,10 @@ "bind_button_help": "Binden Sie die ausgewählte Gruppe an die ausgewählten Geräte-Cluster.", "bind_button_label": "Gruppe binden", "cluster_selection_help": "Wählen Sie Cluster aus, die an die ausgewählte Gruppe gebunden werden sollen.", + "group_picker_help": "Wählen Sie eine Gruppe aus, um einen Bindungsbefehl zu erteilen.", "group_picker_label": "Bindbare Gruppen", + "header": "Gruppenbindung", + "introduction": "Binden und Aufheben der Bindung von Gruppen.", "unbind_button_help": "Trennen Sie die Bindung der ausgewählten Gruppe von den ausgewählten Geräte-Clustern.", "unbind_button_label": "Gruppe auflösen" }, @@ -1548,16 +1625,16 @@ "creating_group": "Erstelle Gruppe", "description": "Erstellen und Ändern von Zigbee-Gruppen", "group_details": "Hier sind alle Details der ausgewählten Zigbee Gruppe.", - "group_id": "Gruppen ID", + "group_id": "Gruppen-ID", "group_info": "Gruppen Information", "group_name_placeholder": "Gruppenname", "group_not_found": "Gruppe nicht gefunden!", - "group-header": "Zigbee Home Automation - Gruppen Details", + "group-header": "Zigbee Home Automation - Gruppen-Details", "groups": "Gruppen", - "groups-header": "Zigbee Home Automation - Gruppen Management", + "groups-header": "Zigbee Home Automation - Gruppen-Verwaltung", "header": "Zigbee Home Automation - Gruppen Management", "introduction": "Erstelle oder bearbeite Zigbee Gruppen", - "manage_groups": "Zigbee Gruppen verwalten", + "manage_groups": "Zigbee-Gruppen verwalten", "members": "Mitglieder", "remove_groups": "Entferne Gruppe", "remove_members": "Mitglieder entfernen", @@ -1576,15 +1653,41 @@ "help_node_dropdown": "Wähle ein Gerät aus, um die Geräteoptionen anzuzeigen.", "hint_battery_devices": "Hinweis: Schlafende (batteriebetriebene) Geräte müssen wach sein, wenn Befehle für sie ausgeführt werden. Ein schlafendes Gerät kann meist durch eine Aktion am Gerät aufgeweckt werden.", "hint_wakeup": "Einige Geräte, z. B. Xiaomi-Sensoren, verfügen über eine Wecktaste, die in Intervallen von ~5 Sekunden gedrückt werden kann, um die Geräte wach zu halten, während mit ihnen interagiert wird.", - "introduction": "Führe ZHA-Befehle aus, die sich auf ein einzelnes Gerät auswirken. Wähle ein Gerät aus, um eine Liste der verfügbaren Befehle anzuzeigen." + "introduction": "ZHA-Befehle ausführen, die sich auf ein einzelnes Gerät auswirken. Wählen Sie ein Gerät aus, um eine Liste der verfügbaren Befehle anzuzeigen." }, "services": { - "reconfigure": "Rekonfiguriere ZHA-Gerät (Gerät heilen). Benutze dies, wenn du Probleme mit dem Gerät hast. Wenn es sich bei dem betroffenden Gerät um ein batteriebetriebenes Gerät handelt, stelle sicher dass es wach ist und Kommandos akzeptiert wenn du diesen Dienst benutzt.", + "reconfigure": "Rekonfigurieren des ZHA-Geräts (Gerät heilen). Benutzen Sie dies, wenn Sie Probleme mit dem Gerät haben. Wenn es sich bei dem betroffenden Gerät um ein batteriebetriebenes Gerät handelt, stellen Sie sicher, dass es wach ist und Kommandos akzeptiert, wenn Sie diesen Dienst benutzen.", "remove": "Entferne ein Gerät aus dem Zigbee-Netzwerk.", "updateDeviceName": "Lege einen benutzerdefinierten Namen für dieses Gerät in der Geräteregistrierung fest." }, "title": "Zigbee Home Automation" }, + "zone": { + "add_zone": "Zone hinzufügen", + "caption": "Zonen", + "configured_in_yaml": "Zonen, die über configuration.yaml konfiguriert wurden, können nicht über die Benutzeroberfläche bearbeitet werden.", + "confirm_delete": "Möchten Sie diesen Bereich wirklich löschen?", + "create_zone": "Zone erstellen", + "description": "Verwalten Sie die Zonen, in denen Sie Personen verfolgen möchten.", + "detail": { + "create": "Erstellen", + "delete": "Löschen", + "icon": "Icon", + "icon_error_msg": "Das Icon sollte das Format Präfix:ICONNAME haben, zum Beispiel: mdi:home", + "latitude": "Breitengrad", + "longitude": "Längengrad", + "name": "Name", + "new_zone": "Neue Zone", + "passive": "Passiv", + "passive_note": "Passive Zonen sind im Frontend versteckt und werden nicht als Ort für Device Tracker verwendet. Dies ist nützlich, wenn Sie es nur für Automatisierungen verwenden möchten.", + "radius": "Radius", + "required_error_msg": "Dieses Feld ist erforderlich", + "update": "Aktualisieren" + }, + "edit_home_zone": "Der Standort Ihres Hauses kann in der allgemeinen Konfiguration geändert werden.", + "introduction": "Mit Zonen können Sie bestimmte Regionen auf der Erde angeben. Befindet sich eine Person in einer Zone, übernimmt der Zustand den Namen aus der Zone. Zonen können auch als Auslöser oder Bedingung in Automatisierungs-Setups verwendet werden.", + "no_zones_created_yet": "Es sieht so aus, als hätten Sie noch keine Zonen erstellt." + }, "zwave": { "caption": "Z-Wave", "common": { @@ -1620,7 +1723,7 @@ }, "ozw_log": { "header": "OZW Log", - "introduction": "Schaue das Protokoll an. 0 ist das Minimum (lädt das gesamte Protokoll) und 1000 ist das Maximum. Beim Laden wird ein statisches Protokoll angezeigt und das Ende wird automatisch mit der zuletzt angegebenen Anzahl von Zeilen des Protokolls aktualisiert." + "introduction": "Schauen Sie das Protokoll an. 0 ist das Minimum (lädt das gesamte Protokoll) und 1000 ist das Maximum. Beim Laden wird ein statisches Protokoll angezeigt und das Ende wird automatisch mit der zuletzt angegebenen Anzahl von Zeilen des Protokolls aktualisiert." }, "services": { "add_node": "Knoten hinzufügen", @@ -1643,7 +1746,7 @@ "external_panel": { "complete_access": "Es wird Zugriff auf alle Daten in Home Assistant haben.", "hide_message": "Überprüfe die Dokumentation für die panel_custom Komponente, um diese Meldung auszublenden.", - "question_trust": "Vertraust du dem externen Panel {name} unter {link}?" + "question_trust": "Vertrauen Sie dem externen Panel {name} unter {link}?" } }, "developer-tools": { @@ -1698,15 +1801,15 @@ "title": "Logs" }, "mqtt": { - "description_listen": "Auf ein Thema lauschen", + "description_listen": "Auf einen Topic hören", "description_publish": "Ein Paket veröffentlichen", "listening_to": "Anhören von", - "message_received": "Nachricht {id} empfangen auf {topic} um {time} :", + "message_received": "Nachricht {id} empfangen auf {topic} um {time}:", "payload": "Payload (Vorlage erlaubt)", "publish": "Veröffentlichen", "start_listening": "Anfangen zuzuhören", "stop_listening": "Aufhören zuzuhören", - "subscribe_to": "Thema abonnieren", + "subscribe_to": "Topic abonnieren", "title": "MQTT", "topic": "Topic" }, @@ -1766,17 +1869,20 @@ }, "lovelace": { "add_entities": { - "generated_unsupported": "Du kannst diese Funktion nur verwenden, wenn du die Kontrolle über Lovelace übernommen hast.", + "generated_unsupported": "Sie können diese Funktion nur verwenden, wenn Sie die Kontrolle über Lovelace übernommen haben.", "saving_failed": "Speichern der Lovelace-Konfiguration ist fehlgeschlagen.", - "yaml_unsupported": "Du kannst diese Funktion nicht verwenden, wenn du Lovelace im YAML-Modus verwendest." + "yaml_unsupported": "Sie können diese Funktion nicht verwenden, wenn Sie Lovelace im YAML-Modus verwenden." }, "cards": { - "confirm_delete": "Möchtest du diese Karte wirklich löschen?", + "confirm_delete": "Möchten Sie diese Karte wirklich löschen?", "empty_state": { "go_to_integrations_page": "Gehe zur Integrationsseite.", - "no_devices": "Auf dieser Seite kannst du deine Geräte steuern, es sieht jedoch so aus, als hättest du noch keine eingerichtet. Gehe zur Integrationsseite, um damit zu beginnen.", + "no_devices": "Auf dieser Seite können Sie Ihre Geräte steuern, es sieht jedoch so aus, als hätten Sie noch keine eingerichtet. Gehen Sie zur Integrationsseite, um damit zu beginnen.", "title": "Willkommen zu Hause" }, + "entities": { + "never_triggered": "Nie ausgelöst" + }, "picture-elements": { "call_service": "Dienst {name} ausführen", "hold": "Halten:", @@ -1793,7 +1899,7 @@ } }, "changed_toast": { - "message": "Die Lovelace-Konfiguration wurde aktualisiert, möchtest du sie aktualisieren?", + "message": "Die Lovelace-Konfiguration wurde aktualisiert, möchten Sie sie aktualisieren?", "refresh": "Aktualisieren" }, "editor": { @@ -1907,6 +2013,7 @@ "name": "Sensor" }, "shopping-list": { + "integration_not_loaded": "Für diese Karte muss die `shopping_list`-Integration eingerichtet werden.", "name": "Einkaufsliste" }, "thermostat": { @@ -1927,7 +2034,7 @@ "move": "Zur Ansicht Bewegen", "options": "Mehr Optionen", "pick_card": "Karte auswählen, die hinzugefügt werden soll.", - "pick_card_view_title": "Welche Karte möchtest du deiner {name} -Ansicht hinzufügen?", + "pick_card_view_title": "Welche Karte möchten Sie Ihrer {name} -Ansicht hinzufügen?", "save": "Speichern", "show_code_editor": "Code-Editor anzeigen", "show_visual_editor": "Visuellen Editor anzeigen", @@ -1955,14 +2062,14 @@ "migrate": { "header": "Konfiguration inkompatibel", "migrate": "Konfiguration migrieren", - "para_migrate": "Home Assistant kann für alle Ihre Karten und Ansichten die IDs automatisch generieren, wenn du den \"Konfiguration migrieren\"-Button klickst.", + "para_migrate": "Home Assistant kann für alle Ihre Karten und Ansichten die IDs automatisch generieren, wenn Sie den \"Konfiguration migrieren\"-Button klicken.", "para_no_id": "Dieses Element hat keine ID. Bitte füge diesem Element eine ID in 'ui-lovelace.yaml' hinzu." }, "raw_editor": { - "confirm_remove_config_text": "Wir generieren automatisch deine Lovelace-Ansichten mit deinen Bereichen und Geräten, wenn du deine Lovelace-Konfiguration entfernst.", - "confirm_remove_config_title": "Bist du sicher, dass du deine Lovelace-Konfiguration entfernen möchtest? Wir generieren automatisch deine Lovelace-Ansichten mit deinen Bereichen und Geräten.", - "confirm_unsaved_changes": "Du hast ungespeicherte Änderungen, bist du sicher, dass du sie beenden willst?", - "confirm_unsaved_comments": "Deine Konfiguration enthält einen oder mehrere Kommentare, diese werden nicht gespeichert. Möchtest du fortfahren?", + "confirm_remove_config_text": "Wir generieren automatisch deine Lovelace-Ansichten mit deinen Bereichen und Geräten, wenn Sie Ihre Lovelace-Konfiguration entfernen.", + "confirm_remove_config_title": "Bist Ssie sicher, dass Sie Ihre deine Lovelace-Konfiguration entfernen ollen? Wir generieren automatisch Ihre Lovelace-Ansichten mit Ihren Bereichen und Geräten.", + "confirm_unsaved_changes": "Sie haben ungespeicherte Änderungen, sind Sie sicher, dass Sie beenden willen?", + "confirm_unsaved_comments": "Ihre Konfiguration enthält einen oder mehrere Kommentare, diese werden nicht gespeichert. Möchten Sie fortfahren?", "error_invalid_config": "Deine Konfiguration ist ungültig: {error}", "error_parse_yaml": "YAML kann nicht geparsed werden: {error}", "error_remove": "Konfiguration konnte nicht entfernt werden: {error}", @@ -1975,13 +2082,13 @@ "save_config": { "cancel": "Abbrechen", "header": "Lovelace Userinterface selbst verwalten", - "para": "Standardmäßig verwaltet Home Assistant Ihre Benutzeroberfläche und aktualisiert sie, sobald neue Entitäten oder Lovelace-Komponenten verfügbar sind. Wenn du die Verwaltung selbst übernehmen willst, nehmen wir für dich keine Änderungen mehr vor.", - "para_sure": "Bist du dir sicher, dass du die Benutzeroberfläche selbst verwalten möchtest?", + "para": "Standardmäßig verwaltet Home Assistant Ihre Benutzeroberfläche und aktualisiert sie, sobald neue Entitäten oder Lovelace-Komponenten verfügbar sind. Wenn Sie die Verwaltung selbst übernehmen wollen, nehmen wir für Sie keine Änderungen mehr vor.", + "para_sure": "Sind Sie sicher, dass Sie die Benutzeroberfläche selbst verwalten möchten?", "save": "Kontrolle übernehmen" }, "suggest_card": { "add": "Zu Lovelace hinzufügen", - "create_own": "Erstelle dein eigenes", + "create_own": "Wählen Sie eine andere Karte", "header": "Wir haben einen Vorschlag für dich erstellt" }, "view": { @@ -1994,24 +2101,24 @@ "menu": { "close": "Schließen", "configure_ui": "Benutzeroberfläche konfigurieren", - "exit_edit_mode": "Schließe den UI-Bearbeitungsmodus", + "exit_edit_mode": "Schließen des UI-Bearbeitungsmodus", "help": "Hilfe", "refresh": "Aktualisieren", "unused_entities": "Ungenutzte Elemente" }, "reload_lovelace": "Lovelace neu laden", "unused_entities": { - "available_entities": "Dies sind die Entitäten, die du zur Verfügung hast, die aber noch nicht in deiner Lovelace-Benutzeroberfläche enthalten sind.", + "available_entities": "Dies sind die Entitäten, die Sie zur Verfügung haben, die aber noch nicht in Ihrer Lovelace-Benutzeroberfläche enthalten sind.", "domain": "Domain", "entity": "Entität", "entity_id": "Entitäts-ID", "last_changed": "Zuletzt geändert", - "select_to_add": "Wähle die Entitäten aus, die Du zur Karte hinzufügen möchtest und klicke auf den Karte hinzufügen Button.", + "select_to_add": "Wählen Sie die Entitäten aus, die Sie zur Karte hinzufügen möchten und klicken Sie auf den Karte hinzufügen Button.", "title": "Nicht verwendete Entitäten" }, "views": { - "confirm_delete": "Möchtest du diese Ansicht wirklich löschen?", - "existing_cards": "Du kannst eine Ansicht mit Karten nicht löschen. Entfernen zuerst die Karten." + "confirm_delete": "Möchten Sie diese Ansicht wirklich löschen?", + "existing_cards": "Sie können eine Ansicht mit Karten nicht löschen. Entfernen Sie zuerst die Karten." }, "warning": { "entity_non_numeric": "Die Entität ist nicht-numerisch: {entity}", @@ -2021,12 +2128,12 @@ "mailbox": { "delete_button": "Löschen", "delete_prompt": "Diese Nachricht löschen?", - "empty": "Du hast keine Nachrichten", + "empty": "Sie haben keine Nachrichten", "playback_title": "Nachrichtenwiedergabe" }, "page-authorize": { "abort_intro": "Anmeldung abgebrochen", - "authorizing_client": "Du bist dabei, {clientId} Zugriff auf deine Home Assistant Instanz zu gewähren.", + "authorizing_client": "Sie sind dabei, {clientId} Zugriff auf Ihre Home Assistant-Instanz zu gewähren.", "form": { "providers": { "command_line": { @@ -2048,7 +2155,7 @@ "data": { "code": "Zwei-Faktor Authentifizierungscode" }, - "description": "Öffne das **{mfa_module_name}** auf deinem Gerät um den 2-Faktor Authentifizierungscode zu sehen und deine Identität zu bestätigen:" + "description": "Öffnen Sie das **{mfa_module_name}** auf Ihrem Gerät, um den 2-Faktor Authentifizierungscode zu sehen und Ihre Identität zu bestätigen:" } } }, @@ -2071,14 +2178,14 @@ "data": { "code": "Zwei-Faktor Authentifizierungscode" }, - "description": "Öffne das **{mfa_module_name}** auf deinem Gerät um den 2-Faktor Authentifizierungscode zu sehen und deine Identität zu bestätigen:" + "description": "Öffnen Sie das **{mfa_module_name}** auf Ihrem Gerät, um den 2-Faktor Authentifizierungscode zu sehen und Ihre Identität zu bestätigen:" } } }, "legacy_api_password": { "abort": { "login_expired": "Sitzung abgelaufen, bitte erneut anmelden.", - "no_api_password_set": "Du hast kein API-Passwort konfiguriert." + "no_api_password_set": "Sie haben kein API-Passwort konfiguriert." }, "error": { "invalid_auth": "Ungültiges API-Passwort", @@ -2095,7 +2202,7 @@ "data": { "code": "Zwei-Faktor Authentifizierungscode" }, - "description": "Öffne das **{mfa_module_name}** auf deinem Gerät um den 2-Faktor Authentifizierungscode zu sehen und deine Identität zu bestätigen:" + "description": "Öffnen Sie das **{mfa_module_name}** auf Ihrem Gerät, um den 2-Faktor Authentifizierungscode zu sehen und Ihre Identität zu bestätigen:" } } }, @@ -2108,7 +2215,7 @@ "data": { "user": "Benutzer" }, - "description": "Bitte wähle einen Benutzer aus, mit dem du dich anmelden möchtest:" + "description": "Bitte wählen Sie einen Benutzer aus, mit dem Sie sich anmelden möchten:" } } } @@ -2124,7 +2231,7 @@ "cards": { "demo": { "demo_by": "von {name}", - "introduction": "Willkommen zu Hause! Du hast die Home Assistant Demo erreicht, in der wir die besten Benutzeroberflächen unserer Community präsentieren.", + "introduction": "Willkommen zu Hause! Sie haben die Home Assistant-Demo erreicht, in der wir die besten Benutzeroberflächen unserer Community präsentieren.", "learn_more": "Erfahre mehr über Home Assistant", "next_demo": "Nächste Demo" } @@ -2168,8 +2275,8 @@ "core-config": { "button_detect": "Erkennen", "finish": "Weiter", - "intro": "Hallo {name}, willkommen bei der Home Assistant. Wie möchtest du dein Haus benennen?", - "intro_location": "Wir würden gerne wissen, wo du wohnst. Diese Information hilft bei der Anzeige von Informationen und der Einrichtung von Sonnenstands-basierten Automatisierungen. Diese Daten werden niemals außerhalb deines Netzwerks weitergegeben.", + "intro": "Hallo {name}, willkommen bei Home Assistant. Wie möchten Sie Ihre Haus benennen?", + "intro_location": "Wir würden gerne wissen, wo Sie wohen. Diese Daten helfen bei der Anzeige von Informationen und der Einrichtung von Sonnenstands-basierten Automatisierungen. Diese Daten werden niemals außerhalb Ihres Netzwerks weitergegeben.", "intro_location_detect": "Wir können helfen, diese Informationen auszufüllen, indem wir eine einmalige Anfrage an einen externen Dienstleister richten.", "location_name_default": "Home" }, @@ -2178,7 +2285,7 @@ "intro": "Geräte und Dienste werden in Home Assistant als Integrationen dargestellt. Sie können jetzt oder später über die Konfigurationsseite eingerichtet werden.", "more_integrations": "Mehr" }, - "intro": "Bist du bereit, dein Zuhause zu erwecken, deine Privatsphäre zurückzugewinnen und einer weltweiten Gemeinschaft von Tüftlern beizutreten?", + "intro": "Sind Sie bereit, dein Zuhause zu wecken, Ihre Privatsphäre zurückzugewinnen und einer weltweiten Gemeinschaft von Tüftlern beizutreten?", "user": { "create_account": "Benutzerkonto anlegen", "data": { @@ -2197,7 +2304,8 @@ }, "profile": { "advanced_mode": { - "description": "Home-Assistent verbirgt standardmäßig erweiterte Funktionen und Optionen. Mache diese Funktionen zugänglich, indem diese Option aktiviert wird. Dies ist eine benutzerspezifische Einstellung, die sich nicht auf andere Benutzer auswirkt, die Home Assistant verwenden.", + "description": "Home Assistent verbirgt standardmäßig erweiterte Funktionen und Optionen. Mache diese Funktionen zugänglich, indem diese Option aktiviert wird. Dies ist eine benutzerspezifische Einstellung, die sich nicht auf andere Benutzer auswirkt, die Home Assistant verwenden.", + "link_promo": "Mehr erfahren", "title": "Erweiterter Modus" }, "change_password": { @@ -2208,29 +2316,31 @@ "new_password": "Neues Passwort", "submit": "Absenden" }, - "current_user": "Du bist derzeit als {fullName} angemeldet.", + "current_user": "Sie sind derzeit als {fullName} angemeldet.", "force_narrow": { "description": "Dies blendet die Seitenleiste standardmäßig aus, ähnlich der Nutzung auf Mobilgeräten.", "header": "Verstecke die Seitenleiste immer" }, - "is_owner": "Du bist der Besitzer", + "is_owner": "Sie sind der Besitzer.", "language": { "dropdown_label": "Sprache", "header": "Sprache", "link_promo": "Hilf beim Übersetzen" }, "logout": "Abmelden", + "logout_text": "Möchten Sie sich wirklich abmelden?", + "logout_title": "Abmelden?", "long_lived_access_tokens": { - "confirm_delete": "Möchtest du den Zugriffs-Token für {name} wirklich löschen?", + "confirm_delete": "Möchten Sie den Zugriffs-Token für {name} wirklich löschen?", "create": "Token erstellen", "create_failed": "Das Zugriffs-Token konnte nicht erstellt werden.", "created_at": "Erstellt am {date}", "delete_failed": "Fehler beim Löschen des Zugriffs-Tokens.", "description": "Erstelle langlebige Zugriffstoken, damit deine Skripte mit deiner Home Assistant-Instanz interagieren können. Jedes Token ist ab der Erstellung für 10 Jahre gültig. Die folgenden langlebigen Zugriffstoken sind derzeit aktiv.", - "empty_state": "Du hast noch keine langlebigen Zugangs-Token.", + "empty_state": "Sie haben noch keine langlebigen Zugangs-Token.", "header": "Langlebige Zugangs-Token", "last_used": "Zuletzt verwendet am {date} in {location}", - "learn_auth_requests": "Erfahre, wie du authentifizierte Anfragen stellen kannst.", + "learn_auth_requests": "Erfahren Sie, wie Sie authentifizierte Anfragen stellen können.", "not_used": "Wurde noch nie benutzt", "prompt_copy_token": "Kopiere deinen Zugangs-Token. Er wird nicht wieder angezeigt werden.", "prompt_name": "Name?" @@ -2243,25 +2353,25 @@ "title_success": "Erfolgreich!" }, "mfa": { - "confirm_disable": "Möchtest du {name} wirklich deaktivieren?", + "confirm_disable": "Möchten Sie {name} wirklich deaktivieren?", "disable": "Deaktivieren", "enable": "Aktivieren", - "header": "2-Faktor-Authentifizierung Module" + "header": "2-Faktor-Authentifizierung-Module" }, "push_notifications": { "description": "Sende Benachrichtigungen an dieses Gerät.", "error_load_platform": "Konfiguriere notify.html5.", - "error_use_https": "Erfordert aktiviertes SSL für das Frontend.", + "error_use_https": "Erfordert aktiviertes SSL/TLS für das Frontend.", "header": "Push-Benachrichtigungen", "link_promo": "Mehr erfahren", "push_notifications": "Push-Benachrichtigungen" }, "refresh_tokens": { - "confirm_delete": "Möchtest du das Aktualisierungstoken für {name} wirklich löschen?", + "confirm_delete": "Möchten Sie das Aktualisierungs-Token für {name} wirklich löschen?", "created_at": "Erstellt am {date}", "current_token_tooltip": "Aktueller Refresh-Token konnte nicht gelöscht werden", "delete_failed": "Fehler beim Löschen das Aktualisierungs-Token.", - "description": "Jedes Aktualisierungstoken stellt eine Anmeldesitzung dar. Aktualisierungstoken werden automatisch entfernt, wenn du auf Abmelden klickst. Die folgenden Aktualisierungstoken sind derzeit für dein Konto aktiv.", + "description": "Jedes Aktualisierungs-Token stellt eine Anmeldesitzung dar. Aktualisierungs-Token werden automatisch entfernt, wenn Sie Abmelden klicken. Die folgenden Aktualisierungs-Token sind derzeit für Ihr Konto aktiv.", "header": "Aktualisierungs-Tokens", "last_used": "Zuletzt verwendet am {date} in {location}", "not_used": "Wurde noch nie benutzt", diff --git a/translations/es.json b/translations/es.json index 832ed70c21..3dfd1d81e7 100644 --- a/translations/es.json +++ b/translations/es.json @@ -1232,6 +1232,7 @@ }, "create": "Crear automatización con el dispositivo", "no_automations": "Sin automatizaciones", + "no_device_automations": "No hay automatizaciones disponibles para este dispositivo.", "triggers": { "caption": "Hacer algo cuando..." } diff --git a/translations/fr.json b/translations/fr.json index b20378afcd..cbc1967a99 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -1232,6 +1232,7 @@ }, "create": "Créer une automation avec l'appareil", "no_automations": "Aucune automation", + "no_device_automations": "Aucune automatisation n'est disponible pour cet appareil.", "triggers": { "caption": "Faire quelque chose quand ..." } diff --git a/translations/gsw.json b/translations/gsw.json index a67009946c..c087e5a007 100644 --- a/translations/gsw.json +++ b/translations/gsw.json @@ -519,6 +519,9 @@ } } }, + "devices": { + "scripts": "Scripts" + }, "integrations": { "caption": "Integratione", "config_entry": { diff --git a/translations/hu.json b/translations/hu.json index a5de3225cd..e7eecbe503 100644 --- a/translations/hu.json +++ b/translations/hu.json @@ -1027,7 +1027,7 @@ }, "integrations": "Integrációk", "integrations_introduction": "A Home Assistant Felhő integrációi úgy biztosítanak lehetőséget felhő szolgáltatásokhoz való csatlakozáshoz, hogy közben nem kell kinyitnod a Home Assistant rendszered publikusan az interneten.", - "integrations_introduction2": "Nézd meg a weboldalt a", + "integrations_introduction2": "Nézd meg a weboldalt a ", "integrations_link_all_features": "az összes elérhető funkció", "manage_account": "Fiók kezelése", "nabu_casa_account": "Nabu Casa fiók", @@ -1049,7 +1049,7 @@ "link_learn_more": "Tudj meg többet a webhook-alapú automatizálások létrehozásáról.", "loading": "Betöltés...", "manage": "Kezelés", - "no_hooks_yet": "Úgy tűnik, még nincs egy webhookod sem. Kezdéshez konfigurálj egy", + "no_hooks_yet": "Úgy tűnik, még nincs egy webhookod sem. Kezdéshez konfigurálj egy ", "no_hooks_yet_link_automation": "webhook automatizálást", "no_hooks_yet_link_integration": "webhook-alapú integrációt", "no_hooks_yet2": "vagy hozz létre egy", @@ -1111,7 +1111,7 @@ "email_error_msg": "Érvénytelen email", "forgot_password": "elfelejtett jelszó?", "introduction": "A Home Assistant Felhő biztonságos távoli kapcsolatot nyújt a példányodhoz, miközben távol vagy. Azt is lehetővé teszi, hogy csak felhőn alapuló szolgáltatásokhoz csatlakozz: Amazon Alexa, Google Asszisztens.", - "introduction2": "Ezt a szolgáltatást partnerünk üzemelteti, a", + "introduction2": "Ezt a szolgáltatást partnerünk üzemelteti, a ", "introduction2a": " vállalat üzemelteti, amelyet a Home Assistant és a Hass.io alapítói alapítottak.", "introduction3": "A Home Assistant Felhő egy előfizetéses szolgáltatás egy hónapos ingyenes próbaverzióval. Nincs szükség fizetési információk megadására.", "learn_more_link": "Tudj meg többet a Home Assistant Felhőről", @@ -1134,7 +1134,7 @@ "headline": "Indítsd el az ingyenes próbaidőszakot", "information": "Hozz létre egy fiókot ahhoz, hogy elindíthasd az egy hónapos ingyenes Home Assistant Felhő próbaidőszakodat. Nincs szükség fizetési információk megadására.", "information2": "A próbaidőszak hozzáférést biztosít a Home Assistant Felhő minden előnyéhez, beleértve a következőket:", - "information3": "Ezt a szolgáltatást partnerünk üzemelteti, a", + "information3": "Ezt a szolgáltatást partnerünk üzemelteti, a ", "information3a": ", vállalat üzemelteti, amelyet a Home Assistant és a Hass.io alapítói alapítottak.", "information4": "Fiók regisztrálásával elfogadod az alábbi feltételeket.", "link_privacy_policy": "Adatvédelmi irányelvek", @@ -1226,14 +1226,19 @@ "actions": { "caption": "Ha valami triggerelődik, akkor..." }, + "automations": "Automatizálások", "conditions": { "caption": "Csak akkor csinálj valamit, ha a(z)..." }, + "create": "Automatizálás létrehozása eszközzel", + "no_automations": "Nincs automatizálás", + "no_device_automations": "Ehhez az eszközhöz nem állnak rendelkezésre automatizálások.", "triggers": { "caption": "Kezdj el csinálni valamit, amikor a(z)..." } }, "automations": "Automatizálások", + "cant_edit": "Kizárólag az UI-ben létrehozott elemeket szerkesztheti.", "caption": "Eszközök", "confirm_rename_entity_ids": "Szeretnéd átnevezni az entitások ID-ját is?", "data_table": { @@ -1254,6 +1259,18 @@ }, "info": "Eszköz infó", "name": "Név", + "scene": { + "create": "Jelenet létrehozása eszközzel", + "no_scenes": "Nincsenek jelenetek", + "scenes": "Jelenetek" + }, + "scenes": "Jelenetek", + "script": { + "create": "Szkript létrehozása eszköz alapján", + "no_scripts": "Nincs szkript", + "scripts": "Szkriptek" + }, + "scripts": "Szkriptek", "unknown_error": "Ismeretlen hiba", "unnamed_device": "Névtelen eszköz", "update": "Frissítés" @@ -1376,7 +1393,7 @@ "new": "Új integráció beállítása", "none": "Még semmi sincs beállítva", "note_about_integrations": "Még nem minden integráció konfigurálható a felhasználói felületen keresztül.", - "note_about_website_reference": "Továbbiak érhetőek el itt:" + "note_about_website_reference": "Továbbiak érhetőek el itt: " }, "introduction": "Itt a komponenseket és a Home Assistant szervert lehet beállítani. Még nem lehet mindent a felületről, de dolgozunk rajta.", "person": { diff --git a/translations/it.json b/translations/it.json index e3e025b4c1..4d341fa469 100644 --- a/translations/it.json +++ b/translations/it.json @@ -1248,7 +1248,7 @@ "details": "Ecco tutti i dettagli del tuo dispositivo.", "device_not_found": "Dispositivo non trovato.", "entities": { - "add_entities_lovelace": "Aggiungere tutte le entità dispositivo all'Interfaccia Utente di Lovelace", + "add_entities_lovelace": "Aggiungi a Lovelace", "entities": "Entità", "none": "Questo dispositivo non ha entità" }, diff --git a/translations/nb.json b/translations/nb.json index 5ddd0cc230..a1c03e61fe 100644 --- a/translations/nb.json +++ b/translations/nb.json @@ -1232,6 +1232,7 @@ }, "create": "Lag automatisering med enheten", "no_automations": "Ingen automatiseringer", + "no_device_automations": "Det er ingen automatiseringer tilgjengelig for denne enheten.", "triggers": { "caption": "Gjør noe når ..." } diff --git a/translations/pl.json b/translations/pl.json index 7760c865e5..43eeee81e7 100644 --- a/translations/pl.json +++ b/translations/pl.json @@ -1232,6 +1232,7 @@ }, "create": "Utwórz automatyzację z urządzeniem", "no_automations": "Brak automatyzacji", + "no_device_automations": "Brak dostępnych automatyzacji dla tego urządzenia.", "triggers": { "caption": "Gdy..." } diff --git a/translations/ru.json b/translations/ru.json index 277ba6d0a0..08804f204a 100644 --- a/translations/ru.json +++ b/translations/ru.json @@ -1232,6 +1232,7 @@ }, "create": "Создать автоматизацию", "no_automations": "Нет автоматизаций", + "no_device_automations": "Создание сценария для этого устройства недоступно.", "triggers": { "caption": "Сделать что-то, когда..." } @@ -1412,7 +1413,7 @@ "link_presence_detection_integrations": "Интеграции обнаружения присутствия", "linked_user": "Связанный пользователь", "name": "Имя", - "name_error_msg": "Укажите имя", + "name_error_msg": "Обязательное поле", "new_person": "Новая персона", "no_device_tracker_available_intro": "Если у Вас есть отслеживающие устройства, Вы можете назначить их этому человеку. Вы можете добавить Ваше первое устройство, добавив интеграцию обнаружения присутствия со страницы интеграции.", "update": "Обновить" @@ -1673,7 +1674,7 @@ "passive": "Пассивная", "passive_note": "Пассивные зоны могут использоваться только в автоматизациях. Они не отображаются на карте в пользовательском интерфейсе и не используются в качестве местоположения для устройств отслеживания.", "radius": "Радиус", - "required_error_msg": "Это поле обязательно к заполнению.", + "required_error_msg": "Обязательное поле", "update": "Обновить" }, "edit_home_zone": "Местоположение Вашего дома может быть изменено в разделе настроек \"Общие\".", @@ -2249,7 +2250,7 @@ "hallway": "Прихожая", "kitchen": "Кухня", "left": "Левая сторона", - "master_bedroom": "Спальня", + "master_bedroom": "Спальная", "mirror": "Зеркало", "patio": "Внутренний дворик", "right": "Правая сторона", diff --git a/translations/tr.json b/translations/tr.json index 1455f8b26b..4c35fc216d 100644 --- a/translations/tr.json +++ b/translations/tr.json @@ -474,6 +474,9 @@ "script": { "execute": "Yürüt" }, + "service": { + "run": "Çalıştır" + }, "timer": { "actions": { "cancel": "İptal", @@ -537,10 +540,24 @@ "yes": "Evet" }, "components": { + "area-picker": { + "add_dialog": { + "add": "Ekle", + "failed_create_area": "Alan oluşturulamadı.", + "name": "Ad", + "text": "Yeni alanın adını girin.", + "title": "Yeni alan ekle" + }, + "add_new": "Yeni alan ekle…", + "area": "Alan", + "clear": "Temizle", + "show_areas": "Alanları göster" + }, "device-picker": { "clear": "Temiz", "device": "Cihaz", - "show_devices": "Cihazları göster" + "show_devices": "Cihazları göster", + "toggle": "Geçiş" }, "entity": { "entity-picker": { @@ -592,11 +609,28 @@ "entity_registry": { "control": "Kontrol", "dismiss": "Kapat", + "editor": { + "confirm_delete": "Bu girişi silmek istediğinizden emin misiniz?", + "delete": "SİL", + "enabled_cause": "{cause} tarafından devre dışı bırakılmış.", + "enabled_description": "Devre dışı bırakılan varlıklar Home Assistant'a eklenmeyecek.", + "enabled_label": "Varlığı etkinleştir", + "entity_id": "Varlık kimliği", + "name": "Ad Geçersiz Kılma", + "unavailable": "Bu varlık şu anda kullanılamıyor.", + "update": "GÜNCELLE" + }, "related": "İlgili", "settings": "Ayarlar" }, + "generic": { + "cancel": "İptal", + "default_confirmation_title": "Emin misin?", + "ok": "Tamam" + }, "more_info_control": { "dismiss": "İletişim kutusunu kapat", + "edit": "Varlığı düzenle", "restored": { "confirm_remove_text": "Bu varlığı kaldırmak istediğinizden emin misiniz?", "confirm_remove_title": "Varlık kaldırılsın mı?", @@ -649,6 +683,7 @@ "manuf": "{manufacturer} tarafından", "no_area": "Alan Yok", "power_source": "Güç kaynağı", + "quirk": "Orijinal", "services": { "remove": "Bir cihazı Zigbee ağından kaldır." }, @@ -1139,14 +1174,19 @@ "actions": { "caption": "Bir şey tetiklendiğinde..." }, + "automations": "Otomasyonlar", "conditions": { "caption": "Sadece bir şey yapmak eğer ..." }, + "create": "Cihazla otomasyon oluşturun", + "no_automations": "Otomasyon yok", + "no_device_automations": "Bu cihaz için kullanılabilir otomasyon yok.", "triggers": { "caption": "Aşağıdaki durumlarda bir şeyler yap..." } }, "automations": "Otomasyonlar", + "cant_edit": "Yalnızca kullanıcı arayüzünde oluşturulan öğeleri düzenleyebilirsiniz.", "caption": "Cihazlar", "data_table": { "area": "Alan", @@ -1165,8 +1205,22 @@ "none": "Bu cihazın varlığı yok" }, "info": "Cihaz bilgileri", + "name": "Ad", + "scene": { + "create": "Aygıtla sahne oluşturma", + "no_scenes": "Sahne yok", + "scenes": "Sahneler" + }, + "scenes": "Sahneler", + "script": { + "create": "Aygıtla sahne oluşturma", + "no_scripts": "Komut dosyası yok", + "scripts": "Komut dosyaları" + }, + "scripts": "Komut dosyaları", "unknown_error": "Bilinmeyen hata", - "unnamed_device": "Adsız cihaz" + "unnamed_device": "Adsız cihaz", + "update": "Güncelle" }, "entities": { "caption": "Varlıklar", @@ -1354,7 +1408,9 @@ "sequence": "Sıra" }, "picker": { + "add_script": "Komut dosyası ekle", "edit_script": "Komut dosyasını düzenle", + "header": "Komut Dosyası Düzenleyicisi", "trigger_script": "Komut dosyası tetikle" } }, @@ -1437,8 +1493,15 @@ "get_zigbee_attribute": "Zigbee Özelliğini al", "set_zigbee_attribute": "Zigbee Özniteliğini Ayarla" }, + "cluster_commands": { + "header": "Küme Komutları" + }, + "clusters": { + "header": "Kümeler" + }, "common": { "add_devices": "Cihaz Ekle", + "clusters": "Kümeler", "devices": "Cihazlar", "value": "Değer" }, @@ -1471,6 +1534,7 @@ "group_not_found": "Grup bulunamadı!", "group-header": "Zigbee Ev Otomasyonu - Grup Detayları", "groups": "Gruplar", + "groups-header": "Zigbee Ev Otomasyonu - Grup Yönetimi", "introduction": "Zigbee grupları oluşturma ve değiştirme", "manage_groups": "Zigbee Gruplarını Yönetin", "members": "Üyeler", @@ -1508,7 +1572,8 @@ "radius": "Yarıçap", "required_error_msg": "Bu alan gereklidir", "update": "Güncelle" - } + }, + "edit_home_zone": "Evinizin konumu genel konfigürasyonda değiştirilebilir." }, "zwave": { "caption": "Z-Wave", @@ -1551,10 +1616,13 @@ "events": { "alert_event_type": "Olay türü zorunlu bir alandır", "available_events": "Mevcut Etkinlikler", + "count_listeners": " ({count} dinleyiciler)", "data": "Olay Verileri (YAML, isteğe bağlı)", "description": "Etkinlik otobüsünde bir etkinlik başlat.", "documentation": "Olaylar Dökümantasyonu.", "fire_event": "Olayı Çalıştır", + "listen_to_events": "Olayları dinleyin", + "listening_to": "Dinliyorum", "notification_event_fired": "{type} etkinliği başarıyla başlatıldı!", "start_listening": "Dinlemeye başla", "stop_listening": "Dinlemeyi bırak", @@ -1576,6 +1644,7 @@ "server": "sunucu", "set": "Ayarlamak", "source": "Kaynak:", + "states_ui": "Kullanıcı arayüzüne git", "system_health_error": "Sistem Sağlığı bileşeni yüklü değil. configuration.yaml içine 'system_health:' ekleyin", "title": "Bilgi" }, @@ -1724,6 +1793,7 @@ "camera_view": "Kamera Görünümü", "entities": "Varlıklar", "entity": "Varlık", + "hold_action": "Eylemi Tut", "hours_to_show": "Gösterilecek Saatler", "icon": "Simge", "maximum": "Maksimum", @@ -1733,6 +1803,7 @@ "show_icon": "Simgeyi Göster?", "show_name": "Adı göster?", "show_state": "Durumu göster", + "tap_action": "Eylem'e dokunun", "theme": "Tema", "title": "Başlık", "unit": "Birim", @@ -2046,6 +2117,7 @@ }, "profile": { "advanced_mode": { + "link_promo": "Daha fazla bilgi edinin", "title": "Gelişmiş mod" }, "change_password": { @@ -2121,6 +2193,7 @@ "link_promo": "Temalar hakkında bilgi edinin" }, "vibrate": { + "description": "Cihazları kontrol ederken bu cihazdaki titreşimi etkinleştirin veya devre dışı bırakın.", "header": "Titreşim" } }, diff --git a/translations/zh-Hans.json b/translations/zh-Hans.json index 30bd266630..fe5e8257ee 100644 --- a/translations/zh-Hans.json +++ b/translations/zh-Hans.json @@ -478,6 +478,9 @@ "script": { "execute": "执行" }, + "service": { + "run": "运行" + }, "timer": { "actions": { "cancel": "取消", @@ -541,10 +544,15 @@ "yes": "是" }, "components": { + "area-picker": { + "clear": "清除", + "show_areas": "显示区域" + }, "device-picker": { "clear": "清除", "device": "设备", - "show_devices": "显示设备" + "show_devices": "显示设备", + "toggle": "切换" }, "entity": { "entity-picker": { @@ -557,6 +565,16 @@ "loading_history": "正在加载历史状态...", "no_history_found": "没有找到历史状态。" }, + "related-items": { + "area": "区域", + "automation": "以下自动化的一部分", + "device": "设备", + "entity": "相关实体", + "group": "以下群组的一部分", + "integration": "集成", + "scene": "以下场景的一部分", + "script": "以下脚本的一部分" + }, "relative_time": { "duration": { "day": "{count} {count, plural,\n one {天}\n other {天}\n}", @@ -587,6 +605,29 @@ "domain_toggler": { "title": "切换域" }, + "entity_registry": { + "control": "控制", + "dismiss": "忽略", + "editor": { + "confirm_delete": "您确定要删除此条目吗?", + "delete": "删除", + "enabled_cause": "由于 {cause} 而被禁用", + "enabled_description": "已禁用的实体不再添加到 Home Assistant。", + "enabled_label": "启用实体", + "entity_id": "实体 ID", + "name": "覆盖名称", + "note": "注意:这可能不适用于所有集成。", + "unavailable": "该实体暂不可用。", + "update": "更新" + }, + "related": "关联", + "settings": "设置" + }, + "generic": { + "cancel": "取消", + "default_confirmation_title": "您确定吗?", + "ok": "确定" + }, "more_info_control": { "dismiss": "关闭对话", "edit": "编辑实体", @@ -598,7 +639,8 @@ "remove_intro": "如果该实体不再使用,可以通过删除来清理它。" }, "script": { - "last_action": "上次执行" + "last_action": "上次执行", + "last_triggered": "上次触发" }, "settings": "实体设置", "sun": { @@ -630,7 +672,7 @@ "found": "为您找到以下结果:", "how_can_i_help": "请问需要什么帮助?", "label": "输入问题,然后按回车", - "label_voice": "键入并按\"输入\"或点击麦克风发言" + "label_voice": "输入后按回车,或点击麦克风图标后讲话" }, "zha_device_info": { "buttons": { @@ -862,7 +904,7 @@ "label": "地理位置", "leave": "离开", "source": "位置来源", - "zone": "区域" + "zone": "地点" }, "homeassistant": { "event": "事件:", @@ -1216,6 +1258,8 @@ "enabled_cause": "被{cause}禁用。", "enabled_description": "已禁用的实体不再添加到 Home Assistant。", "enabled_label": "启用实体", + "entity_id": "实体 ID", + "name": "覆盖名称", "note": "注意:这可能不适用于所有集成。", "unavailable": "该实体暂不可用。", "update": "更新" @@ -1425,8 +1469,10 @@ "group": "重载分组", "heading": "配置重载", "introduction": "Home Assistant 中的部分配置可以直接重载,而无需重启服务。点击重载按钮将重新载入新的配置。", + "person": "重载人员", "scene": "重载场景", - "script": "重载脚本" + "script": "重载脚本", + "zone": "重载地点" }, "server_management": { "confirm_restart": "您确定要重新启动 Home Assistant 吗?", @@ -1537,6 +1583,32 @@ "updateDeviceName": "在设备注册表中为此设备设置自定义名称。" } }, + "zone": { + "add_zone": "添加地点", + "caption": "地点", + "configured_in_yaml": "通过 configuration.yaml 配置的地点不能通过 UI 编辑。", + "confirm_delete": "您确定要删除此地点吗?", + "create_zone": "创建地点", + "description": "管理要跟踪的人员所在的区域。", + "detail": { + "create": "创建", + "delete": "删除", + "icon": "图标", + "icon_error_msg": "图标的格式应为 prefix:iconname,例如:mdi:home", + "latitude": "纬度", + "longitude": "经度", + "name": "名称", + "new_zone": "新建地点", + "passive": "被动式", + "passive_note": "被动式地点不在前端显示,也不能作为设备跟踪器的位置。特别适合只将其用于自动化的情况。", + "radius": "半径", + "required_error_msg": "此字段为必填字段", + "update": "更新" + }, + "edit_home_zone": "家所在的位置可以在通用配置中更改。", + "introduction": "地点用于定义世界的某个地方。若某人位于一个地点,则其状态的名称就取自该地点。地点也可用作自动化配置中的触发条件和环境条件。", + "no_zones_created_yet": "看来您还没有建立地点。" + }, "zwave": { "caption": "Z-Wave", "common": { @@ -2149,6 +2221,7 @@ "profile": { "advanced_mode": { "description": "Home Assistant 默认隐藏高级功能和选项。您可以选中此开关来使用它们。这是用户个人的设置,不会影响使用 Home Assistant 的其他用户。", + "link_promo": "了解更多信息", "title": "高级模式" }, "change_password": { From 3215437bb87e3b962df8f3f3ae8fcc5fa34a7b3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Sat, 1 Feb 2020 08:03:30 +0100 Subject: [PATCH 05/64] Fixes add-on audio selector (#4648) * Fixes addon audio selector * Set device as property * Use getAttribute * Keep device as attribute Co-authored-by: Paulus Schoutsen --- hassio/src/addon-view/hassio-addon-audio.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/hassio/src/addon-view/hassio-addon-audio.ts b/hassio/src/addon-view/hassio-addon-audio.ts index c0718a4c9a..06b4f13c91 100644 --- a/hassio/src/addon-view/hassio-addon-audio.ts +++ b/hassio/src/addon-view/hassio-addon-audio.ts @@ -51,7 +51,7 @@ class HassioAddonAudio extends LitElement { Date: Sat, 1 Feb 2020 09:26:22 +0100 Subject: [PATCH 06/64] Change map settings icon (#4701) * Change map settings icon Closes #4694 * hide for demo --- src/panels/map/ha-panel-map.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/panels/map/ha-panel-map.js b/src/panels/map/ha-panel-map.js index bf62930e59..110dffd636 100644 --- a/src/panels/map/ha-panel-map.js +++ b/src/panels/map/ha-panel-map.js @@ -34,10 +34,12 @@ class HaPanelMap extends LocalizeMixin(PolymerElement) {
[[localize('panel.map')]]
- +
@@ -72,6 +74,10 @@ class HaPanelMap extends LocalizeMixin(PolymerElement) { } } + computeDemo() { + return __DEMO__; + } + openZonesEditor() { navigate(this, "/config/zone"); } From 25f5bf00429a21df46ed794715a00250e78ceb77 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sat, 1 Feb 2020 08:11:30 -0800 Subject: [PATCH 07/64] Fix ingress add-on not started dialog showing twice (#4716) * Fix ingress add-on not started dialog showing twice * logging not allowed --- hassio/src/hassio-main.ts | 98 ++++++++++++++++++++------ src/dialogs/generic/show-dialog-box.ts | 2 +- 2 files changed, 77 insertions(+), 23 deletions(-) diff --git a/hassio/src/hassio-main.ts b/hassio/src/hassio-main.ts index 78954a6675..8369eeb4e4 100644 --- a/hassio/src/hassio-main.ts +++ b/hassio/src/hassio-main.ts @@ -30,6 +30,10 @@ import { ProvideHassLitMixin } from "../../src/mixins/provide-hass-lit-mixin"; // Don't codesplit it, that way the dashboard always loads fast. import "./hassio-pages-with-tabs"; import { navigate } from "../../src/common/navigate"; +import { + showAlertDialog, + AlertDialogParams, +} from "../../src/dialogs/generic/show-dialog-box"; // The register callback of the IronA11yKeysBehavior inside paper-icon-button // is not called, causing _keyBindings to be uninitiliazed for paper-icon-button, @@ -158,31 +162,81 @@ class HassioMain extends ProvideHassLitMixin(HassRouterPage) { } private async _redirectIngress(addonSlug: string) { + // When we trigger a navigation, we sleep to make sure we don't + // show the hassio dashboard before navigating away. + const awaitAlert = async ( + alertParams: AlertDialogParams, + action: () => void + ) => { + await new Promise((resolve) => { + alertParams.confirm = resolve; + showAlertDialog(this, alertParams); + }); + action(); + await new Promise((resolve) => setTimeout(resolve, 1000)); + }; + + const createSessionPromise = createHassioSession(this.hass).then( + () => true, + () => false + ); + + let addon; + try { - const [addon] = await Promise.all([ - fetchHassioAddonInfo(this.hass, addonSlug).catch(() => { - throw new Error("Failed to fetch add-on info"); - }), - createHassioSession(this.hass).catch(() => { - throw new Error("Failed to create an ingress session"); - }), - ]); - if (!addon.ingress_url) { - alert("Add-on does not support Ingress"); - return; - } - if (addon.state !== "started") { - alert("Add-on is not running. Please start it first"); - navigate(this, `/hassio/addon/${addon.slug}`, true); - return; - } - location.assign(addon.ingress_url); - // await a promise that doesn't resolve, so we show the loading screen - // while we load the next page. - await new Promise(() => undefined); + addon = await fetchHassioAddonInfo(this.hass, addonSlug); } catch (err) { - alert("Unable to open ingress connection"); + await awaitAlert( + { + text: "Unable to fetch add-on info to start Ingress", + title: "Hass.io", + }, + () => history.back() + ); + + return; } + + if (!addon.ingress_url) { + await awaitAlert( + { + text: "Add-on does not support Ingress", + title: addon.name, + }, + () => history.back() + ); + + return; + } + + if (addon.state !== "started") { + await awaitAlert( + { + text: "Add-on is not running. Please start it first", + title: addon.name, + }, + () => navigate(this, `/hassio/addon/${addon.slug}`, true) + ); + + return; + } + + if (!(await createSessionPromise)) { + await awaitAlert( + { + text: "Unable to create an Ingress session", + title: addon.name, + }, + () => history.back() + ); + + return; + } + + location.assign(addon.ingress_url); + // await a promise that doesn't resolve, so we show the loading screen + // while we load the next page. + await new Promise(() => undefined); } private _apiCalled(ev) { diff --git a/src/dialogs/generic/show-dialog-box.ts b/src/dialogs/generic/show-dialog-box.ts index bd88af81b6..1c573bb2ca 100644 --- a/src/dialogs/generic/show-dialog-box.ts +++ b/src/dialogs/generic/show-dialog-box.ts @@ -1,6 +1,6 @@ import { fireEvent } from "../../common/dom/fire_event"; -interface AlertDialogParams { +export interface AlertDialogParams { confirmText?: string; text?: string; title?: string; From b082828a756810f01524b9d1ccc7e71dcca15f6a Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sat, 1 Feb 2020 08:11:57 -0800 Subject: [PATCH 08/64] Forward haptic events to parent window (#4719) --- hassio/src/addon-view/hassio-addon-info.ts | 4 ++++ hassio/src/hassio-main.ts | 9 ++++++++- src/components/ha-switch.ts | 12 +++++++++++- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/hassio/src/addon-view/hassio-addon-info.ts b/hassio/src/addon-view/hassio-addon-info.ts index c31de13b80..947ac651dc 100644 --- a/hassio/src/addon-view/hassio-addon-info.ts +++ b/hassio/src/addon-view/hassio-addon-info.ts @@ -319,6 +319,7 @@ class HassioAddonInfo extends LitElement {
@@ -326,6 +327,7 @@ class HassioAddonInfo extends LitElement {
${this.addon.ingress @@ -336,6 +338,7 @@ class HassioAddonInfo extends LitElement { @change=${this._panelToggled} .checked=${this.addon.ingress_panel} .disabled=${this._computeCannotIngressSidebar} + haptic > ${this._computeCannotIngressSidebar ? html` @@ -363,6 +366,7 @@ class HassioAddonInfo extends LitElement {
` diff --git a/hassio/src/hassio-main.ts b/hassio/src/hassio-main.ts index 8369eeb4e4..d8f9cca73f 100644 --- a/hassio/src/hassio-main.ts +++ b/hassio/src/hassio-main.ts @@ -76,7 +76,6 @@ class HassioMain extends ProvideHassLitMixin(HassRouterPage) { }, }, }; - @property() private _supervisorInfo: HassioSupervisorInfo; @property() private _hostInfo: HassioHostInfo; @property() private _hassOsInfo?: HassioHassOSInfo; @@ -111,6 +110,14 @@ class HassioMain extends ProvideHassLitMixin(HassRouterPage) { }) ); + // Forward haptic events to parent window. + window.addEventListener("haptic", (ev) => { + // @ts-ignore + fireEvent(window.parent, ev.type, ev.detail, { + bubbles: false, + }); + }); + makeDialogManager(this, document.body); } diff --git a/src/components/ha-switch.ts b/src/components/ha-switch.ts index 9426082439..349bc56d29 100644 --- a/src/components/ha-switch.ts +++ b/src/components/ha-switch.ts @@ -1,14 +1,19 @@ -import { customElement, CSSResult, css, query } from "lit-element"; +import { customElement, CSSResult, css, query, property } from "lit-element"; import "@material/mwc-switch"; import { style } from "@material/mwc-switch/mwc-switch-css"; // tslint:disable-next-line import { Switch } from "@material/mwc-switch"; import { Constructor } from "../types"; +import { forwardHaptic } from "../data/haptics"; // tslint:disable-next-line const MwcSwitch = customElements.get("mwc-switch") as Constructor; @customElement("ha-switch") export class HaSwitch extends MwcSwitch { + // Generate a haptic vibration. + // Only set to true if the new value of the switch is applied right away when toggling. + // Do not add haptic when a user is required to press save. + @property({ type: Boolean }) public haptic = false; @query("slot") private _slot!: HTMLSlotElement; protected firstUpdated() { @@ -22,6 +27,11 @@ export class HaSwitch extends MwcSwitch { Boolean(this._slot.assignedNodes().length) ); this._slot.addEventListener("click", () => (this.checked = !this.checked)); + this.addEventListener("change", () => { + if (this.haptic) { + forwardHaptic("light"); + } + }); } protected static get styles(): CSSResult[] { From f9d64e51c43e95b1e79366ed9727782312187a77 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Sun, 2 Feb 2020 00:32:38 +0000 Subject: [PATCH 09/64] [ci skip] Translation update --- translations/ko.json | 19 +++++- translations/nl.json | 133 +++++++++++++++++++++++++++++++++----- translations/zh-Hans.json | 11 ++++ translations/zh-Hant.json | 1 + 4 files changed, 146 insertions(+), 18 deletions(-) diff --git a/translations/ko.json b/translations/ko.json index fec9236c19..7681d43d83 100644 --- a/translations/ko.json +++ b/translations/ko.json @@ -1226,14 +1226,19 @@ "actions": { "caption": "뭔가 트리거 되었을 때...." }, + "automations": "자동화", "conditions": { "caption": "... 이면 자동화를 실행 (조건)" }, + "create": "기기로 자동화 구성하기", + "no_automations": "자동화 없음", + "no_device_automations": "이 기기에서 사용할 수 있는 자동화가 없습니다", "triggers": { "caption": "... 일 때 자동화를 실행 (트리거)" } }, "automations": "자동화", + "cant_edit": "UI 에서 작성된 항목만 편집할 수 있습니다.", "caption": "기기", "confirm_rename_entity_ids": "구성요소의 ID 이름 또한 바꾸시겠습니까?", "data_table": { @@ -1248,12 +1253,24 @@ "details": "기기의 모든 세부 정보는 다음과 같습니다.", "device_not_found": "기기를 찾을 수 없습니다.", "entities": { - "add_entities_lovelace": "Lovelace UI 에 모든 기기 구성요소 추가", + "add_entities_lovelace": "Lovelace 에 추가", "entities": "구성요소", "none": "이 기기는 구성요소가 없습니다" }, "info": "기기 정보", "name": "이름", + "scene": { + "create": "기기로 씬 구성하기", + "no_scenes": "씬 없음", + "scenes": "씬" + }, + "scenes": "씬", + "script": { + "create": "기기로 스크립트 작성하기", + "no_scripts": "스크립트 없음", + "scripts": "스크립트" + }, + "scripts": "스크립트", "unknown_error": "알 수 없는 오류", "unnamed_device": "이름이 없는 기기", "update": "업데이트" diff --git a/translations/nl.json b/translations/nl.json index 9b4509a5dc..75fea79622 100644 --- a/translations/nl.json +++ b/translations/nl.json @@ -560,7 +560,8 @@ "device-picker": { "clear": "Wis", "device": "Apparaat", - "show_devices": "Apparaten weergeven" + "show_devices": "Apparaten weergeven", + "toggle": "Omschakelen" }, "entity": { "entity-picker": { @@ -574,7 +575,14 @@ "no_history_found": "Geen geschiedenis gevonden" }, "related-items": { - "area": "Gebied" + "area": "Gebied", + "automation": "Onderdeel van de volgende automatiseringen", + "device": "Apparaat", + "entity": "Gerelateerde entiteiten", + "group": "Onderdeel van de volgende groepen", + "integration": "Integratie", + "scene": "Onderdeel van de volgende scènes", + "script": "Onderdeel van de volgende scripts" }, "relative_time": { "duration": { @@ -607,6 +615,7 @@ "title": "Domeinen in- en uitschakelen" }, "entity_registry": { + "dismiss": "Sluiten", "editor": { "confirm_delete": "Weet je zeker dat je dit item wilt verwijderen?", "delete": "VERWIJDEREN", @@ -618,7 +627,9 @@ "note": "Nota bene: dit werkt mogelijk nog niet met alle integraties.", "unavailable": "Deze entiteit is momenteel niet beschikbaar.", "update": "BIJWERKEN" - } + }, + "related": "Gerelateerd", + "settings": "instellingen" }, "generic": { "cancel": "Annuleren", @@ -627,6 +638,7 @@ }, "more_info_control": { "dismiss": "Dialoogvenster sluiten", + "edit": "Entiteit bewerken", "restored": { "confirm_remove_text": "Weet u zeker dat u dit item wilt verwijderen?", "confirm_remove_title": "Entiteit verwijderen?", @@ -635,7 +647,8 @@ "remove_intro": "Als de entiteit niet meer in gebruik is, kunt u deze opruimen door deze te verwijderen." }, "script": { - "last_action": "Laatste actie" + "last_action": "Laatste actie", + "last_triggered": "Voor het laatst uitgevoerd" }, "settings": "Entiteit instellingen", "sun": { @@ -675,6 +688,9 @@ "reconfigure": "Apparaat opnieuw configureren", "remove": "Verwijder apparaat" }, + "confirmations": { + "remove": "Weet u zeker dat u het apparaat wilt verwijderen?" + }, "last_seen": "Laatst gezien", "manuf": "door {manufacturer}", "no_area": "Geen Gebied", @@ -737,7 +753,7 @@ }, "no_areas": "Het lijkt erop dat je nog geen gebieden hebt!", "picker": { - "create_area": "MAAK GEBIED", + "create_area": "GEBIED MAKEN", "header": "Gebieden", "integrations_page": "Integratiespagina", "introduction": "Gebieden worden gebruikt om te bepalen waar apparaten zijn. Deze informatie wordt overal in de Home Assistant gebruikt om je te helpen bij het organiseren van je interface, machtigingen en integraties met andere systemen.", @@ -1005,6 +1021,7 @@ "manage_entities": "Entiteiten beheren", "security_devices": "Beveiligingsapparaten", "sync_entities": "Synchroniseer entiteiten met Google", + "sync_entities_404_message": "Kan uw entiteiten niet synchroniseren met Google, vraag Google 'Hey Google, synchroniseer mijn apparaten' om uw entiteiten te synchroniseren.", "title": "Google Assistant" }, "integrations": "Integraties", @@ -1141,6 +1158,7 @@ "core_config": { "edit_requires_storage": "Editor uitgeschakeld omdat de configuratie is opgeslagen in configuration.yaml", "elevation": "Hoogte", + "elevation_feet": "voet", "elevation_meters": "meter", "imperial_example": "Fahrenheit, ponden", "latitude": "Breedtegraad", @@ -1213,6 +1231,7 @@ }, "create": "Maak een automatisering aan met het apparaat", "no_automations": "Geen automatiseringen", + "no_device_automations": "Er zijn geen automatiseringen beschikbaar voor dit apparaat.", "triggers": { "caption": "Doe iets wanneer..." } @@ -1266,11 +1285,23 @@ "enabled_cause": "Uitgeschakeld vanwege {cause}", "enabled_description": "Uitgeschakelde entiteiten zullen niet aan Home Assistant worden toegevoegd", "enabled_label": "Schakel entiteit in", + "entity_id": "Entiteits-ID", + "name": "Naam overschrijven", "note": "Nota bene: dit werkt mogelijk nog niet met alle integraties.", "unavailable": "Deze entiteit is momenteel niet beschikbaar.", "update": "BIJWERKEN" }, "picker": { + "disable_selected": { + "button": "Geselecteerde uitschakelen", + "confirm_text": "Uitgeschakelde entiteiten zullen niet aan Home Assistant worden toegevoegd", + "confirm_title": "Wilt je {number} entiteiten uitschakelen?" + }, + "enable_selected": { + "button": "Geselecteerde inschakelen", + "confirm_text": "Dit maakt ze weer beschikbaar in Home Assistant als ze nu zijn uitgeschakeld.", + "confirm_title": "Wilt je {number} entiteiten inschakelen?" + }, "filter": { "filter": "filter", "show_disabled": "Uitgeschakelde entiteiten weergeven", @@ -1281,17 +1312,22 @@ "enabled": "Ingeschakeld", "entity_id": "Entiteits-ID", "integration": "Integratie", - "name": "Naam" + "name": "Naam", + "status": "Status" }, "integrations_page": "Integratiespagina", "introduction": "Home Assistant houdt een register bij van elke entiteit die het ooit heeft gezien en die uniek kan worden geïdentificeerd. Elk van deze entiteiten krijgt een entiteit-ID toegewezen die alleen voor deze entiteit wordt gereserveerd.", "introduction2": "Gebruik het entiteitenregister om de naam te overschrijven, de entiteits-ID te wijzigen of het item te verwijderen uit Home Assistant. Opmerking: als u de entiteitsregistervermelding verwijdert, wordt de entiteit niet verwijderd. Hiertoe volgt u de onderstaande koppeling en verwijdert u deze van de integratiespagina.", "remove_selected": { - "button": "Verwijder geselecteerde" + "button": "Verwijder geselecteerde", + "confirm_text": "Entiteiten kunnen alleen worden verwijderd wanneer de integratie de entiteiten niet langer levert.", + "confirm_title": "Wilt je {number} entiteiten verwijderen?" }, + "selected": "{number} geselecteerd", "show_disabled": "Uitgeschakelde entiteiten weergeven", "status": { "disabled": "Uitgeschakeld", + "ok": "OK", "unavailable": "Onbeschikbaar" }, "unavailable": "(niet beschikbaar)" @@ -1323,6 +1359,7 @@ "area_picker_label": "Gebied", "close": "Sluiten", "created_config": "Configuratie gemaakt voor {name}.", + "dismiss": "Dialoogvenster sluiten", "error_saving_area": "Fout bij het opslaan van gebied: {error}", "external_step": { "description": "Deze stap vereist dat je een externe website bezoekt om dit te voltooien.", @@ -1460,8 +1497,10 @@ "group": "Herlaad groepen", "heading": "Configuratie herladen", "introduction": "Sommige delen van Home Assistant kunnen opnieuw worden geladen zonder dat een herstart vereist is. Als je herladen gebruikt, wordt de huidige configuratie leeggemaakt en wordt de nieuwe geladen.", + "person": "Herlaad personen", "scene": "Herlaad scenes", - "script": "Herlaad scripts" + "script": "Herlaad scripts", + "zone": "Herlaad zones" }, "server_management": { "confirm_restart": "Weet je zeker dat je Home Assistant opnieuw wilt starten?", @@ -1521,10 +1560,14 @@ "search_again": "Opnieuw zoeken", "spinner": "Zoeken naar ZHA Zigbee-apparaten ..." }, + "add": { + "caption": "Apparaten toevoegen", + "description": "Voeg apparaten toe aan het Zigbee netwerk" + }, "caption": "ZHA", "cluster_attributes": { "attributes_of_cluster": "Attributen van het geselecteerde cluster", - "get_zigbee_attribute": "Haal de Zigbee attribuut op", + "get_zigbee_attribute": "Haal Zigbee attribuut op", "header": "Cluster Attributen", "help_attribute_dropdown": "Selecteer een attribuut om deze te bekijken of de waarde in te stellen", "help_get_zigbee_attribute": "Haal de waarde voor de geselecteerde attribuut op", @@ -1537,10 +1580,12 @@ "header": "Cluster commando's", "help_command_dropdown": "Selecteer een commando om mee te communiceren.", "introduction": "Bekijk en geef opdrachten voor clustercommando's.", - "issue_zigbee_command": "Geef Zigbee Command uit" + "issue_zigbee_command": "Zigbee opdracht uitvoeren" }, "clusters": { - "help_cluster_dropdown": "Selecteer een cluster om attributen en commando's te bekijken." + "header": "Clusters", + "help_cluster_dropdown": "Selecteer een cluster om attributen en commando's te bekijken.", + "introduction": "Clusters zijn de bouwstenen voor Zigbee-functionaliteit. Ze scheiden functionaliteit in logische eenheden. Er zijn client- en servertypen en deze bestaan uit attributen en opdrachten." }, "common": { "add_devices": "Apparaten toevoegen", @@ -1555,17 +1600,49 @@ "device_name_placeholder": "Door gebruiker ingegeven naam", "update_name_button": "Naam bijwerken" }, + "devices": { + "header": "Zigbee Home Automation - Apparaat" + }, + "group_binding": { + "bind_button_help": "Koppel de geselecteerde groep van de geselecteerde apparaatclusters.", + "bind_button_label": "Koppel groep", + "cluster_selection_help": "Selecteer clusters om aan de geselecteerde groep te koppelen.", + "group_picker_help": "Selecteer een groep om een koppel opdracht uit te voeren.", + "group_picker_label": "Te koppelen groepen", + "header": "Group koppelingen", + "introduction": "Groepen koppelen en ontkoppelen", + "unbind_button_help": "Ontkoppel de geselecteerde groep van de geselecteerde apparaatclusters.", + "unbind_button_label": "Ontkoppel groep" + }, "groups": { + "add_members": "Leden toevoegen", + "adding_members": "Leden toevoegen", + "caption": "Groepen", + "create": "Groep maken", "create_group": "Zigbee Home Automation - Aanmaken groep", + "create_group_details": "Voer de vereiste gegevens in om een nieuwe Zigbee groep te maken", + "creating_group": "Groep aanmaken", + "description": "Maak en wijzig Zigbee groepen", + "group_details": "Hier zijn alle details voor de geselecteerde Zigbee groep.", "group_id": "Groep", "group_info": "Groepsinformatie", + "group_name_placeholder": "Groepsnaam", + "group_not_found": "Groep niet gevonden!", + "group-header": "Zigbee Home Automation - Groepsdetails", "groups": "groepen", + "groups-header": "Zigbee Home Automation - Groepsbeheer", "header": "Zigbee Home Automation - Groepsbeheer", - "introduction": "Maak en verwijder zigbee groepen", + "introduction": "Maak en verwijder Zigbee groepen", + "manage_groups": "Beheer Zigbee Groepen", "members": "Leden", "remove_groups": "verwijder groepen", - "removing_groups": "groepen verwijderen" + "remove_members": "Leden verwijderen", + "removing_groups": "groepen verwijderen", + "removing_members": "Leden verwijderen", + "zha_zigbee_groups": "ZHA Zigbee Groepen" }, + "header": "Configureer Zigbee Home Automation", + "introduction": "Hier kun je het ZHA component configureren. Het is nog niet mogelijk om alles te configureren vanuit de interface, maar we werken er aan.", "network_management": { "header": "Netwerkbeheer", "introduction": "Commando's die het hele netwerk beïnvloeden" @@ -1581,19 +1658,34 @@ "reconfigure": "Herconfigureer het ZHA-apparaat (heal device). Gebruik dit als je problemen hebt met het apparaat. Als het een apparaat met batterij is, zorg dan dat het wakker is en commando's accepteert wanneer je deze service gebruikt.", "remove": "Verwijder een apparaat uit het Zigbee-netwerk.", "updateDeviceName": "Stel een aangepaste naam in voor dit apparaat in het apparaatregister." - } + }, + "title": "Zigbee Home Automation" }, "zone": { + "add_zone": "Zone toevoegen", + "caption": "Zones", "configured_in_yaml": "Zones die via configuration.yaml zijn geconfigureerd kunnen niet worden bewerkt in de gebruikrs", + "confirm_delete": "Weet je zeker dat je deze zone wilt verwijderen?", + "create_zone": "Creëer Zone", + "description": "Beheer de zones waarin u personen wilt volgen.", "detail": { "create": "Aanmaken", "delete": "Verwijder", + "icon": "Pictogram", + "icon_error_msg": "Het pictogram moet de volgende opmaak hebben voorvoegsel:pictogramnaam, bijvoorbeeld: mdi:home", + "latitude": "Breedtegraad", + "longitude": "Lengtegraad", + "name": "Naam", + "new_zone": "Nieuwe zone", "passive": "Passief", "passive_note": "Passieve zones zijn verborgen in het frontend en worden niet gebruikt als locaties voor apparaat trackers. Dit is handig als je de zone wilt gebruiken voor automatiseringen.", + "radius": "Straal", "required_error_msg": "Dit veld is verplicht", "update": "Bijwerken" }, - "edit_home_zone": "De locatie van je huis kan worden gewijzigd bij de algemene configuratie" + "edit_home_zone": "De locatie van je huis kan worden gewijzigd bij de algemene configuratie", + "introduction": "Met zones kunt u bepaalde regio's op aarde opgeven. Wanneer een persoon zich in een zone bevindt, dan wordt de staat de naam uit de zone. Zones kunnen ook worden gebruikt als trigger of voorwaarde in automatiseringen.", + "no_zones_created_yet": "Het lijkt erop dat je nog geen zones hebt aangemaakt." }, "zwave": { "caption": "Z-Wave", @@ -1787,6 +1879,9 @@ "no_devices": "Op deze pagina kun je je apparaten bedienen, maar het lijkt er op dat je nog geen apparaten hebt ingesteld. Ga naar de integraties pagina om te beginnen.", "title": "Welkom thuis" }, + "entities": { + "never_triggered": "Nooit uitgevoerd" + }, "picture-elements": { "call_service": "Roep service {name} aan", "hold": "Vasthouden:", @@ -1917,6 +2012,7 @@ "name": "Sensor" }, "shopping-list": { + "integration_not_loaded": "Voor deze kaart moet de integratie 'shopping_list' zijn ingesteld.", "name": "Boodschappenlijst" }, "thermostat": { @@ -1945,7 +2041,7 @@ }, "edit_lovelace": { "edit_title": "Wijzig titel", - "explanation": "Deze titel wordt vooral weergegeven in al je weergaven in Lovelace.", + "explanation": "Deze titel wordt getoond in al je Lovelace weergaven.", "header": "Titel van je Lovelace UI" }, "edit_view": { @@ -1975,6 +2071,7 @@ "confirm_unsaved_comments": "Uw configuratie bevat commentaren, deze worden niet opgeslagen. Wil je doorgaan?", "error_invalid_config": "Uw configuratie is niet geldig: {error}", "error_parse_yaml": "Kan YAML niet parseren: {error}", + "error_remove": "Kan configuratie niet verwijderen: {error}", "error_save_yaml": "Kan YAML niet opslaan: {error}", "header": "Configuratie bewerken", "save": "Opslaan", @@ -1990,7 +2087,8 @@ }, "suggest_card": { "add": "Voeg toe aan de Lovelace gebruikersinterface", - "create_own": "Kies een andere kaart" + "create_own": "Kies een andere kaart", + "header": "We hebben een suggestie voor u gemaakt" }, "view": { "panel_mode": { @@ -2229,6 +2327,7 @@ "link_promo": "Help met vertalen" }, "logout": "Uitloggen", + "logout_text": "Weet je zeker dat je wilt uitloggen?", "logout_title": "Afmelden?", "long_lived_access_tokens": { "confirm_delete": "Weet je zeker dat je de toegangstoken voor {name} wilt verwijderen?", diff --git a/translations/zh-Hans.json b/translations/zh-Hans.json index fe5e8257ee..507dfd7355 100644 --- a/translations/zh-Hans.json +++ b/translations/zh-Hans.json @@ -1566,6 +1566,17 @@ "device_name_placeholder": "用户指定的名称", "update_name_button": "更新名称" }, + "group_binding": { + "bind_button_help": "将选定的组绑定到所选的设备集群。", + "bind_button_label": "绑定组", + "cluster_selection_help": "选择要绑定到所选组的集群。", + "group_picker_help": "选择一个组来进行绑定。", + "group_picker_label": "可绑定的组", + "header": "组绑定", + "introduction": "绑定和取消绑定组。", + "unbind_button_help": "从选定的设备集群中取消绑定选定的组。", + "unbind_button_label": "取消绑定组" + }, "network_management": { "header": "网络管理", "introduction": "影响整个网络的命令" diff --git a/translations/zh-Hant.json b/translations/zh-Hant.json index 959386c3f0..f69e4f10ff 100644 --- a/translations/zh-Hant.json +++ b/translations/zh-Hant.json @@ -1232,6 +1232,7 @@ }, "create": "以設備新增自動化", "no_automations": "沒有自動化", + "no_device_automations": "該設備沒有任何自動化可使用。", "triggers": { "caption": "執行動作、當..." } From 3fdcc1c0ea1e6121e7b5d6f96fcb6d7e1d449a93 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Mon, 3 Feb 2020 00:32:48 +0000 Subject: [PATCH 10/64] [ci skip] Translation update --- translations/ca.json | 1 + translations/de.json | 10 +++++----- translations/el.json | 40 ++++++++++++++++++++++++++++++++++++++-- translations/fi.json | 15 +++++++++++++++ translations/it.json | 31 ++++++++++++++++++++++++------- translations/nl.json | 9 +++++---- 6 files changed, 88 insertions(+), 18 deletions(-) diff --git a/translations/ca.json b/translations/ca.json index 660d9210df..363ecd98c8 100644 --- a/translations/ca.json +++ b/translations/ca.json @@ -1185,6 +1185,7 @@ "caption": "Només fer alguna cosa si..." }, "no_automations": "No hi ha automatitzacions", + "no_device_automations": "No hi ha automatitzacions disponibles per a aquest dispositiu.", "triggers": { "caption": "Feu alguna cosa quan..." } diff --git a/translations/de.json b/translations/de.json index 323dd4d2ea..355d7ca9a6 100644 --- a/translations/de.json +++ b/translations/de.json @@ -400,9 +400,9 @@ }, "card": { "alarm_control_panel": { - "arm_away": "Aktivieren, unterwegs", + "arm_away": "Aktivieren - Unterwegs", "arm_custom_bypass": "Benutzerdefinierter Bypass", - "arm_home": "Aktivieren, Zuhause", + "arm_home": "Aktivieren - Zuhause", "arm_night": "Nacht aktiviert", "armed_custom_bypass": "Benutzerdefinierter Bypass", "clear_code": "Löschen", @@ -817,7 +817,7 @@ "delete_confirm": "Möchten Sie das wirklich löschen?", "duplicate": "Duplizieren", "header": "Bedingungen", - "introduction": "Bedingungen sind ein optionaler Bestandteil bei automatisierten Abläufen und können das Ausführen einer Aktion verhindern. Bedingungen sind Auslösern ähnlich, aber dennoch verschieden. Ein Auslöser beobachtet im System ablaufende Ereignisse, wohingegen Bedingungen nur den aktuellen Systemzustand betrachten. Ein Auslöser kann beobachten, ob ein Schalter aktiviert wird. Eine Bedingung kann lediglich sehen, ob ein Schalter aktuell an oder aus ist.", + "introduction": "Die Bedingungen sind optional und verhindern die weitere Ausführung, sofern nicht alle Bedingungen erfüllt sind.", "learn_more": "Erfahre mehr über Bedingungen", "name": "Zustand", "type_select": "Bedingungstyp", @@ -1253,7 +1253,7 @@ "details": "Hier sind alle Details deines Geräts.", "device_not_found": "Gerät nicht gefunden.", "entities": { - "add_entities_lovelace": "Alle Geräte-Entitäten zu Lovelace hinzufügen", + "add_entities_lovelace": "Zu Lovelace hinzufügen", "entities": "Entitäten", "none": "Dieses Gerät hat keine Entitäten" }, @@ -2106,7 +2106,7 @@ "refresh": "Aktualisieren", "unused_entities": "Ungenutzte Elemente" }, - "reload_lovelace": "Lovelace neu laden", + "reload_lovelace": "Benutzeroberfläche neu laden", "unused_entities": { "available_entities": "Dies sind die Entitäten, die Sie zur Verfügung haben, die aber noch nicht in Ihrer Lovelace-Benutzeroberfläche enthalten sind.", "domain": "Domain", diff --git a/translations/el.json b/translations/el.json index 3914ad19e0..1d6d9aa145 100644 --- a/translations/el.json +++ b/translations/el.json @@ -543,10 +543,24 @@ "yes": "Ναι" }, "components": { + "area-picker": { + "add_dialog": { + "add": "Προσθήκη", + "failed_create_area": "Αποτυχία δημιουργίας περιοχής.", + "name": "Όνομα", + "text": "Εισάγετε το όνομα της νέας περιοχής.", + "title": "Προσθήκη νέας περιοχής" + }, + "add_new": "Προσθήκη νέας περιοχής...", + "area": "Περιοχή", + "clear": "Εκκαθάριση", + "show_areas": "Εμφάνιση περιοχών" + }, "device-picker": { "clear": "Καθαρός", "device": "Συσκευή", - "show_devices": "Εμφάνιση συσκευών" + "show_devices": "Εμφάνιση συσκευών", + "toggle": "Εναλλαγή" }, "entity": { "entity-picker": { @@ -597,6 +611,11 @@ "unavailable": "Αυτή η οντότητα δεν είναι προς το παρόν διαθέσιμη." } }, + "generic": { + "cancel": "Ακύρωση", + "default_confirmation_title": "Είστε σίγουροι;", + "ok": "Εντάξει" + }, "more_info_control": { "dismiss": "Κλείσιμο διαλόγου.", "script": { @@ -1172,14 +1191,19 @@ "actions": { "caption": "Όταν ενεργοποιείται κάτι…" }, + "automations": "Αυτοματισμοί", "conditions": { "caption": "Κάνε κάτι μόνο αν…" }, + "create": "Δημιουργία αυτοματισμού με τη συσκευή", + "no_automations": "Δεν υπάρχουν αυτοματισμοί", + "no_device_automations": "Δεν υπάρχουν διαθέσιμοι αυτοματισμοί για αυτήν τη συσκευή.", "triggers": { "caption": "Κάνε κάτι όταν…" } }, "automations": "Αυτοματισμοί", + "cant_edit": "Μπορείτε να επεξεργαστείτε μόνο στοιχεία που έχουν δημιουργηθεί στο UI.", "caption": "Συσκευές", "confirm_rename_entity_ids": "Θέλετε επίσης να μετονομάσετε τα αναγνωριστικά οντότητας των οντοτήτων σας;", "data_table": { @@ -1194,8 +1218,16 @@ "details": "Δείτε όλες τις λεπτομέρειες της συσκευής σας.", "device_not_found": "Η συσκευή δε βρέθηκε.", "info": "Πληροφορίες συσκευής", + "name": "Όνομα", + "scene": { + "create": "Δημιουργία σκηνής με τη συσκευή", + "no_scenes": "Δεν υπάρχουν σκηνές", + "scenes": "Σκηνές" + }, + "scenes": "Σκηνές", "unknown_error": "Άγνωστο σφάλμα", - "unnamed_device": "Συσκευή χωρίς όνομα" + "unnamed_device": "Συσκευή χωρίς όνομα", + "update": "Ενημέρωση" }, "entities": { "caption": "Μητρώο οντοτήτων", @@ -1502,6 +1534,9 @@ "updateDeviceName": "Ορίστε ένα προσαρμοσμένο όνομα γι αυτήν τη συσκευή στο μητρώο συσκευών." } }, + "zone": { + "edit_home_zone": "Η τοποθεσία του σπιτιού σας μπορεί να αλλαχτεί από τις γενικές ρυθμίσεις." + }, "zwave": { "caption": "Z-Wave", "common": { @@ -2102,6 +2137,7 @@ "profile": { "advanced_mode": { "description": "εξειδικευμένη λειτουργία", + "link_promo": "Μάθετε περισσότερα", "title": "Εξειδικευμένη λειτουργία" }, "change_password": { diff --git a/translations/fi.json b/translations/fi.json index 537583fdbf..dc64f0ded6 100644 --- a/translations/fi.json +++ b/translations/fi.json @@ -1040,7 +1040,11 @@ }, "devices": { "area_picker_label": "Alue", + "automation": { + "no_device_automations": "Tälle laitteelle ei ole käytettävissä automaatioita." + }, "automations": "Automaatiot", + "cant_edit": "Voit muokata vain käyttöliittymässä luotuja kohteita.", "caption": "Laitteet", "data_table": { "area": "Alue", @@ -1054,6 +1058,17 @@ "details": "Tässä ovat kaikki laitteesi tiedot.", "device_not_found": "Laitetta ei löydy.", "info": "Laitteen tiedot", + "scene": { + "create": "Luo tilanne laitteella", + "no_scenes": "Ei tilanteita", + "scenes": "Tilanteet" + }, + "scenes": "Tilanteet", + "script": { + "create": "Luo tilanne laitteella", + "no_scripts": "Ei skriptejä" + }, + "scripts": "Skriptit", "unknown_error": "Tuntematon virhe", "unnamed_device": "Nimeämätön laite" }, diff --git a/translations/it.json b/translations/it.json index 4d341fa469..bdccf787ae 100644 --- a/translations/it.json +++ b/translations/it.json @@ -109,17 +109,17 @@ "armed_custom_bypass": "Attivo", "armed_home": "Attivo", "armed_night": "Attivo", - "arming": "Attiva", - "disarmed": "Disattiva", - "disarming": "Disattiva", - "pending": "In attesa", + "arming": "Attivando", + "disarmed": "Disattivo", + "disarming": "Disattivando", + "pending": "Attende", "triggered": "Attiv." }, "default": { "entity_not_found": "Entità non trovata!", "error": "Errore", - "unavailable": "Non Disponibile", - "unknown": "Sconosciuto" + "unavailable": "Non Disp.", + "unknown": "Ignoto" }, "device_tracker": { "home": "In Casa", @@ -1226,14 +1226,19 @@ "actions": { "caption": "Quando qualcosa si attiva..." }, + "automations": "Automazioni", "conditions": { "caption": "Fai qualcosa solo se..." }, + "create": "Crea l'Automazione con il dispositivo", + "no_automations": "Nessuna Automazione", + "no_device_automations": "Non ci sono Automazioni disponibili per questo dispositivo.", "triggers": { "caption": "Fai qualcosa quando..." } }, "automations": "Automazioni", + "cant_edit": "È possibile modificare solo gli elementi creati nell'Interfaccia Utente.", "caption": "Dispositivi", "confirm_rename_entity_ids": "Vuoi anche rinominare gli ID entità delle tue entità?", "data_table": { @@ -1254,6 +1259,18 @@ }, "info": "Informazioni sul dispositivo", "name": "Nome", + "scene": { + "create": "Crea una Scena con il dispositivo", + "no_scenes": "Nessuna Scena", + "scenes": "Scene" + }, + "scenes": "Scene", + "script": { + "create": "Crea uno Script con il dispositivo", + "no_scripts": "Nessuno Script", + "scripts": "Script" + }, + "scripts": "Script", "unknown_error": "Errore sconosciuto", "unnamed_device": "Dispositivo senza nome", "update": "Aggiorna" @@ -1668,7 +1685,7 @@ "update": "Aggiorna" }, "edit_home_zone": "La posizione della tua casa può essere cambiata nella configurazione generale.", - "introduction": "Le zone ti consentono di specificare determinate regioni sulla terra. Quando una persona si trova all'interno di una zona, lo stato prenderà il nome dalla zona. Le zone possono anche essere utilizzate come trigger o condizioni all'interno delle impostazioni di automazione.", + "introduction": "Le Zone consentono di specificare determinate regioni sulla Terra. Quando una persona si trova all'interno di una Zona, nel suo Stato ci sarà il nome dalla Zona. Le Zone possono anche essere utilizzate come Attivazioni (o Triggers) o Condizioni all'interno delle impostazioni di Automazione.", "no_zones_created_yet": "Sembra che tu non abbia ancora creato nessuna zona." }, "zwave": { diff --git a/translations/nl.json b/translations/nl.json index 75fea79622..5ab0162200 100644 --- a/translations/nl.json +++ b/translations/nl.json @@ -615,6 +615,7 @@ "title": "Domeinen in- en uitschakelen" }, "entity_registry": { + "control": "Bediening", "dismiss": "Sluiten", "editor": { "confirm_delete": "Weet je zeker dat je dit item wilt verwijderen?", @@ -816,7 +817,7 @@ "delete_confirm": "Zeker weten dat je wilt verwijderen?", "duplicate": "Dupliceren", "header": "Voorwaarden", - "introduction": "Voorwaarden zijn een optioneel onderdeel van een automatiseringsregel en kunnen worden gebruikt om te voorkomen dat een actie plaatsvindt wanneer deze wordt geactiveerd. Voorwaarden lijken erg op triggers, maar zijn verschillend. Een trigger zal kijken naar gebeurtenissen die in het systeem plaatsvinden, terwijl een voorwaarde alleen kijkt naar hoe het systeem er op dit moment uitziet. Een trigger kan waarnemen dat een schakelaar wordt ingeschakeld. Een voorwaarde kan alleen zien of een schakelaar aan of uit staat.", + "introduction": "Voorwaarden zijn optioneel en verhinderen verdere uitvoering tenzij aan alle voorwaarden is voldaan.", "learn_more": "Meer informatie over condities", "name": "Voorwaarde", "type_select": "Type voorwaarde", @@ -1317,7 +1318,7 @@ }, "integrations_page": "Integratiespagina", "introduction": "Home Assistant houdt een register bij van elke entiteit die het ooit heeft gezien en die uniek kan worden geïdentificeerd. Elk van deze entiteiten krijgt een entiteit-ID toegewezen die alleen voor deze entiteit wordt gereserveerd.", - "introduction2": "Gebruik het entiteitenregister om de naam te overschrijven, de entiteits-ID te wijzigen of het item te verwijderen uit Home Assistant. Opmerking: als u de entiteitsregistervermelding verwijdert, wordt de entiteit niet verwijderd. Hiertoe volgt u de onderstaande koppeling en verwijdert u deze van de integratiespagina.", + "introduction2": "Gebruik het entiteitenregister om de naam te overschrijven, de entiteits-ID te wijzigen of het item te verwijderen uit Home Assistant.", "remove_selected": { "button": "Verwijder geselecteerde", "confirm_text": "Entiteiten kunnen alleen worden verwijderd wanneer de integratie de entiteiten niet langer levert.", @@ -2081,7 +2082,7 @@ "save_config": { "cancel": "Laat maar", "header": "Neem de controle over je Lovelace UI", - "para": "Normaal gesproken onderhoudt Home Assistant je gebruikersinterface en update die met nieuwe entiteiten of Lovelace-onderdelen wanneer deze beschikbaar zijn. Als je het beheer overneemt, zullen we niet langer automatisch wijzigingen aanbrengen.", + "para": "Home Assistant onderhoudt je gebruikersinterface en update die met nieuwe entiteiten of Lovelace-onderdelen wanneer deze beschikbaar zijn. Als je het beheer overneemt, zullen we niet langer automatisch wijzigingen aanbrengen.", "para_sure": "Weet je zeker dat je de controle wilt over je gebruikersinterface?", "save": "Neem over" }, @@ -2303,7 +2304,7 @@ }, "profile": { "advanced_mode": { - "description": "Home Assistant verbergt standaard geavanceerde functies en opties. U kunt deze functies toegankelijk maken door deze schakelaar aan te zetten. Dit is een gebruikersspecifieke instelling en heeft geen invloed op andere gebruikers die Home Assistant gebruiken.", + "description": "Ontgrendelt geavanceerde functies.", "link_promo": "Meer informatie", "title": "Geavanceerde modus" }, From cbe4782d788692b6b4e90799804a8bdfb400df5c Mon Sep 17 00:00:00 2001 From: "David F. Mulcahey" Date: Mon, 3 Feb 2020 03:29:13 -0500 Subject: [PATCH 11/64] fix loading groups (#4727) --- src/panels/config/zha/zha-device-page.ts | 25 +----------------------- 1 file changed, 1 insertion(+), 24 deletions(-) diff --git a/src/panels/config/zha/zha-device-page.ts b/src/panels/config/zha/zha-device-page.ts index ebda46f890..c1c9a8f9fa 100755 --- a/src/panels/config/zha/zha-device-page.ts +++ b/src/panels/config/zha/zha-device-page.ts @@ -44,23 +44,6 @@ export class ZHADevicePage extends LitElement { @property() private _bindableDevices: ZHADevice[] = []; @property() private _groups: ZHAGroup[] = []; - private _firstUpdatedCalled: boolean = false; - - public connectedCallback(): void { - super.connectedCallback(); - if (this.hass && this._firstUpdatedCalled) { - this._fetchGroups(); - } - } - - protected firstUpdated(changedProperties: PropertyValues): void { - super.firstUpdated(changedProperties); - if (this.hass) { - this._fetchGroups(); - } - this._firstUpdatedCalled = true; - } - protected updated(changedProperties: PropertyValues): void { if (changedProperties.has("ieee")) { this._fetchData(); @@ -148,16 +131,10 @@ export class ZHADevicePage extends LitElement { sortZHADevices ) : []; + this._groups = (await fetchGroups(this.hass!)).sort(sortZHAGroups); } } - private async _fetchGroups() { - this._groups = - this.device && this.device.device_type !== "Coordinator" - ? (await fetchGroups(this.hass!)).sort(sortZHAGroups) - : []; - } - static get styles(): CSSResult[] { return [ haStyle, From ad676d7fd3347a3325c35e03cb71cc53ee40d99f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Mon, 3 Feb 2020 09:30:20 +0100 Subject: [PATCH 12/64] Fix theme on sensor card (#4724) --- src/panels/lovelace/cards/hui-sensor-card.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/panels/lovelace/cards/hui-sensor-card.ts b/src/panels/lovelace/cards/hui-sensor-card.ts index 9c5e693466..636481b4bc 100644 --- a/src/panels/lovelace/cards/hui-sensor-card.ts +++ b/src/panels/lovelace/cards/hui-sensor-card.ts @@ -285,7 +285,7 @@ class HuiSensorCard extends LitElement implements LovelaceCard { protected updated(changedProps: PropertyValues) { super.updated(changedProps); - if (!this._config || this._config.graph !== "line" || !this.hass) { + if (!this._config || !this.hass) { return; } @@ -303,11 +303,13 @@ class HuiSensorCard extends LitElement implements LovelaceCard { applyThemesOnElement(this, this.hass.themes, this._config!.theme); } - const minute = 60000; - if (changedProps.has("_config")) { - this._getHistory(); - } else if (Date.now() - this._date!.getTime() >= minute) { - this._getHistory(); + if (this._config.graph === "line") { + const minute = 60000; + if (changedProps.has("_config")) { + this._getHistory(); + } else if (Date.now() - this._date!.getTime() >= minute) { + this._getHistory(); + } } } From 24c591fbf3da780ea33d60eece65d3b378728baa Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 3 Feb 2020 02:06:47 -0800 Subject: [PATCH 13/64] Convert Hass.io add-on options to YAML (#4717) * Convert Hass.io options to YAML * Fix yaml editors on other places * Update ha-automation-action-service.ts Co-authored-by: Bram Kragten --- hassio/src/addon-view/hassio-addon-config.ts | 40 ++++++++++++------- src/components/ha-yaml-editor.ts | 12 +++--- .../action/ha-automation-action-row.ts | 5 ++- .../types/ha-automation-action-event.ts | 6 ++- .../types/ha-automation-action-service.ts | 6 ++- .../ha-automation-condition-editor.ts | 5 ++- .../trigger/ha-automation-trigger-row.ts | 5 ++- .../types/ha-automation-trigger-event.ts | 6 ++- .../card-editor/hui-dialog-suggest-card.ts | 4 +- 9 files changed, 61 insertions(+), 28 deletions(-) diff --git a/hassio/src/addon-view/hassio-addon-config.ts b/hassio/src/addon-view/hassio-addon-config.ts index 5d36267a81..95f821cfea 100644 --- a/hassio/src/addon-view/hassio-addon-config.ts +++ b/hassio/src/addon-view/hassio-addon-config.ts @@ -10,6 +10,7 @@ import { property, PropertyValues, TemplateResult, + query, } from "lit-element"; import { HomeAssistant } from "../../../src/types"; @@ -20,30 +21,41 @@ import { } from "../../../src/data/hassio/addon"; import { hassioStyle } from "../resources/hassio-style"; import { haStyle } from "../../../src/resources/styles"; -import { PolymerChangedEvent } from "../../../src/polymer-types"; import { fireEvent } from "../../../src/common/dom/fire_event"; +import "../../../src/components/ha-yaml-editor"; +// tslint:disable-next-line: no-duplicate-imports +import { HaYamlEditor } from "../../../src/components/ha-yaml-editor"; @customElement("hassio-addon-config") class HassioAddonConfig extends LitElement { @property() public hass!: HomeAssistant; @property() public addon!: HassioAddonDetails; @property() private _error?: string; - @property() private _config!: string; @property({ type: Boolean }) private _configHasChanged = false; + @query("ha-yaml-editor") private _editor!: HaYamlEditor; + protected render(): TemplateResult { + const editor = this._editor; + // If editor not rendered, don't show the error. + const valid = editor ? editor.isValid : true; + return html`
+ ${this._error ? html`
${this._error}
` : ""} - + ${valid + ? "" + : html` +
Invalid YAML
+ `}
@@ -51,7 +63,7 @@ class HassioAddonConfig extends LitElement { Save @@ -77,7 +89,7 @@ class HassioAddonConfig extends LitElement { } .errors { color: var(--google-red-500); - margin-bottom: 16px; + margin-top: 16px; } iron-autogrow-textarea { width: 100%; @@ -93,15 +105,13 @@ class HassioAddonConfig extends LitElement { protected updated(changedProperties: PropertyValues): void { super.updated(changedProperties); if (changedProperties.has("addon")) { - this._config = JSON.stringify(this.addon.options, null, 2); + this._editor.setValue(this.addon.options); } } - private _configChanged(ev: PolymerChangedEvent): void { - this._config = - ev.detail.value || JSON.stringify(this.addon.options, null, 2); - this._configHasChanged = - this._config !== JSON.stringify(this.addon.options, null, 2); + private _configChanged(): void { + this._configHasChanged = true; + this.requestUpdate(); } private async _resetTapped(): Promise { @@ -129,7 +139,7 @@ class HassioAddonConfig extends LitElement { this._error = undefined; try { data = { - options: JSON.parse(this._config), + options: this._editor.value, }; } catch (err) { this._error = err; diff --git a/src/components/ha-yaml-editor.ts b/src/components/ha-yaml-editor.ts index a07297b365..a637a28cc3 100644 --- a/src/components/ha-yaml-editor.ts +++ b/src/components/ha-yaml-editor.ts @@ -21,9 +21,10 @@ const isEmpty = (obj: object) => { @customElement("ha-yaml-editor") export class HaYamlEditor extends LitElement { @property() public value?: any; + @property() public defaultValue?: any; @property() public isValid = true; @property() public label?: string; - @property() private _yaml?: string; + @property() private _yaml: string = ""; @query("ha-code-editor") private _editor?: HaCodeEditor; public setValue(value) { @@ -40,7 +41,9 @@ export class HaYamlEditor extends LitElement { } protected firstUpdated() { - this.setValue(this.value); + if (this.defaultValue) { + this.setValue(this.defaultValue); + } } protected render() { @@ -71,7 +74,6 @@ export class HaYamlEditor extends LitElement { if (value) { try { parsed = safeLoad(value); - isValid = true; } catch (err) { // Invalid YAML isValid = false; @@ -83,9 +85,7 @@ export class HaYamlEditor extends LitElement { this.value = parsed; this.isValid = isValid; - if (isValid) { - fireEvent(this, "value-changed", { value: parsed }); - } + fireEvent(this, "value-changed", { value: parsed, isValid } as any); } } 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 f308d6d84a..43f756ae84 100644 --- a/src/panels/config/automation/action/ha-automation-action-row.ts +++ b/src/panels/config/automation/action/ha-automation-action-row.ts @@ -157,7 +157,7 @@ export default class HaAutomationActionRow extends LitElement { ` : ""}
@@ -238,6 +238,9 @@ export default class HaAutomationActionRow extends LitElement { private _onYamlChange(ev: CustomEvent) { ev.stopPropagation(); + if (!ev.detail.isValid) { + return; + } fireEvent(this, "value-changed", { value: ev.detail.value }); } diff --git a/src/panels/config/automation/action/types/ha-automation-action-event.ts b/src/panels/config/automation/action/types/ha-automation-action-event.ts index e66fa62e8b..115b11680b 100644 --- a/src/panels/config/automation/action/types/ha-automation-action-event.ts +++ b/src/panels/config/automation/action/types/ha-automation-action-event.ts @@ -57,13 +57,17 @@ export class HaEventAction extends LitElement implements ActionElement { "ui.panel.config.automation.editor.actions.type.event.service_data" )} .name=${"event_data"} - .value=${event_data} + .defaultValue=${event_data} @value-changed=${this._dataChanged} > `; } private _dataChanged(ev: CustomEvent): void { + ev.stopPropagation(); + if (!ev.detail.isValid) { + return; + } this._actionData = ev.detail.value; handleChangeEvent(this, ev); } diff --git a/src/panels/config/automation/action/types/ha-automation-action-service.ts b/src/panels/config/automation/action/types/ha-automation-action-service.ts index cd59512da6..a0ac5a6ebe 100644 --- a/src/panels/config/automation/action/types/ha-automation-action-service.ts +++ b/src/panels/config/automation/action/types/ha-automation-action-service.ts @@ -94,13 +94,17 @@ export class HaServiceAction extends LitElement implements ActionElement { "ui.panel.config.automation.editor.actions.type.service.service_data" )} .name=${"data"} - .value=${data} + .defaultValue=${data} @value-changed=${this._dataChanged} > `; } private _dataChanged(ev: CustomEvent): void { + ev.stopPropagation(); + if (!ev.detail.isValid) { + return; + } this._actionData = ev.detail.value; handleChangeEvent(this, ev); } diff --git a/src/panels/config/automation/condition/ha-automation-condition-editor.ts b/src/panels/config/automation/condition/ha-automation-condition-editor.ts index 57a9726bc3..4082b68265 100644 --- a/src/panels/config/automation/condition/ha-automation-condition-editor.ts +++ b/src/panels/config/automation/condition/ha-automation-condition-editor.ts @@ -54,7 +54,7 @@ export default class HaAutomationConditionEditor extends LitElement { ` : ""} @@ -114,6 +114,9 @@ export default class HaAutomationConditionEditor extends LitElement { private _onYamlChange(ev: CustomEvent) { ev.stopPropagation(); + if (!ev.detail.isValid) { + return; + } fireEvent(this, "value-changed", { value: ev.detail.value }); } } 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 cb5f6bc2a9..3559ca2053 100644 --- a/src/panels/config/automation/trigger/ha-automation-trigger-row.ts +++ b/src/panels/config/automation/trigger/ha-automation-trigger-row.ts @@ -139,7 +139,7 @@ export default class HaAutomationTriggerRow extends LitElement { ` : ""} @@ -213,6 +213,9 @@ export default class HaAutomationTriggerRow extends LitElement { private _onYamlChange(ev: CustomEvent) { ev.stopPropagation(); + if (!ev.detail.isValid) { + return; + } fireEvent(this, "value-changed", { value: ev.detail.value }); } diff --git a/src/panels/config/automation/trigger/types/ha-automation-trigger-event.ts b/src/panels/config/automation/trigger/types/ha-automation-trigger-event.ts index 7a70ba055a..ef163d50d2 100644 --- a/src/panels/config/automation/trigger/types/ha-automation-trigger-event.ts +++ b/src/panels/config/automation/trigger/types/ha-automation-trigger-event.ts @@ -35,13 +35,17 @@ export class HaEventTrigger extends LitElement implements TriggerElement { "ui.panel.config.automation.editor.triggers.type.event.event_data" )} .name=${"event_data"} - .value=${event_data} + .defaultValue=${event_data} @value-changed=${this._valueChanged} > `; } private _valueChanged(ev: CustomEvent): void { + ev.stopPropagation(); + if (!ev.detail.isValid) { + return; + } handleChangeEvent(this, ev); } } diff --git a/src/panels/lovelace/editor/card-editor/hui-dialog-suggest-card.ts b/src/panels/lovelace/editor/card-editor/hui-dialog-suggest-card.ts index a81d54ceb3..bc19be2282 100755 --- a/src/panels/lovelace/editor/card-editor/hui-dialog-suggest-card.ts +++ b/src/panels/lovelace/editor/card-editor/hui-dialog-suggest-card.ts @@ -84,7 +84,9 @@ export class HuiDialogSuggestCard extends LitElement { ${this._yamlMode && this._cardConfig ? html`
- +
` : ""} From 82ff444cecfbc841d3fabd3ebdd0adb031f35f94 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 3 Feb 2020 08:53:57 -0800 Subject: [PATCH 14/64] Confirm when resetting hassio optoins (#4718) --- hassio/src/addon-view/hassio-addon-config.ts | 11 +++ src/dialogs/generic/show-dialog-box.ts | 78 +++++++++++++------- 2 files changed, 64 insertions(+), 25 deletions(-) diff --git a/hassio/src/addon-view/hassio-addon-config.ts b/hassio/src/addon-view/hassio-addon-config.ts index 95f821cfea..1a91052163 100644 --- a/hassio/src/addon-view/hassio-addon-config.ts +++ b/hassio/src/addon-view/hassio-addon-config.ts @@ -25,6 +25,7 @@ import { fireEvent } from "../../../src/common/dom/fire_event"; import "../../../src/components/ha-yaml-editor"; // tslint:disable-next-line: no-duplicate-imports import { HaYamlEditor } from "../../../src/components/ha-yaml-editor"; +import { showConfirmationDialog } from "../../../src/dialogs/generic/show-dialog-box"; @customElement("hassio-addon-config") class HassioAddonConfig extends LitElement { @@ -115,6 +116,16 @@ class HassioAddonConfig extends LitElement { } private async _resetTapped(): Promise { + const confirmed = await showConfirmationDialog(this, { + title: this.addon.name, + text: "Are you sure you want to reset all your options?", + confirmText: "reset options", + }); + + if (!confirmed) { + return; + } + this._error = undefined; const data: HassioAddonSetOptionParams = { options: null, diff --git a/src/dialogs/generic/show-dialog-box.ts b/src/dialogs/generic/show-dialog-box.ts index 1c573bb2ca..4d9975a6df 100644 --- a/src/dialogs/generic/show-dialog-box.ts +++ b/src/dialogs/generic/show-dialog-box.ts @@ -1,26 +1,32 @@ import { fireEvent } from "../../common/dom/fire_event"; -export interface AlertDialogParams { +interface BaseDialogParams { confirmText?: string; text?: string; title?: string; - confirm?: (out?: string) => void; } -interface ConfirmationDialogParams extends AlertDialogParams { +export interface AlertDialogParams extends BaseDialogParams { + confirm?: () => void; +} + +export interface ConfirmationDialogParams extends BaseDialogParams { dismissText?: string; + confirm?: () => void; cancel?: () => void; } -interface PromptDialogParams extends AlertDialogParams { +export interface PromptDialogParams extends BaseDialogParams { inputLabel?: string; inputType?: string; defaultValue?: string; + confirm?: (out?: string) => void; } export interface DialogParams extends ConfirmationDialogParams, PromptDialogParams { + confirm?: (out?: string) => void; confirmation?: boolean; prompt?: boolean; } @@ -28,35 +34,57 @@ export interface DialogParams export const loadGenericDialog = () => import(/* webpackChunkName: "confirmation" */ "./dialog-box"); +const showDialogHelper = ( + element: HTMLElement, + dialogParams: DialogParams, + extra?: { + confirmation?: DialogParams["confirmation"]; + prompt?: DialogParams["prompt"]; + } +) => + new Promise((resolve) => { + const origCancel = dialogParams.cancel; + const origConfirm = dialogParams.confirm; + + fireEvent(element, "show-dialog", { + dialogTag: "dialog-box", + dialogImport: loadGenericDialog, + dialogParams: { + ...dialogParams, + ...extra, + cancel: () => { + resolve(extra?.prompt ? null : false); + if (origCancel) { + origCancel(); + } + }, + confirm: (out) => { + resolve(extra?.prompt ? out : true); + if (origConfirm) { + origConfirm(out); + } + }, + }, + }); + }); + export const showAlertDialog = ( element: HTMLElement, dialogParams: AlertDialogParams -): void => { - fireEvent(element, "show-dialog", { - dialogTag: "dialog-box", - dialogImport: loadGenericDialog, - dialogParams, - }); -}; +) => showDialogHelper(element, dialogParams); export const showConfirmationDialog = ( element: HTMLElement, dialogParams: ConfirmationDialogParams -): void => { - fireEvent(element, "show-dialog", { - dialogTag: "dialog-box", - dialogImport: loadGenericDialog, - dialogParams: { ...dialogParams, confirmation: true }, - }); -}; +) => + showDialogHelper(element, dialogParams, { confirmation: true }) as Promise< + boolean + >; export const showPromptDialog = ( element: HTMLElement, dialogParams: PromptDialogParams -): void => { - fireEvent(element, "show-dialog", { - dialogTag: "dialog-box", - dialogImport: loadGenericDialog, - dialogParams: { ...dialogParams, prompt: true }, - }); -}; +) => + showDialogHelper(element, dialogParams, { prompt: true }) as Promise< + null | string + >; From ccc42dad793a3a989192578ba38192c39d992c10 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Tue, 4 Feb 2020 00:33:02 +0000 Subject: [PATCH 15/64] [ci skip] Translation update --- translations/fr.json | 2 +- translations/hu.json | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/translations/fr.json b/translations/fr.json index cbc1967a99..f2468b06d1 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -1253,7 +1253,7 @@ "details": "Voici tous les détails de votre appareil.", "device_not_found": "Appareil non trouvé.", "entities": { - "add_entities_lovelace": "Ajouter toutes les entités de l'appareil à l'interface utilisateur de Lovelace", + "add_entities_lovelace": "Ajouter à Lovelace", "entities": "Entités", "none": "Cet appareil n'a pas d'entités" }, diff --git a/translations/hu.json b/translations/hu.json index e7eecbe503..84105f1571 100644 --- a/translations/hu.json +++ b/translations/hu.json @@ -1112,7 +1112,7 @@ "forgot_password": "elfelejtett jelszó?", "introduction": "A Home Assistant Felhő biztonságos távoli kapcsolatot nyújt a példányodhoz, miközben távol vagy. Azt is lehetővé teszi, hogy csak felhőn alapuló szolgáltatásokhoz csatlakozz: Amazon Alexa, Google Asszisztens.", "introduction2": "Ezt a szolgáltatást partnerünk üzemelteti, a ", - "introduction2a": " vállalat üzemelteti, amelyet a Home Assistant és a Hass.io alapítói alapítottak.", + "introduction2a": "vállalat, amelyet a Home Assistant és a Hass.io alapítói alapítottak.", "introduction3": "A Home Assistant Felhő egy előfizetéses szolgáltatás egy hónapos ingyenes próbaverzióval. Nincs szükség fizetési információk megadására.", "learn_more_link": "Tudj meg többet a Home Assistant Felhőről", "password": "Jelszó", @@ -1135,7 +1135,7 @@ "information": "Hozz létre egy fiókot ahhoz, hogy elindíthasd az egy hónapos ingyenes Home Assistant Felhő próbaidőszakodat. Nincs szükség fizetési információk megadására.", "information2": "A próbaidőszak hozzáférést biztosít a Home Assistant Felhő minden előnyéhez, beleértve a következőket:", "information3": "Ezt a szolgáltatást partnerünk üzemelteti, a ", - "information3a": ", vállalat üzemelteti, amelyet a Home Assistant és a Hass.io alapítói alapítottak.", + "information3a": "vállalat, amelyet a Home Assistant és a Hass.io alapítói alapítottak.", "information4": "Fiók regisztrálásával elfogadod az alábbi feltételeket.", "link_privacy_policy": "Adatvédelmi irányelvek", "link_terms_conditions": "Felhasználási feltételek", @@ -1230,7 +1230,7 @@ "conditions": { "caption": "Csak akkor csinálj valamit, ha a(z)..." }, - "create": "Automatizálás létrehozása eszközzel", + "create": " Eszköz automatizálás létrehozása", "no_automations": "Nincs automatizálás", "no_device_automations": "Ehhez az eszközhöz nem állnak rendelkezésre automatizálások.", "triggers": { @@ -1253,7 +1253,7 @@ "details": "Itt található minden részlet az eszközről.", "device_not_found": "Eszköz nem található.", "entities": { - "add_entities_lovelace": "Az összes eszköz entitás hozzáadása a Lovelace felhasználói felülethez", + "add_entities_lovelace": "Mindet a Lovelace felületre", "entities": "Entitások", "none": "Ennek az eszköznek nincsenek entitásai" }, @@ -1373,7 +1373,7 @@ "submit": "Küldés" }, "configure": "Beállítás", - "configured": "Konfigurált", + "configured": "Konfigurálva", "description": "Integrációk kezelése és beállítása", "details": "Integráció részletei", "discovered": "Felfedezett", From 42cbe863bb292d68bd981a9af6df8a5c28d80c9a Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 4 Feb 2020 07:32:22 +0100 Subject: [PATCH 16/64] Fix passive color radius and fix switch label clicks (#4703) * Fix passive color radius and fix switch label clicks * Colors vars --- src/components/ha-switch.ts | 42 +++++++++++++++++++- src/components/map/ha-location-editor.ts | 14 ++++++- src/components/map/ha-locations-editor.ts | 3 +- src/data/zone.ts | 4 ++ src/panels/config/zone/dialog-zone-detail.ts | 9 ++++- src/panels/config/zone/ha-config-zone.ts | 11 +++-- src/panels/map/ha-panel-map.js | 3 +- 7 files changed, 76 insertions(+), 10 deletions(-) diff --git a/src/components/ha-switch.ts b/src/components/ha-switch.ts index 349bc56d29..89bae13454 100644 --- a/src/components/ha-switch.ts +++ b/src/components/ha-switch.ts @@ -1,10 +1,18 @@ -import { customElement, CSSResult, css, query, property } from "lit-element"; +import { + customElement, + CSSResult, + css, + query, + html, + property, +} from "lit-element"; import "@material/mwc-switch"; import { style } from "@material/mwc-switch/mwc-switch-css"; // tslint:disable-next-line import { Switch } from "@material/mwc-switch"; import { Constructor } from "../types"; import { forwardHaptic } from "../data/haptics"; +import { ripple } from "@material/mwc-ripple/ripple-directive"; // tslint:disable-next-line const MwcSwitch = customElements.get("mwc-switch") as Constructor; @@ -26,7 +34,6 @@ export class HaSwitch extends MwcSwitch { "slotted", Boolean(this._slot.assignedNodes().length) ); - this._slot.addEventListener("click", () => (this.checked = !this.checked)); this.addEventListener("change", () => { if (this.haptic) { forwardHaptic("light"); @@ -34,6 +41,31 @@ export class HaSwitch extends MwcSwitch { }); } + protected render() { + return html` +
+
+
+
+ +
+
+
+ + `; + } + protected static get styles(): CSSResult[] { return [ style, @@ -65,6 +97,12 @@ export class HaSwitch extends MwcSwitch { `, ]; } + + private _haChangeHandler(e: Event) { + this.mdcFoundation.handleChange(e); + // catch "click" event and sync properties + this.checked = this.formElement.checked; + } } declare global { diff --git a/src/components/map/ha-location-editor.ts b/src/components/map/ha-location-editor.ts index a24ceba338..f5ad735329 100644 --- a/src/components/map/ha-location-editor.ts +++ b/src/components/map/ha-location-editor.ts @@ -23,11 +23,13 @@ import { } from "../../common/dom/setup-leaflet-map"; import { fireEvent } from "../../common/dom/fire_event"; import { nextRender } from "../../common/util/render-status"; +import { defaultRadiusColor } from "../../data/zone"; @customElement("ha-location-editor") class LocationEditor extends LitElement { @property() public location?: [number, number]; @property() public radius?: number; + @property() public radiusColor?: string; @property() public icon?: string; public fitZoom = 16; private _iconEl?: DivIcon; @@ -83,6 +85,9 @@ class LocationEditor extends LitElement { if (changedProps.has("radius")) { this._updateRadius(); } + if (changedProps.has("radiusColor")) { + this._updateRadiusColor(); + } if (changedProps.has("icon")) { this._updateIcon(); } @@ -213,7 +218,7 @@ class LocationEditor extends LitElement { this._leafletMap!.addLayer(this._locationMarker); } else { this._locationMarker = this.Leaflet!.circle(this.location, { - color: "#FF9800", + color: this.radiusColor || defaultRadiusColor, radius: this.radius, }); this._leafletMap!.addLayer(this._locationMarker); @@ -228,6 +233,13 @@ class LocationEditor extends LitElement { (this._locationMarker as Circle).setRadius(this.radius); } + private _updateRadiusColor(): void { + if (!this._locationMarker || !this.radius) { + return; + } + (this._locationMarker as Circle).setStyle({ color: this.radiusColor }); + } + static get styles(): CSSResult { return css` :host { diff --git a/src/components/map/ha-locations-editor.ts b/src/components/map/ha-locations-editor.ts index 11de3b91c3..3cb70c0f93 100644 --- a/src/components/map/ha-locations-editor.ts +++ b/src/components/map/ha-locations-editor.ts @@ -22,6 +22,7 @@ import { LeafletModuleType, } from "../../common/dom/setup-leaflet-map"; import { fireEvent } from "../../common/dom/fire_event"; +import { defaultRadiusColor } from "../../data/zone"; declare global { // for fire event @@ -202,7 +203,7 @@ export class HaLocationsEditor extends LitElement { const circle = this.Leaflet!.circle( [location.latitude, location.longitude], { - color: location.radius_color ? location.radius_color : "#FF9800", + color: location.radius_color || defaultRadiusColor, radius: location.radius, } ); diff --git a/src/data/zone.ts b/src/data/zone.ts index 1bd97a4351..85464a975b 100644 --- a/src/data/zone.ts +++ b/src/data/zone.ts @@ -1,5 +1,9 @@ import { HomeAssistant } from "../types"; +export const defaultRadiusColor = "#FF9800"; +export const homeRadiusColor: string = "#03a9f4"; +export const passiveRadiusColor: string = "#9b9b9b"; + export interface Zone { id: string; name: string; diff --git a/src/panels/config/zone/dialog-zone-detail.ts b/src/panels/config/zone/dialog-zone-detail.ts index 869c1c24ec..850b78133b 100644 --- a/src/panels/config/zone/dialog-zone-detail.ts +++ b/src/panels/config/zone/dialog-zone-detail.ts @@ -16,7 +16,11 @@ import "../../../components/ha-dialog"; import { ZoneDetailDialogParams } from "./show-dialog-zone-detail"; import { HomeAssistant } from "../../../types"; -import { ZoneMutableParams } from "../../../data/zone"; +import { + ZoneMutableParams, + passiveRadiusColor, + defaultRadiusColor, +} from "../../../data/zone"; import { addDistanceToCoord } from "../../../common/location/add_distance_to_coord"; class DialogZoneDetail extends LitElement { @@ -127,6 +131,9 @@ class DialogZoneDetail extends LitElement { class="flex" .location=${this._locationValue} .radius=${this._radius} + .radiusColor=${this._passive + ? passiveRadiusColor + : defaultRadiusColor} .icon=${this._icon} @change=${this._locationChanged} > diff --git a/src/panels/config/zone/ha-config-zone.ts b/src/panels/config/zone/ha-config-zone.ts index d35928dced..52a734ab04 100644 --- a/src/panels/config/zone/ha-config-zone.ts +++ b/src/panels/config/zone/ha-config-zone.ts @@ -31,6 +31,9 @@ import { updateZone, deleteZone, ZoneMutableParams, + homeRadiusColor, + passiveRadiusColor, + defaultRadiusColor, } from "../../../data/zone"; // tslint:disable-next-line import { @@ -68,17 +71,17 @@ export class HaConfigZone extends SubscribeMixin(LitElement) { radius: state.attributes.radius, radius_color: state.entity_id === "zone.home" - ? "#03a9f4" + ? homeRadiusColor : state.attributes.passive - ? "#9b9b9b" - : "#FF9800", + ? passiveRadiusColor + : defaultRadiusColor, editable: false, }; }); const storageLocations: MarkerLocation[] = storageItems.map((zone) => { return { ...zone, - radius_color: zone.passive ? "#9b9b9b" : "#FF9800", + radius_color: zone.passive ? passiveRadiusColor : defaultRadiusColor, editable: true, }; }); diff --git a/src/panels/map/ha-panel-map.js b/src/panels/map/ha-panel-map.js index 110dffd636..3fbf540354 100644 --- a/src/panels/map/ha-panel-map.js +++ b/src/panels/map/ha-panel-map.js @@ -12,6 +12,7 @@ import { computeStateDomain } from "../../common/entity/compute_state_domain"; import { computeStateName } from "../../common/entity/compute_state_name"; import LocalizeMixin from "../../mixins/localize-mixin"; import { setupLeafletMap } from "../../common/dom/setup-leaflet-map"; +import { defaultRadiusColor } from "../../data/zone"; /* * @appliesMixin LocalizeMixin @@ -175,7 +176,7 @@ class HaPanelMap extends LocalizeMixin(PolymerElement) { [entity.attributes.latitude, entity.attributes.longitude], { interactive: false, - color: "#FF9800", + color: defaultRadiusColor, radius: entity.attributes.radius, } ).addTo(map) From c54b474838871d8871d782f3d8d5f9872dcb1ea7 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 4 Feb 2020 00:27:26 -0800 Subject: [PATCH 17/64] Hide automations from generated UI (#4748) --- src/panels/lovelace/common/generate-lovelace-config.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/panels/lovelace/common/generate-lovelace-config.ts b/src/panels/lovelace/common/generate-lovelace-config.ts index cd83334f83..d8790b35f7 100644 --- a/src/panels/lovelace/common/generate-lovelace-config.ts +++ b/src/panels/lovelace/common/generate-lovelace-config.ts @@ -52,6 +52,7 @@ const DOMAINS_BADGES = [ "timer", ]; const HIDE_DOMAIN = new Set([ + "automation", "configurator", "device_tracker", "geo_location", From 862044ca2378b71976140a2414b559d442e3756a Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 4 Feb 2020 10:54:10 +0100 Subject: [PATCH 18/64] Hassio styling tweaks (#4749) * Hassio styling tweaks * Update hassio-style.ts * Update hassio-pages-with-tabs.ts --- .../addon-store/hassio-addon-repository.ts | 67 ++++++----- .../addon-store/hassio-repositories-editor.ts | 108 +++++++++--------- hassio/src/dashboard/hassio-addons.ts | 64 ++++++----- hassio/src/dashboard/hassio-update.ts | 28 ++--- hassio/src/hassio-pages-with-tabs.ts | 2 +- hassio/src/resources/hassio-style.ts | 51 ++++----- hassio/src/snapshots/hassio-snapshots.ts | 16 +-- hassio/src/system/hassio-host-info.ts | 18 +-- hassio/src/system/hassio-supervisor-info.ts | 15 +-- hassio/src/system/hassio-supervisor-log.ts | 3 + hassio/src/system/hassio-system.ts | 34 ++++-- 11 files changed, 199 insertions(+), 207 deletions(-) diff --git a/hassio/src/addon-store/hassio-addon-repository.ts b/hassio/src/addon-store/hassio-addon-repository.ts index 722697ecd2..895b729973 100644 --- a/hassio/src/addon-store/hassio-addon-repository.ts +++ b/hassio/src/addon-store/hassio-addon-repository.ts @@ -42,46 +42,45 @@ class HassioAddonRepositoryEl extends LitElement { if (this.filter && addons.length < 1) { return html` -
-
-
- No results found in "${repo.name}" -
-
+
+

+ No results found in "${repo.name}" +

`; } return html` -
-
+
+

${repo.name} -
- Maintained by ${repo.maintainer}
- ${repo.url} -
+

+

+ Maintained by ${repo.maintainer}
+ ${repo.url} +

+
+ ${addons.map( + (addon) => html` + +
+ +
+
+ ` + )}
- - ${addons.map( - (addon) => html` - -
- -
-
- ` - )}
`; } diff --git a/hassio/src/addon-store/hassio-repositories-editor.ts b/hassio/src/addon-store/hassio-repositories-editor.ts index 5110a77c45..27241482b4 100644 --- a/hassio/src/addon-store/hassio-repositories-editor.ts +++ b/hassio/src/addon-store/hassio-repositories-editor.ts @@ -36,61 +36,63 @@ class HassioRepositoriesEditor extends LitElement { protected render(): TemplateResult { const repos = this._sortedRepos(this.repos); return html` -
-
+
+

Repositories -
- Configure which add-on repositories to fetch data from: -
-

- ${// Use repeat so that the fade-out from call-service-api-button - // stays with the correct repo after we add/delete one. - repeat( - repos, - (repo) => repo.slug, - (repo) => html` - -
- -
-
- - Remove - -
-
- ` - )} + +

+ Configure which add-on repositories to fetch data from: +

+
+ ${// Use repeat so that the fade-out from call-service-api-button + // stays with the correct repo after we add/delete one. + repeat( + repos, + (repo) => repo.slug, + (repo) => html` + +
+ +
+
+ + Remove + +
+
+ ` + )} - -
- - -
-
- - Add - -
-
+ +
+ + +
+
+ + Add + +
+
+
`; } diff --git a/hassio/src/dashboard/hassio-addons.ts b/hassio/src/dashboard/hassio-addons.ts index 3d21fc9ea4..e0403b4cf2 100644 --- a/hassio/src/dashboard/hassio-addons.ts +++ b/hassio/src/dashboard/hassio-addons.ts @@ -23,37 +23,39 @@ class HassioAddons extends LitElement { protected render(): TemplateResult { return html` -
-
Add-ons
- ${!this.addons - ? html` - -
- You don't have any add-ons installed yet. Head over to - the add-on store to - get started! -
-
- ` - : this.addons - .sort((a, b) => (a.name > b.name ? 1 : -1)) - .map( - (addon) => html` - -
- -
-
- ` - )} +
+

Add-ons

+
+ ${!this.addons + ? html` + +
+ You don't have any add-ons installed yet. Head over to + the add-on store + to get started! +
+
+ ` + : this.addons + .sort((a, b) => (a.name > b.name ? 1 : -1)) + .map( + (addon) => html` + +
+ +
+
+ ` + )} +
`; } diff --git a/hassio/src/dashboard/hassio-update.ts b/hassio/src/dashboard/hassio-update.ts index e9d699c669..17f37b083f 100644 --- a/hassio/src/dashboard/hassio-update.ts +++ b/hassio/src/dashboard/hassio-update.ts @@ -38,7 +38,12 @@ export class HassioUpdate extends LitElement { this.supervisorInfo, this.hassOsInfo, ].filter((value) => { - return !!value && value.version !== value.last_version; + return ( + !!value && + (value.last_version + ? value.version !== value.last_version + : value.version !== value.version_latest) + ); }).length; if (!updatesAvailable) { @@ -52,12 +57,12 @@ export class HassioUpdate extends LitElement {
Error: ${this._error}
` : ""} +

+ ${updatesAvailable > 1 + ? "Updates Available 🎉" + : "Update Available 🎉"} +

-
- ${updatesAvailable > 1 - ? "Updates Available 🎉" - : "Update Available 🎉"} -
${this._renderUpdateCard( "Home Assistant", this.hassInfo.version, @@ -149,13 +154,6 @@ export class HassioUpdate extends LitElement { haStyle, hassioStyle, css` - :host { - width: 33%; - } - paper-card { - display: inline-block; - margin-bottom: 32px; - } .icon { --iron-icon-height: 48px; --iron-icon-width: 48px; @@ -170,6 +168,10 @@ export class HassioUpdate extends LitElement { .warning { color: var(--secondary-text-color); } + .card-content { + height: calc(100% - 47px); + box-sizing: border-box; + } .card-actions { text-align: right; } diff --git a/hassio/src/hassio-pages-with-tabs.ts b/hassio/src/hassio-pages-with-tabs.ts index 9bb5eca5cd..a34eb11666 100644 --- a/hassio/src/hassio-pages-with-tabs.ts +++ b/hassio/src/hassio-pages-with-tabs.ts @@ -123,7 +123,7 @@ class HassioPagesWithTabs extends LitElement { } paper-tabs { margin-left: 12px; - --paper-tabs-selection-bar-color: #fff; + --paper-tabs-selection-bar-color: var(--text-primary-color, #fff); text-transform: uppercase; } app-header, diff --git a/hassio/src/resources/hassio-style.ts b/hassio/src/resources/hassio-style.ts index 6eb6c2340a..fa33f100b3 100644 --- a/hassio/src/resources/hassio-style.ts +++ b/hassio/src/resources/hassio-style.ts @@ -4,45 +4,36 @@ const documentContainer = document.createElement("template"); documentContainer.setAttribute("style", "display: none;"); export const hassioStyle = css` - .card-group { - margin-top: 24px; + .content { + margin: 8px; } - .card-group .title { + h1 { color: var(--primary-text-color); font-size: 2em; - padding-left: 8px; margin-bottom: 8px; + font-family: var(--paper-font-headline_-_font-family); + -webkit-font-smoothing: var(--paper-font-headline_-_-webkit-font-smoothing); + font-size: var(--paper-font-headline_-_font-size); + font-weight: var(--paper-font-headline_-_font-weight); + letter-spacing: var(--paper-font-headline_-_letter-spacing); + line-height: var(--paper-font-headline_-_line-height); + padding-left: 16px; } - .card-group .description { - font-size: 0.5em; - font-weight: 500; + .description { margin-top: 4px; + padding-left: 16px; } - .card-group paper-card { - --card-group-columns: 4; - width: calc( - (100% - 12px * var(--card-group-columns)) / var(--card-group-columns) - ); - margin: 4px; - vertical-align: top; + .card-group { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + grid-gap: 8px; } - @media screen and (max-width: 1200px) and (min-width: 901px) { - .card-group paper-card { - --card-group-columns: 3; - } + .card-group > * { + max-width: 450px; } - @media screen and (max-width: 900px) and (min-width: 601px) { - .card-group paper-card { - --card-group-columns: 2; - } - } - @media screen and (max-width: 600px) and (min-width: 0) { - .card-group paper-card { - width: 100%; - margin: 4px 0; - } - .content { - padding: 0; + @media screen and (max-width: 800px) { + .card-group > * { + max-width: 100%; } } ha-call-api-button { diff --git a/hassio/src/snapshots/hassio-snapshots.ts b/hassio/src/snapshots/hassio-snapshots.ts index db8d047cd7..90116dbb5e 100644 --- a/hassio/src/snapshots/hassio-snapshots.ts +++ b/hassio/src/snapshots/hassio-snapshots.ts @@ -79,14 +79,14 @@ class HassioSnapshots extends LitElement { protected render(): TemplateResult { return html`
+

+ Create snapshot +

+

+ Snapshots allow you to easily backup and restore all data of your + Hass.io instance. +

-
- Create snapshot -
- Snapshots allow you to easily backup and restore all data of your - Hass.io instance. -
-
+

Available snapshots

-
Available snapshots
${this._snapshots === undefined ? undefined : this._snapshots.length === 0 diff --git a/hassio/src/system/hassio-host-info.ts b/hassio/src/system/hassio-host-info.ts index b02dbf1b92..bdaaecbcfa 100644 --- a/hassio/src/system/hassio-host-info.ts +++ b/hassio/src/system/hassio-host-info.ts @@ -126,23 +126,13 @@ class HassioHostInfo extends LitElement { hassioStyle, css` paper-card { - display: inline-block; - width: 400px; - margin-left: 8px; + height: 100%; + width: 100%; } .card-content { - height: 200px; color: var(--primary-text-color); - } - @media screen and (max-width: 830px) { - paper-card { - margin-top: 8px; - margin-left: 0; - width: 100%; - } - .card-content { - height: auto; - } + box-sizing: border-box; + height: calc(100% - 47px); } .info { width: 100%; diff --git a/hassio/src/system/hassio-supervisor-info.ts b/hassio/src/system/hassio-supervisor-info.ts index 91854c0952..2ff33b4bae 100644 --- a/hassio/src/system/hassio-supervisor-info.ts +++ b/hassio/src/system/hassio-supervisor-info.ts @@ -103,20 +103,13 @@ class HassioSupervisorInfo extends LitElement { hassioStyle, css` paper-card { - display: inline-block; - width: 400px; + height: 100%; + width: 100%; } .card-content { - height: 200px; color: var(--primary-text-color); - } - @media screen and (max-width: 830px) { - paper-card { - width: 100%; - } - .card-content { - height: auto; - } + box-sizing: border-box; + height: calc(100% - 47px); } .info { width: 100%; diff --git a/hassio/src/system/hassio-supervisor-log.ts b/hassio/src/system/hassio-supervisor-log.ts index 9524aac54c..a111969bb7 100644 --- a/hassio/src/system/hassio-supervisor-log.ts +++ b/hassio/src/system/hassio-supervisor-log.ts @@ -50,6 +50,9 @@ class HassioSupervisorLog extends LitElement { hassioStyle, ANSI_HTML_STYLE, css` + paper-card { + width: 100%; + } pre { white-space: pre-wrap; } diff --git a/hassio/src/system/hassio-system.ts b/hassio/src/system/hassio-system.ts index 5fbff5de08..fb9c4c192f 100644 --- a/hassio/src/system/hassio-system.ts +++ b/hassio/src/system/hassio-system.ts @@ -32,17 +32,19 @@ class HassioSystem extends LitElement { public render(): TemplateResult | void { return html`
-
Information
- - -
System log
+

Information

+
+ + +
+

System log

`; @@ -54,7 +56,7 @@ class HassioSystem extends LitElement { hassioStyle, css` .content { - margin: 4px; + margin: 8px; color: var(--primary-text-color); } .title { @@ -64,6 +66,14 @@ class HassioSystem extends LitElement { padding-left: 8px; margin-bottom: 8px; } + .side-by-side { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(400px, 1fr)); + grid-gap: 8px; + } + hassio-supervisor-log { + width: 100%; + } `, ]; } From f1a1654371828535f31ebc7b85fa563390c75a8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Tue, 4 Feb 2020 12:36:09 +0100 Subject: [PATCH 19/64] Use icon image where available (#4721) * Use iconimg where available * Adjust margin for icon * remove log * Fix property casing * Add blue topbar, and generalize properties * Inline checks * inline property functions * Limit compute * Linting * lovercase const * Review comments and move update dot to line * Add roboto font to hassio * Fix update and stopped styles colliding Co-authored-by: Bram Kragten --- .../addon-store/hassio-addon-repository.ts | 65 +++++++++------- hassio/src/addon-view/hassio-addon-info.ts | 1 - hassio/src/components/hassio-card-content.ts | 77 ++++++++++++++++--- hassio/src/dashboard/hassio-addons.ts | 55 +++++++------ hassio/src/entrypoint.ts | 3 + hassio/src/resources/hassio-style.ts | 4 +- 6 files changed, 136 insertions(+), 69 deletions(-) diff --git a/hassio/src/addon-store/hassio-addon-repository.ts b/hassio/src/addon-store/hassio-addon-repository.ts index 895b729973..accfe7d8ed 100644 --- a/hassio/src/addon-store/hassio-addon-repository.ts +++ b/hassio/src/addon-store/hassio-addon-repository.ts @@ -39,6 +39,7 @@ class HassioAddonRepositoryEl extends LitElement { protected render(): TemplateResult { const repo = this.repo; const addons = this._getAddons(this.addons, this.filter); + const ha105pluss = this._computeHA105plus; if (this.filter && addons.length < 1) { return html` @@ -64,7 +65,7 @@ class HassioAddonRepositoryEl extends LitElement {
@@ -85,34 +111,15 @@ class HassioAddonRepositoryEl extends LitElement { `; } - private computeIcon(addon) { - return addon.installed && addon.installed !== addon.version - ? "hassio:arrow-up-bold-circle" - : "hassio:puzzle"; - } - - private computeIconTitle(addon) { - if (addon.installed) { - return addon.installed !== addon.version - ? "New version available" - : "Add-on is installed"; - } - return addon.available - ? "Add-on is not installed" - : "Add-on is not available on your system"; - } - - private computeIconClass(addon) { - if (addon.installed) { - return addon.installed !== addon.version ? "update" : "installed"; - } - return !addon.available ? "not_available" : ""; - } - - private addonTapped(ev) { + private _addonTapped(ev) { navigate(this, `/hassio/addon/${ev.currentTarget.addon.slug}`); } + private get _computeHA105plus(): boolean { + const [major, minor] = this.hass.config.version.split(".", 2); + return Number(major) > 0 || (major === "0" && Number(minor) >= 105); + } + static get styles(): CSSResultArray { return [ hassioStyle, diff --git a/hassio/src/addon-view/hassio-addon-info.ts b/hassio/src/addon-view/hassio-addon-info.ts index 947ac651dc..d8f5ff69db 100644 --- a/hassio/src/addon-view/hassio-addon-info.ts +++ b/hassio/src/addon-view/hassio-addon-info.ts @@ -454,7 +454,6 @@ class HassioAddonInfo extends LitElement { Install diff --git a/hassio/src/components/hassio-card-content.ts b/hassio/src/components/hassio-card-content.ts index ad13904c20..bf3ce9756d 100644 --- a/hassio/src/components/hassio-card-content.ts +++ b/hassio/src/components/hassio-card-content.ts @@ -7,6 +7,7 @@ import { property, customElement, } from "lit-element"; +import { classMap } from "lit-html/directives/class-map"; import "@polymer/iron-icon/iron-icon"; import "../../../src/components/ha-relative-time"; @@ -17,21 +18,40 @@ class HassioCardContent extends LitElement { @property() public hass!: HomeAssistant; @property() public title!: string; @property() public description?: string; - @property({ type: Boolean }) public available?: boolean; + @property({ type: Boolean }) public available: boolean = true; + @property({ type: Boolean }) public showTopbar: boolean = false; + @property() public topbarClass?: string; @property() public datetime?: string; @property() public iconTitle?: string; @property() public iconClass?: string; @property() public icon = "hass:help-circle"; + @property() public iconImage?: string; protected render(): TemplateResult { return html` - + ${this.showTopbar + ? html` +
+ ` + : ""} + ${this.iconImage + ? html` +
+ +
+
+ ` + : html` + + `}
-
${this.title}
+
+ ${this.title} +
${this.description} ${/* treat as available when undefined */ @@ -53,8 +73,9 @@ class HassioCardContent extends LitElement { static get styles(): CSSResult { return css` iron-icon { - margin-right: 16px; - margin-top: 16px; + margin-right: 24px; + margin-left: 8px; + margin-top: 12px; float: left; color: var(--secondary-text-color); } @@ -88,6 +109,44 @@ class HassioCardContent extends LitElement { ha-relative-time { display: block; } + .icon_image img { + max-height: 40px; + max-width: 40px; + margin-top: 4px; + margin-right: 16px; + float: left; + } + .icon_image.stopped, + .icon_image.not_available { + filter: grayscale(1); + } + .dot { + position: absolute; + background-color: var(--paper-orange-400); + width: 12px; + height: 12px; + top: 8px; + right: 8px; + border-radius: 50%; + } + .topbar { + position: absolute; + width: 100%; + height: 2px; + top: 0; + left: 0; + border-top-left-radius: 2px; + border-top-right-radius: 2px; + } + .topbar.installed { + background-color: var(--primary-color); + } + .topbar.update { + background-color: var(--accent-color); + } + .topbar.unavailable { + background-color: var(--error-color); + } `; } } diff --git a/hassio/src/dashboard/hassio-addons.ts b/hassio/src/dashboard/hassio-addons.ts index e0403b4cf2..801afd1854 100644 --- a/hassio/src/dashboard/hassio-addons.ts +++ b/hassio/src/dashboard/hassio-addons.ts @@ -22,6 +22,9 @@ class HassioAddons extends LitElement { @property() public addons?: HassioAddonInfo[]; protected render(): TemplateResult { + const [major, minor] = this.hass.config.version.split(".", 2); + const ha105pluss = + Number(major) > 0 || (major === "0" && Number(minor) >= 105); return html`

Add-ons

@@ -44,12 +47,30 @@ class HassioAddons extends LitElement {
@@ -72,28 +93,6 @@ class HassioAddons extends LitElement { ]; } - private _computeIcon(addon: HassioAddonInfo): string { - return addon.installed !== addon.version - ? "hassio:arrow-up-bold-circle" - : "hassio:puzzle"; - } - - private _computeIconTitle(addon: HassioAddonInfo): string { - if (addon.installed !== addon.version) { - return "New version available"; - } - return addon.state === "started" - ? "Add-on is running" - : "Add-on is stopped"; - } - - private _computeIconClass(addon: HassioAddonInfo): string { - if (addon.installed !== addon.version) { - return "update"; - } - return addon.state === "started" ? "running" : ""; - } - private _addonTapped(ev: any): void { navigate(this, `/hassio/addon/${ev.currentTarget.addon.slug}`); } diff --git a/hassio/src/entrypoint.ts b/hassio/src/entrypoint.ts index 13e57019fd..935d5676d7 100644 --- a/hassio/src/entrypoint.ts +++ b/hassio/src/entrypoint.ts @@ -1,9 +1,12 @@ window.loadES5Adapter().then(() => { + // eslint-disable-next-line + import(/* webpackChunkName: "roboto" */ "../../src/resources/roboto"); // eslint-disable-next-line import(/* webpackChunkName: "hassio-icons" */ "./resources/hassio-icons"); // eslint-disable-next-line import(/* webpackChunkName: "hassio-main" */ "./hassio-main"); }); + const styleEl = document.createElement("style"); styleEl.innerHTML = ` body { diff --git a/hassio/src/resources/hassio-style.ts b/hassio/src/resources/hassio-style.ts index fa33f100b3..a12a21b954 100644 --- a/hassio/src/resources/hassio-style.ts +++ b/hassio/src/resources/hassio-style.ts @@ -17,11 +17,11 @@ export const hassioStyle = css` font-weight: var(--paper-font-headline_-_font-weight); letter-spacing: var(--paper-font-headline_-_letter-spacing); line-height: var(--paper-font-headline_-_line-height); - padding-left: 16px; + padding-left: 8px; } .description { margin-top: 4px; - padding-left: 16px; + padding-left: 8px; } .card-group { display: grid; From 004ff58c21c85db045ce87db972167cb05b331d4 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 4 Feb 2020 13:34:14 +0100 Subject: [PATCH 20/64] Update hassio-style.ts --- hassio/src/resources/hassio-style.ts | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/hassio/src/resources/hassio-style.ts b/hassio/src/resources/hassio-style.ts index a12a21b954..91a8782b6b 100644 --- a/hassio/src/resources/hassio-style.ts +++ b/hassio/src/resources/hassio-style.ts @@ -28,12 +28,19 @@ export const hassioStyle = css` grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); grid-gap: 8px; } - .card-group > * { - max-width: 450px; + @media screen and (min-width: 640px) { + .card-group { + grid-template-columns: repeat(auto-fit, minmax(300px, 0.5fr)); + } } - @media screen and (max-width: 800px) { - .card-group > * { - max-width: 100%; + @media screen and (min-width: 1020px) { + .card-group { + grid-template-columns: repeat(auto-fit, minmax(300px, 0.333fr)); + } + } + @media screen and (min-width: 1300px) { + .card-group { + grid-template-columns: repeat(auto-fit, minmax(300px, 0.25fr)); } } ha-call-api-button { From 1bf82f216a68666efe8a6b689dd7d8a90cf89576 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 4 Feb 2020 15:15:15 +0100 Subject: [PATCH 21/64] Tweak badge focus padding (#4750) --- src/panels/lovelace/badges/hui-state-label-badge.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/panels/lovelace/badges/hui-state-label-badge.ts b/src/panels/lovelace/badges/hui-state-label-badge.ts index 25b7f3c8fa..1535a68963 100644 --- a/src/panels/lovelace/badges/hui-state-label-badge.ts +++ b/src/panels/lovelace/badges/hui-state-label-badge.ts @@ -70,8 +70,8 @@ export class HuiStateLabelBadge extends LitElement implements LovelaceBadge { } ha-state-label-badge { display: inline-block; - padding: 4px; - margin: -4px 0 -4px 0; + padding: 4px 2px 4px 2px; + margin: -4px -2px -4px -2px; } `; } From 4aa49f66bc20e69fda799d1d3693b1805e4e1533 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 4 Feb 2020 15:55:29 +0100 Subject: [PATCH 22/64] Remove unused classmap --- hassio/src/components/hassio-card-content.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/hassio/src/components/hassio-card-content.ts b/hassio/src/components/hassio-card-content.ts index bf3ce9756d..737c36edc3 100644 --- a/hassio/src/components/hassio-card-content.ts +++ b/hassio/src/components/hassio-card-content.ts @@ -7,7 +7,6 @@ import { property, customElement, } from "lit-element"; -import { classMap } from "lit-html/directives/class-map"; import "@polymer/iron-icon/iron-icon"; import "../../../src/components/ha-relative-time"; From cdf6e9eb75d1959ab34ca262f89494556b5105d2 Mon Sep 17 00:00:00 2001 From: Ian Richardson Date: Tue, 4 Feb 2020 09:18:42 -0600 Subject: [PATCH 23/64] =?UTF-8?q?=F0=9F=90=9B=20properly=20format=20timest?= =?UTF-8?q?amps=20in=20glance=20card=20(#4602)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 🐛 properly format timestamps in glance card * address review comments --- src/data/entity.ts | 1 + src/panels/lovelace/cards/hui-glance-card.ts | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/data/entity.ts b/src/data/entity.ts index 4960974c7e..f4d78f3175 100644 --- a/src/data/entity.ts +++ b/src/data/entity.ts @@ -1,4 +1,5 @@ export const UNAVAILABLE = "unavailable"; +export const UNKNOWN = "unknown"; export const ENTITY_COMPONENT_DOMAINS = [ "air_quality", diff --git a/src/panels/lovelace/cards/hui-glance-card.ts b/src/panels/lovelace/cards/hui-glance-card.ts index 883983fa8b..35130eb92c 100644 --- a/src/panels/lovelace/cards/hui-glance-card.ts +++ b/src/panels/lovelace/cards/hui-glance-card.ts @@ -29,6 +29,8 @@ import { actionHandler } from "../common/directives/action-handler-directive"; import { hasAction } from "../common/has-action"; import { ActionHandlerEvent } from "../../../data/lovelace"; import { handleAction } from "../common/handle-action"; +import { computeDomain } from "../../../common/entity/compute_domain"; +import { UNAVAILABLE, UNKNOWN } from "../../../data/entity"; @customElement("hui-glance-card") export class HuiGlanceCard extends LitElement implements LovelaceCard { @@ -242,7 +244,18 @@ export class HuiGlanceCard extends LitElement implements LovelaceCard { ${this._config!.show_state !== false && entityConf.show_state !== false ? html`
- ${entityConf.show_last_changed + ${computeDomain(entityConf.entity) === "sensor" && + stateObj.attributes.device_class === "timestamp" && + stateObj.state !== UNAVAILABLE && + stateObj.state !== UNKNOWN + ? html` + + ` + : entityConf.show_last_changed ? relativeTime( new Date(stateObj.last_changed), this.hass!.localize From 788c490bbcaa1d0ca04986f5bd1456a21ea59013 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 4 Feb 2020 09:36:10 -0800 Subject: [PATCH 24/64] Update update headers in hassio (#4751) * Update update headers in hassio * Other tabs too --- hassio/src/dashboard/hassio-update.ts | 6 +++--- hassio/src/snapshots/hassio-snapshots.ts | 4 ++-- hassio/src/system/hassio-supervisor-info.ts | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/hassio/src/dashboard/hassio-update.ts b/hassio/src/dashboard/hassio-update.ts index 17f37b083f..e7e1fe3f96 100644 --- a/hassio/src/dashboard/hassio-update.ts +++ b/hassio/src/dashboard/hassio-update.ts @@ -64,7 +64,7 @@ export class HassioUpdate extends LitElement {
${this._renderUpdateCard( - "Home Assistant", + "Home Assistant Core", this.hassInfo.version, this.hassInfo.last_version, "hassio/homeassistant/update", @@ -74,7 +74,7 @@ export class HassioUpdate extends LitElement { "hassio:home-assistant" )} ${this._renderUpdateCard( - "Hass.io Supervisor", + "Supervisor", this.supervisorInfo.version, this.supervisorInfo.last_version, "hassio/supervisor/update", @@ -82,7 +82,7 @@ export class HassioUpdate extends LitElement { )} ${this.hassOsInfo ? this._renderUpdateCard( - "HassOS", + "Operating System", this.hassOsInfo.version, this.hassOsInfo.version_latest, "hassio/hassos/update", diff --git a/hassio/src/snapshots/hassio-snapshots.ts b/hassio/src/snapshots/hassio-snapshots.ts index 90116dbb5e..5a96d2cd67 100644 --- a/hassio/src/snapshots/hassio-snapshots.ts +++ b/hassio/src/snapshots/hassio-snapshots.ts @@ -83,8 +83,8 @@ class HassioSnapshots extends LitElement { Create snapshot

- Snapshots allow you to easily backup and restore all data of your - Hass.io instance. + Snapshots allow you to easily backup and restore all data of your Home + Assistant instance.

diff --git a/hassio/src/system/hassio-supervisor-info.ts b/hassio/src/system/hassio-supervisor-info.ts index 2ff33b4bae..d375747e3d 100644 --- a/hassio/src/system/hassio-supervisor-info.ts +++ b/hassio/src/system/hassio-supervisor-info.ts @@ -32,7 +32,7 @@ class HassioSupervisorInfo extends LitElement { return html`
-

Hass.io supervisor

+

Supervisor

From e0376c803fe4cee7406261667143345b536c8103 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 4 Feb 2020 10:28:43 -0800 Subject: [PATCH 25/64] Fix hassio audio --- hassio/src/addon-view/hassio-addon-audio.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/hassio/src/addon-view/hassio-addon-audio.ts b/hassio/src/addon-view/hassio-addon-audio.ts index 06b4f13c91..d41e7ee11c 100644 --- a/hassio/src/addon-view/hassio-addon-audio.ts +++ b/hassio/src/addon-view/hassio-addon-audio.ts @@ -61,7 +61,9 @@ class HassioAddonAudio extends LitElement { ${this._inputDevices && this._inputDevices.map((item) => { return html` - ${item.name} + ${item.name} `; })} @@ -78,7 +80,9 @@ class HassioAddonAudio extends LitElement { ${this._outputDevices && this._outputDevices.map((item) => { return html` - ${item.name} + ${item.name} `; })} From 7758ddba56d2cd9315c16e669d25a8593f188661 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 5 Feb 2020 00:40:35 +0100 Subject: [PATCH 26/64] Fix theming with derived styles (#4758) * Fix theming with derived styles * Move --- hassio/src/hassio-main.ts | 7 ++- hassio/src/hassio-pages-with-tabs.ts | 4 -- hassio/src/resources/hassio-style.ts | 15 +----- hassio/src/system/hassio-system.ts | 7 +-- src/common/dom/apply_themes_on_element.ts | 4 +- src/resources/ha-style.ts | 57 ++--------------------- src/resources/styles.ts | 44 +++++++++++++++++ 7 files changed, 59 insertions(+), 79 deletions(-) diff --git a/hassio/src/hassio-main.ts b/hassio/src/hassio-main.ts index d8f9cca73f..1b6ac36288 100644 --- a/hassio/src/hassio-main.ts +++ b/hassio/src/hassio-main.ts @@ -84,7 +84,12 @@ class HassioMain extends ProvideHassLitMixin(HassRouterPage) { protected firstUpdated(changedProps: PropertyValues) { super.firstUpdated(changedProps); - applyThemesOnElement(this, this.hass.themes, this.hass.selectedTheme, true); + applyThemesOnElement( + this.parentElement, + this.hass.themes, + this.hass.selectedTheme, + true + ); this.addEventListener("hass-api-called", (ev) => this._apiCalled(ev)); // Paulus - March 17, 2019 // We went to a single hass-toggle-menu event in HA 0.90. However, the diff --git a/hassio/src/hassio-pages-with-tabs.ts b/hassio/src/hassio-pages-with-tabs.ts index a34eb11666..ab2291fb54 100644 --- a/hassio/src/hassio-pages-with-tabs.ts +++ b/hassio/src/hassio-pages-with-tabs.ts @@ -126,10 +126,6 @@ class HassioPagesWithTabs extends LitElement { --paper-tabs-selection-bar-color: var(--text-primary-color, #fff); text-transform: uppercase; } - app-header, - app-toolbar { - background-color: var(--primary-color); - } `, ]; } diff --git a/hassio/src/resources/hassio-style.ts b/hassio/src/resources/hassio-style.ts index 91a8782b6b..7c51b469fa 100644 --- a/hassio/src/resources/hassio-style.ts +++ b/hassio/src/resources/hassio-style.ts @@ -1,8 +1,5 @@ import { css } from "lit-element"; -const documentContainer = document.createElement("template"); -documentContainer.setAttribute("style", "display: none;"); - export const hassioStyle = css` .content { margin: 8px; @@ -48,17 +45,7 @@ export const hassioStyle = css` color: var(--primary-color); } .error { - color: var(--google-red-500); + color: var(--error-color); margin-top: 16px; } `; - -documentContainer.innerHTML = ` - -`; - -document.head.appendChild(documentContainer.content); diff --git a/hassio/src/system/hassio-system.ts b/hassio/src/system/hassio-system.ts index fb9c4c192f..e1ea7eb668 100644 --- a/hassio/src/system/hassio-system.ts +++ b/hassio/src/system/hassio-system.ts @@ -33,7 +33,7 @@ class HassioSystem extends LitElement { return html`

Information

-
+
{ const shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i; const checkHex = hex.replace(shorthandRegex, (_m, r, g, b) => { @@ -36,7 +38,7 @@ export const applyThemesOnElement = ( } const styles = { ...element._themes }; if (themeName !== "default") { - const theme = themes.themes[themeName]; + const theme = { ...derivedStyles, ...themes.themes[themeName] }; Object.keys(theme).forEach((key) => { const prefixedKey = `--${key}`; element._themes[prefixedKey] = ""; diff --git a/src/resources/ha-style.ts b/src/resources/ha-style.ts index ae85ea1e6f..943bc9a70c 100644 --- a/src/resources/ha-style.ts +++ b/src/resources/ha-style.ts @@ -1,6 +1,6 @@ import "@polymer/paper-styles/paper-styles"; import "@polymer/polymer/lib/elements/custom-style"; -import { haStyle, haStyleDialog } from "./styles"; +import { haStyle, haStyleDialog, derivedStyles } from "./styles"; const documentContainer = document.createElement("template"); documentContainer.setAttribute("style", "display: none;"); @@ -33,14 +33,11 @@ documentContainer.innerHTML = ` --scrollbar-thumb-color: rgb(194, 194, 194); - --error-color: #db4437; - --error-state-color: var(--error-color); /* states and badges */ --state-icon-color: #44739e; --state-icon-active-color: #FDD835; - --state-icon-unavailable-color: var(--disabled-text-color); /* background and sidebar */ --card-background-color: #ffffff; @@ -48,22 +45,7 @@ documentContainer.innerHTML = ` --secondary-background-color: #e5e5e5; /* behind the cards on state */ /* sidebar menu */ - --sidebar-text-color: var(--primary-text-color); - --sidebar-background-color: var(--paper-listbox-background-color); /* backward compatible with existing themes */ --sidebar-icon-color: rgba(0, 0, 0, 0.5); - --sidebar-selected-text-color: var(--primary-color); - --sidebar-selected-icon-color: var(--primary-color); - - /* controls */ - --switch-checked-color: var(--primary-color); - /* --switch-unchecked-color: var(--accent-color); */ - --switch-checked-button-color: var(--switch-checked-color, var(--paper-grey-50)); - --switch-checked-track-color: var(--switch-checked-color, #000000); - --switch-unchecked-button-color: var(--switch-unchecked-color, var(--paper-grey-50)); - --switch-unchecked-track-color: var(--switch-unchecked-color, #000000); - --slider-color: var(--primary-color); - --slider-secondary-color: var(--light-primary-color); - --slider-bar-color: var(--disabled-text-color); /* for label-badge */ --label-badge-background-color: white; @@ -72,7 +54,6 @@ documentContainer.innerHTML = ` --label-badge-blue: #039be5; --label-badge-green: #0DA035; --label-badge-yellow: #f4b400; - --label-badge-grey: var(--paper-grey-500); /* Paper-styles color.html dependency is stripped on build. @@ -89,7 +70,6 @@ documentContainer.innerHTML = ` --google-blue-500: #4285f4; --google-green-500: #0f9d58; --google-yellow-500: #f4b400; - --paper-spinner-color: var(--primary-color); /* for paper-slider */ --paper-green-400: #66bb6a; @@ -108,26 +88,9 @@ documentContainer.innerHTML = ` --light-secondary-opacity: 0.7; --light-primary-opacity: 1.0; - /* derived colors, to keep existing themes mostly working */ - --paper-card-background-color: var(--card-background-color); - --paper-listbox-background-color: var(--card-background-color); - --paper-item-icon-color: var(--state-icon-color); - --paper-item-icon-active-color: var(--state-icon-active-color); - --table-row-background-color: var(--primary-background-color); - --table-row-alternative-background-color: var(--secondary-background-color); - /* set our slider style */ - --paper-slider-knob-color: var(--slider-color); - --paper-slider-knob-start-color: var(--slider-color); - --paper-slider-pin-color: var(--slider-color); - --paper-slider-active-color: var(--slider-color); - --paper-slider-secondary-color: var(--slider-secondary-color); - --paper-slider-container-color: var(--slider-bar-color); --ha-paper-slider-pin-font-size: 15px; - /* set data table style */ - --data-table-background-color: var(--card-background-color); - /* rgb */ --rgb-primary-color: 3, 169, 244; --rgb-accent-color: 255, 152, 0; @@ -135,21 +98,9 @@ documentContainer.innerHTML = ` --rgb-secondary-text-color: 114, 114, 114; --rgb-text-primary-color: 255, 255, 255; - /* mwc */ - --mdc-theme-primary: var(--primary-color); - --mdc-theme-secondary: var(--accent-color); - --mdc-theme-background: var(--primary-background-color); - --mdc-theme-surface: var(--paper-card-background-color, var(--card-background-color)); - - /* mwc text styles */ - --mdc-theme-on-primary: var(--text-primary-color); - --mdc-theme-on-secondary: var(--text-primary-color); - --mdc-theme-on-surface: var(--primary-text-color); - - /* app header background color */ - --app-header-text-color: var(--text-primary-color); - --app-header-background-color: var(--primary-color); - + ${Object.entries(derivedStyles) + .map(([key, value]) => `--${key}: ${value};`) + .join("")} } diff --git a/src/resources/styles.ts b/src/resources/styles.ts index 278c881f9a..34c2e7980d 100644 --- a/src/resources/styles.ts +++ b/src/resources/styles.ts @@ -1,5 +1,49 @@ import { css } from "lit-element"; +export const derivedStyles = { + "paper-spinner-color": "var(--primary-color)", + "error-state-color": "var(--error-color)", + "state-icon-unavailable-color": "var(--disabled-text-color)", + "sidebar-text-color": "var(--primary-text-color)", + "sidebar-background-color": "var(--paper-listbox-background-color);", + "sidebar-selected-text-color": "var(--primary-color)", + "sidebar-selected-icon-color": "var(--primary-color)", + "switch-checked-color": "var(--primary-color)", + "switch-checked-button-color": + "var(--switch-checked-color, var(--paper-grey-50))", + "switch-checked-track-color": "var(--switch-checked-color, #000000)", + "switch-unchecked-button-color": + "var(--switch-unchecked-color, var(--paper-grey-50))", + "switch-unchecked-track-color": "var(--switch-unchecked-color, #000000)", + "slider-color": "var(--primary-color)", + "slider-secondary-color": "var(--light-primary-color)", + "slider-bar-color": "var(--disabled-text-color)", + "label-badge-grey": "var(--paper-grey-500)", + "paper-card-background-color": "var(--card-background-color)", + "paper-listbox-background-color": "var(--card-background-color)", + "paper-item-icon-color": "var(--state-icon-color)", + "paper-item-icon-active-color": "var(--state-icon-active-color)", + "table-row-background-color": "var(--primary-background-color)", + "table-row-alternative-background-color": "var(--secondary-background-color)", + "paper-slider-knob-color": "var(--slider-color)", + "paper-slider-knob-start-color": "var(--slider-color)", + "paper-slider-pin-color": "var(--slider-color)", + "paper-slider-active-color": "var(--slider-color)", + "paper-slider-secondary-color": "var(--slider-secondary-color)", + "paper-slider-container-color": "var(--slider-bar-color)", + "data-table-background-color": "var(--card-background-color)", + "mdc-theme-primary": "var(--primary-color)", + "mdc-theme-secondary": "var(--accent-color)", + "mdc-theme-background": "var(--primary-background-color)", + "mdc-theme-surface": + "var(--paper-card-background-color, var(--card-background-color))", + "mdc-theme-on-primary": "var(--text-primary-color)", + "mdc-theme-on-secondary": "var(--text-primary-color)", + "mdc-theme-on-surface": "var(--primary-text-color)", + "app-header-text-color": "var(--text-primary-color)", + "app-header-background-color": "var(--primary-color)", +}; + export const haStyle = css` :host { @apply --paper-font-body1; From 107f428dd32e7b937526f767f747519924d123d0 Mon Sep 17 00:00:00 2001 From: Zack Arnett Date: Tue, 4 Feb 2020 19:11:13 -0500 Subject: [PATCH 27/64] Sensor Card Fill feature (#4745) --- src/panels/lovelace/cards/hui-sensor-card.ts | 99 ++++++++++++++------ 1 file changed, 69 insertions(+), 30 deletions(-) diff --git a/src/panels/lovelace/cards/hui-sensor-card.ts b/src/panels/lovelace/cards/hui-sensor-card.ts index 636481b4bc..3c6656bd04 100644 --- a/src/panels/lovelace/cards/hui-sensor-card.ts +++ b/src/panels/lovelace/cards/hui-sensor-card.ts @@ -27,6 +27,17 @@ import { SensorCardConfig } from "./types"; import { hasConfigOrEntityChanged } from "../common/has-changed"; import { actionHandler } from "../common/directives/action-handler-directive"; +const average = (items): number => { + return ( + items.reduce((sum, entry) => sum + parseFloat(entry.state), 0) / + items.length + ); +}; + +const lastValue = (items): number => { + return parseFloat(items[items.length - 1].state) || 0; +}; + const midPoint = ( _Ax: number, _Ay: number, @@ -69,34 +80,40 @@ const calcPoints = ( max: number ): number[][] => { const coords = [] as number[][]; - const margin = 5; const height = 80; - width -= 10; let yRatio = (max - min) / height; yRatio = yRatio !== 0 ? yRatio : height; let xRatio = width / (hours - (detail === 1 ? 1 : 0)); xRatio = isFinite(xRatio) ? xRatio : width; + + const first = history.filter(Boolean)[0]; + let last = [average(first), lastValue(first)]; + const getCoords = (item, i, offset = 0, depth = 1) => { if (depth > 1) { return item.forEach((subItem, index) => getCoords(subItem, i, index, depth - 1) ); } - const average = - item.reduce((sum, entry) => sum + parseFloat(entry.state), 0) / - item.length; - const x = xRatio * (i + offset / 6) + margin; - const y = height - (average - min) / yRatio + margin * 2; + const x = xRatio * (i + offset / 6); + + if (item) { + last = [average(item), lastValue(item)]; + } + const y = height - ((item ? last[0] : last[1]) - min) / yRatio; return coords.push([x, y]); }; - history.forEach((item, i) => getCoords(item, i, 0, detail)); - if (coords.length === 1) { - coords[1] = [width + margin, coords[0][1]]; + for (let i = 0; i < history.length; i += 1) { + getCoords(history[i], i, 0, detail); } - coords.push([width + margin, coords[coords.length - 1][1]]); + if (coords.length === 1) { + coords[1] = [width, coords[0][1]]; + } + + coords.push([width, coords[coords.length - 1][1]]); return coords; }; @@ -227,14 +244,27 @@ class HuiSensorCard extends LitElement implements LovelaceCard { } else { graph = svg` - + + + + + + + + + + `; } @@ -247,17 +277,15 @@ class HuiSensorCard extends LitElement implements LovelaceCard { .actionHandler=${actionHandler()} tabindex="0" > -
+
+
+ ${this._config.name || computeStateName(stateObj)} +
-
- ${this._config.name || computeStateName(stateObj)} -
${stateObj.state} @@ -355,9 +383,9 @@ class HuiSensorCard extends LitElement implements LovelaceCard { display: flex; flex-direction: column; flex: 1; - padding: 16px; position: relative; cursor: pointer; + overflow: hidden; } ha-card:focus { @@ -370,6 +398,11 @@ class HuiSensorCard extends LitElement implements LovelaceCard { } .header { + margin: 16px 16px 0; + justify-content: space-between; + } + + .name { align-items: center; display: flex; min-width: 0; @@ -377,13 +410,13 @@ class HuiSensorCard extends LitElement implements LovelaceCard { position: relative; } - .name { + .name > span { display: block; display: -webkit-box; font-size: 1.2rem; font-weight: 500; max-height: 1.4rem; - margin-top: 2px; + top: 2px; opacity: 0.8; overflow: hidden; text-overflow: ellipsis; @@ -405,7 +438,7 @@ class HuiSensorCard extends LitElement implements LovelaceCard { .info { flex-wrap: wrap; - margin: 16px 0 16px 8px; + margin: 16px; } #value { @@ -432,11 +465,17 @@ class HuiSensorCard extends LitElement implements LovelaceCard { margin-bottom: 0px; position: relative; width: 100%; + overflow: hidden; } .graph > div { align-self: flex-end; - margin: auto 8px; + margin: auto 0px; + display: flex; + } + + .fill { + opacity: 0.1; } `; } From cb0d91d1247b3be89c283cd44cf0245e0dbffe92 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Wed, 5 Feb 2020 00:32:34 +0000 Subject: [PATCH 28/64] [ci skip] Translation update --- translations/fi.json | 36 +++++++++++++----- translations/zh-Hant.json | 80 +++++++++++++++++++-------------------- 2 files changed, 66 insertions(+), 50 deletions(-) diff --git a/translations/fi.json b/translations/fi.json index dc64f0ded6..4da340fee3 100644 --- a/translations/fi.json +++ b/translations/fi.json @@ -664,6 +664,7 @@ "header": "Toiminnot", "introduction": "Home Assistant suorittaa toiminnot, kun automaatio laukaistaan.", "learn_more": "Lisätietoja toiminnoista", + "name": "Toiminta", "type_select": "Toiminnon tyyppi", "type": { "condition": { @@ -775,7 +776,7 @@ "header": "Laukaisuehdot", "introduction": "Laukaisuehdot määrittelevät, milloin automaatiota aletaan suorittaa. Samassa säännössä voi olla useita laukaisuehtoja. Kun laukaisuehto täyttyy, Home Assistant varmistaa ehdot. Jos ehdot täyttyvät, toiminto suoritetaan.", "learn_more": "Lisätietoja triggereistä", - "name": "Laukaisuehto", + "name": "Käynnistysehto", "type_select": "Laukaisimen tyyppi", "type": { "device": { @@ -817,7 +818,7 @@ "value_template": "Arvomalli (template)" }, "state": { - "for": "Ajaksi", + "for": "Viive", "from": "Lähtötila", "label": "Tila", "to": "Kohdetila" @@ -1057,6 +1058,9 @@ "description": "Hallitse yhdistettyjä laitteita", "details": "Tässä ovat kaikki laitteesi tiedot.", "device_not_found": "Laitetta ei löydy.", + "entities": { + "add_entities_lovelace": "Lisää Lovelace näkymään" + }, "info": "Laitteen tiedot", "scene": { "create": "Luo tilanne laitteella", @@ -1109,7 +1113,7 @@ "hub": "Yhdistetty kautta", "manuf": "{manufacturer}", "no_area": "Ei aluetta", - "no_device": "Kokonaisuudet ilman laitteita", + "no_device": "Kohteet ilman laitteita", "no_devices": "Tällä integraatiolla ei ole laitteita.", "restart_confirm": "Käynnistä Home Assistant uudellen viimeistelläksesi tämän integraation poistamisen", "settings_button": "Muokkaa {Integration}-asetuksia", @@ -1352,7 +1356,7 @@ "node_config": { "config_parameter": "Asetusparametri", "config_value": "Asetusarvo", - "false": "Eätosi", + "false": "Epätosi", "header": "Solmun määritysasetukset", "seconds": "sekuntia", "set_config_parameter": "Aseta asetusparametri", @@ -1391,12 +1395,17 @@ "info": { "developed_by": "Kehittänyt joukko mahtavia ihmisiä.", "home_assistant_logo": "Home Assistant-logo", + "icons_by": "Kuvakkeet luonut", "license": "Julkaistu Apache 2.0-lisenssillä", "remove": "Poista", "server": "palvelin", "set": "Aseta", "title": "Tiedot" }, + "logs": { + "refresh": "Päivitä", + "title": "Lokit" + }, "mqtt": { "description_listen": "Kuuntele aihetta", "description_publish": "Julkaise paketti", @@ -1424,6 +1433,7 @@ "title": "Tilat" }, "templates": { + "editor": "Mallieditori", "title": "Malli" } } @@ -1450,12 +1460,13 @@ "more_info": "Näytä lisätietoa: {name}", "navigate_to": "Siirry kohtaan {location}", "tap": "Napauta:", - "toggle": "Kytke {name}" + "toggle": "Kytke {name}", + "url": "Avaa ikkuna {url_path}" }, "shopping-list": { "add_item": "Lisää", - "checked_items": "Valitut", - "clear_items": "Tyhjää valitut" + "checked_items": "Valitut kohteet", + "clear_items": "Tyhjää valitut kohteet" } }, "changed_toast": { @@ -1572,7 +1583,7 @@ }, "edit_card": { "add": "Lisää kortti", - "delete": "Poista", + "delete": "Poista kortti", "edit": "Muokkaa", "header": "Kortti-asetukset", "move": "Siirrä", @@ -1606,6 +1617,8 @@ "para_no_id": "Elementillä ei ole ID. Lisää ID elementille 'ui-lovelace.yaml'-tiedostossa." }, "raw_editor": { + "confirm_remove_config_text": "Lovelace käyttöliittymän näkymät luodaan automaattisesti alueistasi ja laitteistasi, jos poistat nykyisen määrityksen.", + "confirm_remove_config_title": "Haluatko varmasti poistaa Lovelace-käyttöliittymän asetukset? Lovelace käyttöliittymän asetukset luodaan automaattisesti alueistasi ja laitteistasi.", "confirm_unsaved_changes": "Sinulla on tallentamattomia muutoksia. Haluatko varmasti poistua?", "header": "Muokkaa asetuksia", "save": "Tallenna", @@ -1618,6 +1631,9 @@ "para": "Oletuksena Home Assistant ylläpitää käyttöliittymääsi, päivittäen sitä uusien yksiköiden tai Lovelace komponenttien tullessa saataville. Jos muokkaat käyttöliittymääsi, emme enää tee muutoksia automaattisesti.", "para_sure": "Oletko varma, että haluat ottaa haltuun käyttöliittymän?", "save": "Ota hallintaan" + }, + "suggest_card": { + "create_own": "Valitse toinen kortti" } }, "menu": { @@ -1796,7 +1812,7 @@ }, "integration": { "finish": "Valmis", - "intro": "Laitteet ja palvelut ovat edustettuna Home Assistantissa integraatioina. Voit määrittää ne nyt tai tehdä sitä myöhemmin kokoonpanonäytöstä.", + "intro": "Laitteet ja palvelut on esitetty Home Assistantissa integraatioina. Voit määrittää ne nyt tai tehdä sen myöhemmin asetus valikosta.", "more_integrations": "Lisää" }, "intro": "Oletko valmis herättämään kotisi eloon, palauttamaan yksityisyytesi ja liittymään maailmanlaajuiseen nikkarien joukkoon?", @@ -1824,7 +1840,7 @@ "change_password": { "confirm_new_password": "Vahvista uusi salasana", "current_password": "Nykyinen salasana", - "error_required": "Edellytetään", + "error_required": "Pakollinen", "header": "Vaihda salasana", "new_password": "Uusi salasana", "submit": "Lähetä" diff --git a/translations/zh-Hant.json b/translations/zh-Hant.json index f69e4f10ff..264e7289db 100644 --- a/translations/zh-Hant.json +++ b/translations/zh-Hant.json @@ -758,7 +758,7 @@ "header": "分區", "integrations_page": "整合頁面", "introduction": "分區主要用以管理設備所在位置。此資訊將會於 Home Assistant 中使用以協助您管理介面、權限,並與其他系統進行整合。", - "introduction2": "欲於分區中放置設備,請使用下方連結至整合頁面,並點選設定整合以設定設備卡片。", + "introduction2": "欲於分區中放置設備,請使用下方連結至整合頁面,並點選設定整合以設定設備面板。", "no_areas": "看起來你還沒有建立分區!" } }, @@ -1254,7 +1254,7 @@ "device_not_found": "未找到設備。", "entities": { "add_entities_lovelace": "新增至 Lovelace UI", - "entities": "物件", + "entities": "物件列表面板", "none": "此設備沒有物件。" }, "info": "設備資訊", @@ -1874,7 +1874,7 @@ "yaml_unsupported": "當使用 Lovelace UI 的 YAML 模式時,無法使用此功能。" }, "cards": { - "confirm_delete": "確定要刪除此卡片?", + "confirm_delete": "確定要刪除此面板?", "empty_state": { "go_to_integrations_page": "轉至整合頁面。", "no_devices": "此頁面允許進行控制所擁有的設備。看起來您尚未設定任何設備,從設定中的整合頁面開始吧。", @@ -1909,10 +1909,10 @@ }, "alarm-panel": { "available_states": "可用狀態", - "name": "警報面板" + "name": "警報器面板" }, "conditional": { - "name": "條件式" + "name": "條件式面板" }, "config": { "optional": "選項", @@ -1924,13 +1924,13 @@ "toggle": "切換物件。" }, "entity-button": { - "name": "物件按鈕" + "name": "物件按鈕式面板" }, "entity-filter": { - "name": "物件過濾器" + "name": "物件過濾式面板" }, "gauge": { - "name": "尺規", + "name": "量表式面板", "severity": { "define": "定義嚴重度?", "green": "綠色", @@ -1964,77 +1964,77 @@ }, "glance": { "columns": "列", - "name": "Glance" + "name": "簡略式面板" }, "history-graph": { - "name": "歷史圖表" + "name": "歷史圖表式面板" }, "horizontal-stack": { - "name": "水平堆疊" + "name": "水平排列面板" }, "iframe": { - "name": "iFrame" + "name": "iFrame 面板" }, "light": { - "name": "燈光" + "name": "燈光面板" }, "map": { "dark_mode": "深色模式?", "default_zoom": "預設大小", "geo_location_sources": "地理位置來源", - "name": "地圖", + "name": "地圖面板", "source": "來源" }, "markdown": { "content": "內容", - "name": "Markdown" + "name": "Markdown 面板" }, "media-control": { - "name": "媒體控制" + "name": "媒體控制面板" }, "picture-elements": { - "name": "圖片元素" + "name": "圖片要素面板" }, "picture-entity": { - "name": "圖片物件" + "name": "圖片物件面板" }, "picture-glance": { - "name": "Picture Glance" + "name": "圖片簡略式面板" }, "picture": { - "name": "圖片" + "name": "圖片面板" }, "plant-status": { - "name": "植物狀態" + "name": "植物狀態面板" }, "sensor": { "graph_detail": "圖像精細度", "graph_type": "圖像類型", - "name": "傳感器" + "name": "傳感器面板" }, "shopping-list": { - "integration_not_loaded": "此卡片需要先設定「shopping_list」整合。", - "name": "購物清單" + "integration_not_loaded": "此面板需要先設定「shopping_list」整合。", + "name": "購物清單面板" }, "thermostat": { - "name": "溫控器" + "name": "溫控器面板" }, "vertical-stack": { - "name": "垂直堆疊" + "name": "垂直排列面板" }, "weather-forecast": { - "name": "天氣預報" + "name": "天氣預報面板" } }, "edit_card": { - "add": "新增卡片", - "delete": "刪除卡片", + "add": "新增面板", + "delete": "刪除面板", "edit": "編輯", - "header": "卡片設定", + "header": "面板設定", "move": "移動至視圖", "options": "更多選項", - "pick_card": "選擇所要新增的卡片?", - "pick_card_view_title": "要加入 {name} 視圖的卡片?", + "pick_card": "選擇所要新增的面板?", + "pick_card_view_title": "要加入 {name} 視圖的面板?", "save": "儲存", "show_code_editor": "顯示編碼編輯器", "show_visual_editor": "顯示視覺編輯器", @@ -2062,12 +2062,12 @@ "migrate": { "header": "設定不相容", "migrate": "遷移設定", - "para_migrate": "Home Assistant 能於您點選「遷移設定」按鈕後,自動新增 ID 與視圖至所有卡片。", + "para_migrate": "Home Assistant 能於您點選「遷移設定」按鈕後,自動新增 ID 與視圖至所有面板。", "para_no_id": "該元件未含 ID,請於「ui-lovelace.yaml」中為該元件新增 ID。" }, "raw_editor": { - "confirm_remove_config_text": "假如移除 Lovelace UI 設定的話,將自動以區域與設備產生 Lovelace UI 卡片。", - "confirm_remove_config_title": "確定要移除 Lovelace UI 設定?將依據區域與設備自動產生 Lovelace UI 卡片。", + "confirm_remove_config_text": "假如移除 Lovelace UI 設定的話,將自動以區域與設備產生 Lovelace UI 面板。", + "confirm_remove_config_title": "確定要移除 Lovelace UI 設定?將依據區域與設備自動產生 Lovelace UI 面板。", "confirm_unsaved_changes": "變更尚未儲存,確定要退出?", "confirm_unsaved_comments": "設定包含命令、將不會被儲存。是否要繼續?", "error_invalid_config": "設定無效:{error}", @@ -2088,12 +2088,12 @@ }, "suggest_card": { "add": "新增至 Lovelace UI", - "create_own": "選擇其他卡片", - "header": "已為您產生建議卡片" + "create_own": "選擇其他面板", + "header": "已為您產生建議面板" }, "view": { "panel_mode": { - "description": "將會以全寬繪製第一張卡,視圖中其他卡片將不進行呈現。", + "description": "將會以全寬繪製第一張卡,視圖中其他面板將不進行呈現。", "title": "面板模式?" } } @@ -2113,12 +2113,12 @@ "entity": "物件", "entity_id": "物件 ID", "last_changed": "上次變更", - "select_to_add": "選擇所要新增至卡片的物件、並點選新增至卡片按鈕。", + "select_to_add": "選擇所要新增至面板的物件、並點選新增至面板按鈕。", "title": "未使用物件" }, "views": { "confirm_delete": "確定要刪除此視圖?", - "existing_cards": "無法刪除內含卡片的視圖,請先移除卡片。" + "existing_cards": "無法刪除內含面板的視圖,請先移除面板。" }, "warning": { "entity_non_numeric": "物件為非數字:{entity}", From 8518f774d44d4b9cd7e9b824dc9e9372e665347d Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 5 Feb 2020 10:00:19 +0100 Subject: [PATCH 29/64] Rename hass.io panel to supervisor --- hassio/src/hassio-pages-with-tabs.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hassio/src/hassio-pages-with-tabs.ts b/hassio/src/hassio-pages-with-tabs.ts index ab2291fb54..becdccdf49 100644 --- a/hassio/src/hassio-pages-with-tabs.ts +++ b/hassio/src/hassio-pages-with-tabs.ts @@ -52,7 +52,7 @@ class HassioPagesWithTabs extends LitElement { .narrow=${this.narrow} hassio > -
Hass.io
+
Supervisor
${HAS_REFRESH_BUTTON.includes(page) ? html` Date: Wed, 5 Feb 2020 11:34:10 -0500 Subject: [PATCH 30/64] Update Material Design Icons to v4.9.95 (#4764) --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 80a981ee46..9f1686c7b4 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "@material/mwc-fab": "^0.10.0", "@material/mwc-ripple": "^0.10.0", "@material/mwc-switch": "^0.10.0", - "@mdi/svg": "4.8.95", + "@mdi/svg": "4.9.95", "@polymer/app-layout": "^3.0.2", "@polymer/app-localize-behavior": "^3.0.1", "@polymer/app-route": "^3.0.2", diff --git a/yarn.lock b/yarn.lock index ade5077687..7e8b1d0c0a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1662,10 +1662,10 @@ dependencies: "@material/feature-targeting" "^4.0.0" -"@mdi/svg@4.8.95": - version "4.8.95" - resolved "https://registry.yarnpkg.com/@mdi/svg/-/svg-4.8.95.tgz#a48c3cb027bca12a3aa73ad3ef686d0284251109" - integrity sha512-jG+e5B8Y3/vlGWtpKHvDXUCl/evd782GQ4x2Zfpdi6oexZELy+euaXfZNKlqWGUbXVAxqSHyBo6nyAsn60UB5A== +"@mdi/svg@4.9.95": + version "4.9.95" + resolved "https://registry.yarnpkg.com/@mdi/svg/-/svg-4.9.95.tgz#4e9d2b26b12e22f751336b35ba3cb763817e4c45" + integrity sha512-4RBtbnPlILP5TIQJ2p3t3VD6D+HcCeQtrFTKoa5e+v3ZvRbylffttYovtcFKfgEJ+Tk0s9t2NgLcPUyQtD9Rxg== "@polymer/app-layout@^3.0.2": version "3.0.2" From c7f7ef28bfaaa21b38fbe65bbe93d80b01cbfcda Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 5 Feb 2020 18:21:43 +0100 Subject: [PATCH 31/64] Fixes removing audio device (#4763) (only the supervisor doesn't support it) --- hassio/src/addon-view/hassio-addon-audio.ts | 22 ++++++++------------- src/data/hassio/hardware.ts | 7 +++++-- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/hassio/src/addon-view/hassio-addon-audio.ts b/hassio/src/addon-view/hassio-addon-audio.ts index d41e7ee11c..84357963b4 100644 --- a/hassio/src/addon-view/hassio-addon-audio.ts +++ b/hassio/src/addon-view/hassio-addon-audio.ts @@ -128,16 +128,12 @@ class HassioAddonAudio extends LitElement { private _setInputDevice(ev): void { const device = ev.detail.item.getAttribute("device"); - if (device) { - this._selectedInput = device; - } + this._selectedInput = device || null; } private _setOutputDevice(ev): void { const device = ev.detail.item.getAttribute("device"); - if (device) { - this._selectedOutput = device; - } + this._selectedOutput = device || null; } private async _addonChanged(): Promise { @@ -147,13 +143,11 @@ class HassioAddonAudio extends LitElement { return; } - const noDevice: HassioHardwareAudioDevice[] = [ - { device: undefined, name: "-" }, - ]; + const noDevice: HassioHardwareAudioDevice = { device: null, name: "-" }; try { const { audio } = await fetchHassioHardwareAudio(this.hass); - const inupt = Object.keys(audio.input).map((key) => ({ + const input = Object.keys(audio.input).map((key) => ({ device: key, name: audio.input[key], })); @@ -162,12 +156,12 @@ class HassioAddonAudio extends LitElement { name: audio.output[key], })); - this._inputDevices = noDevice.concat(inupt); - this._outputDevices = noDevice.concat(output); + this._inputDevices = [noDevice, ...input]; + this._outputDevices = [noDevice, ...output]; } catch { this._error = "Failed to fetch audio hardware"; - this._inputDevices = noDevice; - this._outputDevices = noDevice; + this._inputDevices = [noDevice]; + this._outputDevices = [noDevice]; } } diff --git a/src/data/hassio/hardware.ts b/src/data/hassio/hardware.ts index ee18581f2b..98a4b3ca57 100644 --- a/src/data/hassio/hardware.ts +++ b/src/data/hassio/hardware.ts @@ -2,12 +2,15 @@ import { HomeAssistant } from "../../types"; import { HassioResponse, hassioApiResultExtractor } from "./common"; export interface HassioHardwareAudioDevice { - device?: string; + device?: string | null; name: string; } interface HassioHardwareAudioList { - audio: { input: any; output: any }; + audio: { + input: { [key: string]: string }; + output: { [key: string]: string }; + }; } export interface HassioHardwareInfo { From 2e4c73c087ef89da278f746a06f6da10e1b750d3 Mon Sep 17 00:00:00 2001 From: Zack Arnett Date: Wed, 5 Feb 2020 12:28:29 -0500 Subject: [PATCH 32/64] Convert Media Control Card to Typescript (#4761) * Delete old JS file. Add new TS file. Add Type * Updates * Reviews * Review Updates :) * Updating State Localize * Clean up * Fixing Travis --- .../lovelace/cards/hui-legacy-wrapper-card.js | 58 ---- .../lovelace/cards/hui-media-control-card.js | 22 -- .../lovelace/cards/hui-media-control-card.ts | 320 ++++++++++++++++++ .../hui-media-control-card-editor.ts | 2 +- src/types.ts | 7 + 5 files changed, 328 insertions(+), 81 deletions(-) delete mode 100644 src/panels/lovelace/cards/hui-legacy-wrapper-card.js delete mode 100644 src/panels/lovelace/cards/hui-media-control-card.js create mode 100644 src/panels/lovelace/cards/hui-media-control-card.ts diff --git a/src/panels/lovelace/cards/hui-legacy-wrapper-card.js b/src/panels/lovelace/cards/hui-legacy-wrapper-card.js deleted file mode 100644 index 0bc35371bd..0000000000 --- a/src/panels/lovelace/cards/hui-legacy-wrapper-card.js +++ /dev/null @@ -1,58 +0,0 @@ -import { createErrorCardConfig } from "./hui-error-card"; -import { computeDomain } from "../../../common/entity/compute_domain"; - -export default class LegacyWrapperCard extends HTMLElement { - constructor(tag, domain) { - super(); - this._tag = tag.toUpperCase(); - this._domain = domain; - this._element = null; - } - - getCardSize() { - return 3; - } - - setConfig(config) { - if (!config.entity) { - throw new Error("No entity specified"); - } - - if (computeDomain(config.entity) !== this._domain) { - throw new Error( - `Specified entity needs to be of domain ${this._domain}.` - ); - } - - this._config = config; - } - - set hass(hass) { - const entityId = this._config.entity; - - if (entityId in hass.states) { - this._ensureElement(this._tag); - this.lastChild.hass = hass; - this.lastChild.stateObj = hass.states[entityId]; - this.lastChild.config = this._config; - } else { - this._ensureElement("HUI-ERROR-CARD"); - this.lastChild.setConfig( - createErrorCardConfig( - `No state available for ${entityId}`, - this._config - ) - ); - } - } - - _ensureElement(tag) { - if (this.lastChild && this.lastChild.tagName === tag) return; - - if (this.lastChild) { - this.removeChild(this.lastChild); - } - - this.appendChild(document.createElement(tag)); - } -} diff --git a/src/panels/lovelace/cards/hui-media-control-card.js b/src/panels/lovelace/cards/hui-media-control-card.js deleted file mode 100644 index bc133b41a2..0000000000 --- a/src/panels/lovelace/cards/hui-media-control-card.js +++ /dev/null @@ -1,22 +0,0 @@ -import "../../../cards/ha-media_player-card"; - -import LegacyWrapperCard from "./hui-legacy-wrapper-card"; - -class HuiMediaControlCard extends LegacyWrapperCard { - static async getConfigElement() { - await import( - /* webpackChunkName: "hui-media-control-card-editor" */ "../editor/config-elements/hui-media-control-card-editor" - ); - return document.createElement("hui-media-control-card-editor"); - } - - static getStubConfig() { - return { entity: "" }; - } - - constructor() { - super("ha-media_player-card", "media_player"); - } -} - -customElements.define("hui-media-control-card", HuiMediaControlCard); diff --git a/src/panels/lovelace/cards/hui-media-control-card.ts b/src/panels/lovelace/cards/hui-media-control-card.ts new file mode 100644 index 0000000000..6b04400ec2 --- /dev/null +++ b/src/panels/lovelace/cards/hui-media-control-card.ts @@ -0,0 +1,320 @@ +import { + html, + LitElement, + PropertyValues, + TemplateResult, + customElement, + property, + css, + CSSResult, +} from "lit-element"; +import { classMap } from "lit-html/directives/class-map"; +import { HassEntity } from "home-assistant-js-websocket"; +import "@polymer/paper-icon-button/paper-icon-button"; + +import "../../../components/ha-card"; +import { applyThemesOnElement } from "../../../common/dom/apply_themes_on_element"; +import { computeStateName } from "../../../common/entity/compute_state_name"; +import { supportsFeature } from "../../../common/entity/supports-feature"; +import { OFF_STATES, SUPPORT_PAUSE } from "../../../data/media-player"; +import { hasConfigOrEntityChanged } from "../common/has-changed"; +import { HomeAssistant, MediaEntity } from "../../../types"; +import { LovelaceCard, LovelaceCardEditor } from "../types"; +import { fireEvent } from "../../../common/dom/fire_event"; +import { MediaControlCardConfig } from "./types"; + +@customElement("hui-media-control-card") +export class HuiMediaControlCard extends LitElement implements LovelaceCard { + public static async getConfigElement(): Promise { + await import( + /* webpackChunkName: "hui-media-control-card-editor" */ "../editor/config-elements/hui-media-control-card-editor" + ); + return document.createElement("hui-media-control-card-editor"); + } + + public static getStubConfig(): object { + return { entity: "" }; + } + + @property() public hass?: HomeAssistant; + @property() private _config?: MediaControlCardConfig; + + public getCardSize(): number { + return 3; + } + + public setConfig(config: MediaControlCardConfig): void { + if (!config.entity || config.entity.split(".")[0] !== "media_player") { + throw new Error("Specify an entity from within the media_player domain."); + } + + this._config = { theme: "default", ...config }; + } + + protected render(): TemplateResult { + if (!this.hass || !this._config) { + return html``; + } + const stateObj = this.hass.states[this._config.entity] as MediaEntity; + + if (!stateObj) { + return html` + ${this.hass.localize( + "ui.panel.lovelace.warning.entity_not_found", + "entity", + this._config.entity + )} + `; + } + const image = + stateObj.attributes.entity_picture || + "../static/images/card_media_player_bg.png"; + + return html` + +
+
+
+ ${this._config!.name || + computeStateName(this.hass!.states[this._config!.entity])} +
+ ${this._computeMediaTitle(stateObj)} +
+
+
+ ${OFF_STATES.includes(stateObj.state) + ? "" + : html` + + `} +
+
+ +
+
+ + + +
+
+ +
+
+
+ `; + } + + protected shouldUpdate(changedProps: PropertyValues): boolean { + return hasConfigOrEntityChanged(this, changedProps); + } + + protected updated(changedProps: PropertyValues): void { + super.updated(changedProps); + if (!this._config || !this.hass || !changedProps.has("hass")) { + return; + } + + const oldHass = changedProps.get("hass") as HomeAssistant | undefined; + const oldConfig = changedProps.get("_config") as + | MediaControlCardConfig + | undefined; + + if ( + !oldHass || + !oldConfig || + oldHass.themes !== this.hass.themes || + oldConfig.theme !== this._config.theme + ) { + applyThemesOnElement(this, this.hass.themes, this._config.theme); + } + } + + private _computeMediaTitle(stateObj: HassEntity): string { + let prefix; + let suffix; + + switch (stateObj.attributes.media_content_type) { + case "music": + prefix = stateObj.attributes.media_artist; + suffix = stateObj.attributes.media_title; + break; + case "tvshow": + prefix = stateObj.attributes.media_series_title; + suffix = stateObj.attributes.media_title; + break; + default: + prefix = + stateObj.attributes.media_title || + stateObj.attributes.app_name || + this.hass!.localize(`state.media_player.${stateObj.state}`) || + this.hass!.localize(`state.default.${stateObj.state}`) || + stateObj.state; + suffix = ""; + } + + return prefix && suffix ? `${prefix}: ${suffix}` : prefix || suffix || ""; + } + + private _handleMoreInfo() { + fireEvent(this, "hass-more-info", { + entityId: this._config!.entity, + }); + } + + private _handleClick(e: MouseEvent) { + this.hass!.callService("media_player", (e.currentTarget! as any).action, { + entity_id: this._config!.entity, + }); + } + + static get styles(): CSSResult { + return css` + .ratio { + position: relative; + width: 100%; + height: 0; + padding-bottom: 56.25%; + } + + .image { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: block; + transition: filter 0.2s linear; + background-position: center center; + background-size: cover; + } + + .no-image { + padding-bottom: 20%; + } + + .no-image > .image { + background-position: center center; + background-repeat: no-repeat; + background-color: var(--primary-color); + background-size: initial; + } + + .no-image > .caption { + background-color: initial; + } + + .controls { + align-content: space-evenly; + padding: 8px; + } + + .controls > div { + width: 33%; + align-items: center; + } + + .flex { + display: flex; + } + + .left { + justify-content: flex-start; + } + + .center { + justify-content: center; + } + + .right { + justify-content: flex-end; + } + + paper-icon-button { + width: 44px; + height: 44px; + opacity: var(--dark-primary-opacity); + } + + paper-icon-button[disabled] { + opacity: var(--dark-disabled-opacity); + } + + .playPauseButton { + width: 56px !important; + height: 56px !important; + background-color: var(--primary-color); + color: white; + border-radius: 50%; + padding: 8px; + transition: background-color 0.5s; + } + + .caption { + position: absolute; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, var(--dark-secondary-opacity)); + padding: 8px 16px; + font-size: 14px; + font-weight: 500; + color: white; + transition: background-color 0.5s; + } + + .title { + font-size: 1.2em; + margin: 8px 0 4px; + } + + .progress { + width: 100%; + height: var(--paper-progress-height, 4px); + margin-top: calc(-1 * var(--paper-progress-height, 4px)); + --paper-progress-active-color: var(--accent-color); + --paper-progress-container-color: rgba(200, 200, 200, 0.5); + } + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + "hui-media-control-card": HuiMediaControlCard; + } +} diff --git a/src/panels/lovelace/editor/config-elements/hui-media-control-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-media-control-card-editor.ts index 94d8d75994..00b596dff6 100644 --- a/src/panels/lovelace/editor/config-elements/hui-media-control-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-media-control-card-editor.ts @@ -11,9 +11,9 @@ import { EntitiesEditorEvent, EditorTarget } from "../types"; import { HomeAssistant } from "../../../../types"; import { LovelaceCardEditor } from "../../types"; import { fireEvent } from "../../../../common/dom/fire_event"; -import { MediaControlCardConfig } from "../../cards/hui-media-control-card"; import "../../../../components/entity/ha-entity-picker"; +import { MediaControlCardConfig } from "../../cards/types"; const cardConfigStruct = struct({ type: "string", diff --git a/src/types.ts b/src/types.ts index 58b2170783..9cef34e771 100644 --- a/src/types.ts +++ b/src/types.ts @@ -200,6 +200,13 @@ export type CameraEntity = HassEntityBase & { }; }; +export type MediaEntity = HassEntityBase & { + attributes: HassEntityAttributeBase & { + media_duration: number; + media_position: number; + }; +}; + export type InputSelectEntity = HassEntityBase & { attributes: HassEntityAttributeBase & { options: string[]; From e01f1cfcac25be6149289ec604e95d61528cb595 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 5 Feb 2020 23:03:16 +0100 Subject: [PATCH 33/64] More info scroll fix (#4774) * Fix more info dialog scrolling * Update ha-more-info-dialog.js --- src/dialogs/ha-more-info-dialog.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/dialogs/ha-more-info-dialog.js b/src/dialogs/ha-more-info-dialog.js index 3a34c1cfc9..878f17473d 100644 --- a/src/dialogs/ha-more-info-dialog.js +++ b/src/dialogs/ha-more-info-dialog.js @@ -80,7 +80,7 @@ class HaMoreInfoDialog extends DialogMixin(PolymerElement) { class="no-padding" hass="[[hass]]" state-obj="[[stateObj]]" - dialog-element="[[_dialogElement]]" + dialog-element="[[_dialogElement()]]" registry-entry="[[_registryInfo]]" large="{{large}}" > @@ -102,7 +102,6 @@ class HaMoreInfoDialog extends DialogMixin(PolymerElement) { observer: "_largeChanged", }, - _dialogElement: Object, _registryInfo: Object, dataDomain: { @@ -116,9 +115,8 @@ class HaMoreInfoDialog extends DialogMixin(PolymerElement) { return ["_dialogOpenChanged(opened)"]; } - ready() { - super.ready(); - this._dialogElement = this; + _dialogElement() { + return this; } _computeDomain(stateObj) { From c72105dca3fbb24a25da4f24fd523bac10f2d7b5 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Thu, 6 Feb 2020 00:32:31 +0000 Subject: [PATCH 34/64] [ci skip] Translation update --- translations/ko.json | 2 +- translations/lb.json | 1 + translations/sv.json | 182 +++++++++++++++++++++++++++++++++++++++---- 3 files changed, 171 insertions(+), 14 deletions(-) diff --git a/translations/ko.json b/translations/ko.json index 7681d43d83..40db0666a3 100644 --- a/translations/ko.json +++ b/translations/ko.json @@ -2231,7 +2231,7 @@ "cards": { "demo": { "demo_by": "{name} 님이 만듦", - "introduction": "집에 오신 것을 환영합니다! 커뮤니티에서 만든 최고의 UI 가 적용된 Home Assistant 를 소개합니다.", + "introduction": "집에 오신 것을 환영합니다! 커뮤니티에서 만든 멋진 UI 가 적용된 Home Assistant 를 소개합니다.", "learn_more": "Home Assistant 에 대해 더 알아보기", "next_demo": "다음 데모" } diff --git a/translations/lb.json b/translations/lb.json index 10b4bea368..f76a2c15e9 100644 --- a/translations/lb.json +++ b/translations/lb.json @@ -1232,6 +1232,7 @@ }, "create": "Automatisme mat Apparat erstellen", "no_automations": "Keng Automatismen", + "no_device_automations": "Et gi keng Automatisme fir dësen Apparat.", "triggers": { "caption": "Maach eppes wann..." } diff --git a/translations/sv.json b/translations/sv.json index a2aeec4f05..7b2eca99dc 100644 --- a/translations/sv.json +++ b/translations/sv.json @@ -478,6 +478,9 @@ "script": { "execute": "Kör" }, + "service": { + "run": "Kör" + }, "timer": { "actions": { "cancel": "avbryt", @@ -540,10 +543,24 @@ "yes": "Ja" }, "components": { + "area-picker": { + "add_dialog": { + "add": "Lägg till", + "failed_create_area": "Det gick inte att skapa område.", + "name": "Namn", + "text": "Ange namnet på det nya området.", + "title": "Lägg till nytt område" + }, + "add_new": "Lägg till nytt område ...", + "area": "Område", + "clear": "Rensa", + "show_areas": "Visa områden" + }, "device-picker": { "clear": "Rensa", "device": "Enhet", - "show_devices": "Visa enheter" + "show_devices": "Visa enheter", + "toggle": "Växla" }, "entity": { "entity-picker": { @@ -558,8 +575,13 @@ }, "related-items": { "area": "Område", + "automation": "Del av följande automatiseringar", "device": "Enhet", - "integration": "Integration" + "entity": "Relaterade entiteter", + "group": "Del av följande grupper", + "integration": "Integration", + "scene": "Del av följande scener", + "script": "Del av följande skript" }, "relative_time": { "duration": { @@ -591,14 +613,38 @@ "domain_toggler": { "title": "Växla domäner" }, + "entity_registry": { + "control": "Kontrollera", + "dismiss": "Avfärda", + "editor": { + "confirm_delete": "Är du säker på att du vill ta bort den här posten?", + "delete": "RADERA", + "enabled_cause": "Inaktiverad på grund av {cause}.", + "enabled_description": "Inaktiverade entiteter kommer inte att läggas till i Home Assistant.", + "enabled_label": "Aktivera entitet", + "entity_id": "Entitets-ID", + "name": "Skriv över namn", + "note": "Obs: detta kanske inte fungerar ännu med alla integrationer.", + "unavailable": "Den här entiteten är för närvarande inte tillgänglig.", + "update": "UPPDATERA" + }, + "related": "Relaterade", + "settings": "Inställningar" + }, "generic": { - "default_confirmation_title": "Är du säker?" + "cancel": "Avbryt", + "default_confirmation_title": "Är du säker?", + "ok": "OK" }, "more_info_control": { "dismiss": "Avfärda", "edit": "Redigera entitet", + "restored": { + "confirm_remove_text": "Är du säker på att du vill ta bort den här entiteten?" + }, "script": { - "last_action": "Senaste åtgärd" + "last_action": "Senaste åtgärd", + "last_triggered": "Senast utlöst" }, "settings": "Entitetsinställningar", "sun": { @@ -649,6 +695,7 @@ "remove": "Ta bort en enhet från Zigbee-nätverket.", "updateDeviceName": "Ange ett anpassat namn för den här enheten i entitetsregistret" }, + "unknown": "Okänd", "zha_device_card": { "area_picker_label": "Område", "device_name_placeholder": "Användarnamn", @@ -679,7 +726,8 @@ "entity_turned_off": "Slog av {entity}.", "entity_turned_on": "Slog på {entity}.", "service_call_failed": "Misslyckades med att anropa tjänsten {service}.", - "service_called": "Tjänsten {service} anropad." + "service_called": "Tjänsten {service} anropad.", + "triggered": "Utlöst {name}" }, "panel": { "config": { @@ -767,6 +815,9 @@ "name": "Villkor", "type_select": "Villkorstyp", "type": { + "and": { + "label": "Och" + }, "device": { "extra_fields": { "above": "Över", @@ -781,6 +832,9 @@ "label": "Siffervärde", "value_template": "Värdemall (valfritt)" }, + "or": { + "label": "Eller" + }, "state": { "label": "Tillstånd", "state": "Tillstånd" @@ -931,13 +985,16 @@ "cloud": { "account": { "alexa": { + "info": "Med Alexa-integrationen för Home Assistant Cloud kan du styra alla dina Home Assistant-enheter via alla Alexa-aktiverade enheter.", "title": "" }, "connected": "Ansluten", + "connection_status": "Status för molnanslutning", "fetching_subscription": "Hämtar prenumeration...", "google": { "config_documentation": "Konfigureringsdokumentation", - "enter_pin_error": "Det går inte att spara PIN-koden:" + "enter_pin_error": "Det går inte att spara PIN-koden:", + "sync_entities_404_message": "Misslyckades med att synkronisera dina entiteter till Google, fråga Google \"Hej Google, synkronisera mina enheter\" för att synkronisera dina entiteter." }, "integrations": "Integrationer", "integrations_introduction": "Integration med Home Assistant Cloud gör det möjligt för dig att koppla upp mot molntjänster utan att behöva exponera din egen installation av Home Assistant publikt på internet.", @@ -947,7 +1004,13 @@ "nabu_casa_account": "Nabu Casa konto", "not_connected": "Ej ansluten", "remote": { - "link_learn_how_it_works": "Lär dig hur det fungerar" + "access_is_being_prepared": "Fjärråtkomst förbereds. Vi meddelar dig när det är klart.", + "certificate_info": "Certifikatinfo", + "info": "Home Assistant Cloud ger en säker fjärranslutning till din instans när du är hemifrån.", + "instance_is_available": "Din instans är tillgänglig på", + "instance_will_be_available": "Din instans kommer att finnas tillgänglig på", + "link_learn_how_it_works": "Lär dig hur det fungerar", + "title": "Fjärrkontroll" }, "sign_out": "Logga ut", "thank_you_note": "Tack för att du är en del av Home Assistant Cloud. Det är tack vare personer som dig som vi kan göra en fantastisk hemautomationsupplevelse för alla. Tack!", @@ -963,6 +1026,9 @@ "description_features": "Styra även när du inte är hemma, integrera med Alexa och Google Assistant.", "description_login": "Inloggad som {email}", "description_not_login": "Inte inloggad", + "dialog_certificate": { + "close": "Stäng" + }, "dialog_cloudhook": { "confirm_disable": "Är du säker på att du vill avaktivera denna webhook?", "copied_to_clipboard": "Kopierat till urklipp", @@ -985,6 +1051,7 @@ "login": { "alert_email_confirm_necessary": "Du måste bekräfta din e-postadress innan du loggar in.", "alert_password_change_required": "Du måste ändra ditt lösenord innan du loggar in.", + "dismiss": "Avfärda", "email": "E-postadress", "forgot_password": "glömt lösenordet?", "introduction": "Home Assistant Cloud ger dig en säker koppling till din installation när du befinner dig hemifrån. Det låter dig också ansluta till tjänster med enbart molnstöd: Amazon Alexa och Google Assistant.", @@ -1002,12 +1069,18 @@ "account_created": "Konto skapat! Kontrollera din e-post för instruktioner om hur du aktiverar ditt konto.", "create_account": "Skapa konto", "email_address": "E-postadress", + "email_error_msg": "Ogiltig e-post", + "feature_amazon_alexa": "Integration med Amazon Alexa", + "feature_google_home": "Integration med Google Assistant", "feature_remote_control": "Kontrollera Home Assistant när du inte är hemma", + "feature_webhook_apps": "Enkel integration med webbhookbaserade appar som OwnTracks", "headline": "Starta din kostnadsfria testperiod", "information": "Skapa ett konto för att starta en gratis provperiod på en månad med Home Assistant Cloud. Ingen betalningsinformation behövs.", "information2": "Testet ger dig tillgång till alla fördelar med Home Assistant Cloud, inklusive:", + "information3": "Denna tjänst drivs av vår partner ", "information3a": ", ett företag grundat av grundarna av Home Assistant och Hass.io.", "information4": "Genom att registrera ett konto godkänner du följande villkor.", + "link_privacy_policy": "Integritetspolicy", "link_terms_conditions": "Villkor", "password": "Lösenord", "password_error_msg": "Lösenord måste vara minst 8 tecken", @@ -1094,14 +1167,19 @@ "actions": { "caption": "När något utlöses..." }, + "automations": "Automationer", "conditions": { "caption": "Utför endast om..." }, + "create": "Skapa automatisering med enheten", + "no_automations": "Inga automatiseringar", + "no_device_automations": "Det finns inga automatiseringar tillgängliga för den här enheten.", "triggers": { "caption": "Gör något när ..." } }, "automations": "Automationer", + "cant_edit": "Du kan bara redigera objekt som skapas i användargränssnittet.", "caption": "Enheter", "confirm_rename_entity_ids": "Vill du också byta namn på entitetens ID för dina enheter?", "data_table": { @@ -1116,11 +1194,27 @@ "details": "Här är alla detaljer om din enhet.", "device_not_found": "Enheten hittades inte.", "entities": { - "add_entities_lovelace": "Lägg till alla enhetsentiteter i Lovelace-gränsnittet" + "add_entities_lovelace": "Lägg till alla enhetsentiteter i Lovelace-gränsnittet", + "entities": "Entiteter", + "none": "Den här enheten har inga entiteter" }, "info": "Enhetsinformation", + "name": "Namn", + "scene": { + "create": "Skapa scen med enhet", + "no_scenes": "Inga scener", + "scenes": "Scener" + }, + "scenes": "Scener", + "script": { + "create": "Skapa skript med enhet", + "no_scripts": "Inga skript", + "scripts": "Skript" + }, + "scripts": "Skript", "unknown_error": "Okänt fel", - "unnamed_device": "Namnlös enhet" + "unnamed_device": "Namnlös enhet", + "update": "Uppdatera" }, "entities": { "caption": "Entiteter", @@ -1133,22 +1227,51 @@ "enabled_cause": "Inaktiverad på grund av {cause}.", "enabled_description": "Inaktiverade enheter kommer ej läggas till i Home Assistant.", "enabled_label": "Aktivera enhet", + "entity_id": "Entitets-ID", + "name": "Skriv över namn", "note": "Obs: detta kanske inte fungerar ännu med alla integrationer.", "unavailable": "Denna enhet är inte tillgänglig för tillfället.", "update": "UPPDATERA" }, "picker": { + "disable_selected": { + "button": "Inaktivera valda", + "confirm_text": "Inaktiverade entiteter kommer inte att läggas till i Home Assistant.", + "confirm_title": "Vill du inaktivera {number} entiteter?" + }, + "enable_selected": { + "button": "Aktivera valda", + "confirm_text": "Detta kommer att göra dem tillgängliga i Home Assistant igen om de nu är inaktiverade.", + "confirm_title": "Vill du aktivera {number} entiteter?" + }, + "filter": { + "filter": "Filter", + "show_disabled": "Visa inaktiverade entiteter", + "show_unavailable": "Visa otillgängliga entiteter" + }, "header": "Entiteter", "headers": { "enabled": "Aktiverad", "entity_id": "Entitets-ID", "integration": "Integration", - "name": "Namn" + "name": "Namn", + "status": "Status" }, "integrations_page": "Integrationssida", "introduction": "Home Assistant har ett entitetsregister som innehåller samtliga identifierade entiteter som någonsin har setts. Var och en av dessa entiteter kommer att ha ett ID-nummer som är reserverat för bara den entiteten.", "introduction2": "Använd entitetsregistret för att skriva över namnet, ändra ID eller ta bort posten ifrån Home Assistant. Obs! Att ta bort posten ifrån entity registry (entitetsregistret) kommer inte att ta bort enheten. För att göra det, följ länken nedan och ta bort det från integrationssidan.", + "remove_selected": { + "button": "Ta bort valda", + "confirm_text": "Entiteter kan endast tas bort när integrationen inte längre tillhandahåller entiteterna.", + "confirm_title": "Vill du ta bort {number} entiteter?" + }, + "selected": "{number} valda", "show_disabled": "Visa inaktiverade entiteter", + "status": { + "disabled": "Inaktiverad", + "ok": "Ok", + "unavailable": "Inte tillgänglig" + }, "unavailable": "(ej tillgänglig)" } }, @@ -1314,8 +1437,10 @@ "group": "Ladda om grupper", "heading": "Konfigurationen laddas om", "introduction": "Vissa delar av Home Assistant kan laddas om utan att en omstart krävs. Att trycka på \"ladda om\" innebär att den nuvarande konfiguration inaktiveras och den nya laddas.", + "person": "Ladda om personer", "scene": "Ladda om scener", - "script": "Ladda om skript" + "script": "Ladda om skript", + "zone": "Ladda om zoner" }, "server_management": { "confirm_restart": "Är du säker på att du vill starta om Home Assistant?", @@ -1412,16 +1537,21 @@ "creating_group": "Skapar grupp", "description": "Skapa och modifiera Zigbee grupper", "group_details": "Här är alla detaljer för den valda Zigbee-gruppen.", + "group_id": "Grupp-ID", "group_info": "Gruppinformation", "group_name_placeholder": "Gruppnamn", "group_not_found": "Gruppen hittades inte!", "group-header": "Zigbee Home Automation - Gruppdetaljer", + "groups": "Grupper", "groups-header": "Zigbee Home Automation - Grupphantering", "introduction": "Skapa och ändra zigbeegrupper", + "manage_groups": "Hantera Zigbee-grupper", + "members": "Medlemmar", "remove_groups": "Ta bort grupper", "remove_members": "Ta bort medlemmar", "removing_groups": "Tar bort grupper", - "removing_members": "Tar bort medlemmar" + "removing_members": "Tar bort medlemmar", + "zha_zigbee_groups": "ZHA Zigbee-grupper" }, "header": "Konfigurera ZigBee-hemautomation", "introduction": "Här går det att konfigurera ZHA-komponenten. Det är inte möjligt att ställa in allt från användargränssnittet ännu, men vi jobbar på det.", @@ -1435,6 +1565,29 @@ }, "title": "ZigBee-hemautomation" }, + "zone": { + "add_zone": "Lägg till Zon", + "caption": "Zoner", + "configured_in_yaml": "Zoner konfigurerade via configuration.yaml kan inte redigeras via användargränssnittet.", + "confirm_delete": "Är du säker på att du vill ta bort den här zonen?", + "create_zone": "Skapa Zon", + "description": "Hantera zonerna du vill följa personer i.", + "detail": { + "create": "Skapa", + "delete": "Radera", + "icon": "Ikon", + "icon_error_msg": "Ikonen ska vara i format prefix:ikonnamn, till exempel: mdi:home", + "latitude": "Latitud", + "longitude": "Longitud", + "name": "Namn", + "new_zone": "Ny Zon", + "passive": "Passiv", + "radius": "Radie", + "required_error_msg": "Det här fältet krävs", + "update": "Uppdatera" + }, + "no_zones_created_yet": "Det verkar som om du inte har skapat några zoner ännu." + }, "zwave": { "caption": "Z-Wave", "common": { @@ -1523,6 +1676,7 @@ "server": "server", "set": "Ange", "source": "Källkod:", + "system_health_error": "System Health-komponenten har inte lästs in. Lägg till 'system_health:' i configuration.yaml", "title": "Info" }, "logs": { @@ -1623,7 +1777,8 @@ "more_info": "Visa mer-info: {name}", "navigate_to": "Navigera till {location}", "tap": "Tryck:", - "toggle": "Växla {name}" + "toggle": "Växla {name}", + "url": "Öppna fönster till {url_path}" }, "shopping-list": { "add_item": "Lägg till objekt", @@ -2022,6 +2177,7 @@ "profile": { "advanced_mode": { "description": "Home Assistant döljer avancerade funktioner och alternativ som standard. Du kan göra dessa funktioner tillgängliga genom att växla här. Det är en användarspecifik inställning och påverkar inte andra användare i Home Assistant.", + "link_promo": "Läs mer", "title": "Avancerat läge" }, "change_password": { From 2e47aa190530617cce7b53e634c002ce710d0fdc Mon Sep 17 00:00:00 2001 From: Zack Arnett Date: Thu, 6 Feb 2020 02:05:49 -0500 Subject: [PATCH 35/64] Update Edit Footer for Cards (#4752) * Update CSS * Radius Updates * Updating to be a ha-card element --- .../lovelace/components/hui-card-options.ts | 115 ++++++++++-------- 1 file changed, 61 insertions(+), 54 deletions(-) diff --git a/src/panels/lovelace/components/hui-card-options.ts b/src/panels/lovelace/components/hui-card-options.ts index fe360b2987..1223354fdd 100644 --- a/src/panels/lovelace/components/hui-card-options.ts +++ b/src/panels/lovelace/components/hui-card-options.ts @@ -33,72 +33,79 @@ export class HuiCardOptions extends LitElement { protected render(): TemplateResult { return html` -
-
- ${this.hass!.localize( - "ui.panel.lovelace.editor.edit_card.edit" - )} -
-
- - - + +
+
+ ${this.hass!.localize( + "ui.panel.lovelace.editor.edit_card.edit" + )} +
+
- - - ${this.hass!.localize( - "ui.panel.lovelace.editor.edit_card.move" - )} - - ${this.hass!.localize( - "ui.panel.lovelace.editor.edit_card.delete" - )} - - + + + + + + ${this.hass!.localize( + "ui.panel.lovelace.editor.edit_card.move" + )} + + ${this.hass!.localize( + "ui.panel.lovelace.editor.edit_card.delete" + )} + + +
-
+ `; } static get styles(): CSSResult { return css` - div.options { - border-top: 1px solid #e8e8e8; - padding: 5px 8px; - background: var(--paper-card-background-color, white); + ha-card { + border-top-right-radius: 0; + border-top-left-radius: 0; box-shadow: rgba(0, 0, 0, 0.14) 0px 2px 2px 0px, rgba(0, 0, 0, 0.12) 0px 1px 5px -4px, rgba(0, 0, 0, 0.2) 0px 3px 1px -2px; + } + + div.options { + border-top: 1px solid #e8e8e8; + padding: 5px 8px; display: flex; + margin-top: -1px; } div.options .primary-actions { From c977f22047825c0910b806127ae5b59d674bf36d Mon Sep 17 00:00:00 2001 From: Ruslan Sayfutdinov Date: Thu, 6 Feb 2020 18:38:38 +0000 Subject: [PATCH 36/64] Show seconds in the UI (#4765) --- src/common/datetime/check_options_support.ts | 31 ++++++++++++++++ src/common/datetime/format_date.ts | 15 ++------ src/common/datetime/format_date_time.ts | 35 ++++++++++++------- src/common/datetime/format_time.ts | 22 ++++++------ src/common/entity/compute_state_display.ts | 6 ++-- src/components/entity/ha-chart-base.js | 2 +- src/components/state-history-chart-line.js | 4 +-- .../state-history-chart-timeline.js | 6 ++-- .../more-info/controls/more-info-sun.ts | 2 +- .../config/automation/ha-automation-picker.ts | 4 +-- .../config/cloud/account/cloud-account.js | 2 +- .../dialog-cloud-certificate.ts | 4 +-- .../event/event-subscribe-card.ts | 4 +-- .../developer-tools/logs/system-log-card.ts | 8 ++--- .../mqtt/mqtt-subscribe-card.ts | 4 +-- src/panels/history/ha-panel-history.js | 2 +- src/panels/logbook/ha-logbook.ts | 8 ++--- src/panels/logbook/ha-panel-logbook.js | 2 +- .../components/hui-timestamp-display.ts | 12 +++---- src/panels/mailbox/ha-panel-mailbox.js | 2 +- .../ha-long-lived-access-tokens-card.js | 2 +- src/panels/profile/ha-refresh-tokens-card.js | 2 +- test-mocha/common/datetime/format_date.ts | 2 +- .../common/datetime/format_date_time.ts | 18 ++++++++-- test-mocha/common/datetime/format_time.ts | 13 ++++++- 25 files changed, 135 insertions(+), 77 deletions(-) create mode 100644 src/common/datetime/check_options_support.ts diff --git a/src/common/datetime/check_options_support.ts b/src/common/datetime/check_options_support.ts new file mode 100644 index 0000000000..614f7f9828 --- /dev/null +++ b/src/common/datetime/check_options_support.ts @@ -0,0 +1,31 @@ +// Check for support of native locale string options +function checkToLocaleDateStringSupportsOptions() { + try { + new Date().toLocaleDateString("i"); + } catch (e) { + return e.name === "RangeError"; + } + return false; +} + +function checkToLocaleTimeStringSupportsOptions() { + try { + new Date().toLocaleTimeString("i"); + } catch (e) { + return e.name === "RangeError"; + } + return false; +} + +function checkToLocaleStringSupportsOptions() { + try { + new Date().toLocaleString("i"); + } catch (e) { + return e.name === "RangeError"; + } + return false; +} + +export const toLocaleDateStringSupportsOptions = checkToLocaleDateStringSupportsOptions(); +export const toLocaleTimeStringSupportsOptions = checkToLocaleTimeStringSupportsOptions(); +export const toLocaleStringSupportsOptions = checkToLocaleStringSupportsOptions(); diff --git a/src/common/datetime/format_date.ts b/src/common/datetime/format_date.ts index 813500ff4a..6a5e7e67f0 100644 --- a/src/common/datetime/format_date.ts +++ b/src/common/datetime/format_date.ts @@ -1,20 +1,11 @@ import fecha from "fecha"; +import { toLocaleDateStringSupportsOptions } from "./check_options_support"; -// Check for support of native locale string options -function toLocaleDateStringSupportsOptions() { - try { - new Date().toLocaleDateString("i"); - } catch (e) { - return e.name === "RangeError"; - } - return false; -} - -export default toLocaleDateStringSupportsOptions() +export const formatDate = toLocaleDateStringSupportsOptions ? (dateObj: Date, locales: string) => dateObj.toLocaleDateString(locales, { year: "numeric", month: "long", day: "numeric", }) - : (dateObj: Date) => fecha.format(dateObj, "mediumDate"); + : (dateObj: Date) => fecha.format(dateObj, "longDate"); diff --git a/src/common/datetime/format_date_time.ts b/src/common/datetime/format_date_time.ts index e8a02139d2..ee6d04f7dd 100644 --- a/src/common/datetime/format_date_time.ts +++ b/src/common/datetime/format_date_time.ts @@ -1,16 +1,7 @@ import fecha from "fecha"; +import { toLocaleStringSupportsOptions } from "./check_options_support"; -// Check for support of native locale string options -function toLocaleStringSupportsOptions() { - try { - new Date().toLocaleString("i"); - } catch (e) { - return e.name === "RangeError"; - } - return false; -} - -export default toLocaleStringSupportsOptions() +export const formatDateTime = toLocaleStringSupportsOptions ? (dateObj: Date, locales: string) => dateObj.toLocaleString(locales, { year: "numeric", @@ -19,4 +10,24 @@ export default toLocaleStringSupportsOptions() hour: "numeric", minute: "2-digit", }) - : (dateObj: Date) => fecha.format(dateObj, "haDateTime"); + : (dateObj: Date) => + fecha.format( + dateObj, + `${fecha.masks.longDate}, ${fecha.masks.shortTime}` + ); + +export const formatDateTimeWithSeconds = toLocaleStringSupportsOptions + ? (dateObj: Date, locales: string) => + dateObj.toLocaleString(locales, { + year: "numeric", + month: "long", + day: "numeric", + hour: "numeric", + minute: "2-digit", + second: "2-digit", + }) + : (dateObj: Date) => + fecha.format( + dateObj, + `${fecha.masks.longDate}, ${fecha.masks.mediumTime}` + ); diff --git a/src/common/datetime/format_time.ts b/src/common/datetime/format_time.ts index 2b747723a7..d8f0c8a8a0 100644 --- a/src/common/datetime/format_time.ts +++ b/src/common/datetime/format_time.ts @@ -1,19 +1,19 @@ import fecha from "fecha"; +import { toLocaleTimeStringSupportsOptions } from "./check_options_support"; -// Check for support of native locale string options -function toLocaleTimeStringSupportsOptions() { - try { - new Date().toLocaleTimeString("i"); - } catch (e) { - return e.name === "RangeError"; - } - return false; -} - -export default toLocaleTimeStringSupportsOptions() +export const formatTime = toLocaleTimeStringSupportsOptions ? (dateObj: Date, locales: string) => dateObj.toLocaleTimeString(locales, { hour: "numeric", minute: "2-digit", }) : (dateObj: Date) => fecha.format(dateObj, "shortTime"); + +export const formatTimeWithSeconds = toLocaleTimeStringSupportsOptions + ? (dateObj: Date, locales: string) => + dateObj.toLocaleTimeString(locales, { + hour: "numeric", + minute: "2-digit", + second: "2-digit", + }) + : (dateObj: Date) => fecha.format(dateObj, "mediumTime"); diff --git a/src/common/entity/compute_state_display.ts b/src/common/entity/compute_state_display.ts index 62304f74e0..c802c7c56a 100644 --- a/src/common/entity/compute_state_display.ts +++ b/src/common/entity/compute_state_display.ts @@ -1,8 +1,8 @@ import { HassEntity } from "home-assistant-js-websocket"; import { computeStateDomain } from "./compute_state_domain"; -import formatDateTime from "../datetime/format_date_time"; -import formatDate from "../datetime/format_date"; -import formatTime from "../datetime/format_time"; +import { formatDateTime } from "../datetime/format_date_time"; +import { formatDate } from "../datetime/format_date"; +import { formatTime } from "../datetime/format_time"; import { LocalizeFunc } from "../translations/localize"; export const computeStateDisplay = ( diff --git a/src/components/entity/ha-chart-base.js b/src/components/entity/ha-chart-base.js index 37eea60bea..ffa76a1d56 100644 --- a/src/components/entity/ha-chart-base.js +++ b/src/components/entity/ha-chart-base.js @@ -6,7 +6,7 @@ import { Debouncer } from "@polymer/polymer/lib/utils/debounce"; import { timeOut } from "@polymer/polymer/lib/utils/async"; import { mixinBehaviors } from "@polymer/polymer/lib/legacy/class"; -import formatTime from "../../common/datetime/format_time"; +import { formatTime } from "../../common/datetime/format_time"; // eslint-disable-next-line no-unused-vars /* global Chart moment Color */ diff --git a/src/components/state-history-chart-line.js b/src/components/state-history-chart-line.js index 6100e4022c..4456b285cc 100644 --- a/src/components/state-history-chart-line.js +++ b/src/components/state-history-chart-line.js @@ -5,7 +5,7 @@ import { PolymerElement } from "@polymer/polymer/polymer-element"; import "./entity/ha-chart-base"; import LocalizeMixin from "../mixins/localize-mixin"; -import formatDateTime from "../common/datetime/format_date_time"; +import { formatDateTimeWithSeconds } from "../common/datetime/format_date_time"; class StateHistoryChartLine extends LocalizeMixin(PolymerElement) { static get template() { @@ -317,7 +317,7 @@ class StateHistoryChartLine extends LocalizeMixin(PolymerElement) { const item = items[0]; const date = data.datasets[item.datasetIndex].data[item.index].x; - return formatDateTime(date, this.hass.language); + return formatDateTimeWithSeconds(date, this.hass.language); }; const chartOptions = { diff --git a/src/components/state-history-chart-timeline.js b/src/components/state-history-chart-timeline.js index ef0c91a87e..0ef2c6194c 100644 --- a/src/components/state-history-chart-timeline.js +++ b/src/components/state-history-chart-timeline.js @@ -6,7 +6,7 @@ import LocalizeMixin from "../mixins/localize-mixin"; import "./entity/ha-chart-base"; -import formatDateTime from "../common/datetime/format_date_time"; +import { formatDateTimeWithSeconds } from "../common/datetime/format_date_time"; import { computeRTL } from "../common/util/compute_rtl"; class StateHistoryChartTimeline extends LocalizeMixin(PolymerElement) { @@ -165,8 +165,8 @@ class StateHistoryChartTimeline extends LocalizeMixin(PolymerElement) { const formatTooltipLabel = (item, data) => { const values = data.datasets[item.datasetIndex].data[item.index]; - const start = formatDateTime(values[0], this.hass.language); - const end = formatDateTime(values[1], this.hass.language); + const start = formatDateTimeWithSeconds(values[0], this.hass.language); + const end = formatDateTimeWithSeconds(values[1], this.hass.language); const state = values[2]; return [state, start, end]; diff --git a/src/dialogs/more-info/controls/more-info-sun.ts b/src/dialogs/more-info/controls/more-info-sun.ts index f8bd512852..4cf93d0ed5 100644 --- a/src/dialogs/more-info/controls/more-info-sun.ts +++ b/src/dialogs/more-info/controls/more-info-sun.ts @@ -11,7 +11,7 @@ import { HassEntity } from "home-assistant-js-websocket"; import "../../../components/ha-relative-time"; -import formatTime from "../../../common/datetime/format_time"; +import { formatTime } from "../../../common/datetime/format_time"; import { HomeAssistant } from "../../../types"; @customElement("more-info-sun") diff --git a/src/panels/config/automation/ha-automation-picker.ts b/src/panels/config/automation/ha-automation-picker.ts index 608956c487..2de58ea69b 100644 --- a/src/panels/config/automation/ha-automation-picker.ts +++ b/src/panels/config/automation/ha-automation-picker.ts @@ -28,7 +28,7 @@ import { showAutomationEditor, AutomationConfig, } from "../../../data/automation"; -import format_date_time from "../../../common/datetime/format_date_time"; +import { formatDateTime } from "../../../common/datetime/format_date_time"; import { fireEvent } from "../../../common/dom/fire_event"; import { showThingtalkDialog } from "./show-dialog-thingtalk"; import { isComponentLoaded } from "../../../common/config/is_component_loaded"; @@ -102,7 +102,7 @@ class HaAutomationPicker extends LitElement { "ui.card.automation.last_triggered" )}: ${ automation.attributes.last_triggered - ? format_date_time( + ? formatDateTime( new Date(automation.attributes.last_triggered), this.hass.language ) diff --git a/src/panels/config/cloud/account/cloud-account.js b/src/panels/config/cloud/account/cloud-account.js index 19f37a5aff..6f3cacefa5 100644 --- a/src/panels/config/cloud/account/cloud-account.js +++ b/src/panels/config/cloud/account/cloud-account.js @@ -16,7 +16,7 @@ import "./cloud-remote-pref"; import { EventsMixin } from "../../../../mixins/events-mixin"; import { fetchCloudSubscriptionInfo } from "../../../../data/cloud"; -import formatDateTime from "../../../../common/datetime/format_date_time"; +import { formatDateTime } from "../../../../common/datetime/format_date_time"; import LocalizeMixin from "../../../../mixins/localize-mixin"; /* diff --git a/src/panels/config/cloud/dialog-cloud-certificate/dialog-cloud-certificate.ts b/src/panels/config/cloud/dialog-cloud-certificate/dialog-cloud-certificate.ts index 2964721dbf..89df7f4812 100644 --- a/src/panels/config/cloud/dialog-cloud-certificate/dialog-cloud-certificate.ts +++ b/src/panels/config/cloud/dialog-cloud-certificate/dialog-cloud-certificate.ts @@ -16,7 +16,7 @@ import { HaPaperDialog } from "../../../../components/dialog/ha-paper-dialog"; import { HomeAssistant } from "../../../../types"; import { haStyle } from "../../../../resources/styles"; import { CloudCertificateParams as CloudCertificateDialogParams } from "./show-dialog-cloud-certificate"; -import format_date_time from "../../../../common/datetime/format_date_time"; +import { formatDateTime } from "../../../../common/datetime/format_date_time"; @customElement("dialog-cloud-certificate") class DialogCloudCertificate extends LitElement { @@ -50,7 +50,7 @@ class DialogCloudCertificate extends LitElement { ${this.hass!.localize( "ui.panel.config.cloud.dialog_certificate.certificate_expiration_date" )} - ${format_date_time( + ${formatDateTime( new Date(certificateInfo.expire_date), this.hass!.language )}
diff --git a/src/panels/developer-tools/event/event-subscribe-card.ts b/src/panels/developer-tools/event/event-subscribe-card.ts index 7b89c464f4..4816672d59 100644 --- a/src/panels/developer-tools/event/event-subscribe-card.ts +++ b/src/panels/developer-tools/event/event-subscribe-card.ts @@ -13,7 +13,7 @@ import { HassEvent } from "home-assistant-js-websocket"; import { HomeAssistant } from "../../../types"; import { PolymerChangedEvent } from "../../../polymer-types"; import "../../../components/ha-card"; -import format_time from "../../../common/datetime/format_time"; +import { formatTime } from "../../../common/datetime/format_time"; @customElement("event-subscribe-card") class EventSubscribeCard extends LitElement { @@ -78,7 +78,7 @@ class EventSubscribeCard extends LitElement { "name", ev.id )} - ${format_time( + ${formatTime( new Date(ev.event.time_fired), this.hass!.language )}: diff --git a/src/panels/developer-tools/logs/system-log-card.ts b/src/panels/developer-tools/logs/system-log-card.ts index ab0f303ca5..1a03a72e1c 100644 --- a/src/panels/developer-tools/logs/system-log-card.ts +++ b/src/panels/developer-tools/logs/system-log-card.ts @@ -16,8 +16,8 @@ import "../../../components/buttons/ha-call-service-button"; import "../../../components/buttons/ha-progress-button"; import { HomeAssistant } from "../../../types"; import { LoggedError, fetchSystemLog } from "../../../data/system_log"; -import formatDateTime from "../../../common/datetime/format_date_time"; -import formatTime from "../../../common/datetime/format_time"; +import { formatDateTimeWithSeconds } from "../../../common/datetime/format_date_time"; +import { formatTimeWithSeconds } from "../../../common/datetime/format_time"; import { showSystemLogDetailDialog } from "./show-dialog-system-log-detail"; const formatLogTime = (date, language: string) => { @@ -26,8 +26,8 @@ const formatLogTime = (date, language: string) => { const dateTimeDay = new Date(date * 1000).setHours(0, 0, 0, 0); return dateTimeDay < today - ? formatDateTime(dateTime, language) - : formatTime(dateTime, language); + ? formatDateTimeWithSeconds(dateTime, language) + : formatTimeWithSeconds(dateTime, language); }; @customElement("system-log-card") diff --git a/src/panels/developer-tools/mqtt/mqtt-subscribe-card.ts b/src/panels/developer-tools/mqtt/mqtt-subscribe-card.ts index 24b40c1601..67d128ff7a 100644 --- a/src/panels/developer-tools/mqtt/mqtt-subscribe-card.ts +++ b/src/panels/developer-tools/mqtt/mqtt-subscribe-card.ts @@ -11,7 +11,7 @@ import "@material/mwc-button"; import "@polymer/paper-input/paper-input"; import { HomeAssistant } from "../../../types"; import "../../../components/ha-card"; -import format_time from "../../../common/datetime/format_time"; +import { formatTime } from "../../../common/datetime/format_time"; import { subscribeMQTTTopic, MQTTMessage } from "../../../data/mqtt"; @@ -85,7 +85,7 @@ class MqttSubscribeCard extends LitElement { "topic", msg.message.topic, "time", - format_time(msg.time, this.hass!.language) + formatTime(msg.time, this.hass!.language) )}
${msg.payload}
diff --git a/src/panels/history/ha-panel-history.js b/src/panels/history/ha-panel-history.js index 3daf0f4345..fcee278b61 100644 --- a/src/panels/history/ha-panel-history.js +++ b/src/panels/history/ha-panel-history.js @@ -16,7 +16,7 @@ import "../../data/ha-state-history-data"; import "../../resources/ha-date-picker-style"; import "../../resources/ha-style"; -import formatDate from "../../common/datetime/format_date"; +import { formatDate } from "../../common/datetime/format_date"; import LocalizeMixin from "../../mixins/localize-mixin"; import { computeRTL } from "../../common/util/compute_rtl"; diff --git a/src/panels/logbook/ha-logbook.ts b/src/panels/logbook/ha-logbook.ts index 86a0f8455a..6decd62cb2 100644 --- a/src/panels/logbook/ha-logbook.ts +++ b/src/panels/logbook/ha-logbook.ts @@ -1,6 +1,6 @@ import "../../components/ha-icon"; -import formatTime from "../../common/datetime/format_time"; -import formatDate from "../../common/datetime/format_date"; +import { formatTimeWithSeconds } from "../../common/datetime/format_time"; +import { formatDate } from "../../common/datetime/format_date"; import { domainIcon } from "../../common/entity/domain_icon"; import { stateIcon } from "../../common/entity/state_icon"; import { computeRTL } from "../../common/util/compute_rtl"; @@ -80,7 +80,7 @@ class HaLogbook extends LitElement {
- ${formatTime(new Date(item.when), this.hass.language)} + ${formatTimeWithSeconds(new Date(item.when), this.hass.language)}
string } = { - date: format_date, - datetime: format_date_time, - time: format_time, + date: formatDate, + datetime: formatDateTime, + time: formatTime, }; const INTERVAL_FORMAT = ["relative", "total"]; diff --git a/src/panels/mailbox/ha-panel-mailbox.js b/src/panels/mailbox/ha-panel-mailbox.js index c2710282e0..f1f3158d53 100644 --- a/src/panels/mailbox/ha-panel-mailbox.js +++ b/src/panels/mailbox/ha-panel-mailbox.js @@ -14,7 +14,7 @@ import "../../components/ha-menu-button"; import "../../components/ha-card"; import "../../resources/ha-style"; -import formatDateTime from "../../common/datetime/format_date_time"; +import { formatDateTime } from "../../common/datetime/format_date_time"; import LocalizeMixin from "../../mixins/localize-mixin"; import { EventsMixin } from "../../mixins/events-mixin"; diff --git a/src/panels/profile/ha-long-lived-access-tokens-card.js b/src/panels/profile/ha-long-lived-access-tokens-card.js index 68244c8d36..76af7c5c1b 100644 --- a/src/panels/profile/ha-long-lived-access-tokens-card.js +++ b/src/panels/profile/ha-long-lived-access-tokens-card.js @@ -4,7 +4,7 @@ import { html } from "@polymer/polymer/lib/utils/html-tag"; import { PolymerElement } from "@polymer/polymer/polymer-element"; import { EventsMixin } from "../../mixins/events-mixin"; import LocalizeMixin from "../../mixins/localize-mixin"; -import formatDateTime from "../../common/datetime/format_date_time"; +import { formatDateTime } from "../../common/datetime/format_date_time"; import "../../components/ha-card"; import "../../resources/ha-style"; diff --git a/src/panels/profile/ha-refresh-tokens-card.js b/src/panels/profile/ha-refresh-tokens-card.js index 59e87d703e..d3a4176e35 100644 --- a/src/panels/profile/ha-refresh-tokens-card.js +++ b/src/panels/profile/ha-refresh-tokens-card.js @@ -7,7 +7,7 @@ import { html } from "@polymer/polymer/lib/utils/html-tag"; import { PolymerElement } from "@polymer/polymer/polymer-element"; import { EventsMixin } from "../../mixins/events-mixin"; import LocalizeMixin from "../../mixins/localize-mixin"; -import formatDateTime from "../../common/datetime/format_date_time"; +import { formatDateTime } from "../../common/datetime/format_date_time"; import "./ha-settings-row"; diff --git a/test-mocha/common/datetime/format_date.ts b/test-mocha/common/datetime/format_date.ts index 2ef3162799..dab6dd5188 100644 --- a/test-mocha/common/datetime/format_date.ts +++ b/test-mocha/common/datetime/format_date.ts @@ -1,6 +1,6 @@ import { assert } from "chai"; -import formatDate from "../../../src/common/datetime/format_date"; +import { formatDate } from "../../../src/common/datetime/format_date"; describe("formatDate", () => { const dateObj = new Date(2017, 10, 18, 11, 12, 13, 1400); diff --git a/test-mocha/common/datetime/format_date_time.ts b/test-mocha/common/datetime/format_date_time.ts index d909839b92..3cc331251e 100644 --- a/test-mocha/common/datetime/format_date_time.ts +++ b/test-mocha/common/datetime/format_date_time.ts @@ -1,9 +1,12 @@ import { assert } from "chai"; -import formatDateTime from "../../../src/common/datetime/format_date_time"; +import { + formatDateTime, + formatDateTimeWithSeconds, +} from "../../../src/common/datetime/format_date_time"; describe("formatDateTime", () => { - const dateObj = new Date(2017, 10, 18, 11, 12, 13, 1400); + const dateObj = new Date(2017, 10, 18, 11, 12, 13, 400); it("Formats English date times", () => { assert.strictEqual( @@ -12,3 +15,14 @@ describe("formatDateTime", () => { ); }); }); + +describe("formatDateTimeWithSeconds", () => { + const dateObj = new Date(2017, 10, 18, 11, 12, 13, 400); + + it("Formats English date times with seconds", () => { + assert.strictEqual( + formatDateTimeWithSeconds(dateObj, "en"), + "November 18, 2017, 11:12:13 AM" + ); + }); +}); diff --git a/test-mocha/common/datetime/format_time.ts b/test-mocha/common/datetime/format_time.ts index 4926e55663..98dfbb0568 100644 --- a/test-mocha/common/datetime/format_time.ts +++ b/test-mocha/common/datetime/format_time.ts @@ -1,6 +1,9 @@ import { assert } from "chai"; -import formatTime from "../../../src/common/datetime/format_time"; +import { + formatTime, + formatTimeWithSeconds, +} from "../../../src/common/datetime/format_time"; describe("formatTime", () => { const dateObj = new Date(2017, 10, 18, 11, 12, 13, 1400); @@ -9,3 +12,11 @@ describe("formatTime", () => { assert.strictEqual(formatTime(dateObj, "en"), "11:12 AM"); }); }); + +describe("formatTimeWithSeconds", () => { + const dateObj = new Date(2017, 10, 18, 11, 12, 13, 400); + + it("Formats English times with seconds", () => { + assert.strictEqual(formatTimeWithSeconds(dateObj, "en"), "11:12:13 AM"); + }); +}); From d1703ba3e8f6bfcc5c730c1f8189acca66c88392 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Fri, 7 Feb 2020 00:32:35 +0000 Subject: [PATCH 37/64] [ci skip] Translation update --- translations/ca.json | 89 ++++++++++++-- translations/cs.json | 23 +++- translations/es.json | 12 +- translations/hu.json | 8 +- translations/ko.json | 60 +++++----- translations/nb.json | 34 +++--- translations/nl.json | 6 +- translations/ro.json | 153 +++++++++++++++++++++++- translations/ru.json | 2 +- translations/sv.json | 236 +++++++++++++++++++++++++++++--------- translations/zh-Hans.json | 38 +++++- 11 files changed, 525 insertions(+), 136 deletions(-) diff --git a/translations/ca.json b/translations/ca.json index 363ecd98c8..eb0328f309 100644 --- a/translations/ca.json +++ b/translations/ca.json @@ -478,6 +478,9 @@ "script": { "execute": "Executar" }, + "service": { + "run": "Executa" + }, "timer": { "actions": { "cancel": "cancel·la", @@ -543,7 +546,10 @@ "area-picker": { "add_dialog": { "add": "Afegeix", - "name": "Nom" + "failed_create_area": "No s'ha pogut crear l'àrea.", + "name": "Nom", + "text": "Introdueix el nom de la nova àrea.", + "title": "Afegeix àrea nova" }, "add_new": "Afegir àrea nova...", "area": "Àrea", @@ -567,6 +573,16 @@ "loading_history": "Carregant historial d'estats...", "no_history_found": "No s'ha trobat cap historial d'estats." }, + "related-items": { + "area": "Àrea", + "automation": "Part de les següents automatitzacions", + "device": "Dispositiu", + "entity": "Entitats relacionades", + "group": "Part dels següents grups", + "integration": "Integració", + "scene": "Part de les següents escenes", + "script": "Part dels següents programes (scripts)" + }, "relative_time": { "duration": { "day": "{count} {count, plural,\n one {dia}\n other {dies}\n}", @@ -597,14 +613,34 @@ "domain_toggler": { "title": "Commutació de dominis" }, + "entity_registry": { + "control": "Control", + "dismiss": "Desestimar", + "editor": { + "confirm_delete": "Estàs segur que vols eliminar aquesta entrada?", + "delete": "ELIMINA", + "enabled_cause": "Desactivada per {cause}.", + "enabled_description": "Les entitats desactivades no s’afegiran a Home Assistant.", + "enabled_label": "Activa l’entitat", + "entity_id": "ID de l'entitat", + "name": "Substitució de Nom", + "note": "Nota: podria no funcionar amb alguna de les integracions.", + "unavailable": "Aquesta entitat no està disponible actualment.", + "update": "ACTUALITZA" + }, + "related": "Relacionades", + "settings": "Configuració" + }, "generic": { "cancel": "Cancel·la", - "default_confirmation_title": "Estàs segur?" + "default_confirmation_title": "Estàs segur?", + "ok": "OK" }, "more_info_control": { "dismiss": "Desestimar el diàleg", "script": { - "last_action": "Última acció" + "last_action": "Última acció", + "last_triggered": "Disparada per última vegada" }, "settings": "Configuració de l'entitat", "sun": { @@ -1184,6 +1220,7 @@ "conditions": { "caption": "Només fer alguna cosa si..." }, + "create": "Crea una automatització amb el dispositiu", "no_automations": "No hi ha automatitzacions", "no_device_automations": "No hi ha automatitzacions disponibles per a aquest dispositiu.", "triggers": { @@ -1191,6 +1228,7 @@ } }, "automations": "Automatitzacions", + "cant_edit": "Només pots editar els elements creats a la interfície d'usuari (UI).", "caption": "Dispositius", "confirm_rename_entity_ids": "Vols, també, canviar el nom dels ID's d’entitat de les entitats?", "data_table": { @@ -1207,15 +1245,17 @@ "info": "Informació del dispositiu", "name": "Nom", "scene": { + "create": "Crea una escena amb el dispositiu", "no_scenes": "No hi ha escenes", "scenes": "Escenes" }, "scenes": "Escenes", "script": { + "create": "Crea un programa (script) amb el dispositiu", "no_scripts": "No hi ha scripts", "scripts": "Scripts" }, - "scripts": "Scripts", + "scripts": "Programes (scripts)", "unknown_error": "Error desconegut", "unnamed_device": "Dispositiu sense nom", "update": "Actualitza" @@ -1224,13 +1264,15 @@ "caption": "Registre d'entitats", "description": "Visió general de totes les entitats conegudes.", "editor": { - "confirm_delete": "Estàs segur que vols eliminar aquesta entitat?", + "confirm_delete": "Estàs segur que vols eliminar aquesta entrada?", "confirm_delete2": "Si suprimeixes una entrada, no suprimiras l'entitat de Home Assistant. Per fer-ho, has de suprimir la integració '{plataform}' de Home Assistant.", "default_name": "Àrea nova", "delete": "ELIMINA", - "enabled_cause": "Desactivat per {cause}.", + "enabled_cause": "Desactivada per {cause}.", "enabled_description": "Les entitats desactivades no s’afegiran a Home Assistant.", "enabled_label": "Activa l’entitat", + "entity_id": "ID de l'entitat", + "name": "Substitució de Nom", "note": "Nota: podria no funcionar amb alguna de les integracions.", "unavailable": "Aquesta entitat no està disponible actualment.", "update": "ACTUALITZAR" @@ -1245,7 +1287,7 @@ }, "integrations_page": "Pàgina d'integracions", "introduction": "Home Assistant manté un registre de totes les entitats que ha detectat alguna vegada les quals tenen una identificació única. Cadascuna d'aquestes entitats té un identificador (ID) assignat que està reservat només per a ella.", - "introduction2": "Utilitza el registre d'entitats per canviar el nom, canviar l'ID o eliminar l'entrada de Home Assistant de les entitats. Tingues en compte que eliminar-les del registre d'entitats no eliminarà l'entitat. Per fer-ho, segueix l'enllaç següent i elimineu-la dins la pàgina d'integracions.", + "introduction2": "Utilitza el registre d'entitats per canviar el nom, canviar l'ID o eliminar l'entrada de Home Assistant.", "show_disabled": "Mostra entitats desactivades", "unavailable": "(no disponible)" } @@ -1336,7 +1378,7 @@ }, "introduction": "Aquí pots definir cada persona d'interès en Home Assistant.", "no_persons_created_yet": "Sembla que encara no has creat cap persona.", - "note_about_persons_configured_in_yaml": "Nota: les persones configurades mitjançant configuration.yaml no es poden editar a la UI." + "note_about_persons_configured_in_yaml": "Nota: les persones configurades mitjançant configuration.yaml no es poden editar des de la UI." }, "scene": { "activated": "Escena {name} activada.", @@ -1414,8 +1456,10 @@ "group": "Actualitza grups", "heading": "Torna a carregar la configuració", "introduction": "Algunes parts de la configuració de Home Assistant es poden recarregar sense necessitat de reiniciar. Els botons de sota esborraran la configuració antiga i en carregaran la nova.", + "person": "Actualitza persones", "scene": "Actualitza escenes", - "script": "Actualitza programes" + "script": "Actualitza programes", + "zone": "Actualitza zones" }, "server_management": { "confirm_restart": "Segur que vols reiniciar Home Assistant?", @@ -1565,6 +1609,30 @@ }, "title": "Domòtica Zigbee (ZHA)" }, + "zone": { + "add_zone": "Afegeix zona", + "caption": "Zones", + "configured_in_yaml": "Les zones configurades mitjançant configuration.yaml no es poden editar des de la UI.", + "confirm_delete": "Estàs segur que vols eliminar aquesta zona?", + "create_zone": "Crea zona", + "description": "Gestiona les zones en les quals es fa seguiment de persones.", + "detail": { + "create": "Crea", + "delete": "Suprimeix", + "icon": "Icona", + "icon_error_msg": "El nom de la icona ha de tenir el format prefix:nom_icona, per exemple: mdi: home", + "latitude": "Latitud", + "longitude": "Longitud", + "name": "Nom", + "new_zone": "Zona nova", + "passive": "Passiva", + "radius": "Radi", + "required_error_msg": "Aquest camp és obligatori", + "update": "Actualitza" + }, + "edit_home_zone": "La ubicació de casa es pot canviar des de la configuració general.", + "no_zones_created_yet": "Sembla que encara no has creat cap zona." + }, "zwave": { "caption": "Z-Wave", "common": { @@ -1752,6 +1820,9 @@ "no_devices": "Aquesta pàgina et permet controlar els teus dispositius, però sembla que encara no en tens cap configurat. Vés a la pàgina d'integracions per a començar.", "title": "Benvingut/da a casa" }, + "entities": { + "never_triggered": "Mai disparada" + }, "picture-elements": { "call_service": "Crida servei {name}", "hold": "Manté:", diff --git a/translations/cs.json b/translations/cs.json index 1b09b00564..b8d9e77ad8 100644 --- a/translations/cs.json +++ b/translations/cs.json @@ -1177,7 +1177,7 @@ }, "server_control": { "reloading": { - "automation": "Znovu načíst automatizace", + "automation": "Znovu načíst automatizaci", "core": "Znovu načíst jádro", "group": "Znovu načíst skupiny", "heading": "Konfigurace se načítá", @@ -1226,14 +1226,19 @@ "actions": { "caption": "Když je něco spuštěno ..." }, + "automations": "Automatizace", "conditions": { "caption": "Udělej něco, jen když ..." }, + "create": "Vytvořit automatizaci se zařízením", + "no_automations": "Žádné automatizace", + "no_device_automations": "Pro toto zařízení nejsou k dispozici žádné automatizace.", "triggers": { "caption": "Udělej něco, když ..." } }, "automations": "Automatizace", + "cant_edit": "Můžete upravovat pouze položky, které jsou vytvořeny v uživatelském rozhraní.", "caption": "Zařízení", "confirm_rename_entity_ids": "Chcete také přejmenovat ID entit vašich entit?", "data_table": { @@ -1254,6 +1259,18 @@ }, "info": "Informace o zařízení", "name": "Jméno", + "scene": { + "create": "Vytvořit scénu se zařízením", + "no_scenes": "Žádné scény", + "scenes": "Scény" + }, + "scenes": "Scény", + "script": { + "create": "Vytvořit skript se zařízením", + "no_scripts": "Žádné skripty", + "scripts": "Skripty" + }, + "scripts": "Skripty", "unknown_error": "Neznámá chyba", "unnamed_device": "Nepojmenované zařízení", "update": "Aktualizovat" @@ -1476,8 +1493,8 @@ "description": "Restart a zastavení serveru Home Asistent", "section": { "reloading": { - "automation": "Znovu načíst automatizace", - "core": "Znovu načíst umístění a přispůsobení", + "automation": "Znovu načíst automatizaci", + "core": "Znovu načíst umístění a přizpůsobení", "group": "Znovu načíst skupiny", "heading": "Konfigurace se načítá", "introduction": "Některé části Home Assistant lze načíst bez nutnosti restartování. Volba načtení zahodí jejich aktuální konfiguraci a načte novou.", diff --git a/translations/es.json b/translations/es.json index 3dfd1d81e7..bbd017ec8a 100644 --- a/translations/es.json +++ b/translations/es.json @@ -764,7 +764,7 @@ }, "automation": { "caption": "Automatizaciones", - "description": "Crear y editar automatizaciones", + "description": "Crea y edita automatizaciones", "editor": { "actions": { "add": "Añadir acción", @@ -1153,7 +1153,7 @@ }, "core": { "caption": "Configuración general", - "description": "Cambiar la configuración general de Home Assistant", + "description": "Cambia la configuración general de Home Assistant", "section": { "core": { "core_config": { @@ -1374,7 +1374,7 @@ }, "configure": "Configurar", "configured": "Configurado", - "description": "Administrar y configurar integraciones", + "description": "Administra y configura integraciones", "details": "Detalles de la integración", "discovered": "Descubierto", "home_assistant_website": "Sitio web de Home Assistant", @@ -1425,7 +1425,7 @@ "scene": { "activated": "Activada escena {name}.", "caption": "Escenas", - "description": "Crear y editar escenas", + "description": "Crea y edita escenas", "editor": { "default_name": "Nueva Escena", "devices": { @@ -1465,7 +1465,7 @@ }, "script": { "caption": "Scripts", - "description": "Crear y editar scripts", + "description": "Crea y edita scripts", "editor": { "alias": "Nombre", "default_name": "Nuevo script", @@ -1529,7 +1529,7 @@ "username": "Nombre de usuario" }, "caption": "Usuarios", - "description": "Administrar usuarios", + "description": "Administra usuarios", "editor": { "activate_user": "Activar usuario", "active": "Activo", diff --git a/translations/hu.json b/translations/hu.json index 84105f1571..9c77e823b6 100644 --- a/translations/hu.json +++ b/translations/hu.json @@ -638,7 +638,7 @@ "ok": "OK" }, "more_info_control": { - "dismiss": "Elvetés párbeszédpanel", + "dismiss": "Párbeszédpanel elvetése", "edit": "Entitás szerkesztése", "restored": { "confirm_remove_text": "Biztosan el szeretnéd távolítani ezt az entitást?", @@ -1212,7 +1212,7 @@ "pick_attribute": "Válassz egy attribútumot a felülbíráláshoz", "picker": { "header": "Testreszabások", - "introduction": "Szabd testre az entitások attribútumait. A hozzáadott/szerkesztett testreszabások azonnal érvényesülnek. A testreszabások eltávolítása akkor lép életbe, amikor az entitás frissül." + "introduction": "Szabd testre az entitások attribútumait. A hozzáadott, szerkesztett testreszabások azonnal érvényesülnek. A testreszabások eltávolítása akkor lép életbe, amikor az entitás frissül." }, "warning": { "include_link": "customize.yaml fájlra", @@ -1230,7 +1230,7 @@ "conditions": { "caption": "Csak akkor csinálj valamit, ha a(z)..." }, - "create": " Eszköz automatizálás létrehozása", + "create": "Eszköz automatizálás létrehozása", "no_automations": "Nincs automatizálás", "no_device_automations": "Ehhez az eszközhöz nem állnak rendelkezésre automatizálások.", "triggers": { @@ -1360,7 +1360,7 @@ "area_picker_label": "Terület", "close": "Bezárás", "created_config": "Konfiguráció létrehozva a következőhöz: {name}.", - "dismiss": "Elvetés párbeszédpanel", + "dismiss": "Párbeszédpanel elvetése", "error_saving_area": "Hiba a terület mentésekor: {error}", "external_step": { "description": "Ehhez a lépéshez egy külső weboldal meglátogatása szükséges.", diff --git a/translations/ko.json b/translations/ko.json index 40db0666a3..9f5d9871bb 100644 --- a/translations/ko.json +++ b/translations/ko.json @@ -625,11 +625,11 @@ "enabled_label": "구성요소 활성화", "entity_id": "구성요소 ID", "name": "대체 이름", - "note": "참고 : 아직 모든 통합 구성요소에 적용되지 않을 수 있습니다.", + "note": "참고: 아직 모든 통합 구성요소에 적용되지 않을 수 있습니다.", "unavailable": "이 구성요소는 현재 사용할 수 없습니다.", "update": "업데이트" }, - "related": "관련된", + "related": "관련 요소", "settings": "설정" }, "generic": { @@ -866,8 +866,8 @@ }, "zone": { "entity": "위치기반 구성요소", - "label": "구역", - "zone": "구역" + "label": "지역", + "zone": "지역" } }, "unsupported_condition": "미지원 조건: {condition}" @@ -913,7 +913,7 @@ "label": "위치정보", "leave": "퇴장", "source": "소스", - "zone": "구역" + "zone": "지역" }, "homeassistant": { "event": "이벤트:", @@ -967,9 +967,9 @@ "enter": "입장", "entity": "위치기반 구성요소", "event": "이벤트:", - "label": "구역", + "label": "지역", "leave": "퇴장", - "zone": "구역" + "zone": "지역" } }, "unsupported_platform": "미지원 플랫폼: {platform}" @@ -1208,7 +1208,7 @@ "attributes_set": "구성요소의 다음 속성은 프로그래밍 방식으로 설정됩니다.", "caption": "사용자화", "description": "구성요소를 사용자화 합니다", - "different_include": "도메인, 글로브 혹은 다른 포함 기능을 통해 가능할 수 있습니다.", + "different_include": "도메인, 글로브 혹은 다른 포함 구성을 통해 가능할 수 있습니다.", "pick_attribute": "재정의 할 속성 선택", "picker": { "header": "사용자화", @@ -1232,7 +1232,7 @@ }, "create": "기기로 자동화 구성하기", "no_automations": "자동화 없음", - "no_device_automations": "이 기기에서 사용할 수 있는 자동화가 없습니다", + "no_device_automations": "이 기기에서 사용할 수 있는 자동화가 없습니다.", "triggers": { "caption": "... 일 때 자동화를 실행 (트리거)" } @@ -1501,7 +1501,7 @@ "person": "구성원 새로고침", "scene": "씬 다시읽기", "script": "스크립트 새로고침", - "zone": "구역 새로고침" + "zone": "지역 새로고침" }, "server_management": { "confirm_restart": "Home Assistant 를 재시작하시겠습니까?", @@ -1526,7 +1526,7 @@ "create": "만들기", "name": "이름", "password": "비밀번호", - "username": "사용자 이름 (계정명)" + "username": "사용자 이름 (계정)" }, "caption": "사용자", "description": "사용자를 관리합니다", @@ -1663,12 +1663,12 @@ "title": "Zigbee 홈 자동화" }, "zone": { - "add_zone": "구역 추가", - "caption": "구역들", - "configured_in_yaml": "configuration.yaml 에서 구성된 구역은 UI 에서 편집 할 수 없습니다.", - "confirm_delete": "이 구역을 삭제하시겠습니까?", - "create_zone": "구역 만들기", - "description": "구성원을 추적하려는 구역을 관리하세요.", + "add_zone": "지역 추가", + "caption": "지역", + "configured_in_yaml": "configuration.yaml 에서 구성된 지역은 UI 에서 편집할 수 없습니다.", + "confirm_delete": "이 지역을 삭제하시겠습니까?", + "create_zone": "지역 만들기", + "description": "구성원을 추적할 지역을 관리합니다", "detail": { "create": "만들기", "delete": "삭제", @@ -1677,16 +1677,16 @@ "latitude": "위도", "longitude": "경도", "name": "이름", - "new_zone": "새로운 구역", + "new_zone": "새로운 지역", "passive": "자동화 전용", "passive_note": "자동화 전용은 프런트엔드에 숨겨져 있으며 추적 기기의 위치로 사용되지 않습니다. 자동화에 사용하려는 경우에 유용합니다.", "radius": "반경", - "required_error_msg": "이 필드는 필수 요소입니다", + "required_error_msg": "이 입력란은 필수 요소입니다", "update": "업데이트" }, "edit_home_zone": "집의 위치는 일반 설정에서 변경할 수 있습니다.", - "introduction": "영역을 사용하면 지구 상의 특정 지역을 지정할 수 있습니다. 구성원이 구역 내에 있으면 구성요소 상태에서 구역의 이름을 가져옵니다. 자동화 설정 내에서 영역을 트리거 또는 조건으로 사용할 수도 있습니다.", - "no_zones_created_yet": "아직 생성된 구역이 없는 것 같습니다." + "introduction": "지역을 사용하면 지구 상의 특정 지역을 지정할 수 있습니다. 구성원이 지역 내에 있으면 구성요소 상태에서 지역의 이름을 가져옵니다. 자동화 설정 내에서 지역을 트리거 또는 조건으로 사용할 수도 있습니다.", + "no_zones_created_yet": "아직 설정한 지역이 없는 것 같습니다." }, "zwave": { "caption": "Z-Wave", @@ -1712,18 +1712,18 @@ "network_stopped": "Z-Wave 네트워크 중지됨" }, "node_config": { - "config_parameter": "구성 파라메터", + "config_parameter": "구성 매개변수", "config_value": "구성 값", "false": "거짓", "header": "노드 구성 옵션", "seconds": "초", - "set_config_parameter": "구성 파라메터 설정", + "set_config_parameter": "구성 매개변수 설정", "set_wakeup": "절전모드 해제 간격 설정", "true": "참" }, "ozw_log": { "header": "OZW 로그", - "introduction": "로그를 봐주세요. 최소값은 0(전체 로그를 불러올 때)이고 최대값은 1000 입니다. 로드된 로그는 정적 로그를 보여주며 로그의 끝 부분은 최근 기록된 로그의 행으로 자동으로 업데이트됩니다." + "introduction": "로그를 봐주세요. 최소값은 0(전체 로그를 불러올 때)이고 최대값은 1000 입니다. 로드된 로그는 정적 로그를 보여주며 로그의 끝 부분은 최근 기록된 로그로 자동으로 업데이트됩니다." }, "services": { "add_node": "노드 추가", @@ -1752,7 +1752,7 @@ "developer-tools": { "tabs": { "events": { - "alert_event_type": "이벤트 유형은 필수 필드입니다", + "alert_event_type": "이벤트 유형은 필수 입력 요소입니다", "available_events": "사용 가능한 이벤트", "count_listeners": " ({count} 청취객체)", "data": "이벤트 데이터 (YAML, 선택 사항)", @@ -1818,17 +1818,17 @@ "call_service": "서비스 호출", "column_description": "상세정보", "column_example": "예제", - "column_parameter": "파라메터", + "column_parameter": "매개변수", "data": "서비스 데이터 (YAML, 선택 사항)", "description": "서비스 개발 도구를 사용하면 Home Assistant 에서 사용 가능한 서비스를 호출할 수 있습니다.", - "fill_example_data": "예제 데이터를 필드에 넣기", + "fill_example_data": "예제 데이터를 입력란에 넣기", "no_description": "상세정보가 없습니다", - "no_parameters": "이 서비스에는 파라메터가 필요 없습니다.", + "no_parameters": "이 서비스에는 매개변수가 필요 없습니다.", "select_service": "상세정보를 보려면 서비스를 선택해주세요", "title": "서비스" }, "states": { - "alert_entity_field": "구성요소는 필수 필드입니다", + "alert_entity_field": "구성요소는 필수 입력 요소입니다", "attributes": "속성", "copied": "클립보드에 복사됨", "copy_entity_attribute": "속성 복사", @@ -1987,7 +1987,7 @@ }, "markdown": { "content": "내용", - "name": "마크다운" + "name": "마크다운 텍스트" }, "media-control": { "name": "미디어 컨트롤" diff --git a/translations/nb.json b/translations/nb.json index a1c03e61fe..458d74dd58 100644 --- a/translations/nb.json +++ b/translations/nb.json @@ -566,7 +566,7 @@ "entity": { "entity-picker": { "clear": "Tøm", - "entity": "Oppføring", + "entity": "Entitet", "show_entities": "Vis entiteter" } }, @@ -578,7 +578,7 @@ "area": "Område", "automation": "Del av følgende automatiseringer", "device": "Enhet", - "entity": "Beslektede enheter", + "entity": "Beslektede entiteter", "group": "Del av følgende grupper", "integration": "Integrering", "scene": "Del av følgende scener", @@ -627,7 +627,7 @@ "name": "Overstyr Navn", "note": "Merk: dette fungerer kanskje ikke ennå med alle integrasjoner.", "unavailable": "Denne entiteten er ikke tilgjengelig for øyeblikket.", - "update": "OPPDATER" + "update": "OPPDATÉR" }, "related": "Relaterte", "settings": "Innstillinger" @@ -639,13 +639,13 @@ }, "more_info_control": { "dismiss": "Avvis dialogboksen", - "edit": "Rediger enhet", + "edit": "Redigér entitet", "restored": { - "confirm_remove_text": "Er du sikker på at du vil fjerne denne enheten?", - "confirm_remove_title": "Vil du fjerne enheten?", - "not_provided": "Denne enheten er ikke tilgjengelig for øyeblikket, og er en foreldreløs til en fjernet, endret eller dysfunksjonelle integrering eller enhet.", - "remove_action": "Fjern enhet", - "remove_intro": "Hvis enheten ikke lenger er i bruk, kan du rense den opp ved å fjerne den." + "confirm_remove_text": "Er du sikker på at du vil fjerne denne entiteten?", + "confirm_remove_title": "Vil du fjerne entiteten?", + "not_provided": "Denne entiteten er ikke tilgjengelig for øyeblikket og er foreldreløs til en fjernet, endret eller ikke-fungerende integrering eller enhet.", + "remove_action": "Fjern entitet", + "remove_intro": "Hvis entiteten ikke lenger er i bruk, kan du rense den opp ved å fjerne den." }, "script": { "last_action": "Siste handling", @@ -663,7 +663,7 @@ }, "more_info_settings": { "back": "Gå tilbake", - "entity_id": "Oppføring ID", + "entity_id": "Entitets-ID", "name": "Navn", "save": "Lagre" }, @@ -965,7 +965,7 @@ }, "zone": { "enter": "Ankommer", - "entity": "Oppføring med posisjon", + "entity": "Entitet med posisjon", "event": "Hendelse:", "label": "Sone", "leave": "Forlater", @@ -1212,7 +1212,7 @@ "pick_attribute": "Velg et attributt som skal overstyres", "picker": { "header": "Tilpasninger", - "introduction": "Juster attributter per entitet. Lagt til/redigert tilpasninger trer i kraft umiddelbart. Fjernede tilpasninger trer i kraft når entiteten er oppdatert." + "introduction": "Justér attributter per entitet. Lagt til eller redigerte tilpasninger trer i kraft umiddelbart. Fjernede tilpasninger trer i kraft når entiteten blir oppdatert." }, "warning": { "include_link": "inkludér customize.yaml", @@ -1285,7 +1285,7 @@ "delete": "SLETT", "enabled_cause": "Deaktivert av {cause}.", "enabled_description": "Deaktiverte entiteter vil ikke bli lagt til i Home Assistant.", - "enabled_label": "Aktiver entitet", + "enabled_label": "Aktivér entitet", "entity_id": "Entitets-ID", "name": "Overstyr Navn", "note": "Merk: dette fungerer kanskje ikke ennå med alle integrasjoner.", @@ -1317,8 +1317,8 @@ "status": "Status" }, "integrations_page": "Integrasjonsside", - "introduction": "Home Assistant bygger opp et register over hver entitet den har sett som kan identifiseres unikt. Hver av disse entitetene vil ha en entitets-ID som er reservert kun til denne entiteten.", - "introduction2": "Bruk enhets registret til å overstyre navnet, endre enhets-ID eller fjerne oppføringen fra Home Assistant.", + "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.", "remove_selected": { "button": "Fjern valgte", "confirm_text": "Enheter kan bare fjernes når integrasjonen ikke lenger gir enhetene.", @@ -1342,7 +1342,7 @@ "delete_button": "Slett {integration}", "delete_confirm": "Er du sikker på at du vil slette denne integrasjonen?", "device_unavailable": "enheten er utilgjengelig", - "entity_unavailable": "oppføringen er utilgjengelig", + "entity_unavailable": "entiteten er ikke tilgjengelig", "firmware": "Fastvare: {version}", "hub": "Tilkoblet via", "manuf": "av {manufacturer}", @@ -1572,7 +1572,7 @@ "header": "Klyngeattributter", "help_attribute_dropdown": "Velg en attributt for å se eller angi verdien.", "help_get_zigbee_attribute": "Hent verdien for det valgte attributtet.", - "help_set_zigbee_attribute": "Angi attributtverdi for den spesifiserte klyngen på den angitte entiteten.", + "help_set_zigbee_attribute": "Angi attributtverdi for klusteret på den angitte entiteten.", "introduction": "Se og rediger klyngeattributter.", "set_zigbee_attribute": "Angi Zigbee-attributt" }, diff --git a/translations/nl.json b/translations/nl.json index 5ab0162200..b54b8880c4 100644 --- a/translations/nl.json +++ b/translations/nl.json @@ -1455,7 +1455,7 @@ "delete_scene": "Scène verwijderen", "edit_scene": "Scène bewerken", "header": "Scene Editor", - "introduction": "Met de scene editor kunt je scenes maken en bewerken. Volg de onderstaande link om de instructies te lezen om ervoor te zorgen dat u Home Assistant correct hebt geconfigureerd.", + "introduction": "Met de scene editor kun je scenes maken en bewerken. Volg de onderstaande link om de instructies te lezen om ervoor te zorgen dat u Home Assistant correct hebt geconfigureerd.", "learn_more": "Meer informatie over scènes", "no_scenes": "We konden geen bewerkbare scènes vinden.", "only_editable": "Alleen scènes die zijn gedefinieerd in scenes.yaml kunnen worden bewerkt.", @@ -1610,7 +1610,7 @@ "cluster_selection_help": "Selecteer clusters om aan de geselecteerde groep te koppelen.", "group_picker_help": "Selecteer een groep om een koppel opdracht uit te voeren.", "group_picker_label": "Te koppelen groepen", - "header": "Group koppelingen", + "header": "Groep koppelingen", "introduction": "Groepen koppelen en ontkoppelen", "unbind_button_help": "Ontkoppel de geselecteerde groep van de geselecteerde apparaatclusters.", "unbind_button_label": "Ontkoppel groep" @@ -1665,7 +1665,7 @@ "zone": { "add_zone": "Zone toevoegen", "caption": "Zones", - "configured_in_yaml": "Zones die via configuration.yaml zijn geconfigureerd kunnen niet worden bewerkt in de gebruikrs", + "configured_in_yaml": "Zones die via configuration.yaml zijn geconfigureerd kunnen niet worden bewerkt in de gebruikers", "confirm_delete": "Weet je zeker dat je deze zone wilt verwijderen?", "create_zone": "Creëer Zone", "description": "Beheer de zones waarin u personen wilt volgen.", diff --git a/translations/ro.json b/translations/ro.json index 74b6c4cbea..1b1b0be02d 100644 --- a/translations/ro.json +++ b/translations/ro.json @@ -464,6 +464,9 @@ "script": { "execute": "Executa" }, + "service": { + "run": "Rulează" + }, "timer": { "actions": { "cancel": "Revocare", @@ -524,10 +527,24 @@ "successfully_saved": "Opțiunile salvate cu succes." }, "components": { + "area-picker": { + "add_dialog": { + "add": "Adaugă", + "failed_create_area": "Nu s-a reușit crearea zonei.", + "name": "Nume", + "text": "Introdu numele noii zone.", + "title": "Adaugă o zonă nouă" + }, + "add_new": "Adaugă o zonă nouă", + "area": "Zonă", + "clear": "Şterge", + "show_areas": "Arată zonele" + }, "device-picker": { "clear": "Şterge", "device": "Dispozitiv", - "show_devices": "Arata dispozitivele" + "show_devices": "Arata dispozitivele", + "toggle": "Comută" }, "entity": { "entity-picker": { @@ -540,6 +557,16 @@ "loading_history": "Încărcarea istoricului de stare ...", "no_history_found": "Nici un istoric de stare nu a fost găsit." }, + "related-items": { + "area": "Zonă", + "automation": "Parte din următoarele automatizări", + "device": "Dispozitiv", + "entity": "Entități conexe", + "group": "Parte din următoarele grupuri", + "integration": "Integrare", + "scene": "Parte din următoarele scenarii", + "script": "Parte din următoarele scripturi" + }, "relative_time": { "duration": { "day": "{count}{count, plural,\n one { zi }\n other { zile }\n}", @@ -562,9 +589,34 @@ "enable_new_entities_label": "Activează entitățile nou adăugate", "title": "Opțiuni de sistem pentru {integration}" }, + "entity_registry": { + "control": "Control", + "dismiss": "Ascunde", + "editor": { + "confirm_delete": "Sigur dorești să ștergi această intrare?", + "delete": "ȘTERGE", + "enabled_cause": "Dezactivat de către {cause}.", + "enabled_description": "Entitățile dezactivate nu vof fi adăugate in Home Assistant", + "enabled_label": "Activează entitatea", + "entity_id": "ID-ul entității", + "name": "Suprascriere nume", + "note": "Notă: este posibil să nu funcționeze încă cu toate integrările.", + "unavailable": "Această entitate nu este disponibilă momentan.", + "update": "ACTUALIZARE" + }, + "related": "În legătură cu", + "settings": "Setări" + }, + "generic": { + "cancel": "Revocare", + "default_confirmation_title": "Ești sigur?", + "ok": "OK" + }, "more_info_control": { + "edit": "Editează entitatea", "script": { - "last_action": "Ultima acțiune" + "last_action": "Ultima acțiune", + "last_triggered": "Ultima declanșare" }, "sun": { "elevation": "Altitudine", @@ -593,6 +645,9 @@ "label_voice": "Tastați și apăsați „Enter” sau atingeți microfonul pentru a vorbi" }, "zha_device_info": { + "confirmations": { + "remove": "Ești sigur că vrei să înlături dispozitivul?" + }, "manuf": "de {manufacturer}", "no_area": "Nici o zonă", "services": { @@ -876,6 +931,7 @@ "core_config": { "edit_requires_storage": "Editorul a fost dezactivat deoarece configurația a fost stocata în configuration.yaml.", "elevation": "Altitudine", + "elevation_feet": "picioare", "elevation_meters": "metri", "imperial_example": "Fahrenheit, livre", "latitude": "Latitudine", @@ -929,15 +985,34 @@ "actions": { "caption": "Când se declanșează ceva ..." }, + "automations": "Automatizări", "conditions": { "caption": "Fă ceva doar dacă ..." }, + "create": "Creează o automatizare cu dispozitivul", + "no_automations": "Nu există automatizări", + "no_device_automations": "Nu există automatizări disponibile pentru acest dispozitiv.", "triggers": { "caption": "Fă ceva când ..." } }, + "cant_edit": "Poți edita numai elementele create în UI.", "caption": "Dispozitive", - "description": "Gestionați dispozitivele conectate" + "description": "Gestionați dispozitivele conectate", + "name": "Nume", + "scene": { + "create": "Creează un scenariu cu dispozitivul", + "no_scenes": "Nu există scenarii", + "scenes": "Scenarii" + }, + "scenes": "Scenarii", + "script": { + "create": "Creează un script cu dispozitivul", + "no_scripts": "Nu există scripturi", + "scripts": "Scripturi" + }, + "scripts": "Scripturi", + "update": "Actualizare" }, "entities": { "caption": "Entități", @@ -948,6 +1023,8 @@ "enabled_cause": "Dezactivat de {cause}.", "enabled_description": "Entitățile dezactivate nu vof fi adăugate in Home Assistant", "enabled_label": "Activează entitatea", + "entity_id": "ID-ul entității", + "name": "Suprascriere nume", "unavailable": "Această entitate nu este disponibilă momentan.", "update": "ACTUALIZAȚI" }, @@ -979,6 +1056,7 @@ "config_flow": { "area_picker_label": "Zonă", "created_config": "Configurare creată pentru {name}.", + "dismiss": "Ascunde dialogul", "error_saving_area": "Imposibil de salvat zona: {error}", "external_step": { "description": "Acest pas necesită să vizitați un site web extern pentru a fi finalizat.", @@ -1051,8 +1129,10 @@ "group": "Reîncărcați grupurile", "heading": "Reîncărcarea configurației", "introduction": "Unele părți din Home Assistant se pot reîncărca fără a necesita o repornire. Apăsarea reîncărcării va dezactiva configurația actuală și va încărca noua configurație.", + "person": "Reîncărcare persoane", "scene": "Reîncărca scenarii", - "script": "Reîncărcați script-uri" + "script": "Reîncărcați script-uri", + "zone": "Reîncărcare zone" }, "server_management": { "confirm_restart": "Sigur doriți să reporniți Home Assistant?", @@ -1099,19 +1179,73 @@ "header": "Zigbee Home Automation - Adăugați dispozitive", "spinner": "Căutarea dispozitivelor ZHA Zigbee ..." }, + "add": { + "caption": "Adaugă dispozitive", + "description": "Adaugă dispozitive la rețeaua Zigbee" + }, "caption": "ZHA", + "clusters": { + "header": "Clustere", + "introduction": "Clusterele sunt blocurile pentru funcționalitatea Zigbee. Ele separă funcționalitatea în unități logice. Există tipuri client și server și sunt alcătuite din atribute și comenzi." + }, "description": "Managementul rețelei Zigbee Home Automation", "device_card": { "area_picker_label": "Zonă", "device_name_placeholder": "Nume dat de utilizator", "update_name_button": "Actualizați numele" }, + "devices": { + "header": "Zigbee Home Automation - Dispozitiv" + }, + "group_binding": { + "bind_button_help": "Conectează grupul selectat cu grupurile de dispozitive selectate.", + "bind_button_label": "Conectează grupul", + "cluster_selection_help": "Selectează grupul pentru conectarea la grupul selectat.", + "group_picker_help": "Selectați un grup pentru a emite o comandă de conectare.", + "group_picker_label": "Grupuri conectabile", + "header": "Conectare grup", + "introduction": "Conectează și deconectează grupuri.", + "unbind_button_help": "Deconectează grupul selectat de grupurile de dispozitive selectate.", + "unbind_button_label": "Deconectează grupul" + }, + "groups": { + "caption": "Grupuri", + "description": "Creează și modifică grupurile Zigbee", + "group-header": "Zigbee Home Automation - Detalii despre grup", + "groups-header": "Zigbee Home Automation - Managementul grupului" + }, "services": { "reconfigure": "Reconfigurați dispozitivul ZHA (dispozitiv de vindecare). Utilizați acest lucru dacă aveți probleme cu dispozitivul. Dacă dispozitivul în cauză este un dispozitiv alimentat cu baterii, asigurați-vă că este treaz și accepta comenzi atunci când utilizați acest serviciu.", "remove": "Eliminați un dispozitiv din rețeaua Zigbee.", "updateDeviceName": "Setați un nume personalizat pentru acest dispozitiv în registrul de dispozitive." } }, + "zone": { + "add_zone": "Adăugare zonă", + "caption": "Zone", + "configured_in_yaml": "Zonele configurate in configuration.yaml nu pot fi editate prin UI.", + "confirm_delete": "Sigur dorești să ștergi această zonă?", + "create_zone": "Creare zonă", + "description": "Gestionează zonele în care dorești să urmărești persoanele.", + "detail": { + "create": "Creează", + "delete": "Șterge", + "icon": "Iconiță", + "icon_error_msg": "Iconița ar trebui să fie de forma prefix:iconname, de exemplu: mdi:home", + "latitude": "Latitudine", + "longitude": "Longitudine", + "name": "Nume", + "new_zone": "Zonă nouă", + "passive": "Pasiv", + "passive_note": "Zonele pasive sunt ascunse în pagina principală și nu sunt utilizate ca locație pentru următorii de dispozitive. Acest lucru este util doar dacă dorești să-l folosești pentru automatizări.", + "radius": "Rază", + "required_error_msg": "Acest câmp este obligatoriu", + "update": "Actualizează" + }, + "edit_home_zone": "Locația casei tale poate fi modificată în configurarea generală.", + "introduction": "Zonele vă permit să specificați anumite regiuni de pe pământ. Când o persoană se află într-o zonă, identificatorul va lua numele din zonă. Zonele pot fi de asemenea utilizate ca declanșator sau condiție în cadrul setărilor de automatizare.", + "no_zones_created_yet": "Se pare că nu ai creat încă nici o zonă." + }, "zwave": { "caption": "Z-Wave", "common": { @@ -1259,6 +1393,9 @@ "no_devices": "Această pagină vă permite să controlați dispozitivele dvs., cu toate acestea se pare că nu aveți dispozitive configurate încă. Du-te la pagina integrări pentru a începe.", "title": "Bun venit acasă" }, + "entities": { + "never_triggered": "Nu s-a declanșat niciodată" + }, "picture-elements": { "call_service": "Apeleaza servicul {name}", "hold": "Țineți apăsat:", @@ -1281,6 +1418,9 @@ "card": { "entities": { "toggle": "Schimbati entitatile" + }, + "shopping-list": { + "integration_not_loaded": "Acest card necesită integrarea \"shopping_list\" pentru a fi configurat." } }, "edit_card": { @@ -1536,6 +1676,9 @@ } }, "profile": { + "advanced_mode": { + "link_promo": "Află mai multe" + }, "change_password": { "confirm_new_password": "Confirmați Noua Parolă", "current_password": "Parola Curentă", @@ -1556,6 +1699,8 @@ "link_promo": "Ajută la traducere" }, "logout": "Deconectare", + "logout_text": "Sigur vrei să te deconectezi?", + "logout_title": "Deconectare?", "long_lived_access_tokens": { "confirm_delete": "Sigur doriti sa stergeti tokenul de acces pentru {name}?", "create": "Creaza un Token", diff --git a/translations/ru.json b/translations/ru.json index 08804f204a..724f1e7ec9 100644 --- a/translations/ru.json +++ b/translations/ru.json @@ -669,7 +669,7 @@ }, "options_flow": { "form": { - "header": "Параметры" + "header": "Настройки" }, "success": { "description": "Параметры успешно сохранены." diff --git a/translations/sv.json b/translations/sv.json index 7b2eca99dc..c167a3300a 100644 --- a/translations/sv.json +++ b/translations/sv.json @@ -45,7 +45,7 @@ "plant": "Växt", "proximity": "Närhet", "remote": "Fjärrkontroll", - "scene": "Scen", + "scene": "Scenario", "script": "Skript", "sensor": "Sensor", "sun": "Sol", @@ -329,7 +329,7 @@ "on": "På" }, "scene": { - "scening": "Aktiverar scen" + "scening": "Scenario" }, "script": { "off": "Av", @@ -411,7 +411,7 @@ }, "automation": { "last_triggered": "Utlöstes senast", - "trigger": "Aktivera" + "trigger": "Kör" }, "camera": { "not_available": "Bilden är inte tillgänglig" @@ -536,6 +536,7 @@ }, "common": { "cancel": "Avbryt", + "close": "Stäng", "loading": "Läser in", "no": "Nej", "save": "Spara", @@ -580,7 +581,7 @@ "entity": "Relaterade entiteter", "group": "Del av följande grupper", "integration": "Integration", - "scene": "Del av följande scener", + "scene": "Del av följande scenarier", "script": "Del av följande skript" }, "relative_time": { @@ -640,7 +641,11 @@ "dismiss": "Avfärda", "edit": "Redigera entitet", "restored": { - "confirm_remove_text": "Är du säker på att du vill ta bort den här entiteten?" + "confirm_remove_text": "Är du säker på att du vill ta bort den här entiteten?", + "confirm_remove_title": "Ta bort entitet?", + "not_provided": "Den här enheten är för närvarande inte tillgänglig och är en föräldralös till en borttagen, ändrad eller dysfunktionell integration eller enhet.", + "remove_action": "Ta bort entitet", + "remove_intro": "Om entiteten inte längre används kan du rensa upp den genom att ta bort den." }, "script": { "last_action": "Senaste åtgärd", @@ -690,6 +695,8 @@ "last_seen": "Senast sedd", "manuf": "av {manufacturer}", "no_area": "Inget område", + "power_source": "Strömkälla", + "quirk": "Quirk", "services": { "reconfigure": "Konfigurera om ZHA-enheten (läk enheten). Använd det här om du har problem med enheten. Om den aktuella enheten är en batteridriven enhet, se till att den är påslagen och accepterar kommandon när du använder den här tjänsten.", "remove": "Ta bort en enhet från Zigbee-nätverket.", @@ -752,11 +759,11 @@ "integrations_page": "Integrationssidan", "introduction": "Områden används för att organisera var enheter befinner sig. Denna information kommer att användas i hela Home Assistant för att hjälpa dig att organisera ditt gränssnitt, behörigheter och integreringar med andra system.", "introduction2": "Om du vill placera enheter i ett område använder du länken nedan för att navigera till integrationssidan och klickar sedan på en konfigurerad integration för att komma till enhetskort.", - "no_areas": "Det verkar som om du inte har några områden än!" + "no_areas": "Ser ut som du inte har några områden ännu!" } }, "automation": { - "caption": "Automationer", + "caption": "Automatiseringar", "description": "Skapa och redigera automationer", "editor": { "actions": { @@ -789,7 +796,7 @@ "service_data": "Tjänstedata" }, "scene": { - "label": "Aktivera scen" + "label": "Aktivera scenario" }, "service": { "label": "Kör tjänst", @@ -810,7 +817,7 @@ "delete_confirm": "Säker på att du vill radera?", "duplicate": "Duplicera", "header": "Villkor", - "introduction": "Villkor är en valfri del av en automatiseringsregel och kan användas för att förhindra att en åtgärd inträffar när den triggas. Villkoren liknar triggers men är väldigt olika. En trigger reagerar på händelser som händer i systemet medan ett villkor bara utvärderar hur systemet ser ut just nu. En trigger kan reagera på att en strömbrytare slås på. Ett villkor kan bara se om en strömbrytare är på eller av.", + "introduction": "Villkoren är valfria och kommer att förhindra ytterligare utförande såvida inte alla villkor är uppfyllda.", "learn_more": "Lär dig mer om villkor", "name": "Villkor", "type_select": "Villkorstyp", @@ -884,6 +891,7 @@ "header": "Triggers", "introduction": "Triggers är det som startar en automation. Det är möjligt att ange flera triggers för samma regel. När en trigger inträffar kommer Home Assistant att validera eventuella villkor och sedan köra åtgärden.", "learn_more": "Lär dig mer om utlösare", + "name": "Trigger", "type_select": "Aktiveringstyp", "type": { "device": { @@ -985,7 +993,17 @@ "cloud": { "account": { "alexa": { + "config_documentation": "Dokumentation av config", + "disable": "inaktivera", + "enable": "aktivera", + "enable_ha_skill": "Aktivera Home Assistant skill för Alexa", + "enable_state_reporting": "Aktivera tillståndsrapportering", "info": "Med Alexa-integrationen för Home Assistant Cloud kan du styra alla dina Home Assistant-enheter via alla Alexa-aktiverade enheter.", + "info_state_reporting": "Om du aktiverar tillståndsrapportering skickar Home Assistant tillståndsändringar av exponerade entiteter till Amazon. På så sätt kan du alltid se de senaste tillstånden i Alexa-appen och använda tillståndsändringarna för att skapa rutiner.", + "manage_entities": "Hantera Entiteter", + "state_reporting_error": "Det går inte att {enable_disable} rapportera tillståndet.", + "sync_entities": "Synkronisera Entiteter", + "sync_entities_error": "Det gick inte att synkronisera entiteter:", "title": "" }, "connected": "Ansluten", @@ -993,8 +1011,19 @@ "fetching_subscription": "Hämtar prenumeration...", "google": { "config_documentation": "Konfigureringsdokumentation", + "devices_pin": "Säkerhetsenheter Pin", + "enable_ha_skill": "Aktivera Home Assistant-färdigheten för Google Assistant", + "enable_state_reporting": "Aktivera tillståndsrapportering", "enter_pin_error": "Det går inte att spara PIN-koden:", - "sync_entities_404_message": "Misslyckades med att synkronisera dina entiteter till Google, fråga Google \"Hej Google, synkronisera mina enheter\" för att synkronisera dina entiteter." + "enter_pin_hint": "Ange en PIN-kod för att använda säkerhetsenheter", + "enter_pin_info": "Ange en pin för att interagera med säkerhetsenheter. Säkerhetsanordningar är dörrar, garagedörrar och lås. Du kommer att bli ombedd att säga/ange denna pin när du interagerar med sådana enheter via Google Assistent.", + "info": "Med Google Assistant-integreringen för Home Assistant Cloud kan du styra alla dina Home Assistant-enheter via alla Google Assistent-aktiverade enheter.", + "info_state_reporting": "Om du aktiverar tillståndsrapportering skickar Home Assistant alla tillståndsändringar av exponerade entiteter till Google. På så sätt kan du alltid se de senaste lägena i Google-appen.", + "manage_entities": "Hantera Entiteter", + "security_devices": "Säkerhetsenheter", + "sync_entities": "Synkronisera Entiteter till Google", + "sync_entities_404_message": "Misslyckades med att synkronisera dina entiteter till Google, fråga Google \"Hej Google, synkronisera mina enheter\" för att synkronisera dina entiteter.", + "title": "Google Assistant" }, "integrations": "Integrationer", "integrations_introduction": "Integration med Home Assistant Cloud gör det möjligt för dig att koppla upp mot molntjänster utan att behöva exponera din egen installation av Home Assistant publikt på internet.", @@ -1015,11 +1044,23 @@ "sign_out": "Logga ut", "thank_you_note": "Tack för att du är en del av Home Assistant Cloud. Det är tack vare personer som dig som vi kan göra en fantastisk hemautomationsupplevelse för alla. Tack!", "webhooks": { + "disable_hook_error_msg": "Det gick inte att inaktivera webhook:", + "info": "Allt som är konfigurerat för att utlösas av en webhook kan ges en offentligt tillgänglig URL för att låta dig skicka tillbaka data till Home Assistant var som helst, utan att exponera din instans för internet.", + "link_learn_more": "Läs mer om hur du skapar webhook-drivna automatiseringar.", "loading": "Laddar...", + "manage": "Hantera", + "no_hooks_yet": "Ser ut som du inte har några webhooks ännu. Kom igång genom att konfigurera en ", + "no_hooks_yet_link_automation": "webhook automation", + "no_hooks_yet_link_integration": "webhook-baserad integration", + "no_hooks_yet2": " eller genom att skapa en ", "title": "" } }, "alexa": { + "banner": "Redigering av vilka entiteter som visas via det här användargränssnittet är inaktiverat eftersom du har konfigurerat entitetsfilter i configuration.yaml.", + "expose": "Exponera för Alexa", + "exposed_entities": "Exponerade entiteter", + "not_exposed_entities": "Ej exponerade entiteter", "title": "" }, "caption": "Home Assistant Cloud", @@ -1027,13 +1068,22 @@ "description_login": "Inloggad som {email}", "description_not_login": "Inte inloggad", "dialog_certificate": { - "close": "Stäng" + "certificate_expiration_date": "Certifikatets utgångsdatum", + "certificate_information": "Certifikatinformation", + "close": "Stäng", + "fingerprint": "Certifikats-fingeravtryck:", + "will_be_auto_renewed": "Kommer automatiskt att förnyas" }, "dialog_cloudhook": { + "available_at": "Webbhooken är tillgänglig på följande url:", + "close": "Stäng", "confirm_disable": "Är du säker på att du vill avaktivera denna webhook?", "copied_to_clipboard": "Kopierat till urklipp", "info_disable_webhook": "Om du inte längre vill använda denna webhook kan du", - "link_disable_webhook": "Inaktivera" + "link_disable_webhook": "Inaktivera", + "managed_by_integration": "Denna webhook hanteras av en integration och kan inte inaktiveras.", + "view_documentation": "Visa dokumentation", + "webhook_for": "Webhook för {name}" }, "forgot_password": { "check_your_email": "Kontrollera din e-post för instruktioner om hur du återställer ditt lösenord.", @@ -1045,14 +1095,20 @@ "title": "Glömt lösenord" }, "google": { + "banner": "Redigera vilka entiteter som visas via det här användargränssnittet är inaktiverat eftersom du har konfigurerat entitetsfilter i configuration.yaml.", "disable_2FA": "Inaktivera tvåfaktorautentisering", - "sync_to_google": "Synkroniserar ändringar till Google." + "expose": "Exponera för Google Assistant", + "exposed_entities": "Exponerade entiteter", + "not_exposed_entities": "Ej exponerade entiteter", + "sync_to_google": "Synkroniserar ändringar till Google.", + "title": "Google Assistant" }, "login": { "alert_email_confirm_necessary": "Du måste bekräfta din e-postadress innan du loggar in.", "alert_password_change_required": "Du måste ändra ditt lösenord innan du loggar in.", "dismiss": "Avfärda", "email": "E-postadress", + "email_error_msg": "Ogiltig e-post", "forgot_password": "glömt lösenordet?", "introduction": "Home Assistant Cloud ger dig en säker koppling till din installation när du befinner dig hemifrån. Det låter dig också ansluta till tjänster med enbart molnstöd: Amazon Alexa och Google Assistant.", "introduction2": "Denna tjänst drivs av vår partner ", @@ -1063,6 +1119,7 @@ "password_error_msg": "Lösenord måste vara minst 8 tecken", "sign_in": "Logga in", "start_trial": "Starta din kostnadsfria 1-månads testperiod", + "title": "Molninloggning", "trial_info": "Ingen betalningsinformation behövs" }, "register": { @@ -1149,16 +1206,18 @@ "attributes_outside": "Följande attribut är anpassade från utanför customize.yaml", "attributes_override": "Du kan åsidosätta dem om du vill.", "attributes_set": "Följande attribut för enheten ställs in programmatiskt.", - "caption": "Anpassning", + "caption": "Anpassningar", "description": "Anpassa dina entiteter", + "different_include": "Möjligen via en domain, en glob eller en annan include.", "pick_attribute": "Välj ett attribut att anpassa", "picker": { - "header": "Anpassning", + "header": "Anpassningar", "introduction": "Justera attribut per enhet. Tillagda och redigerade anpassningar kommer att tillträda omedelbart. Borttagna anpassningar kommer att träda i kraft när enheten är uppdaterad." }, "warning": { "include_link": "inkludera customize.yaml", - "include_sentence": "Det verkar som att din configuration.yaml inte korrekt" + "include_sentence": "Det verkar som att din configuration.yaml inte korrekt", + "not_applied": "Ändringar som görs här skrivs i den, men kommer inte att tillämpas efter en konfiguration omlastning om inte inkludera är på plats." } }, "devices": { @@ -1194,18 +1253,18 @@ "details": "Här är alla detaljer om din enhet.", "device_not_found": "Enheten hittades inte.", "entities": { - "add_entities_lovelace": "Lägg till alla enhetsentiteter i Lovelace-gränsnittet", + "add_entities_lovelace": "Lägg till i Lovelace", "entities": "Entiteter", "none": "Den här enheten har inga entiteter" }, "info": "Enhetsinformation", "name": "Namn", "scene": { - "create": "Skapa scen med enhet", - "no_scenes": "Inga scener", - "scenes": "Scener" + "create": "Skapa scenario med enhet", + "no_scenes": "Inga scenarier", + "scenes": "Scenarier" }, - "scenes": "Scener", + "scenes": "Scenarier", "script": { "create": "Skapa skript med enhet", "no_scripts": "Inga skript", @@ -1259,7 +1318,7 @@ }, "integrations_page": "Integrationssida", "introduction": "Home Assistant har ett entitetsregister som innehåller samtliga identifierade entiteter som någonsin har setts. Var och en av dessa entiteter kommer att ha ett ID-nummer som är reserverat för bara den entiteten.", - "introduction2": "Använd entitetsregistret för att skriva över namnet, ändra ID eller ta bort posten ifrån Home Assistant. Obs! Att ta bort posten ifrån entity registry (entitetsregistret) kommer inte att ta bort enheten. För att göra det, följ länken nedan och ta bort det från integrationssidan.", + "introduction2": "Använd entitetsregistret för att överskida namnet, ändra entitets-ID eller ta bort posten från Home Assistant.", "remove_selected": { "button": "Ta bort valda", "confirm_text": "Entiteter kan endast tas bort när integrationen inte längre tillhandahåller entiteterna.", @@ -1332,7 +1391,9 @@ }, "integration_not_found": "Integration hittades inte.", "new": "Skapa en ny integration", - "none": "Ingenting konfigurerat än" + "none": "Ingenting konfigurerat än", + "note_about_integrations": "Inte alla integrationer kan konfigureras via användargränssnittet ännu.", + "note_about_website_reference": "Fler finns på " }, "introduction": "Här går det att konfigurera dina komponenter och Home Assistant. Det är inte möjligt att ställa in allt från användargränssnittet ännu, men vi jobbar på det.", "person": { @@ -1362,44 +1423,44 @@ "note_about_persons_configured_in_yaml": "Observera: personer som konfigureras via configuration.yaml kan inte redigeras via det grafiska gränssnittet." }, "scene": { - "activated": "Aktiverad scen {name} .", - "caption": "Scener", - "description": "Skapa och redigera scener", + "activated": "Aktiverat scenario {name} .", + "caption": "Scenarier", + "description": "Skapa och redigera scenarier", "editor": { - "default_name": "Ny scen", + "default_name": "Nytt scenario", "devices": { "add": "Lägg till en enhet", "delete": "Ta bort enhet", "header": "Enheter", - "introduction": "Lägg till enheterna som du vill inkludera i din scen. Sätt alla enheter till det tillstånd du vill ha för den här scenen." + "introduction": "Lägg till enheterna som du vill inkludera i ditt scenario. Sätt alla enheter till det tillstånd du vill ha för detta scenario." }, "entities": { "add": "Lägg till en entitet", "delete": "Ta bort entitet", "device_entities": "Om du lägger till en entitet som tillhör en enhet kommer enheten att läggas till.", "header": "Entiteter", - "introduction": "Entiteter som inte tillhör en enhet kan anges här.", + "introduction": "Entiteter som inte tillhör en enhet kan ställas in här.", "without_device": "Entiteter utan enhet" }, - "introduction": "Använd scener för väcka liv i ditt hem.", - "load_error_not_editable": "Endast scener i scenes.yaml kan redigeras.", - "load_error_unknown": "Fel vid inläsning av scen ({err_no}).", + "introduction": "Använd scenarier för väcka liv i ditt hem.", + "load_error_not_editable": "Endast scenarier i scenes.yaml kan redigeras.", + "load_error_unknown": "Fel vid inläsning av scenario ({err_no}).", "name": "Namn", "save": "Spara", "unsaved_confirm": "Du har osparade ändringar. Är du säker på att du vill lämna?" }, "picker": { - "add_scene": "Lägg till scen", - "delete_confirm": "Är du säker på att du vill radera denna scen?", - "delete_scene": "Ta bort scen", - "edit_scene": "Redigera scen", - "header": "Scen-redigerare", - "introduction": "Scenredigeraren låter dig skapa och redigera scener. Följ länken nedan för att läsa instruktionerna för att se till att du har konfigurerat Home Assistant korrekt.", - "learn_more": "Läs dig mer om scener", - "no_scenes": "Vi kunde inte hitta några redigerbara scener", - "only_editable": "Endast scener definierade i scenes.yaml kan redigeras.", - "pick_scene": "Välj scen att redigera", - "show_info_scene": "Visa info om scen" + "add_scene": "Lägg till scenario", + "delete_confirm": "Är du säker på att du vill radera detta scenario?", + "delete_scene": "Ta bort scenario", + "edit_scene": "Redigera scenario", + "header": "Scenario-redigerare", + "introduction": "Scenarioredigeraren låter dig skapa och redigera scenario. Följ länken nedan för att läsa instruktionerna för att se till att du har konfigurerat Home Assistant korrekt.", + "learn_more": "Läs dig mer om scenarier", + "no_scenes": "Vi kunde inte hitta några redigerbara scenarier", + "only_editable": "Endast scenarier definierade i scenes.yaml kan redigeras.", + "pick_scene": "Välj scenario att redigera", + "show_info_scene": "Visa info om scenario" } }, "script": { @@ -1438,7 +1499,7 @@ "heading": "Konfigurationen laddas om", "introduction": "Vissa delar av Home Assistant kan laddas om utan att en omstart krävs. Att trycka på \"ladda om\" innebär att den nuvarande konfiguration inaktiveras och den nya laddas.", "person": "Ladda om personer", - "scene": "Ladda om scener", + "scene": "Ladda om scenarier", "script": "Ladda om skript", "zone": "Ladda om zoner" }, @@ -1471,6 +1532,7 @@ "description": "Hantera användare", "editor": { "activate_user": "Aktivera användare", + "active": "Aktiva", "caption": "Visa användare", "change_password": "Ändra lösenord", "confirm_user_deletion": "Är du säker på att du vill ta bort {name} ?", @@ -1496,6 +1558,7 @@ "add_device_page": { "discovery_text": "Upptäckta enheter kommer dyka upp här. Följ instruktionerna för dina enheter och sätt dem i parningsläge.", "header": "Zigbee Home Automation - Lägg till enheter", + "search_again": "Sök Igen", "spinner": "Söker efter ZHA Zigbee-enheter ..." }, "add": { @@ -1503,10 +1566,35 @@ "description": "Lägg till enheter till Zigbee-nätverket" }, "caption": "ZHA", + "cluster_attributes": { + "attributes_of_cluster": "Attribut för det valda klustret", + "get_zigbee_attribute": "Hämta Zigbee-attribut", + "header": "Klusterattribut", + "help_attribute_dropdown": "Välj ett attribut för att visa eller ange dess värde.", + "help_get_zigbee_attribute": "Få värdet för det valda attributet.", + "help_set_zigbee_attribute": "Ange attributvärde för det angivna klustret på den angivna entiteten.", + "introduction": "Visa och redigera klusterattribut.", + "set_zigbee_attribute": "Ange zigbee-attribut" + }, + "cluster_commands": { + "commands_of_cluster": "Kommandon för det valda klustret", + "header": "Klusterkommandon", + "help_command_dropdown": "Välj ett kommando att interagera med.", + "introduction": "Visa och utfärda klusterkommandon.", + "issue_zigbee_command": "Utfärda Zigbee-kommando" + }, "clusters": { "header": "Kluster", + "help_cluster_dropdown": "Välj ett kluster om du vill visa attribut och kommandon.", "introduction": "Kluster är byggstenarna för Zigbee-funktionalitet. De separerar funktionalitet i logiska enheter. Det finns klient- och servertyper som består av attribut och kommandon." }, + "common": { + "add_devices": "Lägg till enheter", + "clusters": "Kluster", + "devices": "Enheter", + "manufacturer_code_override": "Överskrid kod av tillverkare", + "value": "Värde" + }, "description": "Zigbee Home Automation (ZHA) nätverkshantering", "device_card": { "area_picker_label": "Plats", @@ -1544,6 +1632,7 @@ "group-header": "Zigbee Home Automation - Gruppdetaljer", "groups": "Grupper", "groups-header": "Zigbee Home Automation - Grupphantering", + "header": "Zigbee Home Automation - Grupphantering", "introduction": "Skapa och ändra zigbeegrupper", "manage_groups": "Hantera Zigbee-grupper", "members": "Medlemmar", @@ -1555,8 +1644,16 @@ }, "header": "Konfigurera ZigBee-hemautomation", "introduction": "Här går det att konfigurera ZHA-komponenten. Det är inte möjligt att ställa in allt från användargränssnittet ännu, men vi jobbar på det.", + "network_management": { + "header": "Nätverkshantering", + "introduction": "Kommandon som påverkar hela nätverket" + }, "node_management": { - "hint_wakeup": "Vissa enheter, som Xiaomi-sensorer, har en väckningsknapp som du kan trycka på med ca 5 sekunders intervall för att hålla enheterna vakna medan du interagerar med dem." + "header": "Enhetshantering", + "help_node_dropdown": "Välj en enhet för att visa alternativ per enhet.", + "hint_battery_devices": "Obs: Sömniga (batteridrivna) enheter måste vara vakna när du kör kommandon mot dem. Du kan i allmänhet väcka en sömnig enhet genom att utlösa den.", + "hint_wakeup": "Vissa enheter, som Xiaomi-sensorer, har en väckningsknapp som du kan trycka på med ca 5 sekunders intervall för att hålla enheterna vakna medan du interagerar med dem.", + "introduction": "Kör ZHA-kommandon som påverkar en enda enhet. Välj en enhet för att se en lista över tillgängliga kommandon." }, "services": { "reconfigure": "Omkonfigurera ZHA-enheten (läk enheten). Använd det här om du har problem med enheten. Om den aktuella enheten är en batteridriven enhet, se till att den är påslagen och accepterar kommandon när du använder den här tjänstens funktion.", @@ -1582,10 +1679,13 @@ "name": "Namn", "new_zone": "Ny Zon", "passive": "Passiv", + "passive_note": "Passiva zoner är dolda i frontend och används inte som plats för enhetsspårare. Detta är användbart om du bara vill använda den för automatiseringar.", "radius": "Radie", "required_error_msg": "Det här fältet krävs", "update": "Uppdatera" }, + "edit_home_zone": "Platsen för ditt hem kan ändras i gerenal config.", + "introduction": "Med zoner kan du ange vissa regioner på jorden. När en person befinner sig i en zon tar tillståndet namnet från zonen. Zoner kan också användas som utlösare eller villkor i automatiseringsinställningar.", "no_zones_created_yet": "Det verkar som om du inte har skapat några zoner ännu." }, "zwave": { @@ -1598,6 +1698,7 @@ "wakeup_interval": "Uppvakningsintervall" }, "description": "Hantera ditt Z-Wave nätverk", + "learn_more": "Läs mer om Z-Wave", "network_management": { "header": "Hantering av Z-Wave-nätverk", "introduction": "Kör kommandon som påverkar Z-Wave-nätverket. De flesta kommandon ger ingen bekräftelse om de lyckas men du kan kontrollera OZW-loggen för att försöka ta reda på det." @@ -1620,6 +1721,10 @@ "set_wakeup": "Ställ in uppvakningsintervall", "true": "Sant" }, + "ozw_log": { + "header": "OZW-logg", + "introduction": "Visa loggen. 0 är det minsta (laddar hela loggen) och 1000 är det maximala. Ladda visar en statisk logg och svansen uppdateras automatiskt med det sist angivna antalet rader i loggen." + }, "services": { "add_node": "Lägg till nod", "add_node_secure": "Lägg till nod med säkerhet", @@ -1640,6 +1745,7 @@ "custom": { "external_panel": { "complete_access": "Den kommer att ha tillgång till alla data i home assistant.", + "hide_message": "Kontrollera dokument om panel_custom-komponenten för att dölja det här meddelandet", "question_trust": "Litar du på den externa panelen {name} till {link}?" } }, @@ -1665,9 +1771,12 @@ }, "info": { "built_using": "Byggt med", + "custom_uis": "Anpassade användargränssnitt:", + "default_ui": "{action} {name} som standardsida på den här enheten", "developed_by": "Utvecklad av ett gäng grymma människor.", "frontend": "frontend-UI", "frontend_version": "Frontend-version: {version} - {type}", + "home_assistant_logo": "Home Assistant logotyp", "icons_by": "Ikoner av", "license": "Publicerad under Apache 2.0-licensen", "lovelace_ui": "Gå till Lovelace-utseendet", @@ -1676,6 +1785,7 @@ "server": "server", "set": "Ange", "source": "Källkod:", + "states_ui": "Gå till tillstånds-användargränssnittet", "system_health_error": "System Health-komponenten har inte lästs in. Lägg till 'system_health:' i configuration.yaml", "title": "Info" }, @@ -1695,6 +1805,7 @@ "description_publish": "Publicera ett paket", "listening_to": "Lyssnar på", "message_received": "Meddelande {id} mottaget på {topic} vid {time} :", + "payload": "Payload (mall tillåten)", "publish": "Publicera", "start_listening": "Börja lyssna", "stop_listening": "Sluta lyssna", @@ -1738,6 +1849,7 @@ "title": "Tillstånd" }, "templates": { + "description": "Mallar tolkas med hjälp av Jinja2 template engine med vissa Home Assistant-specifika tillägg.", "editor": "Mallredigerare", "jinja_documentation": "Malldokumentation för Jinja2", "template_extensions": "Mallutökningar för Home Assistant", @@ -1808,6 +1920,7 @@ }, "entities": { "name": "Enheter", + "show_header_toggle": "Visa rubrikväljare?", "toggle": "Växla entiteter." }, "entity-button": { @@ -1850,11 +1963,15 @@ "url": "URL" }, "glance": { - "columns": "Kolumner" + "columns": "Kolumner", + "name": "Blick" }, "history-graph": { "name": "Historikdiagram" }, + "horizontal-stack": { + "name": "Horisontelltrave" + }, "iframe": { "name": "iFrame" }, @@ -1878,6 +1995,12 @@ "picture-elements": { "name": "Bildelement" }, + "picture-entity": { + "name": "Bildentitet" + }, + "picture-glance": { + "name": "Bildblick" + }, "picture": { "name": "Bild" }, @@ -1896,6 +2019,9 @@ "thermostat": { "name": "Termostat" }, + "vertical-stack": { + "name": "Vertikaltrave" + }, "weather-forecast": { "name": "Väderprognos" } @@ -1905,9 +2031,9 @@ "delete": "Ta bort kort", "edit": "Redigera", "header": "Kortkonfiguration", - "move": "Flytta", + "move": "Flytta till vy", "options": "Fler alternativ", - "pick_card": "Välj det kort du vill lägga till.", + "pick_card": "Vilket kort vill du lägga till?", "pick_card_view_title": "Vilket kort vill du lägga till i {name} -vyn?", "save": "Spara", "show_code_editor": "Visa kodredigerare", @@ -1916,7 +2042,7 @@ }, "edit_lovelace": { "edit_title": "Redigera titel", - "explanation": "Den här titeln visas ovanför alla dina vyer i Lovelace.", + "explanation": "Den här titeln visas ovanför alla dina vyer i Lovelace UI.", "header": "Titel på ditt Lovelace-gränssnitt" }, "edit_view": { @@ -1940,7 +2066,7 @@ "para_no_id": "Det här elementet har inget ID. Lägg till ett ID till det här elementet i \"ui-lovelace.yaml\"." }, "raw_editor": { - "confirm_remove_config_text": "Vi kommer automatiskt att generera dina Lovelace-vyer med dina områden och enheter om du tar bort din Lovelace-konfiguration.", + "confirm_remove_config_text": "Vi kommer automatiskt att generera dina Lovelace UI-vyer med dina områden och enheter om du tar bort din Lovelace UI-konfiguration.", "confirm_remove_config_title": "Är du säker på att du vill ta bort din Lovelace UI konfiguration? Vi kommer automatiskt att generera dina Lovelace UI-vyer med dina områden och enheter.", "confirm_unsaved_changes": "Du har osparade ändringar. Är du säker på att du vill avsluta?", "confirm_unsaved_comments": "Din konfiguration innehåller kommentarer, dessa sparas inte. Vill du fortsätta?", @@ -1962,12 +2088,13 @@ }, "suggest_card": { "add": "Lägg till i Lovelace-gränsnitt", - "create_own": "Skapa ditt eget", + "create_own": "Välj annat kort", "header": "Vi har skapat ett förslag för dig" }, "view": { "panel_mode": { - "description": "Detta gör att det första kortet utnyttjar hela bredden i denna vyn." + "description": "Detta gör att det första kortet utnyttjar hela bredden i denna vyn.", + "title": "Panelläge?" } } }, @@ -1979,7 +2106,7 @@ "refresh": "Uppdatera", "unused_entities": "Oanvända enheter" }, - "reload_lovelace": "Ladda om Lovelace", + "reload_lovelace": "Ladda om användargränssnittet", "unused_entities": { "available_entities": "Det här är de enheter som du har tillgängliga, men som inte finns i ditt Lovelace-gränssnitt än.", "domain": "Domän", @@ -2134,6 +2261,7 @@ "mirror": "Spegla", "patio": "Uteplats", "right": "Höger", + "temperature_study": "Temperaturstudie", "upstairs": "Övervåningen" }, "unit": { @@ -2176,7 +2304,7 @@ }, "profile": { "advanced_mode": { - "description": "Home Assistant döljer avancerade funktioner och alternativ som standard. Du kan göra dessa funktioner tillgängliga genom att växla här. Det är en användarspecifik inställning och påverkar inte andra användare i Home Assistant.", + "description": "Låser upp avancerade funktioner.", "link_promo": "Läs mer", "title": "Avancerat läge" }, diff --git a/translations/zh-Hans.json b/translations/zh-Hans.json index 507dfd7355..21fe8ec15d 100644 --- a/translations/zh-Hans.json +++ b/translations/zh-Hans.json @@ -545,6 +545,15 @@ }, "components": { "area-picker": { + "add_dialog": { + "add": "添加", + "failed_create_area": "创建区域失败。", + "name": "名称", + "text": "输入新区域的名称。", + "title": "添加新区域" + }, + "add_new": "添加新区域…", + "area": "区域", "clear": "清除", "show_areas": "显示区域" }, @@ -1040,10 +1049,10 @@ "link_learn_more": "了解有关创建基于Webhook的自动化的更多信息。", "loading": "载入中...", "manage": "管理", - "no_hooks_yet": "看来你还没有webhooks。一起开始配置一个吧", - "no_hooks_yet_link_automation": "Webhook自动化", - "no_hooks_yet_link_integration": "webhook-based集成", - "no_hooks_yet2": "或通过创建一个", + "no_hooks_yet": "看来你还没有 webhooks。您可以配置一个", + "no_hooks_yet_link_automation": "Webhook 自动化", + "no_hooks_yet_link_integration": "基于 Webhook 的集成", + "no_hooks_yet2": "或创建一个", "title": "Webhooks" } }, @@ -1217,14 +1226,19 @@ "actions": { "caption": "满足条件时执行:" }, + "automations": "自动化", "conditions": { "caption": "并且满足以下条件时:" }, + "create": "通过设备创建自动化", + "no_automations": "没有自动化", + "no_device_automations": "该设备没有可用的自动化。", "triggers": { "caption": "当以下事件发生时:" } }, "automations": "自动化", + "cant_edit": "您只能编辑在 UI 中创建的项目。", "caption": "设备", "confirm_rename_entity_ids": "是否要重命名实体的实体 ID?", "data_table": { @@ -1244,8 +1258,22 @@ "none": "这个设备没有实体" }, "info": "设备信息", + "name": "名称", + "scene": { + "create": "通过设备创建场景", + "no_scenes": "没有场景", + "scenes": "场景" + }, + "scenes": "场景", + "script": { + "create": "通过设备创建脚本", + "no_scripts": "没有脚本", + "scripts": "脚本" + }, + "scripts": "脚本", "unknown_error": "未知错误", - "unnamed_device": "未命名设备" + "unnamed_device": "未命名设备", + "update": "更新" }, "entities": { "caption": "实体注册", From 15e7b8117cb45b2ed0d371b1e50db866b9164940 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 7 Feb 2020 09:30:38 -0800 Subject: [PATCH 38/64] Add integrations to dev info page (#4800) * Add integrations to dev info page * Fix annoying looking html tags * What happened here --- .../info/developer-tools-info.ts | 5 +- .../developer-tools/info/integrations-card.ts | 75 +++++++++++++++++++ .../info/system-health-card.ts | 2 +- 3 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 src/panels/developer-tools/info/integrations-card.ts diff --git a/src/panels/developer-tools/info/developer-tools-info.ts b/src/panels/developer-tools/info/developer-tools-info.ts index 7141d4b132..dc9b45ec53 100644 --- a/src/panels/developer-tools/info/developer-tools-info.ts +++ b/src/panels/developer-tools/info/developer-tools-info.ts @@ -11,6 +11,7 @@ import { HomeAssistant } from "../../../types"; import { haStyle } from "../../../resources/styles"; import "./system-health-card"; +import "./integrations-card"; const JS_TYPE = __BUILD__; const JS_VERSION = __VERSION__; @@ -149,6 +150,7 @@ class HaPanelDevInfo extends LitElement {
+
`; } @@ -205,7 +207,8 @@ class HaPanelDevInfo extends LitElement { color: var(--dark-primary-color); } - system-health-card { + system-health-card, + integrations-card { display: block; max-width: 600px; margin: 0 auto; diff --git a/src/panels/developer-tools/info/integrations-card.ts b/src/panels/developer-tools/info/integrations-card.ts new file mode 100644 index 0000000000..e51f73366a --- /dev/null +++ b/src/panels/developer-tools/info/integrations-card.ts @@ -0,0 +1,75 @@ +import { + LitElement, + property, + TemplateResult, + html, + customElement, + CSSResult, + css, +} from "lit-element"; +import { HomeAssistant } from "../../../types"; +import memoizeOne from "memoize-one"; + +@customElement("integrations-card") +class IntegrationsCard extends LitElement { + @property() public hass!: HomeAssistant; + + private _sortedIntegrations = memoizeOne((components: string[]) => { + return components.filter((comp) => !comp.includes(".")).sort(); + }); + + protected render(): TemplateResult { + return html` + +
+ + ${this._sortedIntegrations(this.hass!.config.components).map( + (domain) => html` + + + + + + ` + )} + +
${domain} + + Documentation + + + + Issues + +
+ + `; + } + + static get styles(): CSSResult { + return css` + td { + line-height: 2em; + padding: 0 8px; + } + td:first-child { + padding-left: 0; + } + a { + color: var(--primary-color); + } + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + "integrations-card": IntegrationsCard; + } +} diff --git a/src/panels/developer-tools/info/system-health-card.ts b/src/panels/developer-tools/info/system-health-card.ts index 35e1976d9e..92bef82cf6 100644 --- a/src/panels/developer-tools/info/system-health-card.ts +++ b/src/panels/developer-tools/info/system-health-card.ts @@ -78,7 +78,7 @@ class SystemHealthCard extends LitElement { } return html` - +
${sections}
`; From 8a4c52aeb7535dbab79f1789673e73ad12eedca7 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 7 Feb 2020 09:32:37 -0800 Subject: [PATCH 39/64] Filter battery sensors from generated UI (#4799) * Filter battery sensors from generated UI * Use fancy TypeScript feature --- src/data/sensor.ts | 1 + src/panels/lovelace/common/generate-lovelace-config.ts | 6 ++++++ 2 files changed, 7 insertions(+) create mode 100644 src/data/sensor.ts diff --git a/src/data/sensor.ts b/src/data/sensor.ts new file mode 100644 index 0000000000..e4da2f9825 --- /dev/null +++ b/src/data/sensor.ts @@ -0,0 +1 @@ +export const SENSOR_DEVICE_CLASS_BATTERY = "battery"; diff --git a/src/panels/lovelace/common/generate-lovelace-config.ts b/src/panels/lovelace/common/generate-lovelace-config.ts index d8790b35f7..ae5c5dff95 100644 --- a/src/panels/lovelace/common/generate-lovelace-config.ts +++ b/src/panels/lovelace/common/generate-lovelace-config.ts @@ -41,6 +41,7 @@ import { EntityRegistryEntry, } from "../../../data/entity_registry"; import { processEditorEntities } from "../editor/process-editor-entities"; +import { SENSOR_DEVICE_CLASS_BATTERY } from "../../../data/sensor"; const DEFAULT_VIEW_ENTITY_ID = "group.default_view"; const DOMAINS_BADGES = [ @@ -181,6 +182,11 @@ export const computeCards = ( conf.icon = stateObj.attributes.icon; } entities.push(conf); + } else if ( + domain === "sensor" && + stateObj?.attributes.device_class === SENSOR_DEVICE_CLASS_BATTERY + ) { + // Do nothing. } else { let name: string; const entityConf = From e5387e58062d73b125a2cf3905272d64d9ca58ef Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 7 Feb 2020 09:46:16 -0800 Subject: [PATCH 40/64] Fall back to use handler if translations broken (#4777) --- src/dialogs/config-flow/step-flow-pick-handler.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/dialogs/config-flow/step-flow-pick-handler.ts b/src/dialogs/config-flow/step-flow-pick-handler.ts index 76170c4b6c..8b09967cc7 100644 --- a/src/dialogs/config-flow/step-flow-pick-handler.ts +++ b/src/dialogs/config-flow/step-flow-pick-handler.ts @@ -39,7 +39,8 @@ class StepFlowPickHandler extends LitElement { private _getHandlers = memoizeOne((h: string[], filter?: string) => { const handlers: HandlerObj[] = h.map((handler) => { return { - name: this.hass.localize(`component.${handler}.config.title`), + name: + this.hass.localize(`component.${handler}.config.title`) || handler, slug: handler, }; }); From e0565c35abf768d06481cff875e20f3e7a78e33a Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Sat, 8 Feb 2020 00:32:33 +0000 Subject: [PATCH 41/64] [ci skip] Translation update --- translations/fr.json | 2 +- translations/hr.json | 152 ++++++++++++++++++++++++++++++++++++++++++- translations/hu.json | 44 ++++++------- translations/ko.json | 2 +- 4 files changed, 174 insertions(+), 26 deletions(-) diff --git a/translations/fr.json b/translations/fr.json index f2468b06d1..610ccdb054 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -411,7 +411,7 @@ }, "automation": { "last_triggered": "Dernier déclenchement", - "trigger": "Exécutez" + "trigger": "Exécuter" }, "camera": { "not_available": "Image non disponible" diff --git a/translations/hr.json b/translations/hr.json index 7fc257c402..ba33f07cd4 100644 --- a/translations/hr.json +++ b/translations/hr.json @@ -464,6 +464,9 @@ "script": { "execute": "Izvršiti" }, + "service": { + "run": "Pokreni" + }, "timer": { "actions": { "cancel": "otkaži", @@ -526,10 +529,24 @@ "yes": "Da" }, "components": { + "area-picker": { + "add_dialog": { + "add": "Dodaj", + "failed_create_area": "Nije uspjelo stvaranje područja.", + "name": "Naziv", + "text": "Unesite naziv novog područja.", + "title": "Dodajte novo područje" + }, + "add_new": "Dodajte novo područje…", + "area": "Područje", + "clear": "Obriši", + "show_areas": "Pokažite područja" + }, "device-picker": { "clear": "Obriši", "device": "Uređaj", - "show_devices": "Prikaži uređaje" + "show_devices": "Prikaži uređaje", + "toggle": "Preklopi" }, "entity": { "entity-picker": { @@ -563,7 +580,31 @@ "enable_new_entities_label": "Aktiviraj novododane entitete.", "title": "Mogućnosti sustava" }, + "entity_registry": { + "control": "Kontrola", + "dismiss": "Odbaci", + "editor": { + "confirm_delete": "Jeste li sigurni da želite izbrisati ovaj unos?", + "delete": "OBRIŠI", + "enabled_cause": "Deaktivirano zbog {cause}.", + "enabled_description": "Onemogućeni entiteti neće biti dodani u Home Assistant.", + "enabled_label": "Aktiviraj entitet", + "entity_id": "ID entiteta", + "name": "Premosti naziv", + "note": "Napomena: to možda neće raditi još sa svim integracijama.", + "unavailable": "Ovaj entitet trenutno nije dostupan.", + "update": "AŽURIRAJ" + }, + "related": "Vezani", + "settings": "Postavke" + }, + "generic": { + "cancel": "Otkaži", + "default_confirmation_title": "Jeste li sigurni?", + "ok": "U redu" + }, "more_info_control": { + "edit": "Uredi entitet", "script": { "last_action": "Posljednja akcija" }, @@ -602,6 +643,9 @@ "reconfigure": "Ponovno konfiguriraj uređaj", "remove": "Ukloni uređaj" }, + "confirmations": { + "remove": "Jeste li sigurni da želite ukloniti uređaj?" + }, "last_seen": "Zadnje viđeno", "manuf": "od {manufacturer}", "no_area": "Nema područja", @@ -894,14 +938,19 @@ } }, "cloud": { + "alexa": { + "title": "Alexa" + }, "caption": "Home Assistant Cloud", "description_features": "Upravljajte kad ste izvan kuće, integrirajte se s Alexa i Google Assistantom.", "description_login": "Prijavljeni ste kao {email}", "description_not_login": "Niste prijavljeni", "forgot_password": { + "check_your_email": "Provjerite e-poštu za upute o resetiranju zaporke.", "email": "E-mail", "email_error_msg": "Neispravan e-mail", "instructions": "Unesite svoju e-mail adresu i poslat ćemo vam link za resetiranje lozinke.", + "send_reset_email": "Pošalji e-poštu za resetiranje", "subtitle": "Zaboravili ste lozinku", "title": "Zaboravljena lozinka" }, @@ -923,6 +972,20 @@ "start_trial": "Započnite besplatno probno razdoblje od 1 mjeseca", "title": "Prijava putem clouda", "trial_info": "Nisu potrebne informacije o plaćanju" + }, + "register": { + "account_created": "Račun kreiran! Provjerite svoju e-poštu za upute o aktiviranju računa.", + "create_account": "Stvorite račun", + "email_address": "Email adresa", + "email_error_msg": "Neispravan e-mail", + "headline": "Započnite besplatno probno razdoblje", + "link_privacy_policy": "Pravila o privatnosti", + "link_terms_conditions": "Uvjeti i odredbe", + "password": "Lozinka", + "password_error_msg": "Lozinke imaju najmanje 8 znakova", + "resend_confirm_email": "Ponovno slanje potvrde e-pošte", + "start_trial": "Započnite besplatno probno razdoblje", + "title": "Registrirajte račun" } }, "common": { @@ -998,14 +1061,19 @@ "actions": { "caption": "Kada se nešto pokrene..." }, + "automations": "Automatizacije", "conditions": { "caption": "Učini nešto samo ako..." }, + "create": "Stvorite automatizaciju s uređajem", + "no_automations": "Nema automatizacije", + "no_device_automations": "Nema dostupnih automatizacija za ovaj uređaj.", "triggers": { "caption": "Učini nešto kad..." } }, "automations": "Automatizacije", + "cant_edit": "Možete uređivati samo stavke stvorene u korisničkom sučelju (UI).", "caption": "Uređaji", "confirm_rename_entity_ids": "Želite li također preimenovati ID entiteta svojih entiteta?", "data_table": { @@ -1020,8 +1088,22 @@ "details": "Ovdje su sve pojedinosti vašeg uređaja.", "device_not_found": "Uređaj nije pronađen.", "info": "Informacije o uređaju", + "name": "Naziv", + "scene": { + "create": "Stvorite scenu s uređajem", + "no_scenes": "Nema scena", + "scenes": "Scene" + }, + "scenes": "Scene", + "script": { + "create": "Stvorite skriptu s uređajem", + "no_scripts": "Nema skripte", + "scripts": "Skripte" + }, + "scripts": "Skripte", "unknown_error": "Nepoznata pogreška", - "unnamed_device": "Neimenovani uređaj" + "unnamed_device": "Neimenovani uređaj", + "update": "Ažuriraj" }, "entities": { "caption": "Registar entiteta", @@ -1034,6 +1116,8 @@ "enabled_cause": "Deaktivirano zbog {cause}.", "enabled_description": "Onemogućeni entiteti neće biti dodani u Home Assistant.", "enabled_label": "Aktiviraj entitet", + "entity_id": "ID entiteta", + "name": "Premosti naziv", "note": "Napomena: to možda neće raditi još sa svim integracijama.", "unavailable": "Ovaj entitet trenutno nije dostupan.", "update": "AŽURIRANJE" @@ -1069,6 +1153,7 @@ "area_picker_label": "Područje", "close": "Zatvoriti", "created_config": "Stvorena konfiguracija za {name}.", + "dismiss": "Odbacite dijaloški okvir", "error_saving_area": "Pogreška pri spremanju područja: {error}", "external_step": { "description": "Ovaj korak zahtijeva da posjetite vanjsku web stranicu.", @@ -1222,19 +1307,68 @@ "header": "Zigbee Home Automation-Dodaj uređaje", "spinner": "Traženje ZHA ZigBee uređaja..." }, + "add": { + "caption": "Dodaj uređaje" + }, "caption": "ZHA", + "clusters": { + "header": "klasteri" + }, "description": "Upravljanje Zigbee Home Automation mrežom", "device_card": { "area_picker_label": "Područje", "device_name_placeholder": "Korisničko ime", "update_name_button": "Ažuriraj naziv" }, + "devices": { + "header": "Zigbee kućna automatizacija - uređaj" + }, + "group_binding": { + "bind_button_help": "Povežite odabranu skupinu s odabranim skupinama uređaja.", + "bind_button_label": "Poveži grupu", + "cluster_selection_help": "Odaberite klastere za povezivanje s odabranom skupinom.", + "group_picker_help": "Odaberite grupu za izdavanje naredbe za vezanje.", + "group_picker_label": "Grupe koje se mogu vezati", + "header": "Povezivanje grupe", + "unbind_button_help": "Prekini vezu s odabranom skupinom od odabranih skupina uređaja.", + "unbind_button_label": "Poništi vezu" + }, + "groups": { + "caption": "Grupe", + "description": "Stvarajte i modificirajte Zigbee grupe", + "group-header": "Kućna automatizacija Zigbee - Pojedinosti o grupi", + "groups-header": "Zigbee Home Automation - Upravljanje grupama" + }, "services": { "reconfigure": "Ponovno konfiguriaj ZHA uređaj (liječenje uređaja). Upotrijebite ovo ako imate problema s uređajem. Ako je uređaj u pitanju uređaj za bateriju, provjerite je li budan i prihvaća naredbe kada koristite ovu uslugu.", "remove": "Uklonite uređaj iz ZigBee mreže.", "updateDeviceName": "Postavite prilagođeni naziv za ovaj uređaj u registru uređaja." } }, + "zone": { + "add_zone": "Dodajte zonu", + "caption": "Zone", + "configured_in_yaml": "Zone konfigurirane putem configuration.yaml ne mogu se uređivati putem korisničkog sučelja.", + "confirm_delete": "Jeste li sigurni da želite izbrisati ovu zonu?", + "create_zone": "Stvori zonu", + "description": "Upravljajte zonama u kojima želite pratiti osobe.", + "detail": { + "create": "Kreiraj", + "delete": "Izbriši", + "icon": "Ikona", + "icon_error_msg": "Ikona treba biti u obliku prefiksa: ime ikone, na primjer: mdi: home", + "latitude": "Zemljopisna širina", + "longitude": "Zemljopisna dužina", + "name": "Naziv", + "new_zone": "Nova zona", + "passive": "Pasivno", + "radius": "Radijus", + "required_error_msg": "Ovo polje je obavezno", + "update": "Ažuriraj" + }, + "edit_home_zone": "Položaj vašeg doma može se promijeniti u globalnoj konfiguraciji.", + "no_zones_created_yet": "Izgleda da još niste stvorili nijednu zonu." + }, "zwave": { "caption": "Z-Wave", "common": { @@ -1297,10 +1431,13 @@ "title": "Događaji" }, "info": { + "frontend_version": "Verzija sučelja: {version} - {type}", "home_assistant_logo": "Logotip Home Assistanta", "license": "Objavljeno pod licencom Apache 2.0", + "lovelace_ui": "Idi na Lovelace UI", "path_configuration": "Put do configuration.yaml: {path}", "source": "Izvorni kod:", + "states_ui": "Idi na states UI", "title": "Informacije" }, "logs": { @@ -1345,6 +1482,9 @@ "no_devices": "Ova stranica omogućuje upravljanje uređajima, ali izgleda da još niste postavili nikakve uređaje. Idite na stranicu integracije da biste započeli.", "title": "Dobrodošli kući" }, + "entities": { + "never_triggered": "Nikada pokrenuto" + }, "picture-elements": { "call_service": "Pozovi servis {name}", "hold": "Držite:", @@ -1423,6 +1563,9 @@ "sensor": { "graph_detail": "Detalj grafikona", "graph_type": "Vrsta grafikona" + }, + "shopping-list": { + "integration_not_loaded": "Ova kartica zahtijeva postavljanje integracije `shopping_list`." } }, "edit_card": { @@ -1676,6 +1819,9 @@ } }, "profile": { + "advanced_mode": { + "link_promo": "Saznajte više" + }, "change_password": { "confirm_new_password": "Potvrdite novu lozinku", "current_password": "Trenutna lozinka", @@ -1696,6 +1842,8 @@ "link_promo": "Pomognite prevođenju" }, "logout": "Odjava", + "logout_text": "Jeste li sigurni da se želite odjaviti?", + "logout_title": "Odjavite se?", "long_lived_access_tokens": { "confirm_delete": "Jeste li sigurni da želite izbrisati pristupni token za {name} ?", "create": "Izradite token", diff --git a/translations/hu.json b/translations/hu.json index 9c77e823b6..8c3e2692e2 100644 --- a/translations/hu.json +++ b/translations/hu.json @@ -118,7 +118,7 @@ "default": { "entity_not_found": "Entitás nem található", "error": "Hiba", - "unavailable": "N.elér", + "unavailable": "N/A", "unknown": "Ism" }, "device_tracker": { @@ -546,10 +546,10 @@ "components": { "area-picker": { "add_dialog": { - "add": "hozzáadás", + "add": "Hozzáadás", "failed_create_area": "Nem sikerült létrehozni a területet.", "name": "Név", - "text": "Adja meg az új terület nevét.", + "text": "Add meg az új terület nevét.", "title": "Új terület hozzáadása" }, "add_new": "Új terület hozzáadása...", @@ -690,7 +690,7 @@ "remove": "Eszköz eltávolítása" }, "confirmations": { - "remove": "Biztos benne, hogy el akarja távolítani az eszközt?" + "remove": "Biztosan el akarod távolítani az eszközt?" }, "last_seen": "Utolsó jelentés", "manuf": "{manufacturer} által", @@ -817,7 +817,7 @@ "delete_confirm": "Biztos, hogy törölni szeretnéd?", "duplicate": "Megkettőzés", "header": "Feltételek", - "introduction": "A feltételek opcionális részei az automatizálási szabályoknak és arra lehet őket használni, hogy meggátoljuk egy művelet végrehajtását, ha triggerelődik. A feltételek hasonlítanak a triggerekre, mégis teljesen máshogy működnek. A triggerek a rendszerben történő események bekövetkezését figyelik, míg a feltételek csak azt látják, hogy milyen a rendszer pillanatnyi állapota. Egy trigger például észre tudja venni, ha egy kapcsoló fel lett kapcsolva. Egy feltétel csak azt látja, hogy a kapcsoló éppen fel vagy le van kapcsolva. Kattints az alábbi linkre, ha többet szeretnél megtudni a feltételekről.", + "introduction": "A feltételek opcionálisak és meggátolják a további végrehajtást, kivéve, ha minden feltétel teljesül.", "learn_more": "Tudj meg többet a feltételekről", "name": "Feltétel", "type_select": "Feltétel típusa", @@ -1193,7 +1193,7 @@ "validation": { "check_config": "Ellenőrzés", "heading": "Konfiguráció érvényesítés", - "introduction": "Érvényesítsd a konfigurációt, ha nemrégiben módosítottad azt, és meg szeretnél bizonyosodni róla, hogy minden érvényes", + "introduction": "Konfiguráció helyességének ellenőrzése. Visszajelzést kérhetsz az elírásokról, ha nemrég módosított konfigurációd kapcsán meg szeretnél bizonyosodni róla, hogy minden érvényes", "invalid": "Érvénytelen konfiguráció", "valid": "Érvényes konfiguráció!" } @@ -1231,14 +1231,14 @@ "caption": "Csak akkor csinálj valamit, ha a(z)..." }, "create": "Eszköz automatizálás létrehozása", - "no_automations": "Nincs automatizálás", + "no_automations": "Nincsenek automatizálások", "no_device_automations": "Ehhez az eszközhöz nem állnak rendelkezésre automatizálások.", "triggers": { "caption": "Kezdj el csinálni valamit, amikor a(z)..." } }, "automations": "Automatizálások", - "cant_edit": "Kizárólag az UI-ben létrehozott elemeket szerkesztheti.", + "cant_edit": "Kizárólag a felhasználói felületen létrehozott elemeket szerkesztheted.", "caption": "Eszközök", "confirm_rename_entity_ids": "Szeretnéd átnevezni az entitások ID-ját is?", "data_table": { @@ -1267,7 +1267,7 @@ "scenes": "Jelenetek", "script": { "create": "Szkript létrehozása eszköz alapján", - "no_scripts": "Nincs szkript", + "no_scripts": "Nincsenek szkriptek", "scripts": "Szkriptek" }, "scripts": "Szkriptek", @@ -1318,7 +1318,7 @@ }, "integrations_page": "Integrációk oldal", "introduction": "A Home Assistant nyilvántartást vezet minden olyan entitásról, melyet valaha látott, és egyedileg azonosítható. Ezen entitások mindegyikéhez létrejön egy entitás ID, amely csak az adott entitáshoz van rendelve.", - "introduction2": "Az entitás nyilvántartás használatával felülbírálhatod a nevet, módosíthatod az entitás ID-t vagy eltávolíthatod a bejegyzést a Home Assistant-ból. Megjegyzendő, hogy az entitás nyilvántartásból történő bejegyzés eltávolítás nem fogja eltávolítani magát az entitást. Ehhez kövesd az alábbi linket, és távolítsd el azt az integrációk oldalról.", + "introduction2": "Az entitás nyilvántartás használatával felülbírálhatod a nevet, módosíthatod az entitás ID-t vagy eltávolíthatod a bejegyzést a Home Assistant-ból.", "remove_selected": { "button": "Kiválasztottak eltávolítása", "confirm_text": "Az entitások csak akkor távolíthatók el, ha az integráció már nem használja őket.", @@ -1514,7 +1514,7 @@ "validation": { "check_config": "Konfiguráció ellenőrzése", "heading": "Konfiguráció érvényesítés", - "introduction": "Érvényesítsd a konfigurációt, ha nemrégiben módosítottad azt, és meg szeretnél bizonyosodni róla, hogy minden érvényes", + "introduction": "Konfiguráció helyességének ellenőrzése. Visszajelzést kérhetsz az elírásokról, ha nemrég módosított konfigurációd kapcsán meg szeretnél bizonyosodni róla, hogy minden érvényes", "invalid": "Érvénytelen konfiguráció", "valid": "Érvényes konfiguráció!" } @@ -1608,7 +1608,7 @@ "bind_button_help": "Csatlakoztassa a kiválasztott csoportot a kiválasztott eszközfürtökhöz.", "bind_button_label": "Csoporthoz fűzés", "cluster_selection_help": "Jelölje ki a kijelölt csoporthoz kötni kívánt fürtöket.", - "group_picker_help": "Jelöljön ki egy csoportot a kötési parancs kiadásához.", + "group_picker_help": "Jelölj ki egy csoportot a kötési parancs kiadásához.", "group_picker_label": "Köthető csoportok", "header": "Csoportkötés", "introduction": "Csoportok kötése és lebontása", @@ -1666,7 +1666,7 @@ "add_zone": "Zóna hozzáadása", "caption": "Zónák", "configured_in_yaml": "A configuration.yaml fájlban konfigurált zónák nem szerkeszthetők a felhasználói felületen.", - "confirm_delete": "Biztosan törli ezt a zónát?", + "confirm_delete": "Biztosan törölni szeretnéd ezt a zónát?", "create_zone": "Zóna létrehozása", "description": "Kezelje azokat a zónákat, ahol nyomon szeretné követni a személyeket.", "detail": { @@ -1685,7 +1685,7 @@ "update": "Frissítés" }, "edit_home_zone": "Az otthona címét az általános konfigurációnál változtathatja meg.", - "introduction": "A zónák lehetővé teszik a Föld bizonyos területeinek megadását. Ha egy személy egy zónán belül van, az állapota felveszi a zóna nevét veszi fel. A zónák eseményindítóként vagy feltételként is használhatók az automatizálási beállításokon belül.", + "introduction": "A zónák lehetővé teszik a Föld bizonyos területeinek megadását. Ha egy személy egy zónán belül van, az állapota felveszi a zóna nevét. A zónák eseményindítóként vagy feltételként is használhatók az automatizálási beállításokon belül.", "no_zones_created_yet": "Úgy tűnik, még nem hoztál létre zónákat." }, "zwave": { @@ -1869,7 +1869,7 @@ }, "lovelace": { "add_entities": { - "generated_unsupported": "Ezt a funkciót csak akkor használhatja, ha átvette a Lovelace felhasználói felületének irányítását.", + "generated_unsupported": "Ezt a funkciót csak akkor használhatod, ha átvetted a Lovelace felhasználói felület irányítását.", "saving_failed": "A Lovelace felhasználói felület beállításának mentése sikertelen.", "yaml_unsupported": "Ezt a funkciót nem használhatja, ha YAML módban működteti a Lovelace felhasználói felületet." }, @@ -1899,7 +1899,7 @@ } }, "changed_toast": { - "message": "A Lovelace config módosult, szeretnéd frissíteni?", + "message": "A Lovelace konfiguráció módosítva lett, szeretnéd frissíteni az aktualizáláshoz?", "refresh": "Frissítés" }, "editor": { @@ -2042,7 +2042,7 @@ }, "edit_lovelace": { "edit_title": "Cím szerkesztése", - "explanation": "Ez a cím jelenik meg minden nézet felett a Lovelace-ben.", + "explanation": "Ez a cím jelenik meg minden nézet felett a Lovelace felhasználói felületen.", "header": "Lovelace UI címe" }, "edit_view": { @@ -2066,8 +2066,8 @@ "para_no_id": "Ez az elem nem rendelkezik ID-val. Kérlek, adj hozzá egyet az 'ui-lovelace.yaml' fájlban!" }, "raw_editor": { - "confirm_remove_config_text": "Automatikusan létrehozzuk a lovelace felhasználói felületi nézeteit területekkel és eszközökkel, ha eltávolítja a Lovelace felhasználói felületkonfigurációját.", - "confirm_remove_config_title": "Biztosan eltávolítja a Lovelace felhasználói felületkonfigurációját? A Lovelace felhasználói felületi nézeteit automatikusan létrehozzuk a területeivel és eszközeivel.", + "confirm_remove_config_text": "Automatikusan létrehozzuk a Lovelace felhasználói felületed nézeteit a területeiddel és eszközeiddel, ha eltávolítod a Lovelace konfigurációját.", + "confirm_remove_config_title": "Biztosan el szeretnéd távolítani a Lovelace felhasználói felület konfigurációját? Automatikusan létrehozzuk a Lovelace felhasználói felületed nézeteit a területeiddel és az eszközeiddel.", "confirm_unsaved_changes": "Vannak nem mentett módosítások, biztosan ki akarsz lépni?", "confirm_unsaved_comments": "A konfiguráció megjegyzéseket tartalmaz, amik nem kerülnek elmentésre. Biztosan folytatod?", "error_invalid_config": "A konfiguráció érvénytelen: {error}", @@ -2089,7 +2089,7 @@ "suggest_card": { "add": "Hozzáadás a Lovelace-hez", "create_own": "Készítsd el a sajátod", - "header": "Létrehoztunk önnek egy javaslatot" + "header": "Létrehoztunk neked egy javaslatot" }, "view": { "panel_mode": { @@ -2106,7 +2106,7 @@ "refresh": "Frissítés", "unused_entities": "Nem használt entitások" }, - "reload_lovelace": "Lovelace Újratöltése", + "reload_lovelace": "Felhasználói felület újratöltése", "unused_entities": { "available_entities": "Ezek azok az entitások, amelyek elérhetők, de még nincsenek elhelyezve a Lovelace felületen.", "domain": "Domain", @@ -2304,7 +2304,7 @@ }, "profile": { "advanced_mode": { - "description": "A Home Assistant alapértelmezés szerint elrejti a haladó funkciókat és beállításokat, de ezzel a kapcsolóval elérhetővé teheted őket. Ez egy felhasználó-specifikus beállítás, ami nem befolyásolja a többi felhasználó felületét.", + "description": "Haladó funkciók feloldása.", "link_promo": "Tudj meg többet", "title": "Haladó üzemmód" }, diff --git a/translations/ko.json b/translations/ko.json index 9f5d9871bb..f23d1b5c66 100644 --- a/translations/ko.json +++ b/translations/ko.json @@ -1673,7 +1673,7 @@ "create": "만들기", "delete": "삭제", "icon": "아이콘", - "icon_error_msg": "아이콘은 접두사:아이콘이름 형식이어야합니다, 예: mdi:home", + "icon_error_msg": "아이콘은 접두사:아이콘이름 형식이어야 합니다, 예: mdi:home", "latitude": "위도", "longitude": "경도", "name": "이름", From 7d91515bf5f109cf31574c73431aa20787216f0b Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Sat, 8 Feb 2020 23:49:29 +0100 Subject: [PATCH 42/64] Style tweaks (#4766) * Style tweaks * Update ha-style.ts * Move derived styles --- .../developer-tools/mqtt/developer-tools-mqtt.ts | 4 ---- src/resources/ha-style.ts | 5 ----- src/resources/styles.ts | 13 +++++++++---- 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/src/panels/developer-tools/mqtt/developer-tools-mqtt.ts b/src/panels/developer-tools/mqtt/developer-tools-mqtt.ts index aaef686ffc..e527f4d0dc 100644 --- a/src/panels/developer-tools/mqtt/developer-tools-mqtt.ts +++ b/src/panels/developer-tools/mqtt/developer-tools-mqtt.ts @@ -120,10 +120,6 @@ class HaPanelDevMqtt extends LitElement { direction: ltr; } - mwc-button { - background-color: white; - } - mqtt-subscribe-card { display: block; margin: 16px auto; diff --git a/src/resources/ha-style.ts b/src/resources/ha-style.ts index 943bc9a70c..778277bf41 100644 --- a/src/resources/ha-style.ts +++ b/src/resources/ha-style.ts @@ -44,12 +44,7 @@ documentContainer.innerHTML = ` --primary-background-color: #fafafa; --secondary-background-color: #e5e5e5; /* behind the cards on state */ - /* sidebar menu */ - --sidebar-icon-color: rgba(0, 0, 0, 0.5); - /* for label-badge */ - --label-badge-background-color: white; - --label-badge-text-color: rgb(76, 76, 76); --label-badge-red: #DF4C1E; --label-badge-blue: #039be5; --label-badge-green: #0DA035; diff --git a/src/resources/styles.ts b/src/resources/styles.ts index 34c2e7980d..5a5c0cb837 100644 --- a/src/resources/styles.ts +++ b/src/resources/styles.ts @@ -8,17 +8,20 @@ export const derivedStyles = { "sidebar-background-color": "var(--paper-listbox-background-color);", "sidebar-selected-text-color": "var(--primary-color)", "sidebar-selected-icon-color": "var(--primary-color)", + "sidebar-icon-color": "rgba(var(--rgb-primary-text-color), 0.6)", "switch-checked-color": "var(--primary-color)", "switch-checked-button-color": - "var(--switch-checked-color, var(--paper-grey-50))", + "var(--switch-checked-color, var(--primary-background-color))", "switch-checked-track-color": "var(--switch-checked-color, #000000)", "switch-unchecked-button-color": - "var(--switch-unchecked-color, var(--paper-grey-50))", + "var(--switch-unchecked-color, var(--primary-background-color))", "switch-unchecked-track-color": "var(--switch-unchecked-color, #000000)", "slider-color": "var(--primary-color)", "slider-secondary-color": "var(--light-primary-color)", "slider-bar-color": "var(--disabled-text-color)", "label-badge-grey": "var(--paper-grey-500)", + "label-badge-background-color": "var(--card-background-color)", + "label-badge-text-color": "rgba(var(--rgb-primary-text-color), 0.8)", "paper-card-background-color": "var(--card-background-color)", "paper-listbox-background-color": "var(--card-background-color)", "paper-item-icon-color": "var(--state-icon-color)", @@ -35,13 +38,15 @@ export const derivedStyles = { "mdc-theme-primary": "var(--primary-color)", "mdc-theme-secondary": "var(--accent-color)", "mdc-theme-background": "var(--primary-background-color)", - "mdc-theme-surface": - "var(--paper-card-background-color, var(--card-background-color))", + "mdc-theme-surface": "var(--card-background-color)", "mdc-theme-on-primary": "var(--text-primary-color)", "mdc-theme-on-secondary": "var(--text-primary-color)", "mdc-theme-on-surface": "var(--primary-text-color)", "app-header-text-color": "var(--text-primary-color)", "app-header-background-color": "var(--primary-color)", + "material-body-text-color": "var(--primary-text-color)", + "material-background-color": "var(--card-background-color)", + "material-secondary-background-color": "var(--secondary-background-color)", }; export const haStyle = css` From 9e11fe868e7cffd43b601b5e4929dd687fd39ff3 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Sun, 9 Feb 2020 00:32:35 +0000 Subject: [PATCH 43/64] [ci skip] Translation update --- translations/hu.json | 4 ++-- translations/nb.json | 2 +- translations/sv.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/translations/hu.json b/translations/hu.json index 8c3e2692e2..365b23ae85 100644 --- a/translations/hu.json +++ b/translations/hu.json @@ -1192,7 +1192,7 @@ }, "validation": { "check_config": "Ellenőrzés", - "heading": "Konfiguráció érvényesítés", + "heading": "Konfiguráció ellenőrzése", "introduction": "Konfiguráció helyességének ellenőrzése. Visszajelzést kérhetsz az elírásokról, ha nemrég módosított konfigurációd kapcsán meg szeretnél bizonyosodni róla, hogy minden érvényes", "invalid": "Érvénytelen konfiguráció", "valid": "Érvényes konfiguráció!" @@ -1513,7 +1513,7 @@ }, "validation": { "check_config": "Konfiguráció ellenőrzése", - "heading": "Konfiguráció érvényesítés", + "heading": "Konfiguráció ellenőrzése", "introduction": "Konfiguráció helyességének ellenőrzése. Visszajelzést kérhetsz az elírásokról, ha nemrég módosított konfigurációd kapcsán meg szeretnél bizonyosodni róla, hogy minden érvényes", "invalid": "Érvénytelen konfiguráció", "valid": "Érvényes konfiguráció!" diff --git a/translations/nb.json b/translations/nb.json index 458d74dd58..f43f22ddd1 100644 --- a/translations/nb.json +++ b/translations/nb.json @@ -1684,7 +1684,7 @@ "required_error_msg": "Dette feltet er påkrevd", "update": "Oppdater" }, - "edit_home_zone": "Plasseringen av hjemmet ditt kan endres i gerenal-konfigurasjonen.", + "edit_home_zone": "Plasseringen av hjemmet ditt kan endres i general-konfigurasjonen.", "introduction": "Med soner kan du angi bestemte områder på jorden. Når en person er innenfor en sone, vil staten ta navnet fra sonen. Soner kan også brukes som en utløser eller tilstand i automatiserings oppsett.", "no_zones_created_yet": "Det ser ut til at du ikke har opprettet noen soner enda." }, diff --git a/translations/sv.json b/translations/sv.json index c167a3300a..32efdc874c 100644 --- a/translations/sv.json +++ b/translations/sv.json @@ -1684,7 +1684,7 @@ "required_error_msg": "Det här fältet krävs", "update": "Uppdatera" }, - "edit_home_zone": "Platsen för ditt hem kan ändras i gerenal config.", + "edit_home_zone": "Platsen för ditt hem kan ändras i general config.", "introduction": "Med zoner kan du ange vissa regioner på jorden. När en person befinner sig i en zon tar tillståndet namnet från zonen. Zoner kan också användas som utlösare eller villkor i automatiseringsinställningar.", "no_zones_created_yet": "Det verkar som om du inte har skapat några zoner ännu." }, From 0c8ac17dcb48c53980f4699aa28d1dbbd439c392 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Mon, 10 Feb 2020 00:32:29 +0000 Subject: [PATCH 44/64] [ci skip] Translation update --- translations/de.json | 4 ++-- translations/ko.json | 2 +- translations/uk.json | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/translations/de.json b/translations/de.json index 355d7ca9a6..d5af138c64 100644 --- a/translations/de.json +++ b/translations/de.json @@ -1621,7 +1621,7 @@ "caption": "Gruppen", "create": "Gruppe erstellen", "create_group": "Zigbee Home Automation - Gruppe erstellen", - "create_group_details": "Gebe die erforderlichen Details ein, um eine neue Zigbee-Gruppe zu erstellen", + "create_group_details": "Gib die erforderlichen Details ein, um eine neue Zigbee-Gruppe zu erstellen", "creating_group": "Erstelle Gruppe", "description": "Erstellen und Ändern von Zigbee-Gruppen", "group_details": "Hier sind alle Details der ausgewählten Zigbee Gruppe.", @@ -2276,7 +2276,7 @@ "button_detect": "Erkennen", "finish": "Weiter", "intro": "Hallo {name}, willkommen bei Home Assistant. Wie möchten Sie Ihre Haus benennen?", - "intro_location": "Wir würden gerne wissen, wo Sie wohen. Diese Daten helfen bei der Anzeige von Informationen und der Einrichtung von Sonnenstands-basierten Automatisierungen. Diese Daten werden niemals außerhalb Ihres Netzwerks weitergegeben.", + "intro_location": "Wir würden gerne wissen, wo Sie wohnen. Diese Daten helfen bei der Anzeige von Informationen und der Einrichtung von Sonnenstands-basierten Automatisierungen. Diese Daten werden niemals außerhalb Ihres Netzwerks weitergegeben.", "intro_location_detect": "Wir können helfen, diese Informationen auszufüllen, indem wir eine einmalige Anfrage an einen externen Dienstleister richten.", "location_name_default": "Home" }, diff --git a/translations/ko.json b/translations/ko.json index f23d1b5c66..6723b6b34d 100644 --- a/translations/ko.json +++ b/translations/ko.json @@ -629,7 +629,7 @@ "unavailable": "이 구성요소는 현재 사용할 수 없습니다.", "update": "업데이트" }, - "related": "관련 요소", + "related": "관련 내용", "settings": "설정" }, "generic": { diff --git a/translations/uk.json b/translations/uk.json index 0b849604be..69974623b4 100644 --- a/translations/uk.json +++ b/translations/uk.json @@ -419,11 +419,11 @@ "climate": { "aux_heat": "Aux тепла", "away_mode": "Режиму очікування", - "cooling": "{name} охолоджується", + "cooling": "Охолодження", "current_temperature": "{name} поточна температура", "currently": "В даний час", "fan_mode": "Режим вентилятора", - "heating": "{name} нагрівається", + "heating": "{name}\nОбігрів", "high": "високий", "low": "низький", "on_off": "Вкл / викл", From f791412f73be0bb79889069bcfb1b4d62d67c4d7 Mon Sep 17 00:00:00 2001 From: Nicholas Amadori Date: Mon, 10 Feb 2020 10:03:19 +0100 Subject: [PATCH 45/64] Spelling (#4806) "Gerenal" corrected to "General" --- src/translations/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/translations/en.json b/src/translations/en.json index 74af9fff7e..c23f698c38 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1394,7 +1394,7 @@ "add_zone": "Add Zone", "confirm_delete": "Are you sure you want to delete this zone?", "configured_in_yaml": "Zones configured via configuration.yaml cannot be edited via the UI.", - "edit_home_zone": "The location of your home can be changed in the gerenal config.", + "edit_home_zone": "The location of your home can be changed in the general config.", "detail": { "new_zone": "New Zone", "name": "Name", From cc6686a7907b72cef5e5370785e9648b34323282 Mon Sep 17 00:00:00 2001 From: Iulian Onofrei <6d0847b9@opayq.com> Date: Mon, 10 Feb 2020 11:03:42 +0200 Subject: [PATCH 46/64] Fix typo (#4779) --- src/translations/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/translations/en.json b/src/translations/en.json index c23f698c38..d5946e41ae 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1404,7 +1404,7 @@ "latitude": "Latitude", "longitude": "Longitude", "passive": "Passive", - "passive_note": "Passive zones are hidden in the frontend and are not used as location for device trackers. This is usefull if you just want to use it for automations.", + "passive_note": "Passive zones are hidden in the frontend and are not used as location for device trackers. This is useful if you just want to use it for automations.", "required_error_msg": "This field is required", "delete": "Delete", "create": "Create", From ba4e1949c447c5cc83e53d6dc5809ab266e7dec4 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 10 Feb 2020 01:10:39 -0800 Subject: [PATCH 47/64] Theme update refetch themes (#4812) --- src/data/ws-themes.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/ws-themes.ts b/src/data/ws-themes.ts index 13f37844d4..ed559e45c5 100644 --- a/src/data/ws-themes.ts +++ b/src/data/ws-themes.ts @@ -8,7 +8,7 @@ const fetchThemes = (conn) => const subscribeUpdates = (conn, store) => conn.subscribeEvents( - (event) => store.setState(event.data, true), + () => fetchThemes(conn).then((data) => store.setState(data, true)), "themes_updated" ); From 4613d8b1f6fb81257b24fd6e626953daf7a62fdc Mon Sep 17 00:00:00 2001 From: Ruslan Sayfutdinov Date: Mon, 10 Feb 2020 09:11:28 +0000 Subject: [PATCH 48/64] [logbook] configure flex container to display entries correctly on mobile devices (#4810) --- src/panels/logbook/ha-logbook.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/panels/logbook/ha-logbook.ts b/src/panels/logbook/ha-logbook.ts index 6decd62cb2..e92d4aacfe 100644 --- a/src/panels/logbook/ha-logbook.ts +++ b/src/panels/logbook/ha-logbook.ts @@ -132,6 +132,7 @@ class HaLogbook extends LitElement { .time { width: 65px; + flex-shrink: 0; font-size: 0.8em; color: var(--secondary-text-color); } @@ -142,6 +143,7 @@ class HaLogbook extends LitElement { ha-icon { margin: 0 8px 0 16px; + flex-shrink: 0; color: var(--primary-text-color); } From 981c798e22c385d4318e67c0a9e718360b0e157f Mon Sep 17 00:00:00 2001 From: Ian Richardson Date: Mon, 10 Feb 2020 10:43:38 -0600 Subject: [PATCH 49/64] =?UTF-8?q?=F0=9F=92=84=20match=20alarm=20panel=20ic?= =?UTF-8?q?on=20coloring=20to=20card's=20(#4825)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/style/icon_color_css.ts | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/common/style/icon_color_css.ts b/src/common/style/icon_color_css.ts index da89247533..565fd065e2 100644 --- a/src/common/style/icon_color_css.ts +++ b/src/common/style/icon_color_css.ts @@ -1,7 +1,6 @@ import { css } from "lit-element"; export const iconColorCSS = css` - ha-icon[data-domain="alarm_control_panel"][data-state="disarmed"], ha-icon[data-domain="alert"][data-state="on"], ha-icon[data-domain="automation"][data-state="on"], ha-icon[data-domain="binary_sensor"][data-state="on"], @@ -30,6 +29,34 @@ export const iconColorCSS = css` color: var(--heat-color, #ff8100); } + ha-icon[data-domain="alarm_control_panel"] { + color: var(--alarm-color-armed, var(--label-badge-red)); + } + + ha-icon[data-domain="alarm_control_panel"][data-state="disarmed"] { + color: var(--alarm-color-disarmed, var(--label-badge-green)); + } + + ha-icon[data-domain="alarm_control_panel"][data-state="pending"], + ha-icon[data-domain="alarm_control_panel"][data-state="arming"] { + color: var(--alarm-color-pending, var(--label-badge-yellow)); + animation: pulse 1s infinite; + } + + ha-icon[data-domain="alarm_control_panel"][data-state="triggered"] { + color: var(--alarm-color-triggered, var(--label-badge-red)); + animation: pulse 1s infinite; + } + + @keyframes pulse { + 0% { + opacity: 1; + } + 100% { + opacity: 0; + } + } + ha-icon[data-domain="plant"][data-state="problem"], ha-icon[data-domain="zwave"][data-state="dead"] { color: var(--error-state-color, #db4437); From e7e8dff0ecec6808553d7bc5e362a1320356b54e Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Mon, 10 Feb 2020 20:17:24 +0100 Subject: [PATCH 50/64] Graceful fallback if translations for device automations are missing (#4824) * Graceful fallback if translations for device automations are missing * Update src/data/device_automation.ts Co-Authored-By: Bram Kragten * Update src/data/device_automation.ts Co-Authored-By: Bram Kragten * Update src/data/device_automation.ts Co-Authored-By: Bram Kragten * tweak Co-authored-by: Bram Kragten --- src/data/device_automation.ts | 48 ++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 21 deletions(-) diff --git a/src/data/device_automation.ts b/src/data/device_automation.ts index bc58f1b00a..03c5a6870e 100644 --- a/src/data/device_automation.ts +++ b/src/data/device_automation.ts @@ -101,14 +101,16 @@ export const localizeDeviceAutomationAction = ( action: DeviceAction ) => { const state = action.entity_id ? hass.states[action.entity_id] : undefined; - return hass.localize( - `component.${action.domain}.device_automation.action_type.${action.type}`, - "entity_name", - state ? computeStateName(state) : "", - "subtype", + return ( hass.localize( - `component.${action.domain}.device_automation.action_subtype.${action.subtype}` - ) + `component.${action.domain}.device_automation.action_type.${action.type}`, + "entity_name", + state ? computeStateName(state) : action.entity_id || "", + "subtype", + hass.localize( + `component.${action.domain}.device_automation.action_subtype.${action.subtype}` + ) || action.subtype + ) || `"${action.subtype}" ${action.type}` ); }; @@ -119,14 +121,16 @@ export const localizeDeviceAutomationCondition = ( const state = condition.entity_id ? hass.states[condition.entity_id] : undefined; - return hass.localize( - `component.${condition.domain}.device_automation.condition_type.${condition.type}`, - "entity_name", - state ? computeStateName(state) : "", - "subtype", + return ( hass.localize( - `component.${condition.domain}.device_automation.condition_subtype.${condition.subtype}` - ) + `component.${condition.domain}.device_automation.condition_type.${condition.type}`, + "entity_name", + state ? computeStateName(state) : condition.entity_id || "", + "subtype", + hass.localize( + `component.${condition.domain}.device_automation.condition_subtype.${condition.subtype}` + ) || condition.subtype + ) || `"${condition.subtype}" ${condition.type}` ); }; @@ -135,13 +139,15 @@ export const localizeDeviceAutomationTrigger = ( trigger: DeviceTrigger ) => { const state = trigger.entity_id ? hass.states[trigger.entity_id] : undefined; - return hass.localize( - `component.${trigger.domain}.device_automation.trigger_type.${trigger.type}`, - "entity_name", - state ? computeStateName(state) : "", - "subtype", + return ( hass.localize( - `component.${trigger.domain}.device_automation.trigger_subtype.${trigger.subtype}` - ) + `component.${trigger.domain}.device_automation.trigger_type.${trigger.type}`, + "entity_name", + state ? computeStateName(state) : trigger.entity_id || "", + "subtype", + hass.localize( + `component.${trigger.domain}.device_automation.trigger_subtype.${trigger.subtype}` + ) || trigger.subtype + ) || `"${trigger.subtype}" ${trigger.type}` ); }; From 2c006e99f23f422e6e72ec40b30c22711b022713 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 11 Feb 2020 00:17:29 +0100 Subject: [PATCH 51/64] Use original id to remove entity (#4829) --- .../entities/entity-registry-settings.ts | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/panels/config/entities/entity-registry-settings.ts b/src/panels/config/entities/entity-registry-settings.ts index a0090ff6a4..ac5ac1a30d 100644 --- a/src/panels/config/entities/entity-registry-settings.ts +++ b/src/panels/config/entities/entity-registry-settings.ts @@ -177,26 +177,27 @@ export class EntityRegistrySettings extends LitElement { } } - private async _deleteEntry(): Promise { + private async _confirmDeleteEntry(): Promise { + if ( + !(await showConfirmationDialog(this, { + text: this.hass.localize( + "ui.dialogs.entity_registry.editor.confirm_delete" + ), + })) + ) { + return; + } + this._submitting = true; try { - await removeEntityRegistryEntry(this.hass!, this._entityId); + await removeEntityRegistryEntry(this.hass!, this._origEntityId); fireEvent(this as HTMLElement, "close-dialog"); } finally { this._submitting = false; } } - private _confirmDeleteEntry(): void { - showConfirmationDialog(this, { - text: this.hass.localize( - "ui.dialogs.entity_registry.editor.confirm_delete" - ), - confirm: () => this._deleteEntry(), - }); - } - private _disabledByChanged(ev: Event): void { this._disabledBy = (ev.target as HaSwitch).checked ? null : "user"; } From 88bdf7c7ec8a5ea9352615e2477371d741539186 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Tue, 11 Feb 2020 00:32:36 +0000 Subject: [PATCH 52/64] [ci skip] Translation update --- translations/ca.json | 63 ++++++++- translations/en.json | 4 +- translations/es-419.json | 280 +++++++++++++++++++++++++++++++++++++-- translations/hu.json | 4 +- 4 files changed, 335 insertions(+), 16 deletions(-) diff --git a/translations/ca.json b/translations/ca.json index eb0328f309..674c5225f6 100644 --- a/translations/ca.json +++ b/translations/ca.json @@ -536,6 +536,7 @@ }, "common": { "cancel": "Cancel·la", + "close": "Tanca", "loading": "Carregant", "no": "No", "save": "Desa", @@ -638,6 +639,12 @@ }, "more_info_control": { "dismiss": "Desestimar el diàleg", + "edit": "Edita entitat", + "restored": { + "confirm_remove_title": "Eliminar l'entitat?", + "remove_action": "Elimina entitat", + "remove_intro": "Si l'entitat ja no s'utilitza, pots borrar-la eliminant-la." + }, "script": { "last_action": "Última acció", "last_triggered": "Disparada per última vegada" @@ -1242,6 +1249,11 @@ "description": "Gestiona els dispositius connectats", "details": "Aquí tens tots els detalls del dispositiu.", "device_not_found": "Dispositiu no trobat.", + "entities": { + "add_entities_lovelace": "Afegeix a Lovelace", + "entities": "Entitats", + "none": "Aquest dispositiu no té entitats" + }, "info": "Informació del dispositiu", "name": "Nom", "scene": { @@ -1278,17 +1290,44 @@ "update": "ACTUALITZAR" }, "picker": { + "disable_selected": { + "button": "Desactiva seleccionada/es", + "confirm_text": "Les entitats desactivades no s’afegiran a Home Assistant.", + "confirm_title": "Vols desactivar {number} entitat/s?" + }, + "enable_selected": { + "button": "Activa seleccionada/es", + "confirm_text": "Això farà que tornin a estar disponibles a Home Assistant si estan desactivades.", + "confirm_title": "Vols activar {number} entitat/s?" + }, + "filter": { + "filter": "Filtre", + "show_disabled": "Mostra entitats desactivades", + "show_unavailable": "Mostra entitats no disponibles" + }, "header": "Registre d'entitats", "headers": { "enabled": "Habilitat", "entity_id": "ID de l'entitat", "integration": "Integració", - "name": "Nom" + "name": "Nom", + "status": "Estat" }, "integrations_page": "Pàgina d'integracions", "introduction": "Home Assistant manté un registre de totes les entitats que ha detectat alguna vegada les quals tenen una identificació única. Cadascuna d'aquestes entitats té un identificador (ID) assignat que està reservat només per a ella.", "introduction2": "Utilitza el registre d'entitats per canviar el nom, canviar l'ID o eliminar l'entrada de Home Assistant.", + "remove_selected": { + "button": "Elimina seleccionada/es", + "confirm_text": "Les entitats només poden eliminar-se quan la seva integració ja no les està proporcionant.", + "confirm_title": "Vols eliminar {number} entitat/s?" + }, + "selected": "{number} seleccionada/es", "show_disabled": "Mostra entitats desactivades", + "status": { + "disabled": "Desactivada/es", + "ok": "D'acord", + "unavailable": "No disponible/s" + }, "unavailable": "(no disponible)" } }, @@ -1520,7 +1559,8 @@ "spinner": "S'estan cercant dispositius ZHA Zigbee..." }, "add": { - "caption": "Afegeix dispositius" + "caption": "Afegeix dispositius", + "description": "Afegeix dispositius a la xarxa Zigbee" }, "caption": "ZHA", "cluster_attributes": { @@ -1542,7 +1582,8 @@ }, "clusters": { "header": "Clústers", - "help_cluster_dropdown": "Selecciona un clúster per visualitzar-ne els atributs i comandes." + "help_cluster_dropdown": "Selecciona un clúster per visualitzar-ne els atributs i comandes.", + "introduction": "Els clústers són els blocs de construcció per dotar Zigbee de funcionalitat. Separen la funcionalitat en unitats lògiques. N'hi ha de tipus client i servidor; estan formats per atributs i comandes (ordres)." }, "common": { "add_devices": "Afegeix dispositius", @@ -1557,11 +1598,18 @@ "device_name_placeholder": "Nom donat per l'usuari", "update_name_button": "Actualitzar Nom" }, + "devices": { + "header": "Domòtica Zigbee (ZHA) - Dispositiu" + }, "group_binding": { + "bind_button_help": "Vincula el grup seleccionat als clústers de dispositius seleccionats.", "bind_button_label": "Vincula grup", + "cluster_selection_help": "Selecciona clústers per vincular-los al grup seleccionat.", + "group_picker_help": "Selecciona un grup per emetre una comanda de vinculació.", "group_picker_label": "Grups vinculables", "header": "Vinculació de grups", "introduction": "Vincula i desvincula grups.", + "unbind_button_help": "Desvincula el grup seleccionat dels clústers de dispositius seleccionats.", "unbind_button_label": "Desvincula grup" }, "groups": { @@ -1591,6 +1639,7 @@ "removing_members": "Eliminant membres", "zha_zigbee_groups": "Grups ZHA Zigbee" }, + "header": "Configuració domòtica Zigbee (ZHA)", "network_management": { "header": "Gestió de la xarxa", "introduction": "Comandes que afecten tota la xarxa" @@ -1626,11 +1675,13 @@ "name": "Nom", "new_zone": "Zona nova", "passive": "Passiva", + "passive_note": "Les zones passives estan amagades i no s’utilitzen com a ubicacions per a dispositius rastrejables. Però són utils per a la creació d'automatitzacions.", "radius": "Radi", "required_error_msg": "Aquest camp és obligatori", "update": "Actualitza" }, "edit_home_zone": "La ubicació de casa es pot canviar des de la configuració general.", + "introduction": "Les zones et permeten definir certes regions del planeta. Quan una persona es trobi dins d’una zona, l’estat prendrà el nom d'aquesta zona. També es poden utilitzar com a disparadors o condicions durant la creació d'automatitzacions.", "no_zones_created_yet": "Sembla que encara no has creat cap zona." }, "zwave": { @@ -1813,6 +1864,11 @@ "showing_entries": "Mostrant entrades de" }, "lovelace": { + "add_entities": { + "generated_unsupported": "Només pots utilitzar aquesta funció quan tinguis el control de la UI Lovelace.", + "saving_failed": "S'ha produït un error en desar la configuració de la UI Lovelace.", + "yaml_unsupported": "Només pots utilitzar aquesta funció si fas servir Lovelace en mode YAML." + }, "cards": { "confirm_delete": "Estàs segur que vols eliminar aquesta targeta?", "empty_state": { @@ -2010,6 +2066,7 @@ "confirm_unsaved_comments": "La configuració conté comentaris que es descartaran. Vols continuar?", "error_invalid_config": "La configuració no és vàlida: {error}", "error_parse_yaml": "No es pot analitzar YAML: {error}", + "error_remove": "No s'ha pogut eliminar la configuració: {error}", "error_save_yaml": "No es pot desar YAML: {error}", "header": "Edita la configuració", "save": "Desa", diff --git a/translations/en.json b/translations/en.json index be8650aed3..1e35be7a04 100644 --- a/translations/en.json +++ b/translations/en.json @@ -1679,12 +1679,12 @@ "name": "Name", "new_zone": "New Zone", "passive": "Passive", - "passive_note": "Passive zones are hidden in the frontend and are not used as location for device trackers. This is usefull if you just want to use it for automations.", + "passive_note": "Passive zones are hidden in the frontend and are not used as location for device trackers. This is useful if you just want to use it for automations.", "radius": "Radius", "required_error_msg": "This field is required", "update": "Update" }, - "edit_home_zone": "The location of your home can be changed in the gerenal config.", + "edit_home_zone": "The location of your home can be changed in the general config.", "introduction": "Zones allow you to specify certain regions on earth. When a person is within a zone, the state will take the name from the zone. Zones can also be used as a trigger or condition inside automation setups.", "no_zones_created_yet": "Looks like you have not created any zones yet." }, diff --git a/translations/es-419.json b/translations/es-419.json index cb245ada1e..dd1a356ed8 100644 --- a/translations/es-419.json +++ b/translations/es-419.json @@ -466,6 +466,9 @@ "script": { "execute": "Ejecutar" }, + "service": { + "run": "Ejecutar" + }, "vacuum": { "actions": { "resume_cleaning": "Reanudar la limpieza", @@ -513,16 +516,31 @@ }, "common": { "cancel": "Cancelar", + "close": "Cerrar", "loading": "Cargando", "no": "No", "save": "Guardar", "yes": "Sí" }, "components": { + "area-picker": { + "add_dialog": { + "add": "Agregar", + "failed_create_area": "No se pudo crear el área.", + "name": "Nombre", + "text": "Ingrese el nombre de la nueva área.", + "title": "Agregar nueva área" + }, + "add_new": "Agregar nueva área ...", + "area": "Área", + "clear": "Limpiar", + "show_areas": "Mostrar áreas" + }, "device-picker": { "clear": "Limpiar", "device": "Dispositivo", - "show_devices": "Mostrar dispositivos" + "show_devices": "Mostrar dispositivos", + "toggle": "Alternar" }, "entity": { "entity-picker": { @@ -563,8 +581,29 @@ "domain_toggler": { "title": "Alternar dominios" }, + "entity_registry": { + "control": "Controlar", + "dismiss": "Descartar", + "editor": { + "name": "Sustituir nombre" + }, + "related": "Relacionado", + "settings": "Configuraciones" + }, + "generic": { + "cancel": "Cancelar", + "default_confirmation_title": "¿Está seguro?", + "ok": "De acuerdo" + }, "more_info_control": { "dismiss": "Descartar diálogo", + "restored": { + "confirm_remove_text": "¿Está seguro de que desea eliminar esta entidad?", + "confirm_remove_title": "¿Eliminar entidad?", + "not_provided": "Esta entidad no está disponible actualmente y es huérfana de una integración o dispositivo eliminado, cambiado o disfuncional.", + "remove_action": "Eliminar entidad", + "remove_intro": "Si la entidad ya no está en uso, puede limpiarla eliminándola." + }, "script": { "last_action": "Última acción" }, @@ -797,6 +836,7 @@ "header": "Desencadenadores", "introduction": "Los desencadenadores son los que inician el procesamiento de una regla de automatización. Es posible especificar múltiples activadores para la misma regla. Una vez que se inicia un activador, Home Assistant validará las condiciones, si las hay, y activará la acción.", "learn_more": "Más información sobre los desencadenadores", + "name": "Desencadenar", "type_select": "Tipo de desencadenador", "type": { "device": { @@ -894,13 +934,26 @@ }, "cloud": { "account": { + "alexa": { + "disable": "deshabilitar", + "enable": "habilitar", + "manage_entities": "Administrar entidades", + "sync_entities": "Sincronizar entidades", + "title": "Alexa" + }, "connected": "Conectado", "fetching_subscription": "Obteniendo suscripción ...", "google": { + "config_documentation": "Documentación de configuración", + "devices_pin": "Pin de dispositivos de seguridad", "enable_state_reporting": "Habilitar informes de estado", + "enter_pin_error": "No se puede guardar el pin:", + "enter_pin_hint": "Ingrese un PIN para usar dispositivos de seguridad", + "enter_pin_info": "Ingrese un pin para interactuar con los dispositivos de seguridad. Los dispositivos de seguridad son puertas, puertas de garaje y cerraduras. Se le pedirá que diga/ingrese este pin cuando interactúe con dichos dispositivos a través del Asistente de Google.", "manage_entities": "Administrar entidades", "security_devices": "Dispositivos de seguridad", - "sync_entities": "Sincronizar entidades con Google" + "sync_entities": "Sincronizar entidades con Google", + "title": "Asistente de Google" }, "integrations": "Integraciones", "integrations_link_all_features": "todas las funciones disponibles", @@ -909,6 +962,8 @@ "not_connected": "No conectado", "webhooks": { "disable_hook_error_msg": "Error al deshabilitar el webhook:", + "info": "Cualquier cosa que esté configurada para ser activada por un webhook puede recibir una URL de acceso público para permitirle enviar datos a Home Assistant desde cualquier lugar, sin exponer su instancia a Internet.", + "link_learn_more": "Obtenga más información sobre la creación de automatizaciones basadas en webhook.", "loading": "Cargando ...", "manage": "Administrar", "no_hooks_yet": "Parece que todavía no tienes webhooks. Comience configurando un", @@ -919,6 +974,7 @@ } }, "alexa": { + "banner": "La edición de las entidades expuestas a través de esta interfaz de usuario está deshabilitada porque ha configurado filtros de entidad en configuration.yaml.", "expose": "Exponer a Alexa", "exposed_entities": "Entidades expuestas", "not_exposed_entities": "Entidades no expuestas", @@ -944,12 +1000,20 @@ "view_documentation": "Ver documentación" }, "google": { + "banner": "La edición de las entidades expuestas a través de esta interfaz de usuario está deshabilitada porque ha configurado filtros de entidad en configuration.yaml.", + "disable_2FA": "Deshabilitar la autenticación de dos factores", + "expose": "Exponer al Asistente de Google", + "exposed_entities": "Entidades expuestas", + "not_exposed_entities": "Entidades no expuestas", + "sync_to_google": "Sincronizar los cambios con Google.", "title": "Asistente de Google" }, "login": { "dismiss": "Descartar", + "email": "Correo electrónico", "introduction2a": ", una compañía fundada por los fundadores de Home Assistant y Hass.io.", "learn_more_link": "Obtenga más información sobre Home Assistant Cloud", + "password": "Contraseña", "title": "Inicio de sesión en la nube" }, "register": { @@ -1026,15 +1090,21 @@ "devices": { "area_picker_label": "Área", "automation": { + "automations": "Automatizaciones", "conditions": { "caption": "Sólo hacer algo si..." }, + "create": "Crear automatización con dispositivo", + "no_automations": "Sin automatizaciones", + "no_device_automations": "No hay automatizaciones disponibles para este dispositivo.", "triggers": { "caption": "Haz algo cuando ..." } }, "automations": "Automatizaciones", + "cant_edit": "Solo puede editar elementos que se crean en la interfaz de usuario.", "caption": "Dispositivos", + "confirm_rename_entity_ids": "¿También desea cambiar el nombre de la identificación de la entidad de sus entidades?", "data_table": { "area": "Área", "battery": "Batería", @@ -1047,8 +1117,22 @@ "details": "Aquí están todos los detalles de su dispositivo.", "device_not_found": "Dispositivo no encontrado.", "info": "Información del dispositivo", + "name": "Nombre", + "scene": { + "create": "Crear escena con dispositivo", + "no_scenes": "Sin escenas", + "scenes": "Escenas" + }, + "scenes": "Escenas", + "script": { + "create": "Crear script con dispositivo", + "no_scripts": "Sin scripts", + "scripts": "Scripts" + }, + "scripts": "Scripts", "unknown_error": "Error desconocido", - "unnamed_device": "Dispositivo sin nombre" + "unnamed_device": "Dispositivo sin nombre", + "update": "Actualizar" }, "entities": { "caption": "Registro de entidades", @@ -1061,6 +1145,8 @@ "enabled_cause": "Deshabilitado por {cause}.", "enabled_description": "Las entidades deshabilitadas no serán agregadas a Home Assistant.", "enabled_label": "Habilitar entidad", + "entity_id": "Identificación de la entidad", + "name": "Sustituir nombre", "note": "Nota: esto podría no funcionar todavía con todas las integraciones.", "unavailable": "Esta entidad no está disponible actualmente.", "update": "ACTUALIZAR" @@ -1100,6 +1186,7 @@ "add_area": "Agregar área", "area_picker_label": "Área", "close": "Cerrar", + "created_config": "Configuración creada para {name}.", "error_saving_area": "Error al guardar el área: {error}", "external_step": { "description": "Este paso requiere que visites un sitio web externo para ser completado.", @@ -1117,6 +1204,17 @@ "details": "Detalles de integración", "discovered": "Descubierto", "home_assistant_website": "Sitio web de Home Assistant", + "ignore": { + "confirm_delete_ignore": "Esto hará que la integración aparezca en sus integraciones descubiertas de nuevo cuando sea descubierta. Esto podría requerir un reinicio o tomar algún tiempo.", + "confirm_delete_ignore_title": "¿Dejar de ignorar a {name} ?", + "confirm_ignore": "¿Está seguro de que no desea configurar esta integración? Puede deshacer esto haciendo clic en \"Mostrar integraciones ignoradas\" en el menú deslizable en la parte superior derecha.", + "confirm_ignore_title": "¿Ignorar el descubrimiento de {name}?", + "hide_ignored": "Ocultar integraciones ignoradas", + "ignore": "Ignorar", + "ignored": "Ignorada", + "show_ignored": "Mostrar integraciones ignoradas", + "stop_ignore": "Dejar de ignorar" + }, "integration_not_found": "Integración no encontrada.", "new": "Configurar una nueva integración.", "none": "No hay nada configurado" @@ -1156,6 +1254,7 @@ "entities": { "add": "Agregar una entidad", "delete": "Eliminar entidad", + "device_entities": "Si agrega una entidad que pertenece a un dispositivo, se agregará el dispositivo.", "header": "Entidades", "introduction": "Las entidades que no pertenecen a un dispositivo se pueden configurar aquí.", "without_device": "Entidades sin dispositivo" @@ -1173,9 +1272,11 @@ "delete_scene": "Eliminar escena", "edit_scene": "Editar escena", "header": "Editor de escenas", + "introduction": "El editor de escenas le permite crear y editar escenas. Siga el enlace a continuación para leer las instrucciones y asegurarse de haber configurado Home Assistant correctamente.", "learn_more": "Más información sobre las escenas", "no_scenes": "No pudimos encontrar ninguna escena editable.", "only_editable": "Solo las escenas definidas en scenes.yaml son editables.", + "pick_scene": "Elija una escena para editar", "show_info_scene": "Mostrar información sobre la escena" } }, @@ -1183,12 +1284,16 @@ "caption": "Script", "description": "Crear y editar scripts", "editor": { + "alias": "Nombre", "delete_script": "Eliminar script", + "introduction": "Use scripts para ejecutar una secuencia de acciones.", "link_available_actions": "Obtenga más información sobre las acciones disponibles.", - "sequence": "Secuencia" + "sequence": "Secuencia", + "sequence_sentence": "La secuencia de acciones de este script." }, "picker": { - "edit_script": "Editar script" + "edit_script": "Editar script", + "trigger_script": "Desencadenar script" } }, "server_control": { @@ -1201,8 +1306,10 @@ "group": "Recargar grupos", "heading": "Recarga de configuración", "introduction": "Algunas partes de Home Assistant pueden volver a cargarse sin necesidad de reiniciar. Al pulsar recargar descargará su configuración actual y cargará la nueva.", + "person": "Recargar personas", "scene": "Recargar escenas", - "script": "Recargar scripts" + "script": "Recargar scripts", + "zone": "Recargar zonas" }, "server_management": { "confirm_restart": "¿Estás seguro de que quieres reiniciar el Home Assistant?", @@ -1251,9 +1358,32 @@ "header": "Automatización del hogar Zigbee - Agregar dispositivos", "spinner": "Buscando dispositivos ZHA Zigbee ..." }, + "add": { + "caption": "Agregar dispositivos", + "description": "Agregar dispositivos a la red Zigbee" + }, "caption": "ZHA", + "cluster_attributes": { + "attributes_of_cluster": "Atributos del clúster seleccionado", + "get_zigbee_attribute": "Obtener el atributo Zigbee", + "header": "Atributos del clúster", + "help_attribute_dropdown": "Seleccione un atributo para ver o establecer su valor.", + "help_get_zigbee_attribute": "Obtenga el valor para el atributo seleccionado.", + "help_set_zigbee_attribute": "Establezca el valor de atributo para el clúster especificado en la entidad especificada.", + "introduction": "Ver y editar atributos de clúster.", + "set_zigbee_attribute": "Establecer atributo Zigbee" + }, "cluster_commands": { - "help_command_dropdown": "Seleccione un comando para interactuar con él." + "commands_of_cluster": "Comandos del clúster seleccionado", + "header": "Comandos de clúster", + "help_command_dropdown": "Seleccione un comando para interactuar con él.", + "introduction": "Ver y emitir comandos de clúster.", + "issue_zigbee_command": "Emitir el comando Zigbee" + }, + "clusters": { + "header": "Clústeres", + "help_cluster_dropdown": "Seleccione un clúster para ver atributos y comandos.", + "introduction": "Los clústeres son los bloques de construcción para la funcionalidad de Zigbee. Separa la funcionalidad en unidades lógicas. Hay tipos de clientes y servidores que se componen de atributos y comandos." }, "common": { "add_devices": "Agregar dispositivos", @@ -1265,11 +1395,67 @@ "device_name_placeholder": "Nombre de usuario", "update_name_button": "Actualizar Nombre" }, + "devices": { + "header": "Zigbee Home Automation - Dispositivo" + }, + "groups": { + "add_members": "Agregar miembros", + "adding_members": "Agregando miembros", + "create": "Crear grupo", + "create_group": "Zigbee Home Automation - Crear grupo", + "create_group_details": "Ingrese los detalles requeridos para crear un nuevo grupo zigbee", + "creating_group": "Creando grupo", + "group_details": "Aquí están todos los detalles para el grupo Zigbee seleccionado.", + "group_info": "Información del grupo", + "group_name_placeholder": "Nombre del grupo", + "group_not_found": "¡Grupo no encontrado!", + "remove_members": "Eliminar miembros", + "removing_groups": "Eliminando grupos", + "removing_members": "Eliminando miembros" + }, + "header": "Configurar Zigbee Home Automation", + "introduction": "Aquí es posible configurar el componente ZHA. Todavía no es posible configurar todo desde la interfaz de usuario, pero estamos trabajando en ello.", + "network_management": { + "header": "Administración de redes", + "introduction": "Comandos que afectan a toda la red" + }, + "node_management": { + "header": "Administración de dispositivos", + "help_node_dropdown": "Seleccione un dispositivo para ver las opciones por dispositivo.", + "hint_wakeup": "Algunos dispositivos, como los sensores Xiaomi, tienen un botón de activación que puede presionar a intervalos de ~5 segundos para mantener los dispositivos activos mientras interactúa con ellos.", + "introduction": "Ejecute comandos ZHA que afectan a un solo dispositivo. Elija un dispositivo para ver una lista de comandos disponibles." + }, "services": { "reconfigure": "Reconfigure el dispositivo ZHA (dispositivo de curación). Use esto si tiene problemas con el dispositivo. Si el dispositivo en cuestión es un dispositivo alimentado por batería, asegúrese de que esté activado y acepte los comandos cuando utilice este servicio.", "remove": "Eliminar un dispositivo de la red Zigbee.", "updateDeviceName": "Establecer un nombre personalizado para este dispositivo en el registro de dispositivos." - } + }, + "title": "Zigbee Home Automation" + }, + "zone": { + "add_zone": "Agregar zona", + "caption": "Zonas", + "confirm_delete": "¿Está seguro de que desea eliminar esta zona?", + "create_zone": "Crear zona", + "description": "Administre las zonas en las que desea rastrear personas.", + "detail": { + "create": "Crear", + "delete": "Eliminar", + "icon": "Ícono", + "icon_error_msg": "El ícono debe tener el formato prefijo:nombre del ícono, por ejemplo: mdi:home", + "latitude": "Latitud", + "longitude": "Longitud", + "name": "Nombre", + "new_zone": "Nueva zona", + "passive": "Pasiva", + "passive_note": "Las zonas pasivas están ocultas en la interfaz y no se utilizan como ubicación para rastreadores de dispositivos. Esto es útil si solo quiere usarlas para automatizaciones.", + "radius": "Radio", + "required_error_msg": "Este campo es requerido", + "update": "Actualizar" + }, + "edit_home_zone": "La ubicación de su casa puede ser cambiada en la configuración general.", + "introduction": "Las zonas le permiten especificar ciertas regiones en el planeta. Cuando una persona está dentro de una zona, el estado tomará el nombre de la zona. Las zonas también se pueden usar como desencadenante o condición dentro de las configuraciones de automatización.", + "no_zones_created_yet": "Parece que todavía no ha creado ninguna zona." }, "zwave": { "caption": "", @@ -1304,6 +1490,10 @@ "set_wakeup": "Establecer intervalo de activación", "true": "Verdadero" }, + "ozw_log": { + "header": "Registro de OZW", + "introduction": "Ver el registro. 0 es el mínimo (carga el registro completo) y 1000 es el máximo. L carga mostrará un registro estático y la cola se actualizará automáticamente con el último número especificado de líneas del registro." + }, "services": { "add_node": "Agregar nodo", "add_node_secure": "Agregar nodo seguro", @@ -1322,30 +1512,56 @@ }, "custom": { "external_panel": { + "complete_access": "Tendrá acceso a todos los datos en Home Assistant.", + "hide_message": "Verifique la documentación para el componente panel_custom para ocultar este mensaje", "question_trust": "¿Confía en el panel externo {name} en {link} ?" } }, "developer-tools": { "tabs": { "events": { + "alert_event_type": "El tipo de evento es un campo obligatorio", + "available_events": "Eventos disponibles", + "count_listeners": "({count} oyentes)", + "data": "Datos del evento (YAML, opcional)", "documentation": "Documentación de eventos.", + "event_fired": "Evento {name} desencadenado", + "fire_event": "Desencadenar evento", + "listen_to_events": "Escuchar eventos", + "listening_to": "Escuchando a", + "notification_event_fired": "¡Evento {type} desencadenado con éxito!", + "start_listening": "Comenzar a escuchar", + "stop_listening": "Deja de escuchar", + "subscribe_to": "Evento para suscribirse", "title": "Eventos", "type": "Tipo de evento" }, "info": { "built_using": "Construido usando", + "custom_uis": "Interfaces de usuario personalizadas:", + "default_ui": "{action} {name} como página predeterminada en este dispositivo", + "developed_by": "Desarrollado por un grupo de personas increíbles.", + "frontend": "frontend-ui", + "frontend_version": "Versión de la interfaz: {version} - {type}", "home_assistant_logo": "Logotipo de Home Assistant", "icons_by": "Iconos por", + "license": "Publicado bajo la licencia Apache 2.0", "lovelace_ui": "Ir a la interfaz de usuario de Lovelace", + "path_configuration": "Ruta de acceso a configuration.yaml: {path}", "remove": "Eliminar", "server": "servidor", "set": "Establecer", "source": "Fuente:", + "states_ui": "Ir a la interfaz de usuario de estados", + "system_health_error": "El componente de mantenimiento del sistema no está cargado. Agregue 'system_health:' a configuration.yaml", "title": "Información" }, "logs": { "clear": "Limpiar", + "details": "Detalles del registro ({level})", + "load_full_log": "Cargar registro completo de Home Assistant", "loading_log": "Cargando registro de errores ...", + "multiple_messages": "el mensaje se produjo por primera vez a las {time} y aparece {counter} veces", "no_errors": "No se han reportado errores.", "no_issues": "¡No hay nuevos problemas!", "refresh": "Refrescar", @@ -1398,10 +1614,16 @@ "showing_entries": "Mostrando registros del" }, "logbook": { + "entries_not_found": "No se encontraron entradas en el libro de registro.", "period": "Período", "showing_entries": "Mostrando registros del" }, "lovelace": { + "add_entities": { + "generated_unsupported": "Solo puede usar esta función cuando haya tomado el control de Lovelace UI.", + "saving_failed": "No se pudo guardar la configuración de Lovelace UI.", + "yaml_unsupported": "No puede usar esta función cuando usa Lovelace UI en modo YAML." + }, "cards": { "empty_state": { "go_to_integrations_page": "Ir a la página de integraciones.", @@ -1432,10 +1654,26 @@ "alarm_panel": { "available_states": "Estados disponibles" }, + "alarm-panel": { + "available_states": "Estados disponibles", + "name": "Panel de alarma" + }, + "conditional": { + "name": "Condicional" + }, "config": { "optional": "Opcional", "required": "Requerido" }, + "entities": { + "name": "Entidades" + }, + "entity-button": { + "name": "Botón de entidad" + }, + "entity-filter": { + "name": "Filtro de entidad" + }, "gauge": { "severity": { "define": "¿Definir gravedad?", @@ -1503,7 +1741,10 @@ "move": "Mover", "options": "Mas opciones", "pick_card": "Elija la tarjeta que desea agregar.", + "pick_card_view_title": "¿Qué tarjeta le gustaría agregar a su vista de {name} ?", "save": "Guardar", + "show_code_editor": "Mostrar editor de código", + "show_visual_editor": "Mostrar el editor visual", "toggle_editor": "Cambiar editor" }, "edit_lovelace": { @@ -1516,6 +1757,7 @@ "delete": "Eliminar vista", "edit": "Editar vista", "header": "Ver configuración", + "header_name": "{name} Ver configuración", "move_left": "Mover vista a la izquierda", "move_right": "Mover vista a la derecha" }, @@ -1531,10 +1773,13 @@ "para_no_id": "Este elemento no tiene un ID. Por favor agregue uno a este elemento en 'ui-lovelace.yaml'." }, "raw_editor": { + "confirm_remove_config_text": "Generaremos automáticamente sus vistas de Lovelace UI con sus áreas y dispositivos si elimina su configuración de Lovelace UI.", + "confirm_remove_config_title": "¿Está seguro de que desea eliminar la configuración de Lovelace UI? Generaremos automáticamente sus vistas de Lovelace UI con sus áreas y dispositivos.", "confirm_unsaved_changes": "Tiene cambios sin guardar, ¿está seguro de que desea salir?", "confirm_unsaved_comments": "Su configuración contiene comentarios, estos no se guardarán. ¿Quieres continuar?", "error_invalid_config": "Su configuración no es válida: {error}", "error_parse_yaml": "No se puede analizar el YAML: {error}", + "error_remove": "No se puede eliminar la configuración: {error}", "error_save_yaml": "No se puede guardar YAML: {error}", "header": "Editar configuración", "save": "Guardar", @@ -1547,6 +1792,17 @@ "para": "Por defecto, Home Assistant mantendrá su interfaz de usuario y la actualizará cuando haya nuevas entidades o componentes de Lovelace disponibles. Si usted toma el control, ya no haremos cambios automáticamente para usted.", "para_sure": "¿Está seguro de que desea tomar el control de su interfaz de usuario?", "save": "Tomar el control" + }, + "suggest_card": { + "add": "Agregar a Lovelace UI", + "create_own": "Elegir una tarjeta diferente", + "header": "Creamos una sugerencia para usted" + }, + "view": { + "panel_mode": { + "description": "Esto hace que la primera carta sea de ancho completo; otras cartas en esta vista no se mostrarán.", + "title": "¿Modo de panel?" + } } }, "menu": { @@ -1559,11 +1815,16 @@ }, "reload_lovelace": "Recargar Lovelace", "unused_entities": { + "available_entities": "Estas son las entidades que tiene disponibles, pero aún no están en la interfaz de usuario de Lovelace.", "domain": "Dominio", "entity": "Entidad", "entity_id": "ID de entidad", "last_changed": "Última modificación", - "select_to_add": "Seleccione las entidades que desea agregar a una tarjeta y luego haga clic en el botón Agregar tarjeta." + "select_to_add": "Seleccione las entidades que desea agregar a una tarjeta y luego haga clic en el botón Agregar tarjeta.", + "title": "Entidades no utilizadas" + }, + "views": { + "existing_cards": "No puede eliminar una vista que tiene tarjetas. Elimine las cartas primero." }, "warning": { "entity_non_numeric": "Entidad no es numérica: {entity}", @@ -1749,6 +2010,7 @@ }, "profile": { "advanced_mode": { + "link_promo": "Más información", "title": "Modo avanzado" }, "change_password": { diff --git a/translations/hu.json b/translations/hu.json index 365b23ae85..a8b4b2c34a 100644 --- a/translations/hu.json +++ b/translations/hu.json @@ -1504,8 +1504,8 @@ "zone": "Zónák újratöltése" }, "server_management": { - "confirm_restart": "Biztosan újra akarod indítani a Home Assistantet?", - "confirm_stop": "Biztosan le akarod állítani a Home Assistantet?", + "confirm_restart": "Biztosan újra szeretnéd indítani a Home Assistant-ot?", + "confirm_stop": "Biztosan le szeretnéd állítani a Home Assistant-ot?", "heading": "Szerver menedzsment", "introduction": "Home Assistant szerver vezérlése... a Home Assistant-ból.", "restart": "Újraindítás", From 8cee5c729ea83543ae887cf87f8b84b27c4fe5fe Mon Sep 17 00:00:00 2001 From: Ruslan Sayfutdinov Date: Tue, 11 Feb 2020 04:50:12 +0000 Subject: [PATCH 53/64] [logbook] fix period dropdown animation (#4834) --- src/panels/logbook/ha-panel-logbook.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/panels/logbook/ha-panel-logbook.js b/src/panels/logbook/ha-panel-logbook.js index 63575184c5..fec08c58cc 100644 --- a/src/panels/logbook/ha-panel-logbook.js +++ b/src/panels/logbook/ha-panel-logbook.js @@ -78,6 +78,7 @@ class HaPanelLogbook extends LocalizeMixin(PolymerElement) { paper-item { cursor: pointer; + white-space: nowrap; } ha-entity-picker { From d052b9ede8e5198b31d4692c52d02823e507ba59 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 11 Feb 2020 00:05:18 -0800 Subject: [PATCH 54/64] Update en.json (#4835) --- src/translations/en.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/translations/en.json b/src/translations/en.json index d5946e41ae..c910b10daa 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -777,8 +777,8 @@ "invalid": "Configuration invalid" }, "reloading": { - "heading": "Configuration reloading", - "introduction": "Some parts of Home Assistant can reload without requiring a restart. Hitting reload will unload their current configuration and load the new one.", + "heading": "YAML configuration reloading", + "introduction": "Some parts of Home Assistant can reload without requiring a restart. Hitting reload will unload their current YAML configuration and load the new one.", "core": "Reload location & customizations", "group": "Reload groups", "automation": "Reload automations", From 9fce60065ba693ae1caa275c4e7d8a21b3fa7f5a Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Tue, 11 Feb 2020 09:15:38 +0100 Subject: [PATCH 55/64] Add lozalization to more-info-vacuum (#4793) * Convert more-info-vacuum to Lit * Introduce VacuumCommand to reduce render complexity and duplicate code * Add localization for more-info-vacuum * Inline supportFeature instead of creating a const. * - Use interface instead of class for VacuumCommand - Add different translation for start_pause and pause as they are not the same * fix typo * Use VACUUM_COMMANDS.some instead of writing duplicate code * add @bramkragten suggestions --- src/data/vacuum.ts | 22 ++ .../more-info/controls/more-info-vacuum.js | 263 ------------------ .../more-info/controls/more-info-vacuum.ts | 256 +++++++++++++++++ src/translations/en.json | 12 + 4 files changed, 290 insertions(+), 263 deletions(-) create mode 100644 src/data/vacuum.ts delete mode 100644 src/dialogs/more-info/controls/more-info-vacuum.js create mode 100644 src/dialogs/more-info/controls/more-info-vacuum.ts diff --git a/src/data/vacuum.ts b/src/data/vacuum.ts new file mode 100644 index 0000000000..0ad0738d1b --- /dev/null +++ b/src/data/vacuum.ts @@ -0,0 +1,22 @@ +import { + HassEntityAttributeBase, + HassEntityBase, +} from "home-assistant-js-websocket"; + +export const VACUUM_SUPPORT_PAUSE = 4; +export const VACUUM_SUPPORT_STOP = 8; +export const VACUUM_SUPPORT_RETURN_HOME = 16; +export const VACUUM_SUPPORT_FAN_SPEED = 32; +export const VACUUM_SUPPORT_BATTERY = 64; +export const VACUUM_SUPPORT_STATUS = 128; +export const VACUUM_SUPPORT_LOCATE = 512; +export const VACUUM_SUPPORT_CLEAN_SPOT = 1024; +export const VACUUM_SUPPORT_START = 8192; + +export type VacuumEntity = HassEntityBase & { + attributes: HassEntityAttributeBase & { + battery_level: number; + fan_speed: any; + [key: string]: any; + }; +}; diff --git a/src/dialogs/more-info/controls/more-info-vacuum.js b/src/dialogs/more-info/controls/more-info-vacuum.js deleted file mode 100644 index d712467163..0000000000 --- a/src/dialogs/more-info/controls/more-info-vacuum.js +++ /dev/null @@ -1,263 +0,0 @@ -import "@polymer/iron-flex-layout/iron-flex-layout-classes"; -import "@polymer/iron-icon/iron-icon"; -import "@polymer/paper-icon-button/paper-icon-button"; -import "@polymer/paper-item/paper-item"; -import "@polymer/paper-listbox/paper-listbox"; -import { html } from "@polymer/polymer/lib/utils/html-tag"; -import { PolymerElement } from "@polymer/polymer/polymer-element"; - -import "../../../components/ha-attributes"; -import "../../../components/ha-paper-dropdown-menu"; -import { supportsFeature } from "../../../common/entity/supports-feature"; - -class MoreInfoVacuum extends PolymerElement { - static get template() { - return html` - - - -
-
- Status: [[stateObj.attributes.status]] -
-
- - [[stateObj.attributes.battery_level]] % -
-
-
-

-
Vacuum cleaner commands:
-
- - - -
- -
-
- -
-
- -
-
- -
-
-
- -
-
- - - - - -
- - [[stateObj.attributes.fan_speed]] -
-
-

-
- - `; - } - - static get properties() { - return { - hass: { - type: Object, - }, - - inDialog: { - type: Boolean, - value: false, - }, - - stateObj: { - type: Object, - }, - }; - } - - supportsPause(stateObj) { - return supportsFeature(stateObj, 4); - } - - supportsStop(stateObj) { - return supportsFeature(stateObj, 8); - } - - supportsReturnHome(stateObj) { - return supportsFeature(stateObj, 16); - } - - supportsFanSpeed(stateObj) { - return supportsFeature(stateObj, 32); - } - - supportsBattery(stateObj) { - return supportsFeature(stateObj, 64); - } - - supportsStatus(stateObj) { - return supportsFeature(stateObj, 128); - } - - supportsLocate(stateObj) { - return supportsFeature(stateObj, 512); - } - - supportsCleanSpot(stateObj) { - return supportsFeature(stateObj, 1024); - } - - supportsStart(stateObj) { - return supportsFeature(stateObj, 8192); - } - - supportsCommandBar(stateObj) { - return ( - supportsFeature(stateObj, 4) | - supportsFeature(stateObj, 8) | - supportsFeature(stateObj, 16) | - supportsFeature(stateObj, 512) | - supportsFeature(stateObj, 1024) | - supportsFeature(stateObj, 8192) - ); - } - - fanSpeedChanged(ev) { - var oldVal = this.stateObj.attributes.fan_speed; - var newVal = ev.detail.value; - - if (!newVal || oldVal === newVal) return; - - this.hass.callService("vacuum", "set_fan_speed", { - entity_id: this.stateObj.entity_id, - fan_speed: newVal, - }); - } - - onStop() { - this.hass.callService("vacuum", "stop", { - entity_id: this.stateObj.entity_id, - }); - } - - onPlayPause() { - this.hass.callService("vacuum", "start_pause", { - entity_id: this.stateObj.entity_id, - }); - } - - onPause() { - this.hass.callService("vacuum", "pause", { - entity_id: this.stateObj.entity_id, - }); - } - - onStart() { - this.hass.callService("vacuum", "start", { - entity_id: this.stateObj.entity_id, - }); - } - - onLocate() { - this.hass.callService("vacuum", "locate", { - entity_id: this.stateObj.entity_id, - }); - } - - onCleanSpot() { - this.hass.callService("vacuum", "clean_spot", { - entity_id: this.stateObj.entity_id, - }); - } - - onReturnHome() { - this.hass.callService("vacuum", "return_to_base", { - entity_id: this.stateObj.entity_id, - }); - } -} - -customElements.define("more-info-vacuum", MoreInfoVacuum); diff --git a/src/dialogs/more-info/controls/more-info-vacuum.ts b/src/dialogs/more-info/controls/more-info-vacuum.ts new file mode 100644 index 0000000000..4d6d1c362f --- /dev/null +++ b/src/dialogs/more-info/controls/more-info-vacuum.ts @@ -0,0 +1,256 @@ +import "@polymer/iron-icon/iron-icon"; +import "@polymer/paper-icon-button/paper-icon-button"; +import "@polymer/paper-item/paper-item"; +import "@polymer/paper-listbox/paper-listbox"; + +import { + css, + CSSResult, + customElement, + html, + LitElement, + property, + TemplateResult, +} from "lit-element"; + +import { supportsFeature } from "../../../common/entity/supports-feature"; +import { HomeAssistant } from "../../../types"; + +import "../../../components/ha-paper-dropdown-menu"; +import "../../../components/ha-attributes"; +import { + VACUUM_SUPPORT_BATTERY, + VACUUM_SUPPORT_CLEAN_SPOT, + VACUUM_SUPPORT_FAN_SPEED, + VACUUM_SUPPORT_LOCATE, + VACUUM_SUPPORT_PAUSE, + VACUUM_SUPPORT_RETURN_HOME, + VACUUM_SUPPORT_START, + VACUUM_SUPPORT_STATUS, + VACUUM_SUPPORT_STOP, + VacuumEntity, +} from "../../../data/vacuum"; + +interface VacuumCommand { + translationKey: string; + icon: string; + serviceName: string; + isVisible: (stateObj: VacuumEntity) => boolean; +} + +const VACUUM_COMMANDS: VacuumCommand[] = [ + { + translationKey: "start", + icon: "hass:play", + serviceName: "start", + isVisible: (stateObj) => supportsFeature(stateObj, VACUUM_SUPPORT_START), + }, + { + translationKey: "pause", + icon: "hass:pause", + serviceName: "pause", + isVisible: (stateObj) => + // We need also to check if Start is supported because if not we show play-pause + supportsFeature(stateObj, VACUUM_SUPPORT_START) && + supportsFeature(stateObj, VACUUM_SUPPORT_PAUSE), + }, + { + translationKey: "start_pause", + icon: "hass:play-pause", + serviceName: "start_pause", + isVisible: (stateObj) => + // If start is supported, we don't show this button + !supportsFeature(stateObj, VACUUM_SUPPORT_START) && + supportsFeature(stateObj, VACUUM_SUPPORT_PAUSE), + }, + { + translationKey: "stop", + icon: "hass:stop", + serviceName: "stop", + isVisible: (stateObj) => supportsFeature(stateObj, VACUUM_SUPPORT_STOP), + }, + { + translationKey: "clean_spot", + icon: "hass:broom", + serviceName: "clean_spot", + isVisible: (stateObj) => + supportsFeature(stateObj, VACUUM_SUPPORT_CLEAN_SPOT), + }, + { + translationKey: "locate", + icon: "hass:map-marker", + serviceName: "locate", + isVisible: (stateObj) => supportsFeature(stateObj, VACUUM_SUPPORT_LOCATE), + }, + { + translationKey: "return_home", + icon: "hass:home-map-marker", + serviceName: "return_to_base", + isVisible: (stateObj) => + supportsFeature(stateObj, VACUUM_SUPPORT_RETURN_HOME), + }, +]; + +@customElement("more-info-vacuum") +class MoreInfoVacuum extends LitElement { + @property() public hass!: HomeAssistant; + + @property() public stateObj?: VacuumEntity; + + protected render(): TemplateResult { + if (!this.hass || !this.stateObj) { + return html``; + } + + const stateObj = this.stateObj; + + const filterExtraAttributes = + "fan_speed,fan_speed_list,status,battery_level,battery_icon"; + + return html` +
+ ${supportsFeature(stateObj, VACUUM_SUPPORT_STATUS) + ? html` +
+ ${this.hass!.localize( + "ui.dialogs.more_info_control.vacuum.status" + )}: + + ${stateObj.attributes.status} +
+ ` + : ""} + ${supportsFeature(stateObj, VACUUM_SUPPORT_BATTERY) + ? html` + + + + ${stateObj.attributes.battery_level} % + +
` + : ""} +
+ + ${VACUUM_COMMANDS.some((item) => item.isVisible(stateObj)) + ? html` +
+

+
+ ${this.hass!.localize( + "ui.dialogs.more_info_control.vacuum.commands" + )} +
+
+ ${VACUUM_COMMANDS.filter((item) => + item.isVisible(stateObj) + ).map( + (item) => html` +
+ +
+ ` + )} +
+
+ ` + : ""} + ${supportsFeature(stateObj, VACUUM_SUPPORT_FAN_SPEED) + ? html` +
+
+ + + ${stateObj.attributes.fan_speed_list!.map( + (mode) => html` + + ${mode} + + ` + )} + + +
+ + + ${stateObj.attributes.fan_speed} + +
+
+

+
+ ` + : ""} + + + `; + } + + private callService(ev: CustomEvent) { + const entry = (ev.target! as any).entry as VacuumCommand; + this.hass.callService("vacuum", entry.serviceName, { + entity_id: this.stateObj!.entity_id, + }); + } + + private handleFanSpeedChanged(ev: CustomEvent) { + const oldVal = this.stateObj!.attributes.fan_speed; + const newVal = ev.detail.item.itemName; + + if (!newVal || oldVal === newVal) { + return; + } + + this.hass.callService("vacuum", "set_fan_speed", { + entity_id: this.stateObj!.entity_id, + fan_speed: newVal, + }); + } + + static get styles(): CSSResult { + return css` + :host { + @apply --paper-font-body1; + line-height: 1.5; + } + .status-subtitle { + color: var(--secondary-text-color); + } + paper-item { + cursor: pointer; + } + .flex-horizontal { + display: flex; + flex-direction: row; + justify-content: space-between; + } + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + "more-info-vacuum": MoreInfoVacuum; + } +} diff --git a/src/translations/en.json b/src/translations/en.json index c910b10daa..33c269e94b 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -618,6 +618,18 @@ "remove_action": "Remove entity", "confirm_remove_title": "Remove entity?", "confirm_remove_text": "Are you sure you want to remove this entity?" + }, + "vacuum": { + "status": "Status", + "commands": "Vacuum cleaner commands:", + "fan_speed": "Fan speed", + "start": "Start", + "pause": "Pause", + "stop": "Stop", + "clean_spot": "Clean spot", + "locate": "Locate", + "return_home": "Return home", + "start_pause": "Start/Pause" } }, "entity_registry": { From 1437b4c4b68f8ba16f6f4daaaa113800ebcc979d Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 11 Feb 2020 15:43:46 +0100 Subject: [PATCH 56/64] Fix media control card styling (#4845) --- .../lovelace/cards/hui-media-control-card.ts | 56 +++++++------------ 1 file changed, 21 insertions(+), 35 deletions(-) diff --git a/src/panels/lovelace/cards/hui-media-control-card.ts b/src/panels/lovelace/cards/hui-media-control-card.ts index 6b04400ec2..c5035a9c58 100644 --- a/src/panels/lovelace/cards/hui-media-control-card.ts +++ b/src/panels/lovelace/cards/hui-media-control-card.ts @@ -98,15 +98,13 @@ export class HuiMediaControlCard extends LitElement implements LovelaceCard { class="progress" > `} -
-
- -
-
+
+ +
-
- -
+
`; @@ -224,7 +220,7 @@ export class HuiMediaControlCard extends LitElement implements LovelaceCard { } .no-image { - padding-bottom: 20%; + padding-bottom: 88px; } .no-image > .image { @@ -236,37 +232,27 @@ export class HuiMediaControlCard extends LitElement implements LovelaceCard { .no-image > .caption { background-color: initial; + box-sizing: border-box; + height: 88px; } .controls { - align-content: space-evenly; padding: 8px; - } - - .controls > div { - width: 33%; + display: flex; + justify-content: space-between; align-items: center; } - .flex { + .controls > div { display: flex; + align-items: center; } - .left { - justify-content: flex-start; - } - - .center { - justify-content: center; - } - - .right { - justify-content: flex-end; - } - - paper-icon-button { + .controls paper-icon-button { width: 44px; height: 44px; + } + paper-icon-button { opacity: var(--dark-primary-opacity); } From d48a4e0ac632ff52b43cfd56764024525e6be633 Mon Sep 17 00:00:00 2001 From: Ruslan Sayfutdinov Date: Tue, 11 Feb 2020 23:26:28 +0000 Subject: [PATCH 57/64] [logbook] implement shouldUpdate (#4832) * [logbook] implement shouldUpdate * Update src/panels/logbook/ha-logbook.ts Co-Authored-By: Paulus Schoutsen Co-authored-by: Paulus Schoutsen --- src/panels/logbook/ha-logbook-data.js | 4 ++-- src/panels/logbook/ha-logbook.ts | 15 +++++---------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/src/panels/logbook/ha-logbook-data.js b/src/panels/logbook/ha-logbook-data.js index 8be479e4f8..12a1969f4f 100644 --- a/src/panels/logbook/ha-logbook-data.js +++ b/src/panels/logbook/ha-logbook-data.js @@ -59,7 +59,7 @@ class HaLogbookData extends PolymerElement { this._setIsLoading(true); - this.getDate(this.filterDate, this.filterPeriod, this.filterEntity).then( + this.getData(this.filterDate, this.filterPeriod, this.filterEntity).then( (logbookEntries) => { this._setEntries(logbookEntries); this._setIsLoading(false); @@ -67,7 +67,7 @@ class HaLogbookData extends PolymerElement { ); } - getDate(date, period, entityId) { + getData(date, period, entityId) { if (!entityId) entityId = ALL_ENTITIES; if (!DATA_CACHE[period]) DATA_CACHE[period] = []; diff --git a/src/panels/logbook/ha-logbook.ts b/src/panels/logbook/ha-logbook.ts index e92d4aacfe..f72edab10c 100644 --- a/src/panels/logbook/ha-logbook.ts +++ b/src/panels/logbook/ha-logbook.ts @@ -25,19 +25,14 @@ class HaLogbook extends LitElement { // @ts-ignore private _rtl = false; - protected updated(changedProps: PropertyValues) { - super.updated(changedProps); - if (!changedProps.has("hass")) { - return; - } + protected shouldUpdate(changedProps: PropertyValues) { const oldHass = changedProps.get("hass") as HomeAssistant | undefined; - if (oldHass && oldHass.language !== this.hass.language) { - this._rtl = computeRTL(this.hass); - } + const languageChanged = + oldHass === undefined || oldHass.language !== this.hass.language; + return changedProps.has("entries") || languageChanged; } - protected firstUpdated(changedProps: PropertyValues) { - super.firstUpdated(changedProps); + protected updated(_changedProps: PropertyValues) { this._rtl = computeRTL(this.hass); } From fb9d7ac2d8a4be3fc65b72e6bc024dedb99fcd55 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Wed, 12 Feb 2020 00:32:46 +0000 Subject: [PATCH 58/64] [ci skip] Translation update --- translations/ca.json | 1 + translations/da.json | 2 +- translations/en.json | 16 ++- translations/es-419.json | 297 ++++++++++++++++++++++++++++++++++++--- translations/es.json | 2 +- 5 files changed, 296 insertions(+), 22 deletions(-) diff --git a/translations/ca.json b/translations/ca.json index 674c5225f6..80558831c3 100644 --- a/translations/ca.json +++ b/translations/ca.json @@ -2081,6 +2081,7 @@ "save": "Prendre el control" }, "suggest_card": { + "add": "Afegeix a la UI Lovelace", "create_own": "Crea la teva" }, "view": { diff --git a/translations/da.json b/translations/da.json index e0b62f0132..2473b09fe8 100644 --- a/translations/da.json +++ b/translations/da.json @@ -1679,7 +1679,7 @@ "name": "Navn", "new_zone": "Ny zone", "passive": "Passiv", - "passive_note": "Passive zoner er skjult i brugerfladen og bruges ikke som lokalitet for enhedssporere. Dette er nyttigt, hvis du bare vil bruge det til automatiseringer.", + "passive_note": "Passive zoner er skjult i brugerfladen og bruges ikke som lokalitet for enhedssporere. Dette er nyttigt, hvis du bare vil bruge dem til automatiseringer.", "radius": "Radius", "required_error_msg": "Dette felt er påkrævet", "update": "Opdater" diff --git a/translations/en.json b/translations/en.json index 1e35be7a04..cbfd5727d3 100644 --- a/translations/en.json +++ b/translations/en.json @@ -659,6 +659,18 @@ }, "updater": { "title": "Update Instructions" + }, + "vacuum": { + "clean_spot": "Clean spot", + "commands": "Vacuum cleaner commands:", + "fan_speed": "Fan speed", + "locate": "Locate", + "pause": "Pause", + "return_home": "Return home", + "start": "Start", + "start_pause": "Start/Pause", + "status": "Status", + "stop": "Stop" } }, "more_info_settings": { @@ -1496,8 +1508,8 @@ "automation": "Reload automations", "core": "Reload location & customizations", "group": "Reload groups", - "heading": "Configuration reloading", - "introduction": "Some parts of Home Assistant can reload without requiring a restart. Hitting reload will unload their current configuration and load the new one.", + "heading": "YAML configuration reloading", + "introduction": "Some parts of Home Assistant can reload without requiring a restart. Hitting reload will unload their current YAML configuration and load the new one.", "person": "Reload persons", "scene": "Reload scenes", "script": "Reload scripts", diff --git a/translations/es-419.json b/translations/es-419.json index dd1a356ed8..3f0936a577 100644 --- a/translations/es-419.json +++ b/translations/es-419.json @@ -419,8 +419,11 @@ "climate": { "aux_heat": "Calor auxiliar", "away_mode": "Fuera de Casa", + "cooling": "{name} enfriando", + "current_temperature": "{name} temperatura actual", "currently": "Actualmente", "fan_mode": "Modo del ventilador", + "heating": "{name} calentando", "high": "alto", "low": "bajo", "on_off": "Encendido / Apagado", @@ -430,6 +433,13 @@ "target_humidity": "Humedad deseada", "target_temperature": "Temperatura deseada" }, + "counter": { + "actions": { + "decrement": "reducir", + "increment": "aumentar", + "reset": "restablecer" + } + }, "cover": { "position": "Posición", "tilt_position": "Posición de inclinación" @@ -469,6 +479,14 @@ "service": { "run": "Ejecutar" }, + "timer": { + "actions": { + "cancel": "cancelar", + "finish": "terminar", + "pause": "pausar", + "start": "iniciar" + } + }, "vacuum": { "actions": { "resume_cleaning": "Reanudar la limpieza", @@ -520,6 +538,7 @@ "loading": "Cargando", "no": "No", "save": "Guardar", + "successfully_saved": "Guardado correctamente", "yes": "Sí" }, "components": { @@ -553,6 +572,16 @@ "loading_history": "Cargando historial de estado...", "no_history_found": "No se encontró historial de estado." }, + "related-items": { + "area": "Área", + "automation": "Parte de las siguientes automatizaciones", + "device": "Dispositivo", + "entity": "Entidades relacionadas", + "group": "Parte de los siguientes grupos", + "integration": "Integración", + "scene": "Parte de las siguientes escenas", + "script": "Parte de los siguientes scripts" + }, "relative_time": { "duration": { "day": "{count} {count, plural,\n one {día}\n other {días}\n}", @@ -576,7 +605,9 @@ "title": "Opciones del sistema" }, "confirmation": { - "cancel": "Cancelar" + "cancel": "Cancelar", + "ok": "De acuerdo", + "title": "¿Está seguro?" }, "domain_toggler": { "title": "Alternar dominios" @@ -585,7 +616,16 @@ "control": "Controlar", "dismiss": "Descartar", "editor": { - "name": "Sustituir nombre" + "confirm_delete": "¿Está seguro de que desea eliminar esta entrada?", + "delete": "ELIMINAR", + "enabled_cause": "Deshabilitado por {cause}.", + "enabled_description": "Las entidades deshabilitadas no serán agregadas a Home Assistant.", + "enabled_label": "Habilitar entidad", + "entity_id": "Identificación de la entidad", + "name": "Sustituir nombre", + "note": "Nota: esto podría no funcionar todavía con todas las integraciones.", + "unavailable": "Esta entidad no está disponible actualmente.", + "update": "ACTUALIZAR" }, "related": "Relacionado", "settings": "Configuraciones" @@ -597,6 +637,7 @@ }, "more_info_control": { "dismiss": "Descartar diálogo", + "edit": "Editar entidad", "restored": { "confirm_remove_text": "¿Está seguro de que desea eliminar esta entidad?", "confirm_remove_title": "¿Eliminar entidad?", @@ -605,7 +646,8 @@ "remove_intro": "Si la entidad ya no está en uso, puede limpiarla eliminándola." }, "script": { - "last_action": "Última acción" + "last_action": "Última acción", + "last_triggered": "Última activación" }, "settings": "Configuración de la entidad", "sun": { @@ -635,7 +677,9 @@ "did_not_hear": "Home Assistant no escuchó nada", "error": "¡Vaya! Se ha producido un error.", "found": "Encontré lo siguiente para ti:", - "how_can_i_help": "¿Cómo puedo ayudar?" + "how_can_i_help": "¿Cómo puedo ayudar?", + "label": "Escriba una pregunta y presione 'Entrar'", + "label_voice": "Escriba y presione 'Entrar' o toque el micrófono para hablar" }, "zha_device_info": { "buttons": { @@ -643,6 +687,9 @@ "reconfigure": "Reconfigurar dispositivo", "remove": "Eliminar dispositivo" }, + "confirmations": { + "remove": "¿Está seguro de que desea eliminar el dispositivo?" + }, "last_seen": "Visto por última vez", "manuf": "por {manufacturer}", "no_area": "Sin área", @@ -682,7 +729,8 @@ "entity_turned_off": "Apagado {entity}.", "entity_turned_on": "Encendido {entity}.", "service_call_failed": "Error al llamar al servicio {service} .", - "service_called": "Servicio {service} llamado." + "service_called": "Servicio {service} llamado.", + "triggered": "{name} activado" }, "panel": { "config": { @@ -733,6 +781,9 @@ "label": "Retrasar" }, "device_id": { + "extra_fields": { + "code": "Código" + }, "label": "Dispositivo" }, "event": { @@ -841,6 +892,8 @@ "type": { "device": { "extra_fields": { + "above": "Por encima de", + "below": "Por debajo de", "for": "Duración" }, "label": "Dispositivo" @@ -922,6 +975,7 @@ "picker": { "add_automation": "Agregar automatización", "delete_automation": "Eliminar automatización", + "delete_confirm": "¿Está seguro de que desea eliminar esta automatización?", "edit_automation": "Editar automatización", "header": "Editor de automatizaciones", "introduction": "El editor de automatización le permite crear y editar automatizaciones. Siga el enlace a continuación para leer las instrucciones y asegurarse de que haya configurado Home Assistant correctamente.", @@ -935,31 +989,56 @@ "cloud": { "account": { "alexa": { + "config_documentation": "Documentación de configuración", "disable": "deshabilitar", "enable": "habilitar", + "enable_ha_skill": "Habilitar la habilidad Home Assistant para Alexa", + "enable_state_reporting": "Habilitar informes de estado", + "info": "Con la integración de Alexa para Home Assistant Cloud, podrá controlar todos sus dispositivos Home Assistant a través de cualquier dispositivo habilitado para Alexa.", + "info_state_reporting": "Si habilita los informes de estado, Home Assistant enviará todos los cambios de estado de las entidades expuestas a Amazon. Esto le permite ver siempre los últimos estados en la aplicación Alexa y usar los cambios de estado para crear rutinas.", "manage_entities": "Administrar entidades", + "state_reporting_error": "No se puede {enable_disable} informar el estado.", "sync_entities": "Sincronizar entidades", + "sync_entities_error": "Error al sincronizar entidades:", "title": "Alexa" }, "connected": "Conectado", + "connection_status": "Estado de la conexión en la nube", "fetching_subscription": "Obteniendo suscripción ...", "google": { "config_documentation": "Documentación de configuración", "devices_pin": "Pin de dispositivos de seguridad", + "enable_ha_skill": "Activar la habilidad Home Assistant para Google Assistant", "enable_state_reporting": "Habilitar informes de estado", "enter_pin_error": "No se puede guardar el pin:", "enter_pin_hint": "Ingrese un PIN para usar dispositivos de seguridad", "enter_pin_info": "Ingrese un pin para interactuar con los dispositivos de seguridad. Los dispositivos de seguridad son puertas, puertas de garaje y cerraduras. Se le pedirá que diga/ingrese este pin cuando interactúe con dichos dispositivos a través del Asistente de Google.", + "info": "Con la integración de Google Assistant para Home Assistant Cloud, podrá controlar todos sus dispositivos Home Assistant a través de cualquier dispositivo habilitado para Google Assistant.", + "info_state_reporting": "Si habilita los informes estatales, Home Assistant enviará todos los cambios de estado de las entidades expuestas a Google. Esto le permite ver siempre los últimos estados en la aplicación Google.", "manage_entities": "Administrar entidades", "security_devices": "Dispositivos de seguridad", "sync_entities": "Sincronizar entidades con Google", + "sync_entities_404_message": "No se pudo sincronizar las entidades con Google, pida a Google 'Hey Google, sincronizar mis dispositivos' para sincronizar sus entidades.", "title": "Asistente de Google" }, "integrations": "Integraciones", + "integrations_introduction": "Las integraciones para Home Assistant Cloud le permiten conectarse con servicios en la nube sin tener que exponer su instancia de Home Assistant públicamente en Internet.", + "integrations_introduction2": "Consulte el sitio web para", "integrations_link_all_features": "todas las funciones disponibles", "manage_account": "Administrar cuenta", "nabu_casa_account": "Cuenta de Nabu Casa", "not_connected": "No conectado", + "remote": { + "access_is_being_prepared": "Se está preparando el acceso remoto. Le notificaremos cuando esté listo.", + "certificate_info": "Información del certificado", + "info": "Home Assistant Cloud proporciona una conexión remota segura a su instancia mientras está fuera de casa.", + "instance_is_available": "Su instancia está disponible en", + "instance_will_be_available": "Su instancia estará disponible en", + "link_learn_how_it_works": "Aprenda cómo funciona", + "title": "Control remoto" + }, + "sign_out": "Cerrar sesión", + "thank_you_note": "Gracias por ser parte de Home Assistant Cloud. Gracias a personas como usted, podemos hacer una gran experiencia de automatización del hogar para todos. ¡Gracias!", "webhooks": { "disable_hook_error_msg": "Error al deshabilitar el webhook:", "info": "Cualquier cosa que esté configurada para ser activada por un webhook puede recibir una URL de acceso público para permitirle enviar datos a Home Assistant desde cualquier lugar, sin exponer su instancia a Internet.", @@ -992,12 +1071,24 @@ "will_be_auto_renewed": "Se renovará automáticamente" }, "dialog_cloudhook": { + "available_at": "El webhook está disponible en la siguiente url:", "close": "Cerrar", "confirm_disable": "¿Está seguro de que desea deshabilitar este webhook?", "copied_to_clipboard": "Copiado al portapapeles", "info_disable_webhook": "Si ya no desea utilizar este webhook, puede", "link_disable_webhook": "deshabilitarlo", - "view_documentation": "Ver documentación" + "managed_by_integration": "Este webhook es administrado por una integración y no se puede deshabilitar.", + "view_documentation": "Ver documentación", + "webhook_for": "Webhook para {name}" + }, + "forgot_password": { + "check_your_email": "Consulte su correo electrónico para obtener instrucciones sobre cómo restablecer su contraseña.", + "email": "Correo electrónico", + "email_error_msg": "Correo electrónico no válido", + "instructions": "Ingrese su dirección de correo electrónico y le enviaremos un enlace para restablecer su contraseña.", + "send_reset_email": "Enviar correo electrónico de restablecimiento", + "subtitle": "Olvidó su contraseña", + "title": "Olvidé la contraseña" }, "google": { "banner": "La edición de las entidades expuestas a través de esta interfaz de usuario está deshabilitada porque ha configurado filtros de entidad en configuration.yaml.", @@ -1009,24 +1100,51 @@ "title": "Asistente de Google" }, "login": { + "alert_email_confirm_necessary": "Debe confirmar su correo electrónico antes de iniciar sesión.", + "alert_password_change_required": "Debe cambiar su contraseña antes de iniciar sesión.", "dismiss": "Descartar", "email": "Correo electrónico", + "email_error_msg": "Correo electrónico no válido", + "forgot_password": "¿Olvidó la contraseña?", + "introduction": "Home Assistant Cloud le proporciona una conexión remota segura a su instancia mientras está fuera de casa. También le permite conectarse con servicios solo en la nube: Amazon Alexa y Google Assistant.", + "introduction2": "Este servicio está a cargo de nuestro socio.", "introduction2a": ", una compañía fundada por los fundadores de Home Assistant y Hass.io.", + "introduction3": "Home Assistant Cloud es un servicio de suscripción con una prueba gratuita de un mes. No se necesita información de pago.", "learn_more_link": "Obtenga más información sobre Home Assistant Cloud", "password": "Contraseña", - "title": "Inicio de sesión en la nube" + "password_error_msg": "Las contraseñas tienen al menos 8 caracteres.", + "sign_in": "Registrarse", + "start_trial": "Comience su prueba gratuita de 1 mes", + "title": "Inicio de sesión en la nube", + "trial_info": "No se necesita información de pago" }, "register": { + "account_created": "¡Cuenta creada! Consulta tu correo electrónico para obtener instrucciones sobre cómo activar tu cuenta.", "create_account": "Crear una cuenta", "email_address": "Dirección de correo electrónico", "email_error_msg": "Correo electrónico no válido", + "feature_amazon_alexa": "Integración con Amazon Alexa", "feature_google_home": "Integración con el Asistente de Google", "feature_remote_control": "Control de Home Assistant fuera de casa", + "feature_webhook_apps": "Fácil integración con aplicaciones basadas en webhook como OwnTracks", + "headline": "Comience su prueba gratuita", + "information": "Cree una cuenta para comenzar su prueba gratuita de un mes con Home Assistant Cloud. No se necesita información de pago.", + "information2": "La versión de prueba le dará acceso a todos los beneficios de Home Assistant Cloud, incluyendo:", + "information3": "Este servicio está a cargo de nuestro socio.", "information3a": ", una compañía fundada por los fundadores de Home Assistant y Hass.io.", "information4": "Al registrar una cuenta, usted acepta los siguientes términos y condiciones.", "link_privacy_policy": "Política de privacidad", "link_terms_conditions": "Términos y Condiciones", - "password": "Contraseña" + "password": "Contraseña", + "password_error_msg": "Las contraseñas tienen al menos 8 caracteres.", + "resend_confirm_email": "Reenviar correo electrónico de confirmación", + "start_trial": "Iniciar prueba", + "title": "Registrar cuenta" + } + }, + "common": { + "editor": { + "confirm_unsaved": "Tiene cambios sin guardar. ¿Está seguro que quiere salir?" } }, "core": { @@ -1037,6 +1155,7 @@ "core_config": { "edit_requires_storage": "Editor desactivado porque config está almacenado en configuration.yaml.", "elevation": "Elevación", + "elevation_feet": "pies", "elevation_meters": "metros", "imperial_example": "Fahrenheit, libras", "latitude": "Latitud", @@ -1078,13 +1197,21 @@ } }, "customize": { + "attributes_customize": "Los siguientes atributos ya están establecidos en customize.yaml", + "attributes_not_set": "Los siguientes atributos no fueron establecidos. Ajústelos si lo desea", "attributes_outside": "Los siguientes atributos están personalizados desde fuera de customize.yaml", + "attributes_override": "Puede sobrescribirlos si lo desea", "attributes_set": "Los siguientes atributos de la entidad se establecen mediante programación.", "caption": "Personalización", "description": "Personaliza tus entidades", + "pick_attribute": "Elija un atributo para sobrescribir", "picker": { "header": "Personalización", "introduction": "Ajustar los atributos por entidad. Las personalizaciones agregadas/editadas tendrán efecto inmediatamente. Las personalizaciones eliminadas entrarán en vigor cuando se actualice la entidad." + }, + "warning": { + "include_link": "incluir customize.yaml", + "include_sentence": "Parece que tu configuration.yaml no funciona correctamente" } }, "devices": { @@ -1116,6 +1243,11 @@ "description": "Administrar dispositivos conectados", "details": "Aquí están todos los detalles de su dispositivo.", "device_not_found": "Dispositivo no encontrado.", + "entities": { + "add_entities_lovelace": "Agregar a Lovelace", + "entities": "Entidades", + "none": "Este dispositivo no tiene entidades" + }, "info": "Información del dispositivo", "name": "Nombre", "scene": { @@ -1152,16 +1284,44 @@ "update": "ACTUALIZAR" }, "picker": { + "disable_selected": { + "button": "Deshabilitar selección", + "confirm_text": "Las entidades deshabilitadas no serán agregadas a Home Assistant.", + "confirm_title": "¿Desea deshabilitar {number} entidades?" + }, + "enable_selected": { + "button": "Habilitar selección", + "confirm_text": "Esto los hará disponibles en Home Assistant nuevamente si ahora están deshabilitados.", + "confirm_title": "¿Desea habilitar {number} entidades?" + }, + "filter": { + "filter": "Filtrar", + "show_disabled": "Mostrar entidades deshabilitadas", + "show_unavailable": "Mostrar entidades no disponibles" + }, "header": "Registro de entidades", "headers": { "enabled": "Habilitado", + "entity_id": "Identificación de la entidad", "integration": "Integración", - "name": "Nombre" + "name": "Nombre", + "status": "Estado" }, "integrations_page": "Página de integraciones", "introduction": "Home Assistant mantiene un registro de todas las entidades que ha visto y que pueden identificarse de manera única. Cada una de estas entidades tendrá un ID de entidad asignado que se reservará solo para esta entidad.", "introduction2": "Utilice el registro de la entidad para reemplazar el nombre, cambiar el ID de la entidad o eliminar la entrada de Home Assistant. Tenga en cuenta que eliminar la entrada del registro de la entidad no eliminará la entidad. Para hacerlo, siga el enlace a continuación y elimínelo de la página de integraciones.", + "remove_selected": { + "button": "Eliminar selección", + "confirm_text": "Las entidades sólo pueden ser eliminadas cuando la integración ya no las proporciona.", + "confirm_title": "¿Desea eliminar {number} entidades?" + }, + "selected": "{number} seleccionadas", "show_disabled": "Mostrar entidades deshabilitadas", + "status": { + "disabled": "Deshabilitado", + "ok": "Correcto", + "unavailable": "No disponible" + }, "unavailable": "(no disponible)" } }, @@ -1169,6 +1329,8 @@ "integrations": { "caption": "Integraciones", "config_entry": { + "area": "En {area}", + "delete_button": "Eliminar {integration}", "delete_confirm": "¿Estás seguro de que quieres eliminar esta integración?", "device_unavailable": "dispositivo no disponible", "entity_unavailable": "entidad no disponible", @@ -1179,6 +1341,8 @@ "no_device": "Entidades sin dispositivos", "no_devices": "Esta integración no tiene dispositivos.", "restart_confirm": "Reinicie Home Assistant para terminar de eliminar esta integración.", + "settings_button": "Editar configuración para {integration}", + "system_options_button": "Opciones del sistema para {integration}", "via": "Conectado a través de" }, "config_flow": { @@ -1187,6 +1351,7 @@ "area_picker_label": "Área", "close": "Cerrar", "created_config": "Configuración creada para {name}.", + "dismiss": "Descartar diálogo", "error_saving_area": "Error al guardar el área: {error}", "external_step": { "description": "Este paso requiere que visites un sitio web externo para ser completado.", @@ -1217,12 +1382,16 @@ }, "integration_not_found": "Integración no encontrada.", "new": "Configurar una nueva integración.", - "none": "No hay nada configurado" + "none": "No hay nada configurado", + "note_about_integrations": "No todas las integraciones se pueden configurar a través de la interfaz de usuario.", + "note_about_website_reference": "Hay más disponibles en " }, "introduction": "Aquí es posible configurar sus componentes y Home Assistant. Todavía no es posible configurar todo desde la interfaz de usuario, pero estamos trabajando en ello.", "person": { "add_person": "Agregar persona", "caption": "Personas", + "confirm_delete": "¿Está seguro de que desea eliminar a esta persona?", + "confirm_delete2": "Todos los dispositivos que pertenecen a esta persona quedarán sin asignar.", "create_person": "Crear persona", "description": "Gestiona las personas que rastrea Home Assistant.", "detail": { @@ -1232,12 +1401,17 @@ "device_tracker_pick": "Elegir dispositivo para rastrear", "device_tracker_picked": "Dispositivo de seguimiento", "link_integrations_page": "Página de integraciones", + "link_presence_detection_integrations": "Integraciones de detección de presencia", "linked_user": "Usuario vinculado", "name": "Nombre", + "name_error_msg": "Se requiere el nombre", "new_person": "Nueva persona", + "no_device_tracker_available_intro": "Cuando tenga dispositivos que indiquen la presencia de una persona, podrá asignarlos a una persona aquí. Puede agregar su primer dispositivo agregando una integración de detección de presencia desde la página de integraciones.", "update": "Actualizar" }, - "no_persons_created_yet": "Parece que todavía no has creado ninguna persona." + "introduction": "Aquí puede definir cada persona de interés en Home Assistant.", + "no_persons_created_yet": "Parece que todavía no has creado ninguna persona.", + "note_about_persons_configured_in_yaml": "Nota: las personas configuradas a través de configuration.yaml no se pueden editar a través de la interfaz de usuario." }, "scene": { "activated": "Escena activada {name}.", @@ -1285,14 +1459,23 @@ "description": "Crear y editar scripts", "editor": { "alias": "Nombre", + "default_name": "Nuevo script", + "delete_confirm": "¿Está seguro de que desea eliminar este script?", "delete_script": "Eliminar script", + "header": "Script: {name}", "introduction": "Use scripts para ejecutar una secuencia de acciones.", "link_available_actions": "Obtenga más información sobre las acciones disponibles.", + "load_error_not_editable": "Solo los scripts dentro de scripts.yaml son editables.", "sequence": "Secuencia", "sequence_sentence": "La secuencia de acciones de este script." }, "picker": { + "add_script": "Agregar script", "edit_script": "Editar script", + "header": "Editor de scripts", + "introduction": "El editor de scripts le permite crear y editar scripts. Por favor, siga el siguiente enlace para leer las instrucciones para asegurarse de que ha configurado Home Assistant correctamente.", + "learn_more": "Aprenda más sobre los scripts", + "no_scripts": "No pudimos encontrar ningún script editable", "trigger_script": "Desencadenar script" } }, @@ -1340,12 +1523,22 @@ "description": "Administrar usuarios", "editor": { "activate_user": "Activar usuario", + "active": "Activo", "caption": "Ver usuario", "change_password": "Cambiar contraseña", + "confirm_user_deletion": "¿Está seguro de que desea eliminar el {name}?", "deactivate_user": "Desactivar usuario", "delete_user": "Eliminar usuario", + "enter_new_name": "Ingrese un nuevo nombre", + "group": "Grupo", "group_update_failed": "La actualización del grupo falló:", - "rename_user": "Renombrar usuario" + "id": "Identificación", + "owner": "Propietario", + "rename_user": "Renombrar usuario", + "system_generated": "Generado por el sistema", + "system_generated_users_not_removable": "No se pueden eliminar los usuarios generados por el sistema.", + "unnamed_user": "Usuario sin nombre", + "user_rename_failed": "El cambio de nombre del usuario falló:" }, "picker": { "system_generated": "Generado por el sistema", @@ -1356,6 +1549,7 @@ "add_device_page": { "discovery_text": "Los dispositivos descubiertos se mostrarán aquí. Siga las instrucciones para su(s) dispositivo(s) y coloque el(los) dispositivo(s) en modo de emparejamiento.", "header": "Automatización del hogar Zigbee - Agregar dispositivos", + "search_again": "Buscar de nuevo", "spinner": "Buscando dispositivos ZHA Zigbee ..." }, "add": { @@ -1387,7 +1581,9 @@ }, "common": { "add_devices": "Agregar dispositivos", - "devices": "Dispositivos" + "clusters": "Clústeres", + "devices": "Dispositivos", + "value": "Valor" }, "description": "Gestión de red de Zigbee Home Automation", "device_card": { @@ -1401,17 +1597,29 @@ "groups": { "add_members": "Agregar miembros", "adding_members": "Agregando miembros", + "caption": "Grupos", "create": "Crear grupo", "create_group": "Zigbee Home Automation - Crear grupo", "create_group_details": "Ingrese los detalles requeridos para crear un nuevo grupo zigbee", "creating_group": "Creando grupo", + "description": "Crear y modificar grupos Zigbee", "group_details": "Aquí están todos los detalles para el grupo Zigbee seleccionado.", + "group_id": "Identificación del grupo", "group_info": "Información del grupo", "group_name_placeholder": "Nombre del grupo", "group_not_found": "¡Grupo no encontrado!", + "group-header": "Zigbee Home Automation - Detalles del grupo", + "groups": "Grupos", + "groups-header": "Zigbee Home Automation - Administración de grupos", + "header": "Zigbee Home Automation - Administración de grupos", + "introduction": "Crear y modificar grupos zigbee", + "manage_groups": "Administrar grupos Zigbee", + "members": "Miembros", + "remove_groups": "Eliminar grupos", "remove_members": "Eliminar miembros", "removing_groups": "Eliminando grupos", - "removing_members": "Eliminando miembros" + "removing_members": "Eliminando miembros", + "zha_zigbee_groups": "Grupos ZHA Zigbee" }, "header": "Configurar Zigbee Home Automation", "introduction": "Aquí es posible configurar el componente ZHA. Todavía no es posible configurar todo desde la interfaz de usuario, pero estamos trabajando en ello.", @@ -1569,16 +1777,27 @@ }, "mqtt": { "description_publish": "Publicar un paquete", + "listening_to": "Escuchando a", + "message_received": "Mensaje {id} recibido el {topic} a las {time} :", "publish": "Publicar", - "title": "" + "start_listening": "Comenzar a escuchar", + "stop_listening": "Deja de escuchar", + "subscribe_to": "Tema para suscribirse", + "title": "", + "topic": "tema" }, "services": { + "alert_parsing_yaml": "Error al analizar YAML: {data}", + "call_service": "Llamar al Servico", "column_description": "Descripción", "column_example": "Ejemplo", "column_parameter": "Parámetro", + "data": "Datos de servicio (YAML, opcional)", + "description": "La herramienta de desarrollo de servicios le permite llamar a cualquier servicio disponible en Home Assistant.", "fill_example_data": "Rellenar datos de ejemplo", "no_description": "No hay descripción disponible.", "no_parameters": "Este servicio no toma parámetros.", + "select_service": "Seleccione un servicio para ver la descripción", "title": "Servicios" }, "states": { @@ -1589,6 +1808,8 @@ "copy_entity_id": "Copiar ID", "copy_entity_state": "Copiar estado", "current_entities": "Entidades actuales", + "description1": "Establecer la representación de un dispositivo dentro de Home Assistant.", + "description2": "Esto no se comunicará con el dispositivo real.", "entity": "Entidad", "filter_attributes": "Filtrar atributos", "filter_entities": "Filtrar entidades", @@ -1605,7 +1826,8 @@ "editor": "Editor de plantillas", "jinja_documentation": "Documentación de plantillas Jinja2", "template_extensions": "Extensiones de plantilla de Home Assistant", - "title": "Plantillas" + "title": "Plantillas", + "unknown_error_template": "Error desconocido al mostrar la plantilla" } } }, @@ -1625,11 +1847,15 @@ "yaml_unsupported": "No puede usar esta función cuando usa Lovelace UI en modo YAML." }, "cards": { + "confirm_delete": "¿Está seguro de que desea eliminar esta tarjeta?", "empty_state": { "go_to_integrations_page": "Ir a la página de integraciones.", "no_devices": "Esta página le permite controlar sus dispositivos, sin embargo, parece que aún no tiene dispositivos configurados. Dirígete a la página de integraciones para empezar.", "title": "Bienvenido a casa" }, + "entities": { + "never_triggered": "Nunca activado" + }, "picture-elements": { "call_service": "Servicio de llamadas {name}", "hold": "Mantener:", @@ -1666,7 +1892,8 @@ "required": "Requerido" }, "entities": { - "name": "Entidades" + "name": "Entidades", + "toggle": "Alternar entidades." }, "entity-button": { "name": "Botón de entidad" @@ -1685,6 +1912,7 @@ "generic": { "aspect_ratio": "Relación de aspecto", "camera_image": "Entidad de la cámara", + "camera_view": "Vista de la cámara", "entities": "Entidades", "entity": "Entidad", "icon": "Icono", @@ -1705,6 +1933,12 @@ "glance": { "columns": "Columnas" }, + "history-graph": { + "name": "Gráfico histórico" + }, + "horizontal-stack": { + "name": "Pila horizontal" + }, "iframe": { "name": "iFrame" }, @@ -1721,6 +1955,15 @@ "markdown": { "content": "Contenido" }, + "media-control": { + "name": "Control multimedia" + }, + "picture-elements": { + "name": "Elementos de imagen" + }, + "picture-entity": { + "name": "Entidad de imagen" + }, "picture": { "name": "Imagen" }, @@ -1731,6 +1974,19 @@ "graph_detail": "Detalle del gráfico", "graph_type": "Tipo de gráfico", "name": "Sensor" + }, + "shopping-list": { + "integration_not_loaded": "Esta tarjeta requiere que se configure la integración `shopping_list`.", + "name": "Lista de la compra" + }, + "thermostat": { + "name": "Termostato" + }, + "vertical-stack": { + "name": "Pila vertical" + }, + "weather-forecast": { + "name": "Pronóstico del tiempo" } }, "edit_card": { @@ -1824,6 +2080,7 @@ "title": "Entidades no utilizadas" }, "views": { + "confirm_delete": "¿Está seguro de que desea eliminar esta vista?", "existing_cards": "No puede eliminar una vista que tiene tarjetas. Elimine las cartas primero." }, "warning": { @@ -2010,6 +2267,7 @@ }, "profile": { "advanced_mode": { + "description": "Desbloquear funciones avanzadas.", "link_promo": "Más información", "title": "Modo avanzado" }, @@ -2033,6 +2291,8 @@ "link_promo": "Ayuda a traducir" }, "logout": "Cerrar sesión", + "logout_text": "¿Seguro que quiere cerrar sesión?", + "logout_title": "¿Cerrar sesión?", "long_lived_access_tokens": { "confirm_delete": "¿Está seguro de que desea eliminar el token de acceso para {name}?", "create": "Crear Token", @@ -2099,7 +2359,8 @@ }, "sidebar": { "external_app_configuration": "Configuración de la aplicación", - "log_out": "Cerrar sesión" + "log_out": "Cerrar sesión", + "sidebar_toggle": "Alternar barra lateral" } } } \ No newline at end of file diff --git a/translations/es.json b/translations/es.json index bbd017ec8a..31ae93775d 100644 --- a/translations/es.json +++ b/translations/es.json @@ -1684,7 +1684,7 @@ "required_error_msg": "Este campo es obligatorio", "update": "Actualizar" }, - "edit_home_zone": "Es posible modificar la ubicación de tu casa en la configuración general", + "edit_home_zone": "La ubicación de tu casa se puede cambiar en la configuración general.", "introduction": "Las zonas permiten especificar determinadas regiones de la tierra. Cuando una persona está dentro de una zona, su estado tomará el nombre de la zona. Las zonas también se pueden utilizar como desencadenante o condición dentro de las configuraciones de automatización.", "no_zones_created_yet": "Parece que aún no has creado ninguna zona." }, From a95290235dddf70d33852bc101f838d5a3823cab Mon Sep 17 00:00:00 2001 From: Ruslan Sayfutdinov Date: Wed, 12 Feb 2020 01:29:35 +0000 Subject: [PATCH 59/64] [logbook] fix margins for RTL languages (#4852) --- src/panels/logbook/ha-panel-logbook.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/panels/logbook/ha-panel-logbook.js b/src/panels/logbook/ha-panel-logbook.js index fec08c58cc..c0a1a66133 100644 --- a/src/panels/logbook/ha-panel-logbook.js +++ b/src/panels/logbook/ha-panel-logbook.js @@ -64,6 +64,11 @@ class HaPanelLogbook extends LocalizeMixin(PolymerElement) { margin-right: 16px; } + :host([rtl]) vaadin-date-picker { + margin-right: 0; + margin-left: 16px; + } + paper-dropdown-menu { max-width: 100px; margin-right: 16px; @@ -74,6 +79,8 @@ class HaPanelLogbook extends LocalizeMixin(PolymerElement) { :host([rtl]) paper-dropdown-menu { text-align: right; + margin-right: 0; + margin-left: 16px; } paper-item { From 4cdc4765f7d68868a35289f970e60c06a22d9446 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 12 Feb 2020 13:47:56 +0100 Subject: [PATCH 60/64] Fix tap firing twice on iOS (#4841) --- src/panels/lovelace/cards/hui-entity-button-card.ts | 6 ++++-- .../lovelace/common/directives/action-handler-directive.ts | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/panels/lovelace/cards/hui-entity-button-card.ts b/src/panels/lovelace/cards/hui-entity-button-card.ts index c6cccaadb8..707e4f60ed 100644 --- a/src/panels/lovelace/cards/hui-entity-button-card.ts +++ b/src/panels/lovelace/cards/hui-entity-button-card.ts @@ -138,7 +138,10 @@ class HuiEntityButtonCard extends LitElement implements LovelaceCard { hasDoubleClick: hasAction(this._config!.double_tap_action), })} tabindex=${ifDefined( - hasAction(this._config.tap_action) ? "0" : undefined + hasAction(this._config.tap_action) || + this._config.tap_action === undefined + ? "0" + : undefined )} > ${this._config.show_icon @@ -203,7 +206,6 @@ class HuiEntityButtonCard extends LitElement implements LovelaceCard { ha-card:focus { outline: none; - background: var(--divider-color); } ha-icon { diff --git a/src/panels/lovelace/common/directives/action-handler-directive.ts b/src/panels/lovelace/common/directives/action-handler-directive.ts index 87c5168019..a4e3a2b1ac 100644 --- a/src/panels/lovelace/common/directives/action-handler-directive.ts +++ b/src/panels/lovelace/common/directives/action-handler-directive.ts @@ -177,7 +177,7 @@ class ActionHandler extends HTMLElement implements ActionHandler { } else { fireEvent(element, "action", { action: "tap" }); } - window.setTimeout(() => (this.touch = undefined), 100); + window.setTimeout(() => (this.touch = undefined), this.holdTime); }; element.addEventListener("touchstart", touchStart, { passive: true }); From c5aa000a97db71d731d3adca8342b4bd35db7c0c Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 12 Feb 2020 13:48:27 +0100 Subject: [PATCH 61/64] Check for null target_temp (#4842) Fixes #4359 --- src/dialogs/more-info/controls/more-info-climate.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/dialogs/more-info/controls/more-info-climate.ts b/src/dialogs/more-info/controls/more-info-climate.ts index 7837536d14..bb1a4b2275 100644 --- a/src/dialogs/more-info/controls/more-info-climate.ts +++ b/src/dialogs/more-info/controls/more-info-climate.ts @@ -100,7 +100,8 @@ class MoreInfoClimate extends LitElement {
` : ""} - ${stateObj.attributes.temperature !== undefined + ${stateObj.attributes.temperature !== undefined && + stateObj.attributes.temperature !== null ? html` ` : ""} - ${stateObj.attributes.target_temp_low !== undefined || - stateObj.attributes.target_temp_high !== undefined + ${(stateObj.attributes.target_temp_low !== undefined && + stateObj.attributes.target_temp_low !== null) || + (stateObj.attributes.target_temp_high !== undefined && + stateObj.attributes.target_temp_high !== null) ? html` Date: Wed, 12 Feb 2020 13:48:51 +0100 Subject: [PATCH 62/64] Hide zone edit button for non admins (#4840) --- src/panels/map/ha-panel-map.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/panels/map/ha-panel-map.js b/src/panels/map/ha-panel-map.js index 3fbf540354..1c083e4199 100644 --- a/src/panels/map/ha-panel-map.js +++ b/src/panels/map/ha-panel-map.js @@ -35,7 +35,7 @@ class HaPanelMap extends LocalizeMixin(PolymerElement) {
[[localize('panel.map')]]
-