From a0b5bc54562c212e2a1415ddfd5f2ee6558db495 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Fri, 2 Apr 2021 00:48:47 +0000 Subject: [PATCH 1/6] Translation update --- translations/frontend/bg.json | 97 +++++++++++++++++++++++++++-------- translations/frontend/ca.json | 6 +++ translations/frontend/de.json | 5 ++ translations/frontend/it.json | 3 ++ translations/frontend/ko.json | 12 +++-- translations/frontend/nl.json | 62 +++++++++++----------- translations/frontend/ru.json | 30 +++++------ 7 files changed, 145 insertions(+), 70 deletions(-) diff --git a/translations/frontend/bg.json b/translations/frontend/bg.json index e6b02b1d4b..aa56a3b53d 100644 --- a/translations/frontend/bg.json +++ b/translations/frontend/bg.json @@ -640,6 +640,8 @@ "today": "Днес" }, "data-table": { + "filtering_by": "Филтриране по", + "hidden": "{number} скрити", "no-data": "Няма данни", "search": "Търсене" }, @@ -745,6 +747,12 @@ "label": "Снимка", "unsupported_format": "Неподдържан формат, моля, изберете JPEG, PNG или GIF изображение." }, + "related-filter-menu": { + "filter_by_area": "Филтриране по област", + "filter_by_device": "Филтриране по устройство", + "filtered_by_area": "област: {area_name}", + "filtered_by_device": "устройство: {device_name}" + }, "related-items": { "area": "Област", "automation": "Част от следните автоматизации", @@ -1046,6 +1054,7 @@ }, "errors": { "config": { + "edit_in_yaml_supported": "Все още можете да редактирате вашата конфигурация в YAML.", "error_detected": "Открити са грешки в конфигурацията", "key_missing": "Липсва задължителният ключ \"{key}\".", "no_template_editor_support": "Шаблоните не се поддържат във визуалния редактор" @@ -1076,6 +1085,7 @@ "devices": "Устройства" }, "delete": { + "confirmation_text": "Всички устройства в тази област ще станат неназначени.", "confirmation_title": "Сигурни ли сте, че искате да изтриете тази област?" }, "description": "Групирайте устройствата и обектите в области", @@ -1225,6 +1235,7 @@ "above": "Над", "below": "Под", "for": "Продължителност", + "hvac_mode": "HVAC режим", "preset_mode": "Предварително зададен режим" }, "label": "Устройство" @@ -1413,8 +1424,8 @@ "delete_automation": "Изтрийте автоматизацията", "delete_confirm": "Наистина ли искате да изтриете тази автоматизация?", "duplicate": "Дублиране", - "duplicate_automation": "Дублиране на автоматизация", - "edit_automation": "Редактиране на автоматизация", + "duplicate_automation": "Дублиране на автоматизацията", + "edit_automation": "Редактиране на автоматизацията", "header": "Редактор на автоматизации", "headers": { "name": "Име" @@ -1458,7 +1469,7 @@ "add_blueprint": "Импортирайте план", "confirm_delete_header": "Да се изтрие ли този план?", "confirm_delete_text": "Наистина ли искате да изтриете този план?", - "delete_blueprint": "Изтриване на план", + "delete_blueprint": "Изтриване на плана", "discover_more": "Открийте още планове", "header": "Редактор на планове", "headers": { @@ -1485,6 +1496,7 @@ "config_documentation": "Документация за конфигурацията", "devices_pin": "ПИН код за Устройства за защита", "enter_pin_hint": "Въведете ПИН за използване на устройства за защита", + "not_configured_title": "Google Assistant не е активиран", "security_devices": "Устройства за защита", "title": "Google Assistant" }, @@ -1608,6 +1620,27 @@ "description": "Променете общите настройки на Home Assistant", "section": { "core": { + "analytics": { + "header": "Анализи", + "learn_more": "Научете повече за това как ще бъдат обработени вашите данни.", + "needs_base": "Трябва да активирате базовия анализ, за да бъде налична тази опция", + "preference": { + "base": { + "title": "Базов анализ" + }, + "diagnostics": { + "description": "Споделяйте доклади за сривове и диагностична информация", + "title": "Диагностика" + }, + "usage_supervisor": { + "title": "Използвани интеграции и добавки" + }, + "usage": { + "description": "Това включва имената на вашите интеграции", + "title": "Използвани интеграции" + } + } + }, "core_config": { "edit_requires_storage": "Редакторът е деактивиран, защото конфигурацията е съхранена в configuration.yaml.", "elevation": "Надморска височина", @@ -1657,7 +1690,7 @@ "no_conditions": "Няма условия", "unknown_condition": "Неизвестно условие" }, - "create": "Създаване на автоматизация с устройство", + "create": "Създаване на автоматизация с устройството", "create_disable": "Не може да се създаде автоматизация с деактивирано устройство", "no_automations": "Няма автоматизации", "no_device_automations": "Няма налични автоматизации за това устройство.", @@ -1704,14 +1737,14 @@ "search": "Търсене на устройства" }, "scene": { - "create": "Създаване на сцена с устройство", + "create": "Създаване на сцена с устройството", "create_disable": "Не може да се създаде сцена с деактивирано устройство", "no_scenes": "Няма сцени", "scenes": "Сцени" }, "scenes": "Сцени", "script": { - "create": "Създаване на скрипт с устройство", + "create": "Създаване на скрипт с устройството", "create_disable": "Не може да се създаде скрипт с деактивирано устройство", "no_scripts": "Няма скриптове", "scripts": "Скриптове" @@ -1751,7 +1784,8 @@ "search": "Търсене на обекти", "status": { "ok": "ДА", - "readonly": "Само за четене" + "readonly": "Само за четене", + "unavailable": "Недостъпен" } } }, @@ -1785,6 +1819,7 @@ "description": "Версия, състояние на системата и връзки към документация", "documentation": "Документация", "home_assistant_logo": "Лого на Home Assistant", + "icons_by": "Икони от", "integrations": "Интеграции", "license": "Публикувано под лиценза Apache 2.0", "path_configuration": "Път към configuration.yaml: {path}", @@ -1842,7 +1877,8 @@ "open_site": "Отваряне на уеб сайт" }, "loading_first_time": "Моля, изчакайте, докато се инсталира интеграцията", - "not_all_required_fields": "Не всички задължителни полета са попълнени." + "not_all_required_fields": "Не всички задължителни полета са попълнени.", + "not_loaded": "Интеграцията не можа да бъде заредена, опитайте да рестартирате Home Assistant." }, "configure": "Конфигуриране", "configured": "Конфигуриран", @@ -1874,6 +1910,13 @@ "introduction": "Тук е възможно да конфигурирате Вашите компоненти и Home Assistant. Не всичко е възможно да се конфигурира от Интерфейса, но работим по върпоса.", "logs": { "clear": "Изчистване", + "level": { + "critical": "КРИТИЧНО", + "debug": "ДЕБЪГ", + "error": "ГРЕШКА", + "info": "ИНФО", + "warning": "ВНИМАНИЕ" + }, "multiple_messages": "съобщението е възникнало за първи път в {time} и се показва {counter} пъти", "refresh": "Опресняване" }, @@ -2002,7 +2045,7 @@ "description": "Управлявайте хората, които се следят от Home Assistant.", "detail": { "admin": "Администратор", - "allow_login": "Разрешаване на потребителя да се впише", + "allow_login": "Разрешаване на потребителя да се вписва", "confirm_delete_user": "Сигурен ли сте, че искате да изтриете потребителски акаунт {name}? Все още ще можете да проследявате човека, но той, повече няма да може да се вписва.", "create": "Създаване", "delete": "Изтрий", @@ -2048,8 +2091,8 @@ "picker": { "add_scene": "Добавяне на сцена", "delete_confirm": "Сигурни ли сте, че искате да изтриете тази сцена?", - "delete_scene": "Изтриване на сцена", - "edit_scene": "Редактиране на сцена", + "delete_scene": "Изтриване на сцената", + "edit_scene": "Редактиране на сцената", "header": "Редактор на сцени", "headers": { "name": "Име" @@ -2057,7 +2100,7 @@ "learn_more": "Научете повече за сцените", "only_editable": "Само сцени дефинирани в scenes.yaml могат да се редактират.", "pick_scene": "Изберете сцена за редактиране", - "show_info_scene": "Показване на информация за сцена" + "show_info_scene": "Показване на информация за сцената" } }, "script": { @@ -2067,7 +2110,7 @@ "alias": "Име", "default_name": "Нов скрипт", "delete_confirm": "Сигурни ли сте, че искате да изтриете този скрипт?", - "delete_script": "Изтриване на скрипт", + "delete_script": "Изтриване на скрипта", "header": "Скрипт: {name}", "icon": "Икона", "id_already_exists": "Това ID вече съществува", @@ -2086,8 +2129,8 @@ "picker": { "add_script": "Добавяне на скрипт", "duplicate": "Дублиране", - "duplicate_script": "Дублиране на скрипт", - "edit_script": "Редактиране на скрипт", + "duplicate_script": "Дублиране на скрипта", + "edit_script": "Редактиране на скрипта", "headers": { "name": "Име" }, @@ -2140,7 +2183,7 @@ "caption": "Маркери", "confirm_remove": "Наистина ли искате да премахнете маркера {tag}?", "confirm_remove_title": "Премахване на маркера?", - "create_automation": "Създаване на автоматизация с маркер", + "create_automation": "Създаване на автоматизация с маркера", "description": "Задействайте автоматизации при сканиране на NFC етикет, QR код и др", "detail": { "create": "Създаване", @@ -2182,7 +2225,7 @@ "change_password": "Смяна на парола", "confirm_user_deletion": "Наистина ли искате да изтриете {name}?", "deactivate_user": "Деактивиране на потребителя", - "delete_user": "Изтриване на потребител", + "delete_user": "Изтриване на потребителя", "group": "Група", "id": "ID", "name": "Показвано име", @@ -2655,8 +2698,8 @@ "add": "Добавяне на карта", "clear": "Изчистване", "confirm_cancel": "Сигурни ли сте, че искате да отмените?", - "delete": "Изтриване на карта", - "duplicate": "Дублиране на карта", + "delete": "Изтриване на картата", + "duplicate": "Дублиране на картата", "edit": "Редактиране", "header": "Конфигуриране на Карта", "move": "Преместване в изглед", @@ -2672,7 +2715,7 @@ "unsaved_changes": "Имате незапазени промени" }, "edit_lovelace": { - "edit_title": "Редактиране на заглавие", + "edit_title": "Редактиране на заглавието", "explanation": "Това заглавие се показва над всичките ви изгледи в Lovelace", "header": "Заглавие на вашия Lovelace потребителски интерфейс", "title": "Заглавие" @@ -2763,7 +2806,7 @@ }, "menu": { "close": "Затвори", - "configure_ui": "Редактиране на табло", + "configure_ui": "Редактиране на таблото", "help": "Помощ", "reload_resources": "Презареждане на ресурсите" }, @@ -3051,6 +3094,18 @@ "enable": "Активиране", "header": "Модули за много-факторна аутентикация" }, + "number_format": { + "description": "Изберете как да се форматират числата.", + "dropdown_label": "Формат на числата", + "formats": { + "comma_decimal": "1,234,567.89", + "decimal_comma": "1.234.567,89", + "language": "Авто (изп. езикова настройка)", + "none": "Без", + "space_comma": "1 234 567,89" + }, + "header": "Формат на числата" + }, "push_notifications": { "add_device_prompt": { "input_label": "Име на устройството", diff --git a/translations/frontend/ca.json b/translations/frontend/ca.json index 531a1ce134..b9fb65afab 100644 --- a/translations/frontend/ca.json +++ b/translations/frontend/ca.json @@ -1188,6 +1188,9 @@ "zha_device_card": { "device_name_placeholder": "Canvia el nom del dispositiu" } + }, + "zha_reconfigure_device": { + "heading": "S'està reconfigurant el dispositiu" } }, "duration": { @@ -2072,6 +2075,9 @@ "filtering_by": "Filtratge per", "show": "Mostra" }, + "hassio": { + "button": "Configura" + }, "header": "Configuració de Home Assistant", "helpers": { "caption": "Ajudants", diff --git a/translations/frontend/de.json b/translations/frontend/de.json index 1b8ba6e047..41ed38391e 100644 --- a/translations/frontend/de.json +++ b/translations/frontend/de.json @@ -1130,6 +1130,11 @@ "perform_action": "Server {action}", "restart": "Neustarten", "stop": "Stoppen" + }, + "types": { + "navigation": "Navigieren", + "reload": "Neu laden", + "server_control": "Server" } }, "filter_placeholder": "Entitätsfilter" diff --git a/translations/frontend/it.json b/translations/frontend/it.json index 11bfc48666..fd10898af9 100644 --- a/translations/frontend/it.json +++ b/translations/frontend/it.json @@ -1188,6 +1188,9 @@ "zha_device_card": { "device_name_placeholder": "Cambia il nome del dispositivo" } + }, + "zha_reconfigure_device": { + "heading": "Riconfigurazione del dispositivo" } }, "duration": { diff --git a/translations/frontend/ko.json b/translations/frontend/ko.json index f0196ebb02..e40e5a31ea 100644 --- a/translations/frontend/ko.json +++ b/translations/frontend/ko.json @@ -1188,6 +1188,9 @@ "zha_device_card": { "device_name_placeholder": "기기 이름 변경" } + }, + "zha_reconfigure_device": { + "heading": "기기 재구성 중" } }, "duration": { @@ -1859,7 +1862,7 @@ "documentation": "이 옵션을 활성화하기 전에 분석 관련 문서 페이지 {link}을(를) 방문하여 사용자 통계를 보내는 내용과 저장 방법에 대해 알아보세요.", "header": "분석", "instance_id": "인스턴스 ID: {huuid}", - "introduction": "인스턴스의 분석 내용을 공유합니다. 이 데이터는 {link}에서 공개적으로 사용할 수 있습니다", + "introduction": "인스턴스의 분석 내용을 공유합니다. 이 데이터는 {link}에서 공개적으로 사용될 수 있습니다", "learn_more": "통계자료가 어떻게 처리되는지 알아보기.", "needs_base": "이 옵션을 사용하려면 기본 분석을 활성화해야 합니다", "preference": { @@ -2072,6 +2075,9 @@ "filtering_by": "필터링", "show": "표시하기" }, + "hassio": { + "button": "구성하기" + }, "header": "Home Assistant 구성하기", "helpers": { "caption": "도우미", @@ -2210,7 +2216,7 @@ "ignore": { "confirm_delete_ignore": "이렇게 하면 발견된 통합 구성요소가 발견될 때, 발견된 통합 구성요소에 다시 나타나게 됩니다. 다시 시작해야 하거나 시간이 걸릴 수 있습니다.", "confirm_delete_ignore_title": "{name} 무시를 중지하시겠습니까?", - "confirm_ignore": "이 통합 구성요소의 설정을 하지 않으시겠습니까? 오른쪽 상단의 오버플로 메뉴에서 '무시된 통합 구성요소 표시하기'를 클릭하여 이 작업을 취소할 수 있습니다.", + "confirm_ignore": "이 통합 구성요소를 설정하지 않으시겠습니까? 오른쪽 상단의 오버플로 메뉴에서 '무시된 통합 구성요소 표시하기'를 클릭하여 이 작업을 취소할 수 있습니다.", "confirm_ignore_title": "발견된 {name} 기기를 무시하시겠습니까?", "hide_ignored": "무시된 통합 구성요소 숨기기", "ignore": "무시", @@ -3743,7 +3749,7 @@ "page-onboarding": { "analytics": { "finish": "다음", - "intro": "인스턴스의 분석 내용을 공유합니다. 이 데이터는 {link}에서 공개적으로 사용할 수 있습니다" + "intro": "인스턴스의 분석 내용을 공유합니다. 이 데이터는 {link}에서 공개적으로 사용될 수 있습니다" }, "core-config": { "button_detect": "탐색", diff --git a/translations/frontend/nl.json b/translations/frontend/nl.json index 3f0eedc383..1125c519cb 100644 --- a/translations/frontend/nl.json +++ b/translations/frontend/nl.json @@ -1127,7 +1127,7 @@ "reload": "Herlaad {domain}", "rest": "Herlaad rest entiteiten en notificatieservices", "rpi_gpio": "Herlaad Raspberry PI GPIO entiteiten", - "scene": "Herlaad scenes", + "scene": "Scenes", "script": "Herlaad scripts", "smtp": "Herlaad smtp notificatie services", "statistics": "Herlaad statistieken entiteiten", @@ -1605,7 +1605,7 @@ }, "introduction": "Met de automatiseringseditor editor kun je automatiseringen maken en bewerken. Volg de link hieronder om er zeker van te zijn dat je Home Assistant juist hebt geconfigureerd.", "learn_more": "Meer informatie over automatiseringen", - "no_automations": "We konden geen bewerkbare automatiseringen vinden", + "no_automations": "We konden geen automatiseringen vinden", "only_editable": "Alleen automatiseringen in automations.yaml kunnen worden bewerkt.", "pick_automation": "Kies te bewerken automatisering", "show_info_automation": "Informatie weergeven over automatisering" @@ -2254,7 +2254,7 @@ "load_full_log": "Laad volledige Home Assistant logboek", "loading_log": "Foutenlogboek laden ...", "multiple_messages": "bericht kwam voor het eerst om {time} en verschijnt {counter} keer", - "no_errors": "Er zijn geen fouten gerapporteerd.", + "no_errors": "Er zijn geen fouten gemeld", "no_issues": "Er zijn geen problemen!", "refresh": "Vernieuwen" }, @@ -2535,7 +2535,7 @@ }, "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 je Home Assistant correct hebt geconfigureerd.", "learn_more": "Meer informatie over scènes", - "no_scenes": "We konden geen bewerkbare scènes vinden.", + "no_scenes": "We konden geen scènes vinden", "only_editable": "Alleen scènes die zijn gedefinieerd in scenes.yaml kunnen worden bewerkt.", "pick_scene": "Kies een scène om te bewerken", "show_info_scene": "Informatie weergeven over scène" @@ -2585,7 +2585,7 @@ }, "introduction": "Met de editor kunt u scripts 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 scripts", - "no_scripts": "We hebben geen bewerkbare scrips gevonden", + "no_scripts": "We hebben geen scripts gevonden", "run_script": "Script uitvoeren", "show_info": "Toon info over script" } @@ -2595,39 +2595,39 @@ "description": "De Home Assistant-server opnieuw opstarten en stoppen", "section": { "reloading": { - "automation": "Herlaad automatiseringen", - "command_line": "Herlaad opdrachtregel-entiteiten", - "core": "Herlaad locatie en aanpassingen", - "filesize": "Herlaad bestandsgrootte entiteiten", - "filter": "Herlaad filter-entiteiten", - "generic": "Herlaad generieke IP camera entiteiten", - "generic_thermostat": "Herlaad generieke thermostaat entiteiten", - "group": "Herlaad groepen, groepsentiteiten en notify services", + "automation": "Automatiseringen", + "command_line": "Opdrachtregel-entiteiten", + "core": "Locatie en aanpassingen", + "filesize": "Bestandsgrootte entiteiten", + "filter": "Filter-entiteiten", + "generic": "Generieke IP camera entiteiten", + "generic_thermostat": "Generieke thermostaat entiteiten", + "group": "Groepen, groepsentiteiten en notify services", "heading": "Configuratie herladen", - "history_stats": "Herlaad historische statistieken entiteiten", - "homekit": "Herlaad HomeKit", - "input_boolean": "Herlaad input booleans", - "input_datetime": "Herlaad input date times", - "input_number": "Herlaad input numbers", - "input_select": "Herlaad input selects", - "input_text": "Herlaad input texts", + "history_stats": "Historische statistieken entiteiten", + "homekit": "HomeKit", + "input_boolean": "Input booleans", + "input_datetime": "Input date times", + "input_number": "Input numbers", + "input_select": "Input selects", + "input_text": "Input texts", "introduction": "Sommige delen van Home Assistant kunnen opnieuw worden geladen zonder dat een herstart vereist is. Als je herladen gebruikt, wordt de huidige configuratie leeggemaakt en wordt de nieuwe geladen.", - "min_max": "Herlaad min/max entiteiten", + "min_max": "Min/max entiteiten", "mqtt": "Herlaad handmatig geconfigureerde MQTT-entiteiten", - "person": "Herlaad personen", - "ping": "Herlaad ping binaire sensor entiteiten", + "person": "Personen", + "ping": "Ping binaire sensor entiteiten", "reload": "Herlaad {domain}", - "rest": "Herlaad rest-entiteiten en notify-services", + "rest": "Rest-entiteiten en notify-services", "rpi_gpio": "Herlaad Raspberry Pi GPIO-entiteiten", - "scene": "Herlaad scenes", - "script": "Herlaad scripts", + "scene": "Scenes", + "script": "Scripts", "smtp": "Herlaad de SMTP notify services", - "statistics": "Herlaad statistische entiteiten", + "statistics": "Statistische entiteiten", "telegram": "Herlaad telegram notify services", - "template": "Herlaad template entiteiten", - "trend": "Herlaad trend-entiteiten", - "universal": "Herlaad universele mediaspeler entiteiten", - "zone": "Herlaad zones" + "template": "Template entiteiten", + "trend": "Trend-entiteiten", + "universal": "Universele mediaspeler entiteiten", + "zone": "Zones" }, "server_management": { "confirm_restart": "Weet je zeker dat je Home Assistant opnieuw wilt starten?", diff --git a/translations/frontend/ru.json b/translations/frontend/ru.json index c52247f1c8..de7a2f5826 100644 --- a/translations/frontend/ru.json +++ b/translations/frontend/ru.json @@ -373,7 +373,7 @@ "panel": { "dashboard": "Панель", "snapshots": "Снимки", - "store": "Магазин дополнений", + "store": "Магазин", "system": "Система" }, "snapshot": { @@ -843,8 +843,8 @@ "related-filter-menu": { "filter_by_area": "Фильтр по помещениям", "filter_by_device": "Фильтр по устройствам", - "filtered_by_area": "помещение: {area_name}", - "filtered_by_device": "устройство: {device_name}" + "filtered_by_area": "помещению: {area_name}", + "filtered_by_device": "устройству: {device_name}" }, "related-items": { "area": "Помещение", @@ -1084,7 +1084,7 @@ "commands": { "navigation": { "areas": "Помещения", - "automation": "Автоматизация", + "automation": "Автоматизации", "blueprint": "Проекты", "core": "Общие", "customize": "Кастомизация", @@ -1270,7 +1270,7 @@ } }, "automation": { - "caption": "Автоматизация", + "caption": "Автоматизации", "description": "Управление правилами автоматизации", "dialog_new": { "blueprint": { @@ -1331,7 +1331,7 @@ }, "event": { "event": "Событие:", - "label": "Создание события", + "label": "Создать событие", "service_data": "Данные службы" }, "repeat": { @@ -1356,7 +1356,7 @@ "label": "Активировать сцену" }, "service": { - "label": "Вызов службы" + "label": "Вызвать службу" }, "wait_for_trigger": { "continue_timeout": "Продолжить по истечении времени", @@ -1861,13 +1861,13 @@ "analytics": { "documentation": "Прежде всего, посетите страницу документации по аналитике {link}, чтобы понять, что Вы будете отправлять и как это будет храниться.", "header": "Аналитика", - "instance_id": "Идентификатор экземпляра Home Assistant: {huuid}", + "instance_id": "ID экземпляра Home Assistant: {huuid}", "introduction": "Поделитесь аналитикой из Вашего Home Assistant. Эти данные будут доступны для всех по адресу {link}.", "learn_more": "Узнайте больше о том, как будут обрабатываться Ваши данные.", "needs_base": "Включите базовую аналитику, чтобы эта опция была доступна", "preference": { "base": { - "description": "Включает в себя идентификатор экземпляра, версия и тип установки.", + "description": "Включает в себя ID экземпляра, версию и тип установки.", "title": "Базовая аналитика" }, "diagnostics": { @@ -1996,7 +1996,7 @@ "picker": { "filter": { "filter": "Фильтр", - "hidden_devices": "{number} {number, plural,\n one {скрытое устройство}\n other {скрытых устройств}\n}", + "hidden_devices": "{number, plural,\n one {скрытых устройств:}\n other {скрытых устройств:}\n} {number}", "show_all": "Показать все", "show_disabled": "Скрытые устройства" }, @@ -2036,7 +2036,7 @@ }, "filter": { "filter": "Фильтр", - "hidden_entities": "{number} {number, plural,\n one {скрытый объект}\n other {скрытых объектов}\n}", + "hidden_entities": "{number, plural,\n one {скрытых объектов:}\n other {скрытых объектов:}\n} {number}", "show_all": "Показать все", "show_disabled": "Скрытые объекты", "show_readonly": "Объекты, доступные только для чтения", @@ -2146,7 +2146,7 @@ "delete": "Удалить", "delete_confirm": "Вы уверены, что хотите удалить эту интеграцию?", "device_unavailable": "Устройство недоступно", - "devices": "{count} {count, plural,\n one {устройство}\n other {устройств}\n}", + "devices": "{count, plural,\n one {устройств:}\n other {устройств:}\n} {count}", "disable_restart_confirm": "Перезапустите Home Assistant, чтобы завершить отключение этой интеграции.", "disable": { "disable_confirm": "Вы уверены, что хотите отключить эту запись конфигурации? Её дочерние устройства и объекты будут также отключены.", @@ -2160,7 +2160,7 @@ }, "documentation": "Документация", "enable_restart_confirm": "Перезапустите Home Assistant, чтобы завершить подключение этой интеграции.", - "entities": "{count} {count, plural,\n one {объект}\n other {объектов}\n}", + "entities": "{count, plural,\n one {объектов:}\n other {объектов:}\n} {count}", "entity_unavailable": "Объект недоступен", "firmware": "Прошивка: {version}", "hub": "Подключено через", @@ -2174,7 +2174,7 @@ "reload_restart_confirm": "Перезапустите Home Assistant, чтобы завершить перезагрузку этой интеграции", "rename": "Переименовать", "restart_confirm": "Перезапустите Home Assistant, чтобы завершить удаление этой интеграции", - "services": "{count} {count, plural,\n one {служба}\n other {служб}\n}", + "services": "{count, plural,\n one {служб:}\n other {служб:}\n} {count}", "system_options": "Настройки интеграции", "unnamed_entry": "Без названия" }, @@ -3863,7 +3863,7 @@ "header": "Модули многофакторной аутентификации" }, "number_format": { - "description": "Варианты отображения чисел в пользовательском интерфейсе.", + "description": "Отображение чисел в пользовательском интерфейсе", "dropdown_label": "Формат чисел", "formats": { "comma_decimal": "1,234,567.89", From 82ad5c103d2c3129cfeb129a5ff097237ed01876 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 2 Apr 2021 05:45:34 -0700 Subject: [PATCH 2/6] Handle configurations that don't wrap their action sequences in arrays (#8798) --- src/common/ensure-array.ts | 4 +- src/components/trace/hat-script-graph.ts | 89 +++++++++++-------- src/data/automation.ts | 8 +- src/data/script.ts | 8 +- .../trace/ha-automation-trace-path-details.ts | 7 ++ .../automation/trace/ha-automation-trace.ts | 5 ++ 6 files changed, 74 insertions(+), 47 deletions(-) diff --git a/src/common/ensure-array.ts b/src/common/ensure-array.ts index 4290c040c1..cdc9ea89ed 100644 --- a/src/common/ensure-array.ts +++ b/src/common/ensure-array.ts @@ -1,5 +1,7 @@ +type NonUndefined = T extends undefined ? never : T; + export function ensureArray(value: undefined): undefined; -export function ensureArray(value: T | T[]): T[]; +export function ensureArray(value: T | T[]): NonUndefined[]; export function ensureArray(value) { if (value === undefined || Array.isArray(value)) { return value; diff --git a/src/components/trace/hat-script-graph.ts b/src/components/trace/hat-script-graph.ts index 7a5e04cac7..0fef57b294 100644 --- a/src/components/trace/hat-script-graph.ts +++ b/src/components/trace/hat-script-graph.ts @@ -177,7 +177,7 @@ class HatScriptGraph extends LitElement { track: trace !== undefined && trace[0].result?.choice === i, })} > - ${branch.sequence.map((action, j) => + ${ensureArray(branch.sequence).map((action, j) => this.render_node(action, `${branch_path}/sequence/${j}`) )} @@ -192,7 +192,7 @@ class HatScriptGraph extends LitElement { trace !== undefined && trace[0].result?.choice === "default", })} > - ${config.default?.map((action, i) => + ${ensureArray(config.default)?.map((action, i) => this.render_node(action, `${path}/default/${i}`) )} @@ -319,7 +319,7 @@ class HatScriptGraph extends LitElement { .badge=${repeats} > - ${node.repeat.sequence.map((action, i) => + ${ensureArray(node.repeat.sequence).map((action, i) => this.render_node(action, `${path}/repeat/sequence/${i}`) )} @@ -421,43 +421,52 @@ class HatScriptGraph extends LitElement { return this.render_trigger(trigger, i); } ); - return html` - -
- - ${trigger_nodes} - - - ${ensureArray(this.trace.config.condition)?.map((condition, i) => - this.render_condition(condition!, i) + try { + return html` + +
+ + ${trigger_nodes} + + + ${ensureArray(this.trace.config.condition)?.map((condition, i) => + this.render_condition(condition!, i) + )} + + ${ensureArray(this.trace.config.action).map((action, i) => + this.render_node(action, `action/${i}`) )}
- ${ensureArray(this.trace.config.action).map((action, i) => - this.render_node(action, `action/${i}`) - )} -
-
- - - - - - -
- `; +
+ + + + + + +
+ `; + } catch (err) { + return html` +
+ Error rendering graph. Please download trace and share with the + developers. +
+ `; + } } protected update(changedProps: PropertyValues) { @@ -539,6 +548,10 @@ class HatScriptGraph extends LitElement { .parent { margin-left: 8px; } + .error { + padding: 16px; + max-width: 300px; + } `; } } diff --git a/src/data/automation.ts b/src/data/automation.ts index d137f76600..21bd303a62 100644 --- a/src/data/automation.ts +++ b/src/data/automation.ts @@ -23,9 +23,9 @@ export interface ManualAutomationConfig { id?: string; alias?: string; description?: string; - trigger: Trigger[]; - condition?: Condition[]; - action: Action[]; + trigger: Trigger | Trigger[]; + condition?: Condition | Condition[]; + action: Action | Action[]; mode?: typeof MODES[number]; max?: number; max_exceeded?: @@ -161,7 +161,7 @@ export type Trigger = export interface LogicalCondition { condition: "and" | "not" | "or"; alias?: string; - conditions: Condition[]; + conditions: Condition | Condition[]; } export interface StateCondition { diff --git a/src/data/script.ts b/src/data/script.ts index b9cea29528..096835a49d 100644 --- a/src/data/script.ts +++ b/src/data/script.ts @@ -22,7 +22,7 @@ export interface ScriptEntity extends HassEntityBase { export interface ScriptConfig { alias: string; - sequence: Action[]; + sequence: Action | Action[]; icon?: string; mode?: typeof MODES[number]; max?: number; @@ -89,7 +89,7 @@ export interface RepeatAction { interface BaseRepeat { alias?: string; - sequence: Action[]; + sequence: Action | Action[]; } export interface CountRepeat extends BaseRepeat { @@ -107,13 +107,13 @@ export interface UntilRepeat extends BaseRepeat { export interface ChooseActionChoice { alias?: string; conditions: string | Condition[]; - sequence: Action[]; + sequence: Action | Action[]; } export interface ChooseAction { alias?: string; choose: ChooseActionChoice[]; - default?: Action[]; + default?: Action | Action[]; } export interface VariablesAction { diff --git a/src/panels/config/automation/trace/ha-automation-trace-path-details.ts b/src/panels/config/automation/trace/ha-automation-trace-path-details.ts index aa893efc49..b27edf9814 100644 --- a/src/panels/config/automation/trace/ha-automation-trace-path-details.ts +++ b/src/panels/config/automation/trace/ha-automation-trace-path-details.ts @@ -105,6 +105,7 @@ export class HaAutomationTracePathDetails extends LitElement { path, timestamp, result, + error, changed_variables, ...rest } = trace as any; @@ -116,6 +117,8 @@ export class HaAutomationTracePathDetails extends LitElement { ${result ? html`Result:
${safeDump(result)}
` + : error + ? html`
Error: ${error}
` : ""} ${Object.keys(rest).length === 0 ? "" @@ -232,6 +235,10 @@ ${safeDump(trace.changed_variables).trimRight()} Date: Fri, 2 Apr 2021 20:18:56 +0200 Subject: [PATCH 3/6] Fix disabled icon button color (#8800) Fixes #8797 --- .../config/automation/ha-automation-picker.ts | 28 +++++++++---------- src/resources/styles.ts | 1 + 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/panels/config/automation/ha-automation-picker.ts b/src/panels/config/automation/ha-automation-picker.ts index f6d8834fa6..12e870be15 100644 --- a/src/panels/config/automation/ha-automation-picker.ts +++ b/src/panels/config/automation/ha-automation-picker.ts @@ -213,21 +213,21 @@ class HaAutomationPicker extends LitElement { .label="${this.hass.localize( "ui.panel.config.automation.picker.edit_automation" )}" - > + > + + - ${ - !automation.attributes.id - ? html` - - ${this.hass.localize( - "ui.panel.config.automation.picker.only_editable" - )} - - ` - : "" - } + ${!automation.attributes.id + ? html` + + ${this.hass.localize( + "ui.panel.config.automation.picker.only_editable" + )} + + ` + : ""} `, }; return columns; diff --git a/src/resources/styles.ts b/src/resources/styles.ts index 952193d6e9..6be57cf1f2 100644 --- a/src/resources/styles.ts +++ b/src/resources/styles.ts @@ -75,6 +75,7 @@ export const derivedStyles = { "mdc-theme-on-primary": "var(--text-primary-color)", "mdc-theme-on-secondary": "var(--text-primary-color)", "mdc-theme-on-surface": "var(--primary-text-color)", + "mdc-theme-text-disabled-on-light": "var(--disabled-text-color)", "mdc-theme-text-primary-on-background": "var(--primary-text-color)", "mdc-theme-text-secondary-on-background": "var(--secondary-text-color)", "mdc-theme-text-icon-on-background": "var(--secondary-text-color)", From 61aaaabcb5922f893136c62042e5369a7d2ec65d Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Fri, 2 Apr 2021 20:19:35 +0200 Subject: [PATCH 4/6] Add close button to import blueprint dialog (#8802) --- src/panels/config/blueprint/dialog-import-blueprint.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/panels/config/blueprint/dialog-import-blueprint.ts b/src/panels/config/blueprint/dialog-import-blueprint.ts index 0151e8276a..325fccc460 100644 --- a/src/panels/config/blueprint/dialog-import-blueprint.ts +++ b/src/panels/config/blueprint/dialog-import-blueprint.ts @@ -15,7 +15,6 @@ import { } from "lit-element"; import { fireEvent } from "../../../common/dom/fire_event"; import "../../../components/ha-circular-progress"; -import "../../../components/ha-dialog"; import "../../../components/ha-expansion-panel"; import { BlueprintImportResult, @@ -24,6 +23,7 @@ import { } from "../../../data/blueprint"; import { haStyleDialog } from "../../../resources/styles"; import type { HomeAssistant } from "../../../types"; +import { createCloseHeading } from "../../../components/ha-dialog"; @customElement("ha-dialog-import-blueprint") class DialogImportBlueprint extends LitElement { @@ -65,7 +65,10 @@ class DialogImportBlueprint extends LitElement {
${this._error ? html`
${this._error}
` : ""} From c56b4fade30a974c9a92db324cb5d1afd931762c Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Fri, 2 Apr 2021 20:35:28 +0200 Subject: [PATCH 5/6] Add filtering by related entity + fixes (#8801) --- .eslintrc.json | 3 +- src/components/entity/ha-entity-picker.ts | 6 +-- .../ha-button-related-filter-menu.ts | 48 ++++++++++++++++++- .../config/automation/ha-automation-picker.ts | 1 + src/panels/config/scene/ha-scene-dashboard.ts | 4 ++ src/panels/config/script/ha-script-picker.ts | 4 ++ src/translations/en.json | 2 + 7 files changed, 62 insertions(+), 6 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 9cfa58084a..73d6cea999 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -84,7 +84,8 @@ "@typescript-eslint/no-unused-vars": 0, "@typescript-eslint/explicit-function-return-type": 0, "@typescript-eslint/explicit-module-boundary-types": 0, - "@typescript-eslint/no-shadow": ["error"] + "@typescript-eslint/no-shadow": ["error"], + "lit/attribute-value-entities": 0 }, "plugins": ["disable", "import", "lit", "prettier", "@typescript-eslint"], "processor": "disable/disable" diff --git a/src/components/entity/ha-entity-picker.ts b/src/components/entity/ha-entity-picker.ts index b24c5c227c..dfaeecd570 100644 --- a/src/components/entity/ha-entity-picker.ts +++ b/src/components/entity/ha-entity-picker.ts @@ -99,7 +99,7 @@ export class HaEntityPicker extends LitElement { @property({ type: Boolean }) private _opened = false; - @query("vaadin-combo-box-light", true) private _comboBox!: HTMLElement; + @query("vaadin-combo-box-light", true) private comboBox!: HTMLElement; public open() { this.updateComplete.then(() => { @@ -208,7 +208,7 @@ export class HaEntityPicker extends LitElement { this.entityFilter, this.includeDeviceClasses ); - (this._comboBox as any).filteredItems = this._states; + (this.comboBox as any).filteredItems = this._states; this._initedStates = true; } } @@ -296,7 +296,7 @@ export class HaEntityPicker extends LitElement { private _filterChanged(ev: CustomEvent): void { const filterString = ev.detail.value.toLowerCase(); - (this._comboBox as any).filteredItems = this._states.filter( + (this.comboBox as any).filteredItems = this._states.filter( (state) => state.entity_id.toLowerCase().includes(filterString) || computeStateName(state).toLowerCase().includes(filterString) diff --git a/src/components/ha-button-related-filter-menu.ts b/src/components/ha-button-related-filter-menu.ts index fa2c580735..1e4cde248d 100644 --- a/src/components/ha-button-related-filter-menu.ts +++ b/src/components/ha-button-related-filter-menu.ts @@ -18,6 +18,9 @@ import type { HomeAssistant } from "../types"; import "./ha-svg-icon"; import "./ha-area-picker"; import "./device/ha-device-picker"; +import "./entity/ha-entity-picker"; +import { computeStateName } from "../common/entity/compute_state_name"; +import { computeDeviceName } from "../data/device_registry"; declare global { // for fire event @@ -33,6 +36,7 @@ declare global { interface FilterValue { area?: string; device?: string; + entity?: string; } @customElement("ha-button-related-filter-menu") @@ -47,6 +51,14 @@ export class HaRelatedFilterButtonMenu extends LitElement { @property({ attribute: false }) public value?: FilterValue; + /** + * Show no entities of these domains. + * @type {Array} + * @attr exclude-domains + */ + @property({ type: Array, attribute: "exclude-domains" }) + public excludeDomains?: string[]; + @internalProperty() private _open = false; protected render(): TemplateResult { @@ -78,6 +90,15 @@ export class HaRelatedFilterButtonMenu extends LitElement { .value=${this.value?.device} @value-changed=${this._devicePicked} > + `; } @@ -93,6 +114,25 @@ export class HaRelatedFilterButtonMenu extends LitElement { this._open = false; } + private async _entityPicked(ev: CustomEvent) { + const entityId = ev.detail.value; + if (!entityId) { + fireEvent(this, "related-changed", { value: undefined }); + return; + } + const filter = this.hass.localize( + "ui.components.related-filter-menu.filtered_by_entity", + "entity_name", + computeStateName((ev.currentTarget as any).comboBox.selectedItem) + ); + const items = await findRelated(this.hass, "entity", entityId); + fireEvent(this, "related-changed", { + value: { entity: entityId }, + filter, + items, + }); + } + private async _devicePicked(ev: CustomEvent) { const deviceId = ev.detail.value; if (!deviceId) { @@ -102,7 +142,10 @@ export class HaRelatedFilterButtonMenu extends LitElement { const filter = this.hass.localize( "ui.components.related-filter-menu.filtered_by_device", "device_name", - (ev.currentTarget as any).comboBox.selectedItem.name + computeDeviceName( + (ev.currentTarget as any).comboBox.selectedItem, + this.hass + ) ); const items = await findRelated(this.hass, "device", deviceId); @@ -142,7 +185,8 @@ export class HaRelatedFilterButtonMenu extends LitElement { position: static; } ha-area-picker, - ha-device-picker { + ha-device-picker, + ha-entity-picker { display: block; width: 300px; padding: 4px 16px; diff --git a/src/panels/config/automation/ha-automation-picker.ts b/src/panels/config/automation/ha-automation-picker.ts index 12e870be15..5f879b843b 100644 --- a/src/panels/config/automation/ha-automation-picker.ts +++ b/src/panels/config/automation/ha-automation-picker.ts @@ -261,6 +261,7 @@ class HaAutomationPicker extends LitElement { .narrow=${this.narrow} .hass=${this.hass} .value=${this._filterValue} + exclude-domains='["automation"]' @related-changed=${this._relatedFilterChanged} > diff --git a/src/panels/config/scene/ha-scene-dashboard.ts b/src/panels/config/scene/ha-scene-dashboard.ts index 4b18f9e79f..177d7da864 100644 --- a/src/panels/config/scene/ha-scene-dashboard.ts +++ b/src/panels/config/scene/ha-scene-dashboard.ts @@ -58,6 +58,9 @@ class HaSceneDashboard extends LitElement { private _scenes = memoizeOne( (scenes: SceneEntity[], filteredScenes?: string[] | null) => { + if (filteredScenes === null) { + return []; + } return (filteredScenes ? scenes.filter((scene) => filteredScenes!.includes(scene.entity_id)) : scenes @@ -183,6 +186,7 @@ class HaSceneDashboard extends LitElement { .narrow=${this.narrow} .hass=${this.hass} .value=${this._filterValue} + exclude-domains='["scene"]' @related-changed=${this._relatedFilterChanged} > diff --git a/src/panels/config/script/ha-script-picker.ts b/src/panels/config/script/ha-script-picker.ts index cb352e7f33..b60e594ab5 100644 --- a/src/panels/config/script/ha-script-picker.ts +++ b/src/panels/config/script/ha-script-picker.ts @@ -56,6 +56,9 @@ class HaScriptPicker extends LitElement { private _scripts = memoizeOne( (scripts: HassEntity[], filteredScripts?: string[] | null) => { + if (filteredScripts === null) { + return []; + } return (filteredScripts ? scripts.filter((script) => filteredScripts!.includes(script.entity_id) @@ -193,6 +196,7 @@ class HaScriptPicker extends LitElement { .narrow=${this.narrow} .hass=${this.hass} .value=${this._filterValue} + exclude-domains='["script"]' @related-changed=${this._relatedFilterChanged} > diff --git a/src/translations/en.json b/src/translations/en.json index 1d2d8b3303..3315f926f1 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -399,8 +399,10 @@ } }, "related-filter-menu": { + "filter_by_entity": "Filter by entity", "filter_by_device": "Filter by device", "filter_by_area": "Filter by area", + "filtered_by_entity": "entity: {entity_name}", "filtered_by_device": "device: {device_name}", "filtered_by_area": "area: {area_name}" }, From 8f6ec03446aa17a98a8da32c51823ee9da76f13d Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Fri, 2 Apr 2021 20:48:57 +0200 Subject: [PATCH 6/6] Bumped version to 20210402.1 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index a6b1c3d459..b3932bd0f7 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name="home-assistant-frontend", - version="20210402.0", + version="20210402.1", description="The Home Assistant frontend", url="https://github.com/home-assistant/home-assistant-polymer", author="The Home Assistant Authors",