From 6b88081360eff09f79883c793cfd904197bf2f02 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Sun, 13 Sep 2020 00:32:53 +0000 Subject: [PATCH 01/31] [ci skip] Translation update --- translations/frontend/bg.json | 111 +++++++++++++++++++++++++++-- translations/frontend/ca.json | 15 +++- translations/frontend/en.json | 22 ++++++ translations/frontend/ru.json | 8 +++ translations/frontend/zh-Hant.json | 17 ++++- 5 files changed, 165 insertions(+), 8 deletions(-) diff --git a/translations/frontend/bg.json b/translations/frontend/bg.json index f5703b28f4..68302a4647 100644 --- a/translations/frontend/bg.json +++ b/translations/frontend/bg.json @@ -19,6 +19,7 @@ "logbook": "Дневник", "mailbox": "Пощенска кутия", "map": "Карта", + "media_browser": "Медиен браузър", "profile": "Профил", "shopping_list": "Списък за пазаруване", "states": "Състояние" @@ -455,6 +456,7 @@ }, "common": { "cancel": "Отмени", + "continue": "Продължи", "delete": "Изтриване", "loading": "Зареждане", "save": "Запазване", @@ -466,6 +468,10 @@ "device": "Устройство" }, "entity": { + "entity-attribute-picker": { + "attribute": "Атрибут", + "show_attributes": "Показване на атрибутите" + }, "entity-picker": { "entity": "Обект" } @@ -474,6 +480,18 @@ "loading_history": "Зареждане на история за състоянието...", "no_history_found": "Не е намерена история за състоянието" }, + "logbook": { + "entries_not_found": "Липсват логове в дневника" + }, + "media-browser": { + "audio_not_supported": "Браузърът не поддържа този аудио елемент.", + "choose_player": "Изберете плейър", + "media_browsing_error": "Грешка в медийния браузър", + "media_not_supported": "Плейърът на медийния браузър не поддържа този тип медия", + "media_player": "Медиен плейър", + "video_not_supported": "Браузърът не поддържа този видео елемент.", + "web-browser": "Уеб браузър" + }, "relative_time": { "duration": { "day": "{count}{count, plural,\n one {ден}\n other {дни}\n}", @@ -496,6 +514,9 @@ "enable_new_entities_label": "Активирай новодобавените устройства.", "title": "Системни опции за {integration}" }, + "domain_toggler": { + "reset_entities": "Нулиране на обекти" + }, "entity_registry": { "editor": { "delete": "Изтриване", @@ -515,6 +536,9 @@ "yaml_not_editable": "Настройките на този обект не могат да бъдат редактирани. Могат да се конфигурират само обектите, създадени от потребителския интерфейс." }, "more_info_control": { + "controls": "Контроли", + "details": "Детайли", + "history": "История", "script": { "last_action": "Последно задействане" }, @@ -644,7 +668,13 @@ "label": "Извикване на услуга", "service_data": "Данни за услугата" }, + "wait_for_trigger": { + "continue_timeout": "Продължи след изчакване", + "label": "Изчакайте спусък/тригър", + "timeout": "Време на изчакване (опция)" + }, "wait_template": { + "continue_timeout": "Продължи след изчакване", "label": "Изчакване", "timeout": "Изчакване (по избор)", "wait_template": "Шаблон за изчакване" @@ -692,7 +722,9 @@ "time": { "after": "След", "before": "Преди", - "label": "Време" + "label": "Време", + "type_input": "Стойност на помощника за дата/час", + "type_value": "Фиксирано време" }, "zone": { "entity": "Обект с местоположение", @@ -751,6 +783,7 @@ "value_template": "Шаблон за стойност (незадължително)" }, "state": { + "attribute": "Атрибут (опция)", "for": "За период от", "from": "От", "label": "Състояние", @@ -775,7 +808,9 @@ }, "time": { "at": "В", - "label": "Време" + "label": "Време", + "type_input": "Стойност на помощника за дата/час", + "type_value": "Фиксирано време" }, "webhook": { "label": "Webhook", @@ -796,6 +831,8 @@ }, "picker": { "add_automation": "Добавяне на автоматизация", + "duplicate": "Дублиране", + "duplicate_automation": "Дублиране на автоматизация", "header": "Редактор на автоматизации", "headers": { "name": "Име" @@ -815,10 +852,26 @@ "config_documentation": "Документация за конфигурацията" } }, + "alexa": { + "dont_expose_entity": "Не излагай обекта", + "expose_entity": "Изложи обекта", + "exposed": "{избран} изложен", + "follow_domain": "следван домейн", + "manage_domains": "Управление на домейни", + "not_exposed": "{избран} неизложен" + }, "caption": "Home Assistant Cloud", "description_features": "Контролирайте дома си, и когато не сте вкъщи, активирайте интегрирациите с Alexa и Google Assistant.", "description_login": "Влезли сте като {email}", - "description_not_login": "Не сте влезли" + "description_not_login": "Не сте влезли", + "google": { + "dont_expose_entity": "Не излагай обекта", + "expose_entity": "Изложи обекта", + "exposed": "{избран} изложен", + "follow_domain": "следван домейн", + "manage_domains": "Управление на домейни", + "not_exposed": "{избран} неизложен" + } }, "core": { "caption": "Общи", @@ -882,6 +935,7 @@ }, "integrations": { "add_integration": "Добавяне на интеграция", + "attention": "Задълителна проверка", "caption": "Интеграции", "config_entry": { "delete": "Изтриване", @@ -897,6 +951,7 @@ "options": "Настройки", "rename": "Преименуване", "restart_confirm": "Рестартирайте Home Assistant за да завършите премахването на интеграцията", + "services": "{брой} {число, множествено число,\n една {услуга}\n други {услуги}\n}", "system_options": "Системни настройки" }, "config_flow": { @@ -915,6 +970,7 @@ "none": "Нищо не е конфигурирано към момента", "none_found": "Не са намерени интеграции", "none_found_detail": "Коригирайте критериите си за търсене.", + "reconfigure": "Преконфигурирай", "rename_dialog": "Редактирайте името на този запис в конфигурацията" }, "introduction": "Тук е възможно да конфигурирате Вашите компоненти и Home Assistant. Не всичко е възможно да се конфигурира от Интерфейса, но работим по върпоса.", @@ -942,6 +998,23 @@ "mqtt": { "title": "MQTT" }, + "ozw": { + "node": { + "button": "Детайли за възела", + "not_found": "Възел не е намерен" + }, + "nodes_table": { + "failed": "Неуспешно", + "id": "ID", + "manufacturer": "Производител", + "model": "Модел", + "query_stage": "Етап на заявка", + "zwave_plus": "Z-Wave плюс" + }, + "refresh_node": { + "button": "Обнови възела" + } + }, "person": { "caption": "Хора", "description": "Управлявайте хората, които следите от Home Assistant.", @@ -979,8 +1052,13 @@ "group": "Презареждане на гурпите", "heading": "Презареждане на YAML конфигурацията", "introduction": "Някои части от Home Assistant могат да се презаредят без да е необходимо рестартиране. Натискането на Презареди ще отхвърли настоящата конфигурация и ще зареди новата конфигурация.", + "mqtt": "Презареди mqtt обектите", + "reload": "Презарежди {домейн}", + "rpi_gpio": "Презареди GPIO обектите на Raspberry Pi ", "scene": "Презареди сцените", - "script": "Презареждане на скриптовете" + "script": "Презареждане на скриптовете", + "smtp": "Презареди smtp услугите за уведомяване", + "telegram": "Презареди telegram услугите за уведомяване" }, "server_management": { "confirm_restart": "Сигурни ли сте, че искате да рестартирате Home Assistant?", @@ -1005,6 +1083,8 @@ "create": "Създаване", "name": "Име", "password": "Парола", + "password_confirm": "Потвърди парола", + "password_not_match": "Паролите не съвпадат", "username": "Потребителско име" }, "caption": "Потребители", @@ -1017,6 +1097,8 @@ "deactivate_user": "Деактивиране на потребителя", "delete_user": "Изтриване на потребител", "name": "Име", + "new_password": "Нова парола", + "password_changed": "Паролата е променена!", "system_generated_users_not_editable": "Неуспешно обновяване на системно генерираните потребители" }, "picker": { @@ -1102,6 +1184,11 @@ "title": "Състояния" }, "templates": { + "all_listeners": "Този шаблон следи за всички събития на промяна на състояние.", + "domain": "Домейн", + "entity": "Обект", + "listeners": "Този шаблон следи за събития със следните промени на състояния:", + "no_listeners": "Този шаблон не следи за събития на промяна на състояние и не се актуализира автоматично.", "title": "Шаблон" } } @@ -1144,6 +1231,9 @@ "entities": { "toggle": "Превключване на обекти." }, + "generic": { + "state_color": "Да се оцветят ли иконите спрямо състоянието?" + }, "iframe": { "name": "Уеб страница" }, @@ -1155,6 +1245,10 @@ } }, "cardpicker": { + "by_card": "По карта", + "by_entity": "По обект", + "domain": "Домейн", + "entity": "Обект", "no_description": "Няма налично описание." }, "edit_card": { @@ -1166,6 +1260,7 @@ "move": "Преместване", "options": "Още опции", "pick_card": "Изберете картата, която искате да добавите.", + "search_cards": "Търсене на карти", "toggle_editor": "Превключете редактора" }, "edit_lovelace": { @@ -1419,6 +1514,11 @@ "submit": "Промяна" }, "current_user": "В момента сте влезли като {fullName}.", + "customize_sidebar": { + "button": "Редактиране", + "description": "Може също да се задържи водача на страничната лента, за да се активира режим за редактиране.", + "header": "Промяна на реда и скриване на елементи от страничната лента" + }, "dashboard": { "dropdown_label": "Табло", "header": "Табло" @@ -1438,6 +1538,7 @@ "confirm_delete": "Сигурни ли сте, че искате да изтриете кода за достъп за {name}?", "create": "Създай код", "create_failed": "Възникна грешка при създаването на код за достъп.", + "created": "Създаване {дата}", "created_at": "Създаден на {date}", "delete_failed": "Възникна грешка при изтриването на кода за достъп.", "description": "Създайте дългосрочни кодове за достъп за да могат скриптовете Ви да взаимодействат с Home Assistant. Всеки код е валиден за 10 години от създаването си. Следните дългосрочни кодове са активни в момента.", @@ -1445,6 +1546,7 @@ "header": "Дългосрочни кодове за достъп", "last_used": "Последно използван на {date} от {location}", "learn_auth_requests": "Научете се как да правите оторизирани заявки.", + "name": "Име", "not_used": "Никога не е бил използван", "prompt_copy_token": "Копирайте кода си за достъп. Той няма да бъде показан отново.", "prompt_name": "Име?" @@ -1495,6 +1597,7 @@ } }, "sidebar": { + "done": "Готово", "external_app_configuration": "Конфигурация на приложение" } } diff --git a/translations/frontend/ca.json b/translations/frontend/ca.json index 54945cf396..9e89a2f943 100644 --- a/translations/frontend/ca.json +++ b/translations/frontend/ca.json @@ -1943,7 +1943,7 @@ }, "introduction": "L'editor de scripts et permet crear i editar scripts. Vés a l'enllaç de sota per veure'n les instruccions i assegurar-te que has configurat Home Assistant correctament.", "learn_more": "Més informació sobre els scripts", - "no_scripts": "No hem trobat cap script editable", + "no_scripts": "No s'ha pogut trobar cap script editable", "show_info": "Mostra informació sobre l'script", "trigger_script": "Dispara l'script" } @@ -2352,9 +2352,14 @@ "title": "Estats" }, "templates": { + "all_listeners": "Aquesta plantilla escolta a tots els esdeveniments de canvi d'estat.", "description": "Les plantilles es renderitzen mitjançant el motor Jinja2 amb algunes extensions específiques de Home Assistant.", + "domain": "Domini", "editor": "Editor de plantilles", + "entity": "Entitat", "jinja_documentation": "Documentació sobre plantilles amb Jinja2", + "listeners": "Aquesta plantilla escolta als següents esdeveniments de canvi d'estat:", + "no_listeners": "Aquesta plantilla no escolta cap esdeveniment de canvi d'estat i no s'actualitza automàticament.", "reset": "Restableix a la plantilla de demostració", "template_extensions": "Extensions de plantilla de Home Assistant", "title": "Plantilla", @@ -2501,7 +2506,7 @@ "no_theme": "Sense tema", "refresh_interval": "Interval d'actualització", "search": "Cerca", - "secondary_info_attribute": "Atribut d’informació secundària", + "secondary_info_attribute": "Atribut d'informació secundària", "show_icon": "Mostra icona?", "show_name": "Mostra nom?", "show_state": "Mostra estat?", @@ -2941,6 +2946,11 @@ "submit": "Envia" }, "current_user": "Has iniciat la sessió com a {fullName}.", + "customize_sidebar": { + "button": "Edita", + "description": "També pots mantenir premuda la capçalera de la barra lateral per activar el mode d'edició.", + "header": "Canvia l'ordre i/o amaga elements de la barra lateral" + }, "dashboard": { "description": "Tria un panell per defecte per a aquest dispositiu.", "dropdown_label": "Panell", @@ -3038,6 +3048,7 @@ } }, "sidebar": { + "done": "Fet", "external_app_configuration": "Configuració de l'aplicació", "sidebar_toggle": "Commutació de la barra lateral" } diff --git a/translations/frontend/en.json b/translations/frontend/en.json index fcc53ba406..2074324131 100644 --- a/translations/frontend/en.json +++ b/translations/frontend/en.json @@ -574,6 +574,28 @@ "audio_not_supported": "Your browser does not support the audio element.", "choose_player": "Choose Player", "choose-source": "Choose Source", + "class": { + "album": "Album", + "app": "App", + "artist": "Artist", + "channel": "Channel", + "composer": "Composer", + "contributing_artist": "Contributing Artist", + "directory": "Library", + "episode": "Episode", + "game": "Game", + "genre": "Genre", + "image": "Image", + "movie": "Movie", + "music": "Music", + "playlist": "Playlist", + "podcast": "Podcast", + "season": "Season", + "track": "Track", + "tv_show": "TV Show", + "url": "Url", + "video": "Video" + }, "content-type": { "album": "Album", "artist": "Artist", diff --git a/translations/frontend/ru.json b/translations/frontend/ru.json index 739b8ccc63..30a5044abe 100644 --- a/translations/frontend/ru.json +++ b/translations/frontend/ru.json @@ -2353,7 +2353,9 @@ }, "templates": { "description": "Здесь Вы можете протестировать поведение шаблонов. В Home Assistant используется шаблонизатор Jinja2 с некоторыми специальными расширениями.", + "domain": "Домен", "editor": "Редактор шаблонов", + "entity": "Объект", "jinja_documentation": "Узнайте больше о шаблонизаторе Jinja2", "reset": "Вернуться к демонстрационному шаблону", "template_extensions": "Узнайте больше о шаблонах Home Assistant", @@ -2941,6 +2943,11 @@ "submit": "Подтвердить" }, "current_user": "Добро пожаловать, {fullName}! Вы вошли в систему.", + "customize_sidebar": { + "button": "Изменить", + "description": "Режим редактирования можно включить, нажав и удерживая заголовок боковой панели", + "header": "Изменить элементы боковой панели" + }, "dashboard": { "description": "Панель, используемая по умолчанию для этого устройства", "dropdown_label": "Панель", @@ -3038,6 +3045,7 @@ } }, "sidebar": { + "done": "Готово", "external_app_configuration": "Настройки приложения", "sidebar_toggle": "Переключатель в боковой панели" } diff --git a/translations/frontend/zh-Hant.json b/translations/frontend/zh-Hant.json index 0fcc924359..5273e7c538 100644 --- a/translations/frontend/zh-Hant.json +++ b/translations/frontend/zh-Hant.json @@ -1982,7 +1982,7 @@ "smtp": "重新載入 SMTP 通知服務", "statistics": "重新載入統計資訊實體", "telegram": "重新載入 Telegram 通知服務", - "template": "重新載入範例實體", + "template": "重新載入模板實體", "trend": "重新載入趨勢實體", "universal": "重新載入通用媒體播放器實體", "zone": "重新載入區域" @@ -2352,9 +2352,14 @@ "title": "狀態" }, "templates": { + "all_listeners": "此模板監聽所有狀態變更事件。", "description": "模版使用 Jinja2 模板引擎及 Home Assistant 特殊擴充進行模板渲染。", + "domain": "區域", "editor": "模板編輯器", + "entity": "實體", "jinja_documentation": "Jinja2 模版文件", + "listeners": "此模板監聽以下狀態變更事件:", + "no_listeners": "此模板不監聽任何狀態變更事件,將不會自動更新。", "reset": "重置示範範模板", "template_extensions": "Home Assistant 模板擴充", "title": "模板", @@ -2941,6 +2946,11 @@ "submit": "傳送" }, "current_user": "目前登入身份:{fullName}。", + "customize_sidebar": { + "button": "編輯", + "description": "同時也能長按側邊列的標題以啟動編輯模式。", + "header": "自側邊列中變更順序或隱藏項目" + }, "dashboard": { "description": "選擇此設備的預設主面板。", "dropdown_label": "主面板", @@ -2963,6 +2973,7 @@ "confirm_delete": "確定要刪除{name}存取密鑰嗎?", "create": "創建密鑰", "create_failed": "創建存取密鑰失敗。", + "created": "新增日期:{date}", "created_at": "於{date}創建", "delete_failed": "刪除存取密鑰失敗。", "description": "創建長效存取密鑰,可供運用腳本與 Home Assistant 實體進行互動。每個密鑰於創建後,有效期為十年。目前已啟用之永久有效密鑰如下。", @@ -2970,9 +2981,10 @@ "header": "永久有效存取密鑰", "last_used": "上次使用:於{date}、位置{location}", "learn_auth_requests": "學習如何進行驗證請求。", + "name": "名稱", "not_used": "從未使用過", "prompt_copy_token": "複製存取密鑰,將不會再次顯示。", - "prompt_name": "名稱?" + "prompt_name": "為密鑰命名" }, "mfa_setup": { "close": "關閉", @@ -3036,6 +3048,7 @@ } }, "sidebar": { + "done": "完成", "external_app_configuration": "App 設定", "sidebar_toggle": "側邊欄開關" } From 9af805ab5e17428510f9c24833090302eb917547 Mon Sep 17 00:00:00 2001 From: Kendell R Date: Sun, 13 Sep 2020 12:43:17 -0700 Subject: [PATCH 02/31] Make moon icon more readable (#6969) --- src/data/weather.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/weather.ts b/src/data/weather.ts index 369a64ec34..fa6f6354b0 100644 --- a/src/data/weather.ts +++ b/src/data/weather.ts @@ -200,7 +200,7 @@ export const weatherSVGStyles = css` fill: var(--weather-icon-sun-color, #fdd93c); } .moon { - fill: var(--weather-icon-moon-color, #fdf9cc); + fill: var(--weather-icon-moon-color, #fcf497); } .cloud-back { fill: var(--weather-icon-cloud-back-color, #d4d4d4); From 1bc9b95289520af3639ac5fc56027abaa9f9b4cf Mon Sep 17 00:00:00 2001 From: Kendell R Date: Sun, 13 Sep 2020 12:43:54 -0700 Subject: [PATCH 03/31] Remove useless "My Title" (#6970) --- src/panels/lovelace/cards/hui-entities-card.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/panels/lovelace/cards/hui-entities-card.ts b/src/panels/lovelace/cards/hui-entities-card.ts index 2e55a41b39..90383f3bdb 100644 --- a/src/panels/lovelace/cards/hui-entities-card.ts +++ b/src/panels/lovelace/cards/hui-entities-card.ts @@ -50,7 +50,7 @@ class HuiEntitiesCard extends LitElement implements LovelaceCard { ["light", "switch", "sensor"] ); - return { type: "entities", title: "My Title", entities: foundEntities }; + return { type: "entities", entities: foundEntities }; } @internalProperty() private _config?: EntitiesCardConfig; From 868399ed6f9213501631bfa14aa6520c16497908 Mon Sep 17 00:00:00 2001 From: Zack Barett Date: Sun, 13 Sep 2020 15:27:16 -0500 Subject: [PATCH 04/31] HA Logs: Copy log (#6945) --- .../config/logs/dialog-system-log-detail.ts | 72 +++++++++++++++---- src/translations/en.json | 3 +- 2 files changed, 62 insertions(+), 13 deletions(-) diff --git a/src/panels/config/logs/dialog-system-log-detail.ts b/src/panels/config/logs/dialog-system-log-detail.ts index ad5f28c648..34d05afca9 100644 --- a/src/panels/config/logs/dialog-system-log-detail.ts +++ b/src/panels/config/logs/dialog-system-log-detail.ts @@ -1,14 +1,21 @@ +import "@material/mwc-icon-button/mwc-icon-button"; +import { mdiContentCopy } from "@mdi/js"; import "@polymer/paper-dialog-scrollable/paper-dialog-scrollable"; +import "@polymer/paper-tooltip/paper-tooltip"; +import type { PaperTooltipElement } from "@polymer/paper-tooltip/paper-tooltip"; import { css, CSSResult, html, + internalProperty, LitElement, property, - internalProperty, + query, TemplateResult, } from "lit-element"; +import { fireEvent } from "../../../common/dom/fire_event"; import "../../../components/dialog/ha-paper-dialog"; +import "../../../components/ha-svg-icon"; import { domainToName, fetchIntegrationManifest, @@ -16,12 +23,11 @@ import { IntegrationManifest, } from "../../../data/integration"; import { getLoggedErrorIntegration } from "../../../data/system_log"; -import { PolymerChangedEvent } from "../../../polymer-types"; +import type { PolymerChangedEvent } from "../../../polymer-types"; import { haStyleDialog } from "../../../resources/styles"; -import { HomeAssistant } from "../../../types"; -import { SystemLogDetailDialogParams } from "./show-dialog-system-log-detail"; +import type { HomeAssistant } from "../../../types"; +import type { SystemLogDetailDialogParams } from "./show-dialog-system-log-detail"; import { formatSystemLogTime } from "./util"; -import { fireEvent } from "../../../common/dom/fire_event"; class DialogSystemLogDetail extends LitElement { @property({ attribute: false }) public hass!: HomeAssistant; @@ -30,6 +36,8 @@ class DialogSystemLogDetail extends LitElement { @internalProperty() private _manifest?: IntegrationManifest; + @query("paper-tooltip") private _toolTip?: PaperTooltipElement; + public async showDialog(params: SystemLogDetailDialogParams): Promise { this._params = params; this._manifest = undefined; @@ -66,13 +74,25 @@ class DialogSystemLogDetail extends LitElement { opened @opened-changed="${this._openedChanged}" > -

- ${this.hass.localize( - "ui.panel.config.logs.details", - "level", - item.level - )} -

+
+

+ ${this.hass.localize( + "ui.panel.config.logs.details", + "level", + item.level + )} +

+ + + + ${this.hass.localize("ui.common.copied")} +

Logger: ${item.name}
@@ -148,6 +168,25 @@ class DialogSystemLogDetail extends LitElement { } } + private _copyLog(): void { + const copyElement = this.shadowRoot?.querySelector( + "paper-dialog-scrollable" + ) as HTMLElement; + + const selection = window.getSelection()!; + const range = document.createRange(); + + range.selectNodeContents(copyElement); + selection.removeAllRanges(); + selection.addRange(range); + + document.execCommand("copy"); + window.getSelection()!.removeAllRanges(); + + this._toolTip!.show(); + setTimeout(() => this._toolTip?.hide(), 3000); + } + static get styles(): CSSResult[] { return [ haStyleDialog, @@ -164,6 +203,15 @@ class DialogSystemLogDetail extends LitElement { pre { margin-bottom: 0; } + .heading { + display: flex; + display: flex; + align-items: center; + justify-content: space-between; + } + .heading ha-svg-icon { + cursor: pointer; + } `, ]; } diff --git a/src/translations/en.json b/src/translations/en.json index 8eadb910a9..f4dee440c1 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -278,7 +278,8 @@ "successfully_saved": "Successfully saved", "successfully_deleted": "Successfully deleted", "back": "Back", - "error_required": "Required" + "error_required": "Required", + "copied": "Copied" }, "components": { "logbook": { From ff081dd0f123d3c4ef36868f0014e41178c8b0f0 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Mon, 14 Sep 2020 00:32:37 +0000 Subject: [PATCH 05/31] [ci skip] Translation update --- translations/frontend/ca.json | 22 +++ translations/frontend/cs.json | 33 ++++ translations/frontend/en.json | 1 + translations/frontend/es-419.json | 282 ++++++++++++++++++++++++++--- translations/frontend/es.json | 9 + translations/frontend/nb.json | 30 +++ translations/frontend/nl.json | 32 ++++ translations/frontend/pl.json | 62 ++++++- translations/frontend/ru.json | 21 +++ translations/frontend/zh-Hans.json | 33 ++++ translations/frontend/zh-Hant.json | 22 +++ 11 files changed, 514 insertions(+), 33 deletions(-) diff --git a/translations/frontend/ca.json b/translations/frontend/ca.json index 9e89a2f943..c7ae05df35 100644 --- a/translations/frontend/ca.json +++ b/translations/frontend/ca.json @@ -574,6 +574,28 @@ "audio_not_supported": "El teu navegador no és compatible amb l'element d'àudio.", "choose_player": "Tria el reproductor", "choose-source": "Tria la font", + "class": { + "album": "Àlbum", + "app": "Aplicació", + "artist": "Artista", + "channel": "Canal", + "composer": "Compositor", + "contributing_artist": "Artista col·laborador", + "directory": "Biblioteca", + "episode": "Episodi", + "game": "Joc", + "genre": "Gènere", + "image": "Imatge", + "movie": "Pel·lícula", + "music": "Música", + "playlist": "Llista de reproducció", + "podcast": "Podcast", + "season": "Temporada", + "track": "Pista", + "tv_show": "Programa de TV", + "url": "URL", + "video": "Vídeo" + }, "content-type": { "album": "Àlbum", "artist": "Artista", diff --git a/translations/frontend/cs.json b/translations/frontend/cs.json index 8107413439..2bf3b4226f 100644 --- a/translations/frontend/cs.json +++ b/translations/frontend/cs.json @@ -574,6 +574,28 @@ "audio_not_supported": "Váš prohlížeč nepodporuje element \"audio\".", "choose_player": "Vyberte přehrávač", "choose-source": "Zvolte zdroj", + "class": { + "album": "Album", + "app": "Aplikace", + "artist": "Umělec", + "channel": "Kanál", + "composer": "Skladatel", + "contributing_artist": "Přispívající umělec", + "directory": "Knihovna", + "episode": "Epizoda", + "game": "Hra", + "genre": "Žánr", + "image": "Obrázek", + "movie": "Film", + "music": "Hudba", + "playlist": "Seznam skladeb", + "podcast": "Podcast", + "season": "Sezóna", + "track": "Stopa", + "tv_show": "Televizní pořad", + "url": "Url adresa", + "video": "Video" + }, "content-type": { "album": "Album", "artist": "Umělec", @@ -2352,9 +2374,14 @@ "title": "Stavy" }, "templates": { + "all_listeners": "Tato šablona naslouchá všem změnám stavu.", "description": "Šablony jsou vykreslovány pomocí Jinja2 šablonového enginu s některými specifickými rozšířeními pro Home Assistant.", + "domain": "Doména", "editor": "Editor šablon", + "entity": "Entita", "jinja_documentation": "Dokumentace šablony Jinja2", + "listeners": "Tato šablona naslouchá následujícím změnám stavu:", + "no_listeners": "Tato šablona neposlouchá žádné změny stavu a nebude se automaticky aktualizovat.", "reset": "Obnovit ukázkovou šablonu", "template_extensions": "Rozšíření šablony Home Assistant", "title": "Šablony", @@ -2941,6 +2968,11 @@ "submit": "Odeslat" }, "current_user": "Nyní jste přihlášeni jako {fullName}.", + "customize_sidebar": { + "button": "Upravit", + "description": "Režim úprav můžete aktivovat také stisknutím a podržením záhlaví postranního panelu.", + "header": "Změna pořadí a skrytí položek postranního panelu" + }, "dashboard": { "description": "Vyberte výchozí dashboard pro toto zařízení.", "dropdown_label": "Dashboard", @@ -3038,6 +3070,7 @@ } }, "sidebar": { + "done": "Hotovo", "external_app_configuration": "Konfigurace aplikace", "sidebar_toggle": "Přepínač postranního panelu" } diff --git a/translations/frontend/en.json b/translations/frontend/en.json index 2074324131..c4308bd7a5 100644 --- a/translations/frontend/en.json +++ b/translations/frontend/en.json @@ -507,6 +507,7 @@ "cancel": "Cancel", "close": "Close", "continue": "Continue", + "copied": "Copied", "delete": "Delete", "error_required": "Required", "loading": "Loading", diff --git a/translations/frontend/es-419.json b/translations/frontend/es-419.json index ced016f2a1..9f6f2ba0a4 100644 --- a/translations/frontend/es-419.json +++ b/translations/frontend/es-419.json @@ -19,6 +19,7 @@ "logbook": "", "mailbox": "", "map": "", + "media_browser": "Navegador de medios", "profile": "Perfil", "shopping_list": "Lista de compras", "states": "" @@ -106,7 +107,7 @@ }, "automation": { "off": "Desactivado", - "on": "Encendido" + "on": "Activada" }, "binary_sensor": { "battery": { @@ -205,7 +206,7 @@ "fan_only": "Sólo ventilador", "heat": "Calentar", "heat_cool": "Calentar/Enfriar", - "off": "Desactivar" + "off": "Apagado" }, "configurator": { "configure": "Configurar", @@ -237,7 +238,7 @@ "home": "En Casa", "locked": "Cerrado", "not_home": "Fuera de Casa", - "off": "Desactivado", + "off": "Apagado", "ok": "OK", "on": "Encendido", "open": "Abierto", @@ -419,9 +420,16 @@ "unlock": "Desbloquear" }, "media_player": { + "browse_media": "Explorar medios", + "media_next_track": "Siguiente", + "media_play": "Reproducir", + "media_play_pause": "Reproducir/pausa", + "media_previous_track": "Anterior", "sound_mode": "Modo de sonido", "source": "Fuente", - "text_to_speak": "Texto a hablar" + "text_to_speak": "Texto a hablar", + "turn_off": "Apagar", + "turn_on": "Encender" }, "persistent_notification": { "dismiss": "Descartar" @@ -498,6 +506,7 @@ "back": "Atrás", "cancel": "Cancelar", "close": "Cerrar", + "continue": "Continuar", "delete": "Eliminar", "error_required": "Requerido", "loading": "Cargando", @@ -544,6 +553,10 @@ "toggle": "Alternar" }, "entity": { + "entity-attribute-picker": { + "attribute": "Atributo", + "show_attributes": "Mostrar atributos" + }, "entity-picker": { "clear": "Limpiar", "entity": "Entidad", @@ -554,6 +567,58 @@ "loading_history": "Cargando historial de estado...", "no_history_found": "No se encontró historial de estado." }, + "logbook": { + "entries_not_found": "No se encontraron entradas en el libro de registro." + }, + "media-browser": { + "audio_not_supported": "Su navegador no soporta el elemento de audio.", + "choose_player": "Elige el reproductor", + "choose-source": "Elige la fuente", + "class": { + "album": "Álbum", + "app": "Aplicación", + "artist": "Artista", + "channel": "Canal", + "composer": "Compositor", + "contributing_artist": "Artista colaborador", + "directory": "Biblioteca", + "episode": "Episodio", + "game": "Juego", + "genre": "Género", + "image": "Imagen", + "movie": "Película", + "music": "Música", + "playlist": "Lista de reproducción", + "podcast": "Podcast", + "season": "Temporada", + "track": "Pista", + "tv_show": "Programa de TV", + "url": "URL", + "video": "Video" + }, + "content-type": { + "album": "Álbum", + "artist": "Artista", + "library": "Biblioteca", + "playlist": "Lista de reproducción", + "server": "Servidor" + }, + "media_browsing_error": "Error de navegación de medios", + "media_not_supported": "El Reproductor multimedia no es compatible con este tipo de medios", + "media_player": "Reproductor multimedia", + "media-player-browser": "Navegador del reproductor multimedia", + "no_items": "No hay elementos", + "pick": "Elegir", + "pick-media": "Elija medios", + "play": "Reproducir", + "play-media": "Reproducir medios", + "video_not_supported": "Su navegador no soporta el elemento de vídeo.", + "web-browser": "Navegador web" + }, + "picture-upload": { + "label": "Imagen", + "unsupported_format": "Formato no admitido, elija una imagen JPEG, PNG o GIF." + }, "related-items": { "area": "Área", "automation": "Parte de las siguientes automatizaciones", @@ -574,6 +639,7 @@ "week": "{count} {count, plural,\n one {semana}\n other {semanas}\n}" }, "future": "en {time}", + "just_now": "Ahora mismo", "never": "Nunca", "past": "Hace {time}" }, @@ -652,13 +718,19 @@ "pattern": "Patrón de expresiones regulares para la validación del lado del cliente", "text": "Texto" }, - "platform_not_loaded": "La integración {platform} no está cargada. Agregue su configuración agregando 'default_config:' o ''{platform}:''.", + "platform_not_loaded": "La integración {platform} no está cargada. Añádela a su archivo de configuración agregando 'default_config:' o ''{platform}:''.", "required_error_msg": "Este campo es requerido", "yaml_not_editable": "La configuración de esta entidad no se puede editar desde la interfaz de usuario. Solo las entidades configuradas desde la interfaz de usuario se pueden configurar desde la interfaz de usuario." }, + "image_cropper": { + "crop": "Cortar" + }, "more_info_control": { + "controls": "Controles", + "details": "Detalles", "dismiss": "Descartar diálogo", "edit": "Editar entidad", + "history": "Historial", "person": { "create_zone": "Crear zona desde ubicación actual" }, @@ -724,11 +796,11 @@ }, "zha_device_info": { "buttons": { - "add": "Agregar dispositivos", + "add": "Agregar dispositivos usando este dispositivo", "clusters": "Administrar clústeres", "reconfigure": "Reconfigurar dispositivo", "remove": "Eliminar dispositivo", - "zigbee_information": "Información de Zigbee" + "zigbee_information": "Firma del dispositivo Zigbee" }, "confirmations": { "remove": "¿Está seguro de que desea eliminar el dispositivo?" @@ -748,7 +820,7 @@ "unknown": "Desconocido", "zha_device_card": { "area_picker_label": "Área", - "device_name_placeholder": "Nombre de usuario", + "device_name_placeholder": "Cambiar el nombre del dispositivo", "update_name_button": "Actualizar Nombre" } } @@ -798,7 +870,7 @@ "confirmation_text": "Todos los dispositivos en esta área quedarán sin asignar.", "confirmation_title": "¿Está seguro de que desea eliminar esta área?" }, - "description": "Visión general de todas las áreas de su casa.", + "description": "Gestione las áreas de su casa.", "editor": { "area_id": "Identificador del área", "create": "Crear", @@ -859,13 +931,19 @@ "label": "Llamar servico", "service_data": "Datos" }, + "wait_for_trigger": { + "continue_timeout": "Continuar cuando el tiempo venza", + "label": "Esperar por un desencadenador", + "timeout": "Tiempo limite (opcional)" + }, "wait_template": { + "continue_timeout": "Continuar cuando el tiempo venza", "label": "Esperar", "timeout": "Tiempo de espera (opcional)", "wait_template": "Plantilla de espera" } }, - "unsupported_action": "Acción no soportada: {action}" + "unsupported_action": "No hay soporte en la interfaz de usuario para la acción: {action}" }, "alias": "Nombre", "conditions": { @@ -923,7 +1001,9 @@ "time": { "after": "Después de", "before": "Antes de", - "label": "Hora" + "label": "Hora", + "type_input": "Valor de un auxiliar de tipo fecha/tiempo", + "type_value": "Tiempo corregido" }, "zone": { "entity": "Entidad con ubicación", @@ -931,7 +1011,7 @@ "zone": "Zona" } }, - "unsupported_condition": "Condición no soportada: {condition}" + "unsupported_condition": "No hay soporte en la interfaz de usuario para la condición: {condition}" }, "default_name": "Nueva Automatización", "description": { @@ -1000,7 +1080,7 @@ "start": "Inicio" }, "mqtt": { - "label": "", + "label": "MQTT", "payload": "Payload (opcional)", "topic": "Topic" }, @@ -1011,6 +1091,7 @@ "value_template": "Plantilla de valor (opcional)" }, "state": { + "attribute": "Atributo (opcional)", "for": "Por", "from": "De", "label": "Estado", @@ -1023,6 +1104,9 @@ "sunrise": "Salida del sol", "sunset": "Puesta de sol" }, + "tag": { + "label": "Etiqueta" + }, "template": { "label": "Plantilla", "value_template": "Plantilla de valor" @@ -1034,8 +1118,10 @@ "seconds": "Segundos" }, "time": { - "at": "A", - "label": "Hora" + "at": "A las", + "label": "Hora", + "type_input": "Valor de un auxiliar de tipo fecha/tiempo", + "type_value": "Tiempo corregido" }, "webhook": { "label": "Webhook", @@ -1050,7 +1136,7 @@ "zone": "Zona" } }, - "unsupported_platform": "Plataforma no soportada: {platform}" + "unsupported_platform": "No hay soporte en la interfaz de usuario para la plataforma: {platform}" }, "unsaved_confirm": "Tiene cambios sin guardar. ¿Estás seguro que quieres salir?" }, @@ -1058,6 +1144,8 @@ "add_automation": "Agregar automatización", "delete_automation": "Eliminar automatización", "delete_confirm": "¿Está seguro de que desea eliminar esta automatización?", + "duplicate": "Duplicar", + "duplicate_automation": "Duplicar automatización", "edit_automation": "Editar automatización", "header": "Editor de automatizaciones", "headers": { @@ -1139,8 +1227,13 @@ }, "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.", + "dont_expose_entity": "No exponer la entidad", "expose": "Exponer a Alexa", + "expose_entity": "Exponer la entidad", + "exposed": "{selected} expuesto", "exposed_entities": "Entidades expuestas", + "follow_domain": "Seguir dominio", + "not_exposed": "{selected} no expuesto", "not_exposed_entities": "Entidades no expuestas", "title": "Alexa" }, @@ -1178,8 +1271,14 @@ "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", + "dont_expose_entity": "No exponer la entidad", "expose": "Exponer al Asistente de Google", + "expose_entity": "Exponer la entidad", + "exposed": "{selected} expuesto", "exposed_entities": "Entidades expuestas", + "follow_domain": "Seguir dominio", + "manage_domains": "Gestionar dominios", + "not_exposed": "{selected} no expuesto", "not_exposed_entities": "Entidades no expuestas", "sync_to_google": "Sincronizar los cambios con Google.", "title": "Asistente de Google" @@ -1281,6 +1380,7 @@ } }, "devices": { + "add_prompt": "Aún no se ha agregado ningún {name} con este dispositivo. Puede agregar uno haciendo clic en el botón + de arriba.", "automation": { "actions": { "caption": "Cuando algo se desencadena..." @@ -1300,6 +1400,7 @@ "caption": "Dispositivos", "confirm_delete": "¿Está seguro de que desea eliminar este dispositivo?", "confirm_rename_entity_ids": "¿También desea cambiar el nombre de la identificación de la entidad de sus entidades?", + "confirm_rename_entity_ids_warning": "Esto no cambiará ninguna configuración (como automatizaciones, scripts, escenas, Lovelace) que esté usando actualmente estas entidades, tendrás que actualizarlas tú mismo.", "data_table": { "area": "Área", "battery": "Batería", @@ -1341,7 +1442,7 @@ }, "entities": { "caption": "Entidades", - "description": "Visión general de todas las entidades conocidas.", + "description": "Gestione todas las entidades conocidas.", "picker": { "disable_selected": { "button": "Deshabilitar selección", @@ -1393,7 +1494,7 @@ "header": "Configurar Home Assistant", "helpers": { "caption": "Auxiliares", - "description": "Elementos que pueden ayudar a construir automatizaciones.", + "description": "Gestionar elementos ayudan a construir automatizaciones", "dialog": { "add_helper": "Agregar auxiliar", "add_platform": "Añadir {platform}", @@ -1444,6 +1545,7 @@ }, "integrations": { "add_integration": "Agregar integración", + "attention": "Atención requerida", "caption": "Integraciones", "config_entry": { "area": "En {area}", @@ -1464,6 +1566,7 @@ "options": "Opciones", "rename": "Renombrar", "restart_confirm": "Reinicie Home Assistant para terminar de eliminar esta integración.", + "services": "{count} {count, plural,\n one {service}\n other {services}\n}", "settings_button": "Editar configuración para {integration}", "system_options": "Opciones de Sistema", "system_options_button": "Opciones del sistema para {integration}", @@ -1486,7 +1589,7 @@ }, "configure": "Configurar", "configured": "Configurado", - "description": "Administrar y configurar integraciones", + "description": "Gestione las integraciones", "details": "Detalles de integración", "discovered": "Descubierto", "home_assistant_website": "Sitio web de Home Assistant", @@ -1510,6 +1613,7 @@ "none_found_detail": "Ajuste sus criterios de búsqueda", "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 ", + "reconfigure": "Reconfigurar", "rename_dialog": "Editar el nombre de esta entrada de configuración", "rename_input_label": "Ingresar Nombre", "search": "Buscar integraciones" @@ -1619,13 +1723,84 @@ "title": "", "topic": "tema" }, + "ozw": { + "button": "Configurar", + "common": { + "controller": "Controlador", + "instance": "Instancia", + "network": "Red" + }, + "navigation": { + "network": "Red", + "nodes": "Nodos", + "select_instance": "Seleccione la instancia" + }, + "network_status": { + "details": { + "driverallnodesqueried": "Todos los nodos han sido consultados", + "driverallnodesqueriedsomedead": "Todos los nodos han sido consultados. Algunos nodos fueron encontrados inactivos.", + "driverawakenodesqueries": "Se han consultado todos los nodos activos", + "driverfailed": "No se pudo conectar al controlador Z-Wave", + "driverready": "Iniciando el controlador de Z-Wave", + "driverremoved": "El controlador ha sido eliminado", + "driverreset": "El controlador se ha reiniciado", + "offline": "OZWDaemon fuera de línea", + "ready": "Listo para conectar", + "started": "Conectado a MQTT", + "starting": "Conectando con MQTT", + "stopped": "OpenZWave se detuvo" + }, + "offline": "Fuera de línea", + "online": "En línea", + "starting": "Comenzando", + "unknown": "Desconocido" + }, + "network": { + "header": "Gestión de red", + "introduction": "Gestione las funciones de toda la red." + }, + "node_query_stages": { + "complete": "El proceso de consulta está completo", + "configuration": "Obteniendo los valores de configuración del nodo", + "dynamic": "Obteniendo los valores que cambian con frecuencia del nodo" + }, + "node": { + "button": "Detalles del nodo", + "not_found": "Nodo no encontrado" + }, + "nodes_table": { + "failed": "Fallido", + "id": "ID", + "manufacturer": "Fabricante", + "model": "Modelo", + "query_stage": "Etapa de consulta", + "zwave_plus": "Z-Wave Plus" + }, + "refresh_node": { + "battery_note": "Si el nodo funciona con batería, asegúrese de activarlo antes de continuar.", + "button": "Actualizar nodo", + "complete": "Actualización de nodo completa", + "description": "Esto le indicará a OpenZWave que vuelva a consultar un nodo y actualice las clases de comando, las capacidades y los valores del nodo.", + "node_status": "Estado del nodo", + "refreshing_description": "Actualizando la información del nodo ...", + "start_refresh_button": "Iniciar actualización", + "step": "Paso", + "title": "Actualizar la información del nodos", + "wakeup_header": "Instrucciones de activación para", + "wakeup_instructions_source": "Las instrucciones de activación se obtienen de la base de datos de dispositivos de la comunidad OpenZWave." + }, + "select_instance": { + "header": "Seleccione una instancia OpenZWave", + "introduction": "Tiene más de una instancia de OpenZWave en ejecución. ¿Qué instancia te gustaría gestionar?" + } + }, "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.", + "description": "Gestione las personas que rastrea Home Assistant.", "detail": { "create": "Crear", "delete": "Eliminar", @@ -1648,7 +1823,7 @@ "scene": { "activated": "Escena activada {name}.", "caption": "Escenas", - "description": "Crear y editar escenas", + "description": "Gestionar escenas", "editor": { "default_name": "Nueva escena", "devices": { @@ -1743,7 +1918,7 @@ "reloading": { "automation": "Recargar automatizaciones", "core": "Recargar ubicación y personalizaciones", - "group": "Recargar grupos", + "group": "Recargar grupos, entidades grupales, y servicios de notificación", "heading": "Recarga de configuración YAML", "input_boolean": "Recargar controles booleanos", "input_datetime": "Recargar controles de fechas", @@ -1751,9 +1926,16 @@ "input_select": "Recargar controles de selección", "input_text": "Recargar controles de texto", "introduction": "Algunas partes de Home Assistant pueden recargarse sin requerir un reinicio. Al presionar recargar se descargará su configuración YAML actual y se cargará la nueva.", + "mqtt": "Recargar entidades MQTT", "person": "Recargar personas", + "reload": "Recargar {domain}", + "rest": "Recargar entidades \"rest\" y servicios de notificación.", + "rpi_gpio": "Recargue las entidades GPIO de la Raspberry Pi", "scene": "Recargar escenas", "script": "Recargar scripts", + "smtp": "Recargar servicios de notificación smtp", + "telegram": "Recargar servicios de notificación de telegram", + "template": "Recargar las entidades de la plantilla", "zone": "Recargar zonas" }, "server_management": { @@ -1773,6 +1955,32 @@ } } }, + "tags": { + "add_tag": "Añadir etiqueta", + "automation_title": "La etiqueta {name} ha sido escaneada", + "caption": "Etiquetas", + "create_automation": "Crea automatización con etiqueta", + "description": "Gestionar etiquetas", + "detail": { + "create": "Crear", + "create_and_write": "Crear y escribir", + "delete": "Eliminar", + "description": "Descripción", + "name": "Nombre", + "new_tag": "Nueva etiqueta", + "tag_id": "ID de etiqueta", + "tag_id_placeholder": "Autogenerado cuando se deja vacío", + "update": "Actualizar" + }, + "edit": "Editar", + "headers": { + "last_scanned": "Último escaneado", + "name": "Nombre" + }, + "never_scanned": "Nunca escaneado", + "no_tags": "Sin etiquetas", + "write": "Escribir" + }, "users": { "add_user": { "caption": "Agregar usuario", @@ -1809,7 +2017,7 @@ "system": "Sistema" } }, - "users_privileges_note": "El grupo de usuarios es un trabajo en progreso. El usuario no podrá administrar la instancia a través de la interfaz de usuario. Todavía estamos auditando todos los puntos finales de la API de administración para garantizar que limiten correctamente el acceso a los administradores." + "users_privileges_note": "El grupo de usuarios es un trabajo en progreso. El usuario no podrá administrar la instancia a través de la interfaz de usuario. Todavía estamos auditando todos los puntos finales de la API de administración para garantizar que limiten correctamente el acceso solo a los administradores." }, "zha": { "add_device_page": { @@ -1847,7 +2055,7 @@ "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." + "introduction": "Los clústeres son los bloques de construcción para la funcionalidad de Zigbee. Ellos separan la funcionalidad en unidades lógicas. Hay tipos de clientes y servidores que se componen de atributos y comandos." }, "common": { "add_devices": "Agregar dispositivos", @@ -1879,7 +2087,7 @@ "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", + "description": "Gestione los 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", @@ -2091,9 +2299,14 @@ "title": "Estados" }, "templates": { + "all_listeners": "Esta plantilla escucha todos los eventos de cambio de estado.", "description": "Las plantillas se representan utilizando el motor de plantillas Jinja2 con algunas extensiones específicas de Home Assistant.", + "domain": "Dominio", "editor": "Editor de plantillas", + "entity": "Entidad", "jinja_documentation": "Documentación de plantillas Jinja2", + "listeners": "Esta plantilla escucha los eventos de los siguientes cambios de estado:", + "no_listeners": "Esta plantilla no escucha ningún evento de cambio de estado y no se actualizará automáticamente.", "template_extensions": "Extensiones de plantilla de Home Assistant", "title": "Plantilla", "unknown_error_template": "Error desconocido al mostrar la plantilla" @@ -2335,7 +2548,11 @@ } }, "cardpicker": { + "by_card": "Por Tarjeta", + "by_entity": "Por Entidad", "custom_card": "Personalizado", + "domain": "Dominio", + "entity": "Entidad", "no_description": "No hay descripción disponible." }, "edit_card": { @@ -2349,10 +2566,11 @@ "options": "Mas opciones", "pick_card": "¿Qué tarjeta desea agregar?", "pick_card_view_title": "¿Qué tarjeta le gustaría agregar a su vista de {name} ?", + "search_cards": "Buscar tarjetas", "show_code_editor": "Mostrar editor de código", "show_visual_editor": "Mostrar el editor visual", "toggle_editor": "Cambiar editor", - "typed_header": "{tipo} Configuración de la tarjeta", + "typed_header": "{type} Configuración de la tarjeta", "unsaved_changes": "Tiene cambios no guardados" }, "edit_lovelace": { @@ -2429,7 +2647,7 @@ }, "menu": { "close": "Cerrar", - "configure_ui": "Configurar interfaz de usuario", + "configure_ui": "Editar interfaz de usuario", "exit_edit_mode": "Salir del modo de edición de la interfaz de usuario", "help": "Ayuda", "refresh": "Refrescar", @@ -2661,6 +2879,11 @@ "submit": "Enviar" }, "current_user": "Actualmente estás conectado como {fullName} .", + "customize_sidebar": { + "button": "Editar", + "description": "También puede mantener pulsado el encabezado de la barra lateral para activar el modo de edición.", + "header": "Cambiar el orden y ocultar elementos de la barra lateral" + }, "dashboard": { "description": "Elija un tablero predeterminado para este dispositivo.", "dropdown_label": "Tablero", @@ -2683,6 +2906,7 @@ "confirm_delete": "¿Está seguro de que desea eliminar el token de acceso para {name}?", "create": "Crear Token", "create_failed": "No se pudo crear el token de acceso.", + "created": "Creado {date}", "created_at": "Creado en {date}", "delete_failed": "No se pudo eliminar el token de acceso.", "description": "Cree tokens de acceso de larga duración para permitir que sus secuencias de comandos interactúen con la instancia de su Home Assistant. Cada token tendrá una validez de 10 años a partir de su creación. Los siguientes tokens de acceso de larga duración están activos actualmente.", @@ -2690,9 +2914,10 @@ "header": "Tokens de acceso de larga duración", "last_used": "Utilizado por última vez en {date} desde {location}.", "learn_auth_requests": "Aprenda a realizar solicitudes autenticadas.", + "name": "Nombre", "not_used": "Nunca se ha utilizado", "prompt_copy_token": "Copia tu token de acceso. No se volverá a mostrar", - "prompt_name": "¿Nombre?" + "prompt_name": "Dale un nombre al token" }, "mfa_setup": { "close": "Cerrar", @@ -2748,6 +2973,7 @@ } }, "sidebar": { + "done": "Hecho", "external_app_configuration": "Configuración de la aplicación", "sidebar_toggle": "Alternar barra lateral" } diff --git a/translations/frontend/es.json b/translations/frontend/es.json index 93eaa86477..10b6151b0d 100644 --- a/translations/frontend/es.json +++ b/translations/frontend/es.json @@ -571,6 +571,15 @@ "audio_not_supported": "Tu navegador no es compatible con el elemento de audio.", "choose_player": "Elige reproductor", "choose-source": "Elige la fuente", + "class": { + "playlist": "Lista de reproducción", + "podcast": "Podcast", + "season": "Temporada", + "track": "Pista", + "tv_show": "Programa de TV", + "url": "Url", + "video": "Vídeo" + }, "content-type": { "album": "Álbum", "artist": "Artista", diff --git a/translations/frontend/nb.json b/translations/frontend/nb.json index ab4abc249b..f835f9e909 100644 --- a/translations/frontend/nb.json +++ b/translations/frontend/nb.json @@ -574,6 +574,28 @@ "audio_not_supported": "Nettleseren din støtter ikke lydelementet.", "choose_player": "Velg spiller", "choose-source": "Velg kilde", + "class": { + "album": "Album", + "app": "App", + "artist": "Artist", + "channel": "Kanal", + "composer": "Komponist", + "contributing_artist": "Medvirkende artist", + "directory": "Bibliotek", + "episode": "Episode", + "game": "Spill", + "genre": "Sjanger", + "image": "Bilde", + "movie": "Film", + "music": "Musikk", + "playlist": "Spilleliste", + "podcast": "Podcast", + "season": "Sesong", + "track": "Spor", + "tv_show": "TV Serie", + "url": "Url", + "video": "Video" + }, "content-type": { "album": "Album", "artist": "Artist", @@ -2353,7 +2375,9 @@ }, "templates": { "description": "Maler blir rendret ved hjelp av Jinja2-malmotoren med noen spesifikke utvidelser for Home Assistant.", + "domain": "Domene", "editor": "Maleditor", + "entity": "Entitet", "jinja_documentation": "Jinja2 mal dokumentasjon", "reset": "Tilbakestill til demomal", "template_extensions": "Mal utvidelser for Home Assistant", @@ -2941,6 +2965,9 @@ "submit": "Send inn" }, "current_user": "Du er logget inn som {fullName}.", + "customize_sidebar": { + "header": "Endre rekkefølgen og skjul elementer fra sidepanelet" + }, "dashboard": { "description": "Velg et standard instrumentbord for denne enheten.", "dropdown_label": "", @@ -2963,6 +2990,7 @@ "confirm_delete": "Er du sikker på at du vil slette tilgangstoken for {name}?", "create": "Opprett Token", "create_failed": "Kunne ikke opprette tilgangstoken.", + "created": "Opprettet {date}", "created_at": "Opprettet den {date}", "delete_failed": "Kan ikke slette tilgangstokenet.", "description": "Opprett langvarige tilgangstokener slik at skriptene dine kan samhandle med din Home Assistant instans. Hver token vil være gyldig i 10 år fra opprettelsen. Følgende langvarige tilgangstokener er for tiden aktive.", @@ -2970,6 +2998,7 @@ "header": "Langvarige tilgangstokener", "last_used": "Sist brukt den {date} fra {location}", "learn_auth_requests": "Lær hvordan du lager godkjente forespørsler.", + "name": "Navn", "not_used": "Har aldri blitt brukt", "prompt_copy_token": "Kopier tilgangstoken. Det blir ikke vist igjen.", "prompt_name": "Navn?" @@ -3036,6 +3065,7 @@ } }, "sidebar": { + "done": "Ferdig", "external_app_configuration": "Appkonfigurasjon", "sidebar_toggle": "Vis/Skjul sidepanel" } diff --git a/translations/frontend/nl.json b/translations/frontend/nl.json index 7e36879dae..b4f6f2fbce 100644 --- a/translations/frontend/nl.json +++ b/translations/frontend/nl.json @@ -574,6 +574,28 @@ "audio_not_supported": "Uw browser ondersteunt het audio-element niet.", "choose_player": "Kies speler", "choose-source": "Kies bron", + "class": { + "album": "Album", + "app": "App", + "artist": "Artiest", + "channel": "Kanaal", + "composer": "Componist", + "contributing_artist": "Bijdragende artiest", + "directory": "Bibliotheek", + "episode": "Aflevering", + "game": "Spel", + "genre": "Genre", + "image": "Afbeelding", + "movie": "Film", + "music": "Muziek", + "playlist": "Afspeellijst", + "podcast": "Podcast", + "season": "Seizoen", + "track": "Nummer", + "tv_show": "TV-programma", + "url": "Url", + "video": "Video" + }, "content-type": { "album": "Album", "artist": "Artiest", @@ -2353,7 +2375,9 @@ }, "templates": { "description": "Sjablonen worden weergegeven met de Jinja2-sjabloonediter samen met enkele extensies van Home Assistant.", + "domain": "Domein", "editor": "Sjabloonediter", + "entity": "Entiteit", "jinja_documentation": "Jinja2-sjabloondocumentatie", "reset": "Resetten naar demosjabloon", "template_extensions": "Home Assistant sjabloon extensiesHome Assistant", @@ -2941,6 +2965,11 @@ "submit": "Verzenden" }, "current_user": "Je bent momenteel ingelogd als {fullName}.", + "customize_sidebar": { + "button": "Bewerken", + "description": "U kunt ook de koptekst van de zijbalk ingedrukt houden om de bewerkingsmodus te activeren.", + "header": "Wijzig de volgorde en verberg items van de zijbalk" + }, "dashboard": { "description": "Kies een standaard dashboard voor dit apparaat.", "dropdown_label": "Dashboard", @@ -2963,6 +2992,7 @@ "confirm_delete": "Weet je zeker dat je de toegangstoken voor {name} wilt verwijderen?", "create": "Token aanmaken", "create_failed": "De toegangstoken kon niet worden aangemaakt.", + "created": "Gemaakt op {date}", "created_at": "Gemaakt op {date}", "delete_failed": "Verwijderen van de toegangstoken is mislukt.", "description": "Maak toegangstokens met een lange levensduur zodat je scripts kunnen communiceren met je Home Assistant-instantie. Elk token is tien jaar geldig vanaf de aanmaakdatum. De volgende langlevende toegangstokens zijn momenteel actief.", @@ -2970,6 +3000,7 @@ "header": "Toegangtokens met lange levensduur", "last_used": "Laatst gebruikt op {date} vanaf {location}", "learn_auth_requests": "Kom te weten hoe je geverifieerde verzoeken kunt maken", + "name": "Naam", "not_used": "Is nog nooit gebruikt", "prompt_copy_token": "Kopieer je toegangstoken. Het wordt niet meer getoond.", "prompt_name": "Naam?" @@ -3036,6 +3067,7 @@ } }, "sidebar": { + "done": "Gedaan", "external_app_configuration": "App configuratie", "sidebar_toggle": "Zijbalk in- en uitschakelen" } diff --git a/translations/frontend/pl.json b/translations/frontend/pl.json index 68d09fa8ae..ffee82cabd 100644 --- a/translations/frontend/pl.json +++ b/translations/frontend/pl.json @@ -19,6 +19,7 @@ "logbook": "Dziennik", "mailbox": "Poczta", "map": "Mapa", + "media_browser": "Odtwarzacz mediów", "profile": "Profil", "shopping_list": "Lista zakupów", "states": "Przegląd" @@ -553,6 +554,7 @@ }, "entity": { "entity-attribute-picker": { + "attribute": "Atrybut", "show_attributes": "Pokaż atrybuty" }, "entity-picker": { @@ -565,10 +567,35 @@ "loading_history": "Ładowanie historii...", "no_history_found": "Nie znaleziono historii." }, + "logbook": { + "entries_not_found": "Nie znaleziono wpisów w dzienniku." + }, "media-browser": { "audio_not_supported": "Twoja przeglądarka nie obsługuje elementu audio.", "choose_player": "Wybierz odtwarzacz", "choose-source": "Wybierz źródło", + "class": { + "album": "Album", + "app": "Aplikacja", + "artist": "Artysta", + "channel": "Kanał", + "composer": "Kompozytor", + "contributing_artist": "Artysta współpracujący", + "directory": "Biblioteka", + "episode": "Odcinek", + "game": "Gra", + "genre": "Gatunek", + "image": "Obraz", + "movie": "Film", + "music": "Muzyka", + "playlist": "Playlista", + "podcast": "Podcast", + "season": "Sezon", + "track": "Ścieżka", + "tv_show": "Program telewizyjny", + "url": "URL", + "video": "Wideo" + }, "content-type": { "album": "Album", "artist": "Artysta", @@ -576,6 +603,7 @@ "playlist": "Lista odtwarzania", "server": "Serwer" }, + "media_browsing_error": "Błąd przeglądania multimediów", "media_not_supported": "Przeglądarka odtwarzacza mediów nie obsługuje tego typu mediów", "media_player": "Odtwarzacz mediów", "media-player-browser": "Przeglądarka odtwarzacza mediów", @@ -931,7 +959,13 @@ "label": "Wywołanie usługi", "service_data": "Dane usługi" }, + "wait_for_trigger": { + "continue_timeout": "Kontynuuj po przekroczeniu limitu czasu", + "label": "Czekaj na wyzwalacz", + "timeout": "Limit czasu (opcjonalnie)" + }, "wait_template": { + "continue_timeout": "Kontynuuj po przekroczeniu limitu czasu", "label": "Oczekiwanie", "timeout": "Limit czasu (opcjonalnie)", "wait_template": "Szablon czekania" @@ -995,7 +1029,9 @@ "time": { "after": "Po", "before": "Przed", - "label": "Czas" + "label": "Czas", + "type_input": "Wartość pomocnika typu data/czas", + "type_value": "Ustalony czas" }, "zone": { "entity": "Encja z lokalizacją", @@ -1083,6 +1119,7 @@ "value_template": "Szablon wartości (opcjonalnie)" }, "state": { + "attribute": "Atrybut (opcjonalnie)", "for": "Przez", "from": "Z", "label": "Stan", @@ -1110,7 +1147,9 @@ }, "time": { "at": "O", - "label": "Czas" + "label": "Czas", + "type_input": "Wartość pomocnika typu data/czas", + "type_value": "Ustalony czas" }, "webhook": { "label": "Webhook", @@ -1134,7 +1173,7 @@ "delete_automation": "Usuń automatyzację", "delete_confirm": "Czy na pewno chcesz usunąć tę automatyzację?", "duplicate": "Duplikuj", - "duplicate_automation": "Duplikat automatyzację", + "duplicate_automation": "Duplikuj automatyzację", "edit_automation": "Edytuj automatyzację", "header": "Edytor automatyzacji", "headers": { @@ -1502,7 +1541,7 @@ }, "types": { "input_boolean": "Przełącznik", - "input_datetime": "Data i/lub godzina", + "input_datetime": "Data i/lub czas", "input_number": "Numer", "input_select": "Pole wyboru", "input_text": "Tekst" @@ -1535,6 +1574,7 @@ }, "integrations": { "add_integration": "Dodaj integrację", + "attention": "Wymaga uwagi", "caption": "Integracje", "config_entry": { "area": "obszar: {area}", @@ -1937,7 +1977,7 @@ "reloading": { "automation": "Automatyzacje", "command_line": "Encje komponentu linia komend", - "core": "Lokalizacja i dostosowywanie", + "core": "Lokalizację i dostosowywanie", "filesize": "Encje komponentu wielkość pliku", "filter": "Encje komponentu filtr", "generic": "Encje komponentu kamera IP generic", @@ -2334,9 +2374,14 @@ "title": "Stany" }, "templates": { + "all_listeners": "Ten szablon nasłuchuje wszystkich zdarzeń zmiany stanu.", "description": "Szablony są renderowane przy użyciu silnika szablonów Jinja2 z kilkoma specyficznymi rozszerzeniami Home Assistanta.", + "domain": "Domena", "editor": "Edytor szablonów", + "entity": "Encja", "jinja_documentation": "Dokumentacja szablonów Jinja2", + "listeners": "Ten szablon nasłuchuje następujących zdarzeń zmiany stanu:", + "no_listeners": "Ten szablon nie nasłuchuje żadnych zdarzeń zmiany stanu i nie zostanie zaktualizowany automatycznie.", "reset": "Zresetuj do szablonu demonstracyjnego", "template_extensions": "Rozszerzenia szablonów Home Assistanta", "title": "Szablon", @@ -2923,6 +2968,11 @@ "submit": "Zatwierdź" }, "current_user": "Jesteś obecnie zalogowany jako {fullName}.", + "customize_sidebar": { + "button": "Edytuj", + "description": "Możesz także nacisnąć i przytrzymać nagłówek paska bocznego, aby aktywować tryb edycji.", + "header": "Zmień kolejność i ukryj elementy na pasku bocznym" + }, "dashboard": { "description": "Wybierz domyślny dashboard dla tego urządzenia.", "dropdown_label": "Dashboard", @@ -2945,6 +2995,7 @@ "confirm_delete": "Czy na pewno chcesz usunąć token dla {name}?", "create": "Utwórz token", "create_failed": "Nie udało się utworzyć tokena.", + "created": "Utworzony {date}", "created_at": "Utworzony {date}", "delete_failed": "Nie udało się usunąć tokena.", "description": "Długoterminowe tokeny dostępu umożliwiają skryptom interakcję z Home Assistantem. Każdy token będzie ważny przez 10 lat od utworzenia. Następujące tokeny są obecnie aktywne.", @@ -3019,6 +3070,7 @@ } }, "sidebar": { + "done": "Gotowe", "external_app_configuration": "Konfiguracja aplikacji", "sidebar_toggle": "Przełącz pasek boczny" } diff --git a/translations/frontend/ru.json b/translations/frontend/ru.json index 30a5044abe..476f5bdb03 100644 --- a/translations/frontend/ru.json +++ b/translations/frontend/ru.json @@ -574,6 +574,27 @@ "audio_not_supported": "Ваш браузер не поддерживает аудио.", "choose_player": "Выберите медиаплеер", "choose-source": "Выбрать источник", + "class": { + "album": "Альбом", + "app": "Приложение", + "artist": "Исполнитель", + "channel": "Канал", + "composer": "Композитор", + "directory": "Библиотека", + "episode": "Эпизод", + "game": "Игра", + "genre": "Жанр", + "image": "Изображение", + "movie": "Фильм", + "music": "Музыка", + "playlist": "Плейлист", + "podcast": "Подкаст", + "season": "Сезон", + "track": "Трек", + "tv_show": "Сериалы", + "url": "URL-адрес", + "video": "Видео" + }, "content-type": { "album": "Альбом", "artist": "Исполнитель", diff --git a/translations/frontend/zh-Hans.json b/translations/frontend/zh-Hans.json index 611909f0cf..d8bc96cb89 100644 --- a/translations/frontend/zh-Hans.json +++ b/translations/frontend/zh-Hans.json @@ -574,6 +574,28 @@ "audio_not_supported": "您的浏览器不支持音频元素。", "choose_player": "选择播放器", "choose-source": "选择媒体源", + "class": { + "album": "专辑", + "app": "应用", + "artist": "艺术家", + "channel": "频道", + "composer": "作曲家", + "contributing_artist": "参与创作者", + "directory": "媒体库", + "episode": "分集", + "game": "游戏", + "genre": "体裁", + "image": "图片", + "movie": "电影", + "music": "音乐", + "playlist": "播放列表", + "podcast": "播客", + "season": "播出季", + "track": "音轨", + "tv_show": "电视节目", + "url": "网址", + "video": "视频" + }, "content-type": { "album": "专辑", "artist": "艺术家", @@ -2352,9 +2374,14 @@ "title": "状态" }, "templates": { + "all_listeners": "此模板监听所有的状态改变事件。", "description": "模板使用 jinja2 模板引擎和一些 Home Assistant 特定的插件进行渲染。", + "domain": "域", "editor": "模板编辑器", + "entity": "实体", "jinja_documentation": "Jinja2 模板文档", + "listeners": "此模板监听以下状态改变事件:", + "no_listeners": "此模板不监听任何状态改变事件,并且不会自动更新。", "reset": "重置为演示模板", "template_extensions": "Home Assistant 模板插件", "title": "模板", @@ -2941,6 +2968,11 @@ "submit": "提交" }, "current_user": "您目前以 {fullName} 的身份登录。", + "customize_sidebar": { + "button": "编辑", + "description": "您也可以长按侧边栏标题来进入编辑模式。", + "header": "排序和隐藏侧边栏中的项目" + }, "dashboard": { "description": "选择此设备的默认仪表盘。", "dropdown_label": "仪表盘", @@ -3038,6 +3070,7 @@ } }, "sidebar": { + "done": "完成", "external_app_configuration": "应用配置", "sidebar_toggle": "侧边栏切换" } diff --git a/translations/frontend/zh-Hant.json b/translations/frontend/zh-Hant.json index 5273e7c538..5343241299 100644 --- a/translations/frontend/zh-Hant.json +++ b/translations/frontend/zh-Hant.json @@ -574,6 +574,28 @@ "audio_not_supported": "瀏覽器不支援音效元件。", "choose_player": "選擇播放器", "choose-source": "選擇來源", + "class": { + "album": "專輯", + "app": "App", + "artist": "演唱者", + "channel": "頻道", + "composer": "作曲者", + "contributing_artist": "參與藝術家", + "directory": "媒體庫", + "episode": "集", + "game": "遊戲", + "genre": "類型", + "image": "圖像", + "movie": "電影", + "music": "音樂", + "playlist": "播放列表", + "podcast": "Podcast", + "season": "季", + "track": "音軌", + "tv_show": "電視節目", + "url": "網址", + "video": "影片" + }, "content-type": { "album": "專輯", "artist": "演唱者", From fab6cebf0d4b055e5be1abe46a9fd97198de7082 Mon Sep 17 00:00:00 2001 From: Zack Barett Date: Mon, 14 Sep 2020 02:33:23 -0500 Subject: [PATCH 06/31] fix hard to read text (#6980) --- src/panels/media-browser/ha-panel-media-browser.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/panels/media-browser/ha-panel-media-browser.ts b/src/panels/media-browser/ha-panel-media-browser.ts index 63c71d2e92..8fa84cba67 100644 --- a/src/panels/media-browser/ha-panel-media-browser.ts +++ b/src/panels/media-browser/ha-panel-media-browser.ts @@ -64,7 +64,7 @@ class PanelMediaBrowser extends LitElement { "ui.components.media-browser.media-player-browser" )} -

${title || ""}
+
${title || ""}
${this.hass.localize("ui.components.media-browser.choose_player")} @@ -146,8 +146,7 @@ class PanelMediaBrowser extends LitElement { overflow: hidden; white-space: nowrap; } - .heading .secondary { - color: var(--secondary-text-color); + .heading .secondary-text { font-size: 14px; overflow: hidden; text-overflow: ellipsis; From 426f93998298b520d17e72aa70c1068f99710865 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Lov=C3=A9n?= Date: Mon, 14 Sep 2020 09:34:59 +0200 Subject: [PATCH 07/31] Add Execute button to script editor (#6957) --- src/panels/config/script/ha-script-editor.ts | 30 ++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/panels/config/script/ha-script-editor.ts b/src/panels/config/script/ha-script-editor.ts index b3195e0cf7..9e4ce3cc07 100644 --- a/src/panels/config/script/ha-script-editor.ts +++ b/src/panels/config/script/ha-script-editor.ts @@ -18,12 +18,14 @@ import { navigate } from "../../../common/navigate"; import { computeRTL } from "../../../common/util/compute_rtl"; import "../../../components/ha-card"; import "../../../components/ha-icon-input"; +import { showToast } from "../../../util/toast"; import "@material/mwc-fab"; import { Action, deleteScript, getScriptEditorInitData, ScriptConfig, + triggerScript, MODES, MODES_MAX, } from "../../../data/script"; @@ -193,6 +195,22 @@ export class HaScriptEditor extends LitElement { ` : html``} + ${this.scriptEntityId + ? html` +
+ + + ${this.hass.localize("ui.card.script.execute")} + +
+ ` + : ``} @@ -301,6 +319,18 @@ export class HaScriptEditor extends LitElement { } } + private async _runScript(ev) { + ev.stopPropagation(); + await triggerScript(this.hass, this.scriptEntityId); + showToast(this, { + message: this.hass.localize( + "ui.notification_toast.triggered", + "name", + this._config!.alias + ), + }); + } + private _modeChanged(ev: CustomEvent) { const mode = ((ev.target as PaperListboxElement)?.selectedItem as any) ?.mode; From f6eb31bf9daf249842a53035d16c39d44a181f36 Mon Sep 17 00:00:00 2001 From: Kendell R Date: Mon, 14 Sep 2020 00:37:59 -0700 Subject: [PATCH 08/31] Use --error-color instead of a fixed color (#6961) Co-authored-by: Zack Barett --- src/panels/lovelace/cards/hui-error-card.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/panels/lovelace/cards/hui-error-card.ts b/src/panels/lovelace/cards/hui-error-card.ts index 9da8f631b7..b995c6c04d 100644 --- a/src/panels/lovelace/cards/hui-error-card.ts +++ b/src/panels/lovelace/cards/hui-error-card.ts @@ -43,8 +43,8 @@ export class HuiErrorCard extends LitElement implements LovelaceCard { return css` :host { display: block; - background-color: #ef5350; - color: white; + background-color: var(--error-color); + color: var(--color-on-error, white); padding: 8px; font-weight: 500; user-select: text; From e465ec88354a0c4e293ef9f827fdf0852f3202f9 Mon Sep 17 00:00:00 2001 From: Kendell R Date: Mon, 14 Sep 2020 00:39:47 -0700 Subject: [PATCH 09/31] Make code editor font family follow theme (#6958) --- src/components/ha-code-editor.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/ha-code-editor.ts b/src/components/ha-code-editor.ts index 452e75dffd..dbbc9b616f 100644 --- a/src/components/ha-code-editor.ts +++ b/src/components/ha-code-editor.ts @@ -97,6 +97,7 @@ export class HaCodeEditor extends UpdatingElement { .CodeMirror { height: var(--code-mirror-height, auto); direction: var(--code-mirror-direction, ltr); + font-family: var(--code-font-family, monospace); } .CodeMirror-scroll { max-height: var(--code-mirror-max-height, --code-mirror-height); From 709112c498464985be9b22bfe2f610a72ba3ce70 Mon Sep 17 00:00:00 2001 From: Kendell R Date: Mon, 14 Sep 2020 00:40:35 -0700 Subject: [PATCH 10/31] Do safety check before detecting hex value and handle YAML numbers better (#6956) Co-authored-by: Bram Kragten --- src/common/dom/apply_themes_on_element.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/dom/apply_themes_on_element.ts b/src/common/dom/apply_themes_on_element.ts index f994f0d99d..0ac552abdd 100644 --- a/src/common/dom/apply_themes_on_element.ts +++ b/src/common/dom/apply_themes_on_element.ts @@ -105,12 +105,12 @@ const processTheme = ( const keys = {}; for (const key of Object.keys(combinedTheme)) { const prefixedKey = `--${key}`; - const value = combinedTheme[key]!; + const value = String(combinedTheme[key]!); styles[prefixedKey] = value; keys[prefixedKey] = ""; // Try to create a rgb value for this key if it is not a var - if (!value.startsWith("#")) { + if (value.startsWith("#")) { // Can't convert non hex value continue; } From 5b94a4de9ae0dc6d608f148d528e6d8e7f23cb84 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Mon, 14 Sep 2020 11:14:32 +0200 Subject: [PATCH 11/31] Fix muted on video --- src/components/ha-hls-player.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ha-hls-player.ts b/src/components/ha-hls-player.ts index 8f47b08870..912bcab7b6 100644 --- a/src/components/ha-hls-player.ts +++ b/src/components/ha-hls-player.ts @@ -61,7 +61,7 @@ class HaHLSPlayer extends LitElement { return html`
` : ""} - ${this.hostInfo.features.includes("network") && - atLeastVersion(this.hass.config.version, 0, 115) + ${this.hostInfo.features.includes("network") ? html` IP address From 239e817779e2ed71036cd3ee0ddd56be82b1c2ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Tue, 15 Sep 2020 11:15:58 +0200 Subject: [PATCH 24/31] Rename upgrade -> update (#7013) --- hassio/src/dashboard/hassio-update.ts | 2 +- hassio/src/system/hassio-supervisor-info.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/hassio/src/dashboard/hassio-update.ts b/hassio/src/dashboard/hassio-update.ts index eec4097e54..a95eafbd76 100644 --- a/hassio/src/dashboard/hassio-update.ts +++ b/hassio/src/dashboard/hassio-update.ts @@ -153,7 +153,7 @@ export class HassioUpdate extends LitElement { item.progress = true; const confirmed = await showConfirmationDialog(this, { title: `Update ${item.name}`, - text: `Are you sure you want to upgrade ${item.name} to version ${item.version}?`, + text: `Are you sure you want to update ${item.name} to version ${item.version}?`, confirmText: "update", dismissText: "cancel", }); diff --git a/hassio/src/system/hassio-supervisor-info.ts b/hassio/src/system/hassio-supervisor-info.ts index 12af46d091..fcec51d607 100644 --- a/hassio/src/system/hassio-supervisor-info.ts +++ b/hassio/src/system/hassio-supervisor-info.ts @@ -213,7 +213,7 @@ class HassioSupervisorInfo extends LitElement { const confirmed = await showConfirmationDialog(this, { title: "Update supervisor", - text: `Are you sure you want to upgrade supervisor to version ${this.supervisorInfo.version_latest}?`, + text: `Are you sure you want to update supervisor to version ${this.supervisorInfo.version_latest}?`, confirmText: "update", dismissText: "cancel", }); From d5cd288fe84ca4866e597ce017ef825f06cf7f2b Mon Sep 17 00:00:00 2001 From: uvjustin <46082645+uvjustin@users.noreply.github.com> Date: Tue, 15 Sep 2020 19:18:11 +0800 Subject: [PATCH 25/31] Temporarily remove exoplayer (#7015) --- src/components/ha-hls-player.ts | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/components/ha-hls-player.ts b/src/components/ha-hls-player.ts index b513413d23..b613a5ad05 100644 --- a/src/components/ha-hls-player.ts +++ b/src/components/ha-hls-player.ts @@ -12,7 +12,6 @@ import { } from "lit-element"; import { fireEvent } from "../common/dom/fire_event"; import { nextRender } from "../common/util/render-status"; -import { getExternalConfig } from "../external_app/external_config"; import type { HomeAssistant } from "../types"; type HLSModule = typeof import("hls.js"); @@ -94,11 +93,7 @@ class HaHLSPlayer extends LitElement { } private async _getUseExoPlayer(): Promise { - if (!this.hass!.auth.external || !this.allowExoPlayer) { - return false; - } - const externalConfig = await getExternalConfig(this.hass!.auth.external); - return externalConfig && externalConfig.hasExoPlayer; + return false; } private async _startHls(): Promise { @@ -140,7 +135,10 @@ class HaHLSPlayer extends LitElement { this._videoEl.style.visibility = "hidden"; await this.hass!.auth.external!.sendMessage({ type: "exoplayer/play_hls", - payload: new URL(url, window.location.href).toString(), + payload: { + url: new URL(url, window.location.href).toString(), + muted: this.muted, + }, }); } From 9c80776d8c7c39ceebc1ef18a0fca80a83c629a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Tue, 15 Sep 2020 13:20:17 +0200 Subject: [PATCH 26/31] Refresh snapshots on first update (#7014) --- hassio/src/snapshots/hassio-snapshots.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hassio/src/snapshots/hassio-snapshots.ts b/hassio/src/snapshots/hassio-snapshots.ts index 1f594a125a..18f2b1d0ed 100644 --- a/hassio/src/snapshots/hassio-snapshots.ts +++ b/hassio/src/snapshots/hassio-snapshots.ts @@ -242,7 +242,7 @@ class HassioSnapshots extends LitElement { protected firstUpdated(changedProps: PropertyValues) { super.firstUpdated(changedProps); - this._updateSnapshots(); + this.refreshData(); } protected updated(changedProps: PropertyValues) { From 7d862d6f2ac0c47d057e4d5fb3ccdf3a4be41a3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Tue, 15 Sep 2020 13:20:43 +0200 Subject: [PATCH 27/31] Use helper to generate documentation URL (#7012) --- .../media-player/ha-media-player-browse.ts | 8 ++- .../config-flow/step-flow-pick-handler.ts | 3 +- .../config/automation/ha-automation-editor.ts | 21 ++++++-- .../dialog-manage-cloudhook.ts | 8 ++- .../config/cloud/register/cloud-register.js | 13 ++++- .../config/customize/ha-form-customize.js | 16 ++++-- src/panels/config/info/ha-config-info.ts | 5 +- .../integration-panels/zwave/zwave-network.ts | 12 +++-- .../config/person/dialog-person-detail.ts | 14 +++-- src/panels/config/scene/ha-scene-dashboard.ts | 3 +- src/panels/config/script/ha-script-editor.ts | 54 ++++++++++--------- src/panels/config/script/ha-script-picker.ts | 3 +- .../event/developer-tools-event.js | 7 ++- .../template/developer-tools-template.ts | 6 ++- .../card-editor/hui-dialog-edit-card.ts | 5 +- .../editor/get-card-documentation-url.ts | 13 +++-- .../lovelace/editor/hui-dialog-save-config.ts | 25 +++++---- src/panels/lovelace/hui-root.ts | 5 +- src/panels/profile/ha-pick-theme-row.ts | 26 +++++---- .../profile/ha-push-notifications-row.js | 7 ++- src/util/documentation-url.ts | 7 +++ .../util/generate-documentation-url.spec.ts | 19 +++++++ 22 files changed, 193 insertions(+), 87 deletions(-) create mode 100644 src/util/documentation-url.ts create mode 100644 test-mocha/util/generate-documentation-url.spec.ts diff --git a/src/components/media-player/ha-media-player-browse.ts b/src/components/media-player/ha-media-player-browse.ts index 0b14444536..f63f3592e4 100644 --- a/src/components/media-player/ha-media-player-browse.ts +++ b/src/components/media-player/ha-media-player-browse.ts @@ -22,6 +22,7 @@ import { styleMap } from "lit-html/directives/style-map"; import { fireEvent } from "../../common/dom/fire_event"; import { computeRTLDirection } from "../../common/util/compute_rtl"; import { debounce } from "../../common/util/debounce"; +import type { MediaPlayerItem } from "../../data/media-player"; import { browseLocalMediaPlayer, browseMediaPlayer, @@ -30,11 +31,11 @@ import { MediaPickedEvent, MediaPlayerBrowseAction, } from "../../data/media-player"; -import type { MediaPlayerItem } from "../../data/media-player"; import { showAlertDialog } from "../../dialogs/generic/show-dialog-box"; import { installResizeObserver } from "../../panels/lovelace/common/install-resize-observer"; import { haStyle } from "../../resources/styles"; import type { HomeAssistant } from "../../types"; +import { documentationUrl } from "../../util/documentation-url"; import "../entity/ha-entity-picker"; import "../ha-button-menu"; import "../ha-card"; @@ -511,7 +512,10 @@ export class HaMediaPlayerBrowse extends LitElement {

Check the documentation${this.hass.localize( diff --git a/src/panels/config/automation/ha-automation-editor.ts b/src/panels/config/automation/ha-automation-editor.ts index f76f44ac67..5a39e7eac8 100644 --- a/src/panels/config/automation/ha-automation-editor.ts +++ b/src/panels/config/automation/ha-automation-editor.ts @@ -39,6 +39,7 @@ import "../../../layouts/ha-app-layout"; import "../../../layouts/hass-tabs-subpage"; import { haStyle } from "../../../resources/styles"; import { HomeAssistant, Route } from "../../../types"; +import { documentationUrl } from "../../../util/documentation-url"; import "../ha-config-section"; import { configSections } from "../ha-panel-config"; import "./action/ha-automation-action"; @@ -159,7 +160,10 @@ export class HaAutomationEditor extends LitElement { "ui.panel.config.automation.editor.modes.description", "documentation_link", html`${this.hass.localize( @@ -247,7 +251,10 @@ export class HaAutomationEditor extends LitElement { )}

@@ -276,7 +283,10 @@ export class HaAutomationEditor extends LitElement { )}

@@ -305,7 +315,10 @@ export class HaAutomationEditor extends LitElement { )}

diff --git a/src/panels/config/cloud/dialog-manage-cloudhook/dialog-manage-cloudhook.ts b/src/panels/config/cloud/dialog-manage-cloudhook/dialog-manage-cloudhook.ts index b590848f99..1561ed7420 100644 --- a/src/panels/config/cloud/dialog-manage-cloudhook/dialog-manage-cloudhook.ts +++ b/src/panels/config/cloud/dialog-manage-cloudhook/dialog-manage-cloudhook.ts @@ -14,6 +14,7 @@ import type { HaPaperDialog } from "../../../../components/dialog/ha-paper-dialo import { showConfirmationDialog } from "../../../../dialogs/generic/show-dialog-box"; import { haStyle } from "../../../../resources/styles"; import { HomeAssistant } from "../../../../types"; +import { documentationUrl } from "../../../../util/documentation-url"; import { WebhookDialogParams } from "./show-dialog-manage-cloudhook"; const inputLabel = "Public URL – Click to copy to clipboard"; @@ -37,8 +38,11 @@ export class DialogManageCloudhook extends LitElement { const { webhook, cloudhook } = this._params; const docsUrl = webhook.domain === "automation" - ? "https://www.home-assistant.io/docs/automation/trigger/#webhook-trigger" - : `https://www.home-assistant.io/integrations/${webhook.domain}/`; + ? documentationUrl( + this.hass!, + "/docs/automation/trigger/#webhook-trigger" + ) + : documentationUrl(this.hass!, `/integrations/${webhook.domain}/`); return html`

diff --git a/src/panels/config/cloud/register/cloud-register.js b/src/panels/config/cloud/register/cloud-register.js index 8b5b04c5b1..382effb34f 100644 --- a/src/panels/config/cloud/register/cloud-register.js +++ b/src/panels/config/cloud/register/cloud-register.js @@ -8,6 +8,7 @@ import "../../../../layouts/hass-subpage"; import { EventsMixin } from "../../../../mixins/events-mixin"; import LocalizeMixin from "../../../../mixins/localize-mixin"; import "../../../../styles/polymer-ha-style"; +import { documentationUrl } from "../../../../util/documentation-url"; import "../../ha-config-section"; /* @@ -70,8 +71,8 @@ class CloudRegister extends LocalizeMixin(EventsMixin(PolymerElement)) {

[[localize('ui.panel.config.cloud.register.information4')]]

@@ -137,6 +138,14 @@ class CloudRegister extends LocalizeMixin(EventsMixin(PolymerElement)) { } } + _computeDocumentationUrlTos(hass) { + return documentationUrl(hass, "/tos/"); + } + + _computeDocumentationUrlPrivacy(hass) { + return documentationUrl(hass, "/privacy/"); + } + _handleRegister() { let invalid = false; diff --git a/src/panels/config/customize/ha-form-customize.js b/src/panels/config/customize/ha-form-customize.js index 4c85d7b27f..2ad523125d 100644 --- a/src/panels/config/customize/ha-form-customize.js +++ b/src/panels/config/customize/ha-form-customize.js @@ -6,10 +6,11 @@ import { html } from "@polymer/polymer/lib/utils/html-tag"; import { PolymerElement } from "@polymer/polymer/polymer-element"; import { computeStateDomain } from "../../../common/entity/compute_state_domain"; import LocalizeMixin from "../../../mixins/localize-mixin"; -import hassAttributeUtil from "../../../util/hass-attributes-util"; -import "./ha-form-customize-attributes"; -import "../ha-form-style"; import "../../../styles/polymer-ha-style"; +import { documentationUrl } from "../../../util/documentation-url"; +import hassAttributeUtil from "../../../util/hass-attributes-util"; +import "../ha-form-style"; +import "./ha-form-customize-attributes"; class HaFormCustomize extends LocalizeMixin(PolymerElement) { static get template() { @@ -30,7 +31,7 @@ class HaFormCustomize extends LocalizeMixin(PolymerElement) {
[[localize('ui.panel.config.customize.warning.include_sentence')]] [[localize('ui.panel.config.customize.warning.include_link')]]

diff --git a/src/panels/config/integrations/integration-panels/zwave/zwave-network.ts b/src/panels/config/integrations/integration-panels/zwave/zwave-network.ts index 7d220ba93c..b9860c0589 100644 --- a/src/panels/config/integrations/integration-panels/zwave/zwave-network.ts +++ b/src/panels/config/integrations/integration-panels/zwave/zwave-network.ts @@ -1,20 +1,20 @@ -import "../../../../../components/ha-icon-button"; -import "../../../../../components/ha-circular-progress"; import { UnsubscribeFunc } from "home-assistant-js-websocket"; import { css, CSSResult, customElement, html, + internalProperty, LitElement, property, - internalProperty, TemplateResult, } from "lit-element"; import "../../../../../components/buttons/ha-call-api-button"; import "../../../../../components/buttons/ha-call-service-button"; import "../../../../../components/ha-card"; +import "../../../../../components/ha-circular-progress"; import "../../../../../components/ha-icon"; +import "../../../../../components/ha-icon-button"; import "../../../../../components/ha-service-description"; import { fetchNetworkStatus, @@ -26,6 +26,7 @@ import { } from "../../../../../data/zwave"; import { haStyle } from "../../../../../resources/styles"; import { HomeAssistant } from "../../../../../types"; +import { documentationUrl } from "../../../../../util/documentation-url"; import "../../../ha-config-section"; @customElement("zwave-network") @@ -71,7 +72,10 @@ export class ZwaveNetwork extends LitElement { )}

diff --git a/src/panels/config/person/dialog-person-detail.ts b/src/panels/config/person/dialog-person-detail.ts index 94c50807c1..043d407607 100644 --- a/src/panels/config/person/dialog-person-detail.ts +++ b/src/panels/config/person/dialog-person-detail.ts @@ -4,23 +4,24 @@ import { css, CSSResult, html, + internalProperty, LitElement, property, - internalProperty, TemplateResult, } from "lit-element"; import memoizeOne from "memoize-one"; -import "../../../components/ha-picture-upload"; -import type { HaPictureUpload } from "../../../components/ha-picture-upload"; import "../../../components/entity/ha-entities-picker"; import { createCloseHeading } from "../../../components/ha-dialog"; +import "../../../components/ha-picture-upload"; +import type { HaPictureUpload } from "../../../components/ha-picture-upload"; import "../../../components/user/ha-user-picker"; import { PersonMutableParams } from "../../../data/person"; +import { CropOptions } from "../../../dialogs/image-cropper-dialog/show-image-cropper-dialog"; import { PolymerChangedEvent } from "../../../polymer-types"; import { haStyleDialog } from "../../../resources/styles"; import { HomeAssistant } from "../../../types"; +import { documentationUrl } from "../../../util/documentation-url"; import { PersonDetailDialogParams } from "./show-dialog-person-detail"; -import { CropOptions } from "../../../dialogs/image-cropper-dialog/show-image-cropper-dialog"; const includeDomains = ["device_tracker"]; @@ -153,7 +154,10 @@ class DialogPersonDetail extends LitElement {

${this.scriptEntityId ? html` -
- - - ${this.hass.localize("ui.card.script.execute")} - -
+ + + ${this.hass.localize("ui.card.script.execute")} + +
` : ``} @@ -227,7 +233,7 @@ export class HaScriptEditor extends LitElement { )}

diff --git a/src/panels/config/script/ha-script-picker.ts b/src/panels/config/script/ha-script-picker.ts index 99b6dce17e..d7b713596c 100644 --- a/src/panels/config/script/ha-script-picker.ts +++ b/src/panels/config/script/ha-script-picker.ts @@ -25,6 +25,7 @@ import { configSections } from "../ha-panel-config"; import "../../../components/ha-svg-icon"; import { mdiPlus } from "@mdi/js"; import { stateIcon } from "../../../common/entity/state_icon"; +import { documentationUrl } from "../../../util/documentation-url"; @customElement("ha-script-picker") class HaScriptPicker extends LitElement { @@ -187,7 +188,7 @@ class HaScriptPicker extends LitElement { ${this.hass.localize("ui.panel.config.script.picker.introduction")}

diff --git a/src/panels/developer-tools/event/developer-tools-event.js b/src/panels/developer-tools/event/developer-tools-event.js index 4466d48f10..ec7526fee9 100644 --- a/src/panels/developer-tools/event/developer-tools-event.js +++ b/src/panels/developer-tools/event/developer-tools-event.js @@ -9,6 +9,7 @@ import "../../../components/ha-code-editor"; import { showAlertDialog } from "../../../dialogs/generic/show-dialog-box"; import { EventsMixin } from "../../../mixins/events-mixin"; import LocalizeMixin from "../../../mixins/localize-mixin"; +import { documentationUrl } from "../../../util/documentation-url"; import "../../../styles/polymer-ha-style"; import "./event-subscribe-card"; import "./events-list"; @@ -61,7 +62,7 @@ class HaPanelDevEvent extends EventsMixin(LocalizeMixin(PolymerElement)) {

[[localize( 'ui.panel.developer-tools.tabs.events.description' )]] @@ -149,6 +150,10 @@ class HaPanelDevEvent extends EventsMixin(LocalizeMixin(PolymerElement)) { } } + _computeDocumentationUrl(hass) { + return documentationUrl(hass, "/docs/configuration/events/"); + } + _computeValidJSON(parsedJSON) { return parsedJSON !== ERROR_SENTINEL; } diff --git a/src/panels/developer-tools/template/developer-tools-template.ts b/src/panels/developer-tools/template/developer-tools-template.ts index c9ca775fbf..d41e8fed1e 100644 --- a/src/panels/developer-tools/template/developer-tools-template.ts +++ b/src/panels/developer-tools/template/developer-tools-template.ts @@ -19,6 +19,7 @@ import { } from "../../../data/ws-templates"; import { haStyle } from "../../../resources/styles"; import { HomeAssistant } from "../../../types"; +import { documentationUrl } from "../../../util/documentation-url"; const DEMO_TEMPLATE = `{## Imitate available variables: ##} {% set my_test_json = { @@ -107,7 +108,10 @@ class HaPanelDevTemplate extends LitElement {

  • diff --git a/src/panels/lovelace/editor/card-editor/hui-dialog-edit-card.ts b/src/panels/lovelace/editor/card-editor/hui-dialog-edit-card.ts index 87d5ea3115..e700cd097b 100755 --- a/src/panels/lovelace/editor/card-editor/hui-dialog-edit-card.ts +++ b/src/panels/lovelace/editor/card-editor/hui-dialog-edit-card.ts @@ -115,7 +115,10 @@ export class HuiDialogEditCard extends LitElement implements HassDialog { const oldConfig = changedProps.get("_cardConfig") as LovelaceCardConfig; if (oldConfig?.type !== this._cardConfig!.type) { - this._documentationURL = getCardDocumentationURL(this._cardConfig!.type); + this._documentationURL = getCardDocumentationURL( + this.hass, + this._cardConfig!.type + ); } } diff --git a/src/panels/lovelace/editor/get-card-documentation-url.ts b/src/panels/lovelace/editor/get-card-documentation-url.ts index 4d1e989a1d..e810f6bb4f 100644 --- a/src/panels/lovelace/editor/get-card-documentation-url.ts +++ b/src/panels/lovelace/editor/get-card-documentation-url.ts @@ -1,14 +1,17 @@ import { - getCustomCardEntry, CUSTOM_TYPE_PREFIX, + getCustomCardEntry, } from "../../../data/lovelace_custom_cards"; +import { HomeAssistant } from "../../../types"; +import { documentationUrl } from "../../../util/documentation-url"; -const coreDocumentationURLBase = "https://www.home-assistant.io/lovelace/"; - -export const getCardDocumentationURL = (type: string): string | undefined => { +export const getCardDocumentationURL = ( + hass: HomeAssistant, + type: string +): string | undefined => { if (type.startsWith(CUSTOM_TYPE_PREFIX)) { return getCustomCardEntry(type)?.documentationURL; } - return `${coreDocumentationURLBase}${type}`; + return `${documentationUrl(hass, "/lovelace/")}${type}`; }; diff --git a/src/panels/lovelace/editor/hui-dialog-save-config.ts b/src/panels/lovelace/editor/hui-dialog-save-config.ts index f056413258..3fd5997ffa 100644 --- a/src/panels/lovelace/editor/hui-dialog-save-config.ts +++ b/src/panels/lovelace/editor/hui-dialog-save-config.ts @@ -1,33 +1,32 @@ import "@material/mwc-button"; import "@material/mwc-icon-button/mwc-icon-button"; +import { mdiHelpCircle } from "@mdi/js"; import { css, CSSResult, customElement, html, + internalProperty, LitElement, property, - internalProperty, TemplateResult, } from "lit-element"; -import { mdiHelpCircle } from "@mdi/js"; import { fireEvent } from "../../../common/dom/fire_event"; +import { computeRTLDirection } from "../../../common/util/compute_rtl"; +import "../../../components/ha-circular-progress"; +import "../../../components/ha-dialog"; +import "../../../components/ha-formfield"; +import "../../../components/ha-svg-icon"; +import "../../../components/ha-switch"; +import "../../../components/ha-yaml-editor"; +import type { HassDialog } from "../../../dialogs/make-dialog-manager"; import { haStyleDialog } from "../../../resources/styles"; import type { HomeAssistant } from "../../../types"; +import { documentationUrl } from "../../../util/documentation-url"; import type { SaveDialogParams } from "./show-save-config-dialog"; -import { computeRTLDirection } from "../../../common/util/compute_rtl"; -import type { HassDialog } from "../../../dialogs/make-dialog-manager"; -import "../../../components/ha-switch"; -import "../../../components/ha-formfield"; -import "../../../components/ha-yaml-editor"; -import "../../../components/ha-svg-icon"; -import "../../../components/ha-dialog"; -import "../../../components/ha-circular-progress"; const EMPTY_CONFIG = { views: [] }; -const coreDocumentationURLBase = "https://www.home-assistant.io/lovelace/"; - @customElement("hui-dialog-save-config") export class HuiSaveConfig extends LitElement implements HassDialog { @property({ attribute: false }) public hass?: HomeAssistant; @@ -68,7 +67,7 @@ export class HuiSaveConfig extends LitElement implements HassDialog { "ui.panel.lovelace.editor.save_config.header" )} diff --git a/src/panels/profile/ha-push-notifications-row.js b/src/panels/profile/ha-push-notifications-row.js index 7f0bbc0af0..528a447298 100644 --- a/src/panels/profile/ha-push-notifications-row.js +++ b/src/panels/profile/ha-push-notifications-row.js @@ -7,6 +7,7 @@ import { isComponentLoaded } from "../../common/config/is_component_loaded"; import { pushSupported } from "../../components/ha-push-notifications-toggle"; import LocalizeMixin from "../../mixins/localize-mixin"; import "../../components/ha-settings-row"; +import { documentationUrl } from "../../util/documentation-url"; /* * @appliesMixin LocalizeMixin @@ -26,7 +27,7 @@ class HaPushNotificationsRow extends LocalizeMixin(PolymerElement) { [[_description(_platformLoaded, _pushSupported)]] [[localize('ui.panel.profile.push_notifications.link_promo')]] { + return `https://${ + hass.config.version.includes("b") ? "rc" : "www" + }.home-assistant.io${path}`; +}; diff --git a/test-mocha/util/generate-documentation-url.spec.ts b/test-mocha/util/generate-documentation-url.spec.ts new file mode 100644 index 0000000000..9e34e61448 --- /dev/null +++ b/test-mocha/util/generate-documentation-url.spec.ts @@ -0,0 +1,19 @@ +import * as assert from "assert"; +import { documentationUrl } from "../../src/util/documentation-url"; + +describe("Generate documentation URL", function () { + it("Generate documentation url for stable", function () { + assert.strictEqual( + // @ts-ignore + documentationUrl({ config: { version: "1.0.0" } }, "/blog"), + "https://www.home-assistant.io/blog" + ); + }); + it("Generate documentation url for rc", function () { + assert.strictEqual( + // @ts-ignore + documentationUrl({ config: { version: "1.0.0b0" } }, "/blog"), + "https://rc.home-assistant.io/blog" + ); + }); +}); From 9659c97978dcb19533cbfa3a67e74826f03e0e3d Mon Sep 17 00:00:00 2001 From: Zack Barett Date: Tue, 15 Sep 2020 07:32:02 -0500 Subject: [PATCH 28/31] Update Error handling (#7007) Co-authored-by: Bram Kragten --- .../media-player/ha-media-player-browse.ts | 16 ++++---- src/data/media-player.ts | 38 +++++++++---------- .../media-browser/ha-panel-media-browser.ts | 8 ++-- .../hui-dialog-select-media-player.ts | 30 ++++++++------- 4 files changed, 49 insertions(+), 43 deletions(-) diff --git a/src/components/media-player/ha-media-player-browse.ts b/src/components/media-player/ha-media-player-browse.ts index f63f3592e4..62fe5d1236 100644 --- a/src/components/media-player/ha-media-player-browse.ts +++ b/src/components/media-player/ha-media-player-browse.ts @@ -26,7 +26,7 @@ import type { MediaPlayerItem } from "../../data/media-player"; import { browseLocalMediaPlayer, browseMediaPlayer, - BROWSER_SOURCE, + BROWSER_PLAYER, MediaClassBrowserSettings, MediaPickedEvent, MediaPlayerBrowseAction, @@ -109,9 +109,11 @@ export class HaMediaPlayerBrowse extends LitElement { text: this._renderError(this._error), }); } else { - return html`
    - ${this._renderError(this._error)} -
    `; + return html` +
    + ${this._renderError(this._error)} +
    + `; } } @@ -236,7 +238,7 @@ export class HaMediaPlayerBrowse extends LitElement { ${this._error ? html` -
    +
    ${this._renderError(this._error)}
    ` @@ -457,7 +459,7 @@ export class HaMediaPlayerBrowse extends LitElement { mediaContentType?: string ): Promise { const itemData = - this.entityId !== BROWSER_SOURCE + this.entityId !== BROWSER_PLAYER ? await browseMediaPlayer( this.hass, this.entityId, @@ -524,7 +526,7 @@ export class HaMediaPlayerBrowse extends LitElement {

    `; } - return html`err.message`; + return html`${err.message}`; } static get styles(): CSSResultArray { diff --git a/src/data/media-player.ts b/src/data/media-player.ts index 70b29c2d63..393c06cb71 100644 --- a/src/data/media-player.ts +++ b/src/data/media-player.ts @@ -1,23 +1,23 @@ +import { + mdiAccountMusic, + mdiAccountMusicOutline, + mdiAlbum, + mdiApplication, + mdiDramaMasks, + mdiFileMusic, + mdiFolder, + mdiGamepadVariant, + mdiImage, + mdiMovie, + mdiMusic, + mdiPlaylistMusic, + mdiPodcast, + mdiTelevisionClassic, + mdiVideo, + mdiWeb, +} from "@mdi/js"; import type { HassEntity } from "home-assistant-js-websocket"; import type { HomeAssistant } from "../types"; -import { - mdiFolder, - mdiPlaylistMusic, - mdiFileMusic, - mdiAlbum, - mdiMusic, - mdiTelevisionClassic, - mdiMovie, - mdiVideo, - mdiImage, - mdiWeb, - mdiGamepadVariant, - mdiAccountMusic, - mdiPodcast, - mdiApplication, - mdiAccountMusicOutline, - mdiDramaMasks, -} from "@mdi/js"; export const SUPPORT_PAUSE = 1; export const SUPPORT_SEEK = 2; @@ -38,7 +38,7 @@ export const CONTRAST_RATIO = 4.5; export type MediaPlayerBrowseAction = "pick" | "play"; -export const BROWSER_SOURCE = "browser"; +export const BROWSER_PLAYER = "browser"; export type MediaClassBrowserSetting = { icon: string; diff --git a/src/panels/media-browser/ha-panel-media-browser.ts b/src/panels/media-browser/ha-panel-media-browser.ts index 8fa84cba67..32e8661d52 100644 --- a/src/panels/media-browser/ha-panel-media-browser.ts +++ b/src/panels/media-browser/ha-panel-media-browser.ts @@ -17,7 +17,7 @@ import { supportsFeature } from "../../common/entity/supports-feature"; import "../../components/ha-menu-button"; import "../../components/media-player/ha-media-player-browse"; import { - BROWSER_SOURCE, + BROWSER_PLAYER, MediaPickedEvent, SUPPORT_BROWSE_MEDIA, } from "../../data/media-player"; @@ -36,7 +36,7 @@ class PanelMediaBrowser extends LitElement { // @ts-ignore @LocalStorage("mediaBrowseEntityId", true) - private _entityId = BROWSER_SOURCE; + private _entityId = BROWSER_PLAYER; protected render(): TemplateResult { const stateObj = this._entityId @@ -44,7 +44,7 @@ class PanelMediaBrowser extends LitElement { : undefined; const title = - this._entityId === BROWSER_SOURCE + this._entityId === BROWSER_PLAYER ? `${this.hass.localize("ui.components.media-browser.web-browser")}` : stateObj?.attributes.friendly_name ? `${stateObj?.attributes.friendly_name}` @@ -95,7 +95,7 @@ class PanelMediaBrowser extends LitElement { ev: HASSDomEvent ): Promise { const item = ev.detail.item; - if (this._entityId === BROWSER_SOURCE) { + if (this._entityId === BROWSER_PLAYER) { const resolvedUrl: any = await this.hass.callWS({ type: "media_source/resolve_media", media_content_id: item.media_content_id, diff --git a/src/panels/media-browser/hui-dialog-select-media-player.ts b/src/panels/media-browser/hui-dialog-select-media-player.ts index 03b53b6a2d..46865415da 100644 --- a/src/panels/media-browser/hui-dialog-select-media-player.ts +++ b/src/panels/media-browser/hui-dialog-select-media-player.ts @@ -1,3 +1,5 @@ +import "@material/mwc-list/mwc-list"; +import "@material/mwc-list/mwc-list-item"; import "@polymer/paper-item/paper-item"; import "@polymer/paper-listbox/paper-listbox"; import { @@ -13,7 +15,8 @@ import { fireEvent } from "../../common/dom/fire_event"; import { computeStateName } from "../../common/entity/compute_state_name"; import { compare } from "../../common/string/compare"; import { createCloseHeading } from "../../components/ha-dialog"; -import { BROWSER_SOURCE } from "../../data/media-player"; +import { UNAVAILABLE_STATES } from "../../data/entity"; +import { BROWSER_PLAYER } from "../../data/media-player"; import { haStyleDialog } from "../../resources/styles"; import type { HomeAssistant } from "../../types"; import type { SelectMediaPlayerDialogParams } from "./show-select-media-source-dialog"; @@ -49,30 +52,31 @@ export class HuiDialogSelectMediaPlayer extends LitElement { )} @closed=${this.closeDialog} > - + ${this.hass.localize( "ui.components.media-browser.web-browser" - )} ${this._params.mediaSources .sort((a, b) => compare(computeStateName(a), computeStateName(b))) .map( (source) => html` - ${computeStateName(source)}${computeStateName(source)} ` )} - + `; } - private _selectSource(ev: CustomEvent): void { - const entityId = ev.detail.item.itemName; + private _selectPlayer(ev: CustomEvent): void { + const entityId = (ev.currentTarget as any).player; this._params!.sourceSelectedCallback(entityId); this.closeDialog(); } @@ -84,8 +88,8 @@ export class HuiDialogSelectMediaPlayer extends LitElement { ha-dialog { --dialog-content-padding: 0 24px 20px; } - paper-item { - cursor: pointer; + mwc-list-item[disabled] { + --mdc-theme-text-primary-on-background: var(--disabled-text-color); } `, ]; From c917b67cbdb4955f06fd8a14dc0aff4c063d3218 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 15 Sep 2020 14:43:13 +0200 Subject: [PATCH 29/31] Adjust local media error messages (#7017) --- .../media-player/ha-media-player-browse.ts | 73 +++++++++++++------ src/translations/en.json | 6 ++ src/util/documentation-url.ts | 6 +- 3 files changed, 61 insertions(+), 24 deletions(-) diff --git a/src/components/media-player/ha-media-player-browse.ts b/src/components/media-player/ha-media-player-browse.ts index 62fe5d1236..1f6af63c66 100644 --- a/src/components/media-player/ha-media-player-browse.ts +++ b/src/components/media-player/ha-media-player-browse.ts @@ -22,7 +22,6 @@ import { styleMap } from "lit-html/directives/style-map"; import { fireEvent } from "../../common/dom/fire_event"; import { computeRTLDirection } from "../../common/util/compute_rtl"; import { debounce } from "../../common/util/debounce"; -import type { MediaPlayerItem } from "../../data/media-player"; import { browseLocalMediaPlayer, browseMediaPlayer, @@ -31,6 +30,7 @@ import { MediaPickedEvent, MediaPlayerBrowseAction, } from "../../data/media-player"; +import type { MediaPlayerItem } from "../../data/media-player"; import { showAlertDialog } from "../../dialogs/generic/show-dialog-box"; import { installResizeObserver } from "../../panels/lovelace/common/install-resize-observer"; import { haStyle } from "../../resources/styles"; @@ -357,7 +357,31 @@ export class HaMediaPlayerBrowse extends LitElement { ` : html`
    - ${this.hass.localize("ui.components.media-browser.no_items")} + ${this.hass.localize("ui.components.media-browser.no_items")}
    + + ${currentItem.media_content_id.startsWith( + "media-source://media_source/local_source" + ) + ? html`${this.hass.localize( + "ui.components.media-browser.learn_adding_local_media", + "documentation", + html`${this.hass.localize( + "ui.components.media-browser.documentation" + )}` + )} +
    + ${this.hass.localize( + "ui.components.media-browser.local_media_files" + )}.` + : ""}
    `} `; @@ -501,28 +525,31 @@ export class HaMediaPlayerBrowse extends LitElement { private _renderError(err: { message: string; code: string }) { if (err.message === "Media directory does not exist.") { return html` -

    No local media found.

    +

    + ${this.hass.localize( + "ui.components.media-browser.no_local_media_found" + )} +

    - It looks like you have not yet created a media directory. -
    Create a directory with the name "media" in the - configuration directory of Home Assistant - (${this.hass.config.config_dir}).
    Place your video, audio and - image files in this directory to be able to browse and play them in - the browser or on supported media players. -

    - -

    - Check the - documentation - for more info + ${this.hass.localize("ui.components.media-browser.no_media_folder")} +
    + ${this.hass.localize( + "ui.components.media-browser.setup_local_help", + "documentation", + html`${this.hass.localize( + "ui.components.media-browser.documentation" + )}` + )} +
    + ${this.hass.localize("ui.components.media-browser.local_media_files")}

    `; } diff --git a/src/translations/en.json b/src/translations/en.json index fff67d34fb..5504fd17df 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -374,6 +374,12 @@ "video_not_supported": "Your browser does not support the video element.", "media_not_supported": "The Browser Media Player does not support this type of media", "media_browsing_error": "Media Browsing Error", + "learn_adding_local_media": "Learn more about adding media in the {documentation}.", + "local_media_files": "Place your video, audio and image files in the media directory to be able to browse and play them in the browser or on supported media players.", + "documentation": "documentation", + "no_local_media_found": "No local media found", + "no_media_folder": "It looks like you have not yet created a media directory.", + "setup_local_help": "Check the {documentation} on how to setup local media.", "class": { "album": "Album", "app": "App", diff --git a/src/util/documentation-url.ts b/src/util/documentation-url.ts index 693e9437d8..3ad016be72 100644 --- a/src/util/documentation-url.ts +++ b/src/util/documentation-url.ts @@ -2,6 +2,10 @@ import { HomeAssistant } from "../types"; export const documentationUrl = (hass: HomeAssistant, path: string) => { return `https://${ - hass.config.version.includes("b") ? "rc" : "www" + hass.config.version.includes("b") + ? "rc" + : hass.config.version.includes("dev") + ? "next" + : "www" }.home-assistant.io${path}`; }; From ca4757db5b6b356a49e3ce46f00470c4cfe07465 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 15 Sep 2020 14:44:55 +0200 Subject: [PATCH 30/31] Bumped version to 20200915.0 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 7ee304d284..b7b90326ef 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name="home-assistant-frontend", - version="20200912.0", + version="20200915.0", description="The Home Assistant frontend", url="https://github.com/home-assistant/home-assistant-polymer", author="The Home Assistant Authors", From d6aba040dde366249ba10c5149a5fbc68a1d98bc Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 15 Sep 2020 14:45:38 +0200 Subject: [PATCH 31/31] revert remove tap action from button stub (#7018) --- src/panels/lovelace/cards/hui-button-card.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/panels/lovelace/cards/hui-button-card.ts b/src/panels/lovelace/cards/hui-button-card.ts index 65c045f8ab..2d75c7e33b 100644 --- a/src/panels/lovelace/cards/hui-button-card.ts +++ b/src/panels/lovelace/cards/hui-button-card.ts @@ -63,6 +63,9 @@ export class HuiButtonCard extends LitElement implements LovelaceCard { return { type: "button", + tap_action: { + action: "toggle", + }, entity: foundEntities[0] || "", }; }