From 3dc4b1d7759aba78278c002773e055a8877c5166 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Fri, 7 Aug 2020 16:36:49 +0200 Subject: [PATCH 001/300] Merge to master for 20200807.1 (#6566) * Reorder to not break jinja templates (#6564) * Bumped version to 20200807.1 --- setup.py | 2 +- src/html/index.html.template | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/setup.py b/setup.py index f4c217e8bd..834ffe3aab 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name="home-assistant-frontend", - version="20200807.0", + version="20200807.1", description="The Home Assistant frontend", url="https://github.com/home-assistant/home-assistant-polymer", author="The Home Assistant Authors", diff --git a/src/html/index.html.template b/src/html/index.html.template index 0225c9b3ab..fe4271c0fb 100644 --- a/src/html/index.html.template +++ b/src/html/index.html.template @@ -47,12 +47,12 @@ background-color: var(--primary-background-color); } @media (prefers-color-scheme: dark) { - #ha-init-skeleton::before { - background-color: #1c1c1c; - } html { background-color: #111111; } + #ha-init-skeleton::before { + background-color: #1c1c1c; + } } From c705e74fc85d36d119f71d61267baf33e6c7b7cc Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Mon, 10 Aug 2020 00:32:35 +0000 Subject: [PATCH 002/300] [ci skip] Translation update --- translations/frontend/es.json | 2 +- translations/frontend/fy.json | 115 +++++++++++++++++++++++++++++++++- translations/frontend/tr.json | 77 ++++++++++++++++++++--- 3 files changed, 181 insertions(+), 13 deletions(-) diff --git a/translations/frontend/es.json b/translations/frontend/es.json index 84ae39b6bf..f5b4dabc25 100644 --- a/translations/frontend/es.json +++ b/translations/frontend/es.json @@ -2475,7 +2475,7 @@ }, "menu": { "close": "Cerrar", - "configure_ui": "Configurar la interfaz de usuario", + "configure_ui": "Editar panel de control", "exit_edit_mode": "Salir del modo de edición de la interfaz de usuario", "help": "Ayuda", "refresh": "Actualizar", diff --git a/translations/frontend/fy.json b/translations/frontend/fy.json index c352177f6f..9d3024376c 100644 --- a/translations/frontend/fy.json +++ b/translations/frontend/fy.json @@ -2,6 +2,8 @@ "panel": { "config": "Konfiguraasje", "history": "Skiednis", + "mailbox": "Postfak", + "map": "Kaart", "shopping_list": "Boadskiplist" }, "state_attributes": { @@ -17,24 +19,57 @@ } }, "state": { + "alarm_control_panel": { + "triggered": "Aktivearre" + }, "binary_sensor": { + "cold": { + "on": "Kâld" + }, + "connectivity": { + "on": "Ferbûn" + }, "default": { "on": "Oan" }, + "door": { + "off": "Ticht", + "on": "Iepen" + }, "garage_door": { "off": "Ticht", "on": "Iepen" }, + "gas": { + "off": "Net detektearre" + }, + "motion": { + "on": "Detekteare" + }, "opening": { "off": "Ticht" }, "presence": { "on": "Thús" + }, + "vibration": { + "on": "Detekteare" + }, + "window": { + "off": "Ticht" } }, "calendar": { "on": "Oan" }, + "camera": { + "recording": "Opnimme" + }, + "climate": { + "cool": "Kuolje", + "dry": "Droech", + "heat": "Ferwaarmje" + }, "cover": { "open": "Iepen" }, @@ -51,12 +86,19 @@ }, "group": { "home": "Thús", + "locked": "Beskoattele", "open": "Iepen", "stopped": "Stoppe" }, "light": { "off": "Út" }, + "lock": { + "locked": "Beskoattele" + }, + "media_player": { + "playing": "Ôfspylje" + }, "script": { "off": "Út" }, @@ -69,9 +111,22 @@ }, "weather": { "sunny": "Sinnich" + }, + "zwave": { + "default": { + "dead": "Net berikber", + "initializing": "Inisjalisearje", + "sleeping": "Sliept" + }, + "query_stage": { + "dead": "Net berikber ({query_stage})" + } } }, "ui": { + "common": { + "loading": "Oan it laden" + }, "dialogs": { "zha_device_info": { "zha_device_card": { @@ -79,6 +134,11 @@ } } }, + "duration": { + "day": "{count} {count, plural,\none {dei}\nother {dagen}\n}", + "second": "{count} {count, plural,\none {sekonde}\nother {sekonden}\n}", + "week": "{count} {count, plural,\none {wike}\nother {wiken}\n}" + }, "panel": { "config": { "automation": { @@ -87,9 +147,24 @@ "type": { "choose": { "add_option": "Opsje tafoegje" + } + } + }, + "triggers": { + "add": "Trigger tafoegje", + "header": "", + "type": { + "homeassistant": { + "label": "", + "shutdown": "Ofslúte", + "start": "Opstarte" }, - "repeat": { - "sequence": "Aksjes" + "mqtt": { + "payload": "Payload (opsjoneel)" + }, + "state": { + "from": "Fan", + "to": "Nei" } } } @@ -105,11 +180,47 @@ "description": "Ynformaasje oer dyn Home Assistant ynstallaasje" }, "lovelace": { + "description": "Konfigurearje dyn Lovelace-dashboards", "resources": { "detail": { "warning_header": "Wês foarsichtich!" } } + }, + "script": { + "description": "Meitsje en bewurkje scripts" + }, + "zha": { + "groups": { + "description": "Meitsje en bewurkje Zigbee groepen" + } + }, + "zwave": { + "node_config": { + "config_value": "Konfiguraasje wearde" + } + } + }, + "lovelace": { + "editor": { + "select_view": { + "dashboard_label": "Dashboard" + } + }, + "menu": { + "configure_ui": "Konfigurearje UI" + } + }, + "mailbox": { + "playback_title": "Berjocht ôfspylje" + }, + "profile": { + "themes": { + "dark_mode": { + "dark": "Tsjuster", + "light": "ljocht" + }, + "primary_color": "Primêre kleur" } } } diff --git a/translations/frontend/tr.json b/translations/frontend/tr.json index 7844947073..0c2c4831f9 100644 --- a/translations/frontend/tr.json +++ b/translations/frontend/tr.json @@ -96,7 +96,7 @@ "armed": "Etkin", "armed_away": "Etkin dışarıda", "armed_custom_bypass": "Özel alarm atlatması", - "armed_home": "Etkin evde", + "armed_home": "Evdeyim modu kuruldu", "armed_night": "Etkin gece", "arming": "Etkinleşiyor", "disarmed": "Etkisiz", @@ -581,6 +581,7 @@ }, "dialogs": { "config_entry_system_options": { + "enable_new_entities_description": "Devre dışı bırakılırsa, {integration} için yeni keşfedilen varlıklar otomatik olarak Home Assistant'a eklenmez.", "enable_new_entities_label": "Yeni eklenen varlıkları etkinleştir.", "title": "{integration} için Sistem Seçenekleri", "update": "Güncelle" @@ -692,11 +693,14 @@ } }, "mqtt_device_debug_info": { + "deserialize": "MQTT mesajlarını JSON olarak ayrıştırma yap", "entities": "Varlıklar", "no_entities": "Varlık yok", "no_triggers": "Tetikleyici yok", + "payload_display": "Yük ekranı", "recent_messages": "{n} , en son alınan mesaj (lar)", "show_as_yaml": "YAML olarak göster", + "title": "{device} hata ayıklama bilgisi", "triggers": "Tetikleyiciler" }, "options_flow": { @@ -726,6 +730,7 @@ "confirmations": { "remove": "Cihazı kaldırmak istediğinize emin misiniz?" }, + "device_signature": "Zigbee cihaz imzası", "last_seen": "Son görülen", "manuf": "{manufacturer} tarafından", "no_area": "Alan Yok", @@ -733,7 +738,8 @@ "quirk": "Orijinal", "services": { "remove": "Bir cihazı Zigbee ağından kaldır.", - "updateDeviceName": "Aygıt kayıt defterinde bu aygıt için özel bir ad ayarlayın." + "updateDeviceName": "Aygıt kayıt defterinde bu aygıt için özel bir ad ayarlayın.", + "zigbee_information": "Cihazın Zigbee bilgilerini görüntüleyin." }, "unknown": "Bilinmeyen", "zha_device_card": { @@ -775,7 +781,7 @@ }, "config": { "advanced_mode": { - "hint_enable": "Eksik yapılandırma seçenekleri? Gelişmiş modunu etkinleştir", + "hint_enable": "Yapılandırma seçenekleri eksik mi? Gelişmiş modu etkinleştirin", "link_profile_page": "profil sayfanız" }, "areas": { @@ -821,6 +827,15 @@ "name": "Aksiyon", "type_select": "Aksiyon türü", "type": { + "choose": { + "add_option": "Seçenek ekle", + "conditions": "Koşullar", + "default": "Varsayılan eylemler", + "label": "Seç", + "option": "Seçenek {number}", + "remove_option": "Seçeneği kaldır", + "sequence": "Aksiyonlar" + }, "condition": { "label": "Durum" }, @@ -840,6 +855,15 @@ "label": "Olayı Çalıştır", "service_data": "Hizmet verisi" }, + "repeat": { + "sequence": "Aksiyonlar", + "type": { + "until": { + "conditions": "Koşullara kadar", + "label": "Kadar" + } + } + }, "scene": { "label": "Sahneyi etkinleştir" }, @@ -1220,7 +1244,7 @@ "save_button": "Kaydet", "time_zone": "Saat dilimi", "unit_system": "Birim Sistemi", - "unit_system_imperial": "ımperial", + "unit_system_imperial": "Imperial", "unit_system_metric": "Metrik" }, "header": "Yapılandırma ve sunucu kontrolü", @@ -1465,7 +1489,7 @@ "note_about_website_reference": "Daha fazlası için", "rename_dialog": "Bu yapılandırma girişinin adını düzenleyin", "rename_input_label": "Varlık adı", - "search": "Entegrasyonları ara" + "search": "Entegrasyon ara" }, "introduction": "Buradan bileşenlerinizi ve Home Assistant'ınızı yapılandırabilirsiniz. Herşeyi kullanıcı arayüzü ile ayarlamak henüz mümkün değil fakat üzerinde çalışıyoruz", "logs": { @@ -1569,6 +1593,18 @@ "title": "MQTT", "topic": "konu" }, + "ozw": { + "common": { + "node_id": "Düğüm Kimliği", + "ozw_instance": "OpenZWave Örneği", + "zwave": "Z-Wave" + }, + "device_info": { + "node_failed": "Düğüm Başarısız", + "stage": "Sahne", + "zwave_info": "Z-Wave Bilgisi" + } + }, "person": { "add_person": "Kişi ekle", "caption": "Kişiler", @@ -1752,6 +1788,7 @@ "zha": { "add_device_page": { "discovered_text": "Cihazlar keşfedildikten sonra burada görünecektir.", + "discovery_text": "Keşfedilen cihazlar burada görünecektir. Cihaz (lar) ınız için talimatları izleyin ve cihazları eşleştirme moduna getirin.", "header": "Zigbee Ev Otomasyonu - Cihaz Ekle", "no_devices_found": "Hiçbir cihaz bulunamadı, eşleştirme modunda olduklarından emin olun ve keşfetme sırasında cihazı açık tutun.", "pairing_mode": "Cihazlarınızın eşleme modunda olduğundan emin olun. Bunun nasıl yapılacağı konusunda cihazınızın talimatlarını kontrol edin.", @@ -1916,6 +1953,7 @@ "set_protection": "Korumayı Ayarla" }, "ozw_log": { + "introduction": "Günlüğü görüntüleyin. 0 minimum (yükler tüm günlük) ve 1000 maksimum. Yük statik bir günlük gösterir ve kuyruk günlüğün son belirtilen satır sayısı ile otomatik güncelleştirme gösterir.", "last_log_lines": "Son günlük satırı sayısı", "load": "Yük", "tail": "Kuyruk" @@ -2278,6 +2316,9 @@ "para_migrate": "'Ayarları aktar' düğmesine bastığınız zaman Home Assistant tüm kartlarınıza ve görünümlerinize otomatik olarak kimlik atayabilir.", "para_no_id": "Bu öğenin bir kimliği yok. Lütfen 'ui-lovelace.yaml' dosyasında bu elemente bir kimlik ekleyin." }, + "move_card": { + "header": "Kartı taşımak için bir görünüm seçin" + }, "raw_editor": { "confirm_remove_config_text": "Lovelace kullanıcı arayüzü yapılandırmanızı kaldırırsanız, Lovelace kullanıcı arayüzü, görünümleriniz alanlarınız ve cihazlarınız otomatik olarak oluşturulacatır.", "confirm_remove_config_title": "Lovelace UI yapılandırmanızı kaldırmak istediğinizden emin misiniz? Lovelace kullanıcı arayüzü görünümlerinizi alanlarınız ve cihazlarınızla otomatik olarak oluşturacağız.", @@ -2303,6 +2344,10 @@ "save": "Kontrol altına al", "yaml_mode": "Bu gösterge tablosu için YAML modunu kullanıyorsunuz. Bunun anlamı, Lovelace yapılandırmanızı kullanıcı arayüzünden değiştiremezsiniz. Bu gösterge tablosunu kullanıcı arayüzünden yönetmek istiyorsanız, 'configuration: yaml' içindeki Lovelace yapılandırmanızdan 'mode: yaml' öğesini kaldırın." }, + "select_view": { + "dashboard_label": "Gösterge Paneli", + "header": "Bir görünüm seçin" + }, "suggest_card": { "add": "Lovelace kullanıcı arayüzüne ekle", "create_own": "Farklı kart seç", @@ -2500,13 +2545,16 @@ }, "page-onboarding": { "core-config": { - "button_detect": "Tespit", + "button_detect": "Algıla", "finish": "Sonraki", "intro": "Merhaba {name} , Home Assistant'a hoş geldin. Evini nasıl adlandırmak istersin?", - "location_name_default": "Evde" + "intro_location": "Nerede yaşadığınızı bilmek isteriz. Bu bilgiler, güneşe dayalı bilgilerin görüntülenmesine ve otomasyonların kurulmasına yardımcı olacaktır. Bu veriler asla ağınızın dışında paylaşılmaz.", + "intro_location_detect": "Harici bir hizmete tek seferlik talepte bulunarak bu bilgileri doldurmanıza yardımcı olabiliriz.", + "location_name_default": "Evim" }, "integration": { "finish": "Bitir", + "intro": "Cihazlar ve hizmetler, Home Asistant'ta entegrasyonlar olarak temsil edilir. Bunları şimdi kurabilir veya daha sonra yapılandırma ekranından yapabilirsiniz.", "more_integrations": "Daha fazla" }, "user": { @@ -2564,6 +2612,7 @@ "create_failed": "Erişim anahtarı oluşturulamadı.", "created_at": "{date} tarihinde oluşturuldu", "delete_failed": "Erişim anahtarı silinemedi.", + "description": "Komut dosyalarınızın Home Assistant örneğinizle etkileşime girmesine izin vermek için uzun ömürlü erişim jetonları oluşturun. Her bir jeton, oluşturulduktan sonra 10 yıl süreyle geçerli olacaktır. Aşağıdaki uzun ömürlü erişim jetonları şu anda aktif.", "empty_state": "Henüz uzun ömürlü erişim anahtarınız yok.", "header": "Uzun ömürlü erişim anahtarları", "last_used": "En son {date} tarihinde {location} konumundan kullanıldı", @@ -2583,7 +2632,7 @@ "confirm_disable": "{name} adlı öğeyi devre dışı bırakmak istediğinizden emin misiniz?", "disable": "Devre dışı bırak", "enable": "Etkinleştir", - "header": "Çoklu-faktör Kimlik Doğrulama Modülleri" + "header": "Çok Faktörlü Kimlik Doğrulama Modülleri" }, "push_notifications": { "description": "Bu cihaza bildirimler gönder", @@ -2605,14 +2654,22 @@ "token_title": "{clientId} için yenileme anahtarı" }, "suspend": { - "description": "5 dakika boyunca gizlendikten sonra sunucu bağlantısı kapatılsın mı?", + "description": "5 dakika boyunca aktif olmayınca sunucu ile bağlantı kapatılsın mı?", "header": "Bağlantıyı otomatik olarak kapat" }, "themes": { + "accent_color": "Vurgu rengi", + "dark_mode": { + "auto": "Otomatik", + "dark": "Karanlık", + "light": "Işık" + }, "dropdown_label": "Tema", "error_no_theme": "Kullanılabilir tema yok.", "header": "Tema", - "link_promo": "Temalar hakkında bilgi edinin" + "link_promo": "Temalar hakkında bilgi edinin", + "primary_color": "Birincil renk", + "reset": "Sıfırla" }, "vibrate": { "description": "Cihazları kontrol ederken bu cihazdaki titreşimi etkinleştirin veya devre dışı bırakın.", From dec1f99a5fbfdafb348d30fa0f7a03f84b0d5d9e Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Mon, 10 Aug 2020 09:36:01 +0200 Subject: [PATCH 003/300] Fix hassio panel dark mode (#6569) --- hassio/src/hassio-main.ts | 51 ++++++++++++++++++++++++++++++++------- 1 file changed, 42 insertions(+), 9 deletions(-) diff --git a/hassio/src/hassio-main.ts b/hassio/src/hassio-main.ts index d20c690e30..7d55a23378 100644 --- a/hassio/src/hassio-main.ts +++ b/hassio/src/hassio-main.ts @@ -28,15 +28,7 @@ export class HassioMain extends urlSyncMixin(ProvideHassLitMixin(LitElement)) { protected firstUpdated(changedProps: PropertyValues) { super.firstUpdated(changedProps); - applyThemesOnElement( - this.parentElement, - this.hass.themes, - (atLeastVersion(this.hass.config.version, 0, 114) - ? this.hass.selectedTheme?.theme - : ((this.hass.selectedTheme as unknown) as string)) || - this.hass.themes.default_theme, - this.hass.selectedTheme - ); + this._applyTheme(); // Paulus - March 17, 2019 // We went to a single hass-toggle-menu event in HA 0.90. However, the @@ -73,6 +65,17 @@ export class HassioMain extends urlSyncMixin(ProvideHassLitMixin(LitElement)) { makeDialogManager(this, this.shadowRoot!); } + protected updated(changedProps: PropertyValues) { + super.updated(changedProps); + const oldHass = changedProps.get("hass") as HomeAssistant | undefined; + if (!oldHass) { + return; + } + if (oldHass.themes !== this.hass.themes) { + this._applyTheme(); + } + } + protected render() { return html` `; } + + private _applyTheme() { + let themeName: string; + let options: Partial | undefined; + + if (atLeastVersion(this.hass.config.version, 0, 114)) { + themeName = + this.hass.selectedTheme?.theme || + (this.hass.themes.darkMode && this.hass.themes.default_dark_theme + ? this.hass.themes.default_dark_theme! + : this.hass.themes.default_theme); + + options = this.hass.selectedTheme; + if (themeName === "default" && options?.dark === undefined) { + options = { + ...this.hass.selectedTheme, + dark: this.hass.themes.darkMode, + }; + } + } else { + themeName = (this.hass.selectedTheme as unknown) as string; + } + + applyThemesOnElement( + this.parentElement, + this.hass.themes, + themeName, + options + ); + } } declare global { From 7f819f00204903a8c463a70f5e40bb6d599466b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Mon, 10 Aug 2020 16:23:14 +0200 Subject: [PATCH 004/300] Set min width (#6583) --- .../lovelace/editor/view-editor/hui-dialog-edit-view.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/panels/lovelace/editor/view-editor/hui-dialog-edit-view.ts b/src/panels/lovelace/editor/view-editor/hui-dialog-edit-view.ts index a03c42f826..cc5c9daaca 100644 --- a/src/panels/lovelace/editor/view-editor/hui-dialog-edit-view.ts +++ b/src/panels/lovelace/editor/view-editor/hui-dialog-edit-view.ts @@ -411,6 +411,12 @@ export class HuiDialogEditView extends LitElement { margin: 12px 16px; flex-wrap: wrap; } + + @media all and (min-width: 600px) { + ha-dialog { + --mdc-dialog-min-width: 600px; + } + } `, ]; } From 1eac9fa1cd05e31bcbaf81f59345cf117a4ceb60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Mon, 10 Aug 2020 16:42:55 +0200 Subject: [PATCH 005/300] Set header and tab color (#6582) --- src/panels/lovelace/editor/view-editor/hui-dialog-edit-view.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/panels/lovelace/editor/view-editor/hui-dialog-edit-view.ts b/src/panels/lovelace/editor/view-editor/hui-dialog-edit-view.ts index cc5c9daaca..99a4022efc 100644 --- a/src/panels/lovelace/editor/view-editor/hui-dialog-edit-view.ts +++ b/src/panels/lovelace/editor/view-editor/hui-dialog-edit-view.ts @@ -342,6 +342,7 @@ export class HuiDialogEditView extends LitElement { css` h2 { display: block; + color: var(--primary-text-color); line-height: normal; -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; @@ -380,6 +381,7 @@ export class HuiDialogEditView extends LitElement { } paper-tabs { --paper-tabs-selection-bar-color: var(--primary-color); + color: var(--primary-text-color); text-transform: uppercase; border-bottom: 1px solid rgba(0, 0, 0, 0.1); padding: 0 20px; From 16167bef07959d574cfad3f2e071191fa91cbc19 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Tue, 11 Aug 2020 00:32:11 +0000 Subject: [PATCH 006/300] [ci skip] Translation update --- translations/frontend/da.json | 2 +- translations/frontend/nb.json | 2 +- translations/frontend/pt-BR.json | 70 ++++++++++++++++++++++++++++-- translations/frontend/tr.json | 19 +++++--- translations/frontend/zh-Hant.json | 2 +- 5 files changed, 82 insertions(+), 13 deletions(-) diff --git a/translations/frontend/da.json b/translations/frontend/da.json index 14550a224a..075b09ecb2 100644 --- a/translations/frontend/da.json +++ b/translations/frontend/da.json @@ -2475,7 +2475,7 @@ }, "menu": { "close": "Luk", - "configure_ui": "Konfigurer brugerflade", + "configure_ui": "Rediger betjeningspanel", "exit_edit_mode": "Afslut brugerflade-redigeringstilstand", "help": "Hjælp", "refresh": "Opdater", diff --git a/translations/frontend/nb.json b/translations/frontend/nb.json index b22415f52b..36496f4f21 100644 --- a/translations/frontend/nb.json +++ b/translations/frontend/nb.json @@ -2475,7 +2475,7 @@ }, "menu": { "close": "Lukk", - "configure_ui": "Konfigurer brukergrensesnitt", + "configure_ui": "Rediger brukergrensesnitt", "exit_edit_mode": "Avslutt redigeringsmodus for brukergrensesnitt", "help": "Hjelp", "refresh": "Oppdater", diff --git a/translations/frontend/pt-BR.json b/translations/frontend/pt-BR.json index 8e3ba9cd45..7656f77073 100644 --- a/translations/frontend/pt-BR.json +++ b/translations/frontend/pt-BR.json @@ -725,6 +725,7 @@ "zha_device_info": { "buttons": { "add": "Adicionar dispositivos através deste dispositivo", + "clusters": "Gerenciar Grupos", "reconfigure": "Reconfigurar O Dispositivo", "remove": "Remover dispositivo", "zigbee_information": "Assinatura de dispositivo Zigbee" @@ -832,6 +833,15 @@ "name": "Açao", "type_select": "Tipo de acão", "type": { + "choose": { + "add_option": "Adicionar opção", + "conditions": "Condições", + "default": "Ações padrão", + "label": "Selecione", + "option": "Opção {number}", + "remove_option": "Remover opção", + "sequence": "Ações" + }, "condition": { "label": "Condição" }, @@ -851,6 +861,24 @@ "label": "Iniciar evento", "service_data": "Dados do Serviço" }, + "repeat": { + "label": "Repetir", + "sequence": "Ações", + "type_select": "Tipo de repetição", + "type": { + "count": { + "label": "Contagem" + }, + "until": { + "conditions": "Condições (até que...)", + "label": "Até que" + }, + "while": { + "conditions": "Condições (enquanto...)", + "label": "Enquanto" + } + } + }, "scene": { "label": "Ativar cena" }, @@ -1618,6 +1646,18 @@ "title": "", "topic": "tópico" }, + "ozw": { + "common": { + "node_id": "ID do Nó", + "ozw_instance": "Instância OpenZWave", + "zwave": "Z-Wave" + }, + "device_info": { + "node_failed": "Falha no nó", + "stage": "Estágio", + "zwave_info": "Informações de Z-Wave" + } + }, "person": { "add_person": "Adicionar pessoa", "caption": "Pessoas", @@ -1807,7 +1847,8 @@ "name": "Nome", "system": "Sistema" } - } + }, + "users_privileges_note": "Grupos de Usuários ainda é um recurso experimental. O usuário será incapaz de administrar através da interface grática. Nós ainda estamos auditando todos os endponts da API de gerenciamento para se certificar que eles limitam o acesso para administradores da maneira correta." }, "zha": { "add_device_page": { @@ -1980,13 +2021,21 @@ "node_management": { "add_to_group": "Adicionar ao Grupo", "entities": "Entidades deste nó", + "entity_info": "Informações da Entidade", "exclude_entity": "Excluir esta entidade do Home Assistant", "group": "Grupo", "header": "Gerenciamento de nó Z-Wave", + "introduction": "Executar comandos Z-Wave que afetam um único nó. Seleciona um nó para ver a lista de comandos disponíveis", + "max_associations": "Máximo de Associações", "node_group_associations": "Associações de grupos de nós", "node_protection": "Proteção dos nós", + "node_to_control": "Nó para controlar", "nodes": "Nós", + "nodes_hint": "Selecione um nó para ver opções específicas", + "nodes_in_group": "Outros nós neste grupo", + "pooling_intensity": "Frequência da consulta", "protection": "Proteção", + "remove_broadcast": "Remover Broadcast", "remove_from_group": "Remover do Grupo", "set_protection": "Definir proteção" }, @@ -2342,7 +2391,7 @@ "show_code_editor": "Mostrar Editor de Código", "show_visual_editor": "Mostrar Editor Visual", "toggle_editor": "Alternar Editor", - "typed_header": "Configuração de cartão {type}", + "typed_header": "Configuração do cartão {type}", "unsaved_changes": "Você tem alterações não salvas" }, "edit_lovelace": { @@ -2377,6 +2426,9 @@ "para_migrate": "O Home Assistant pode adicionar IDs a todos os seus cards e visualizações automaticamente clicando no botão 'Migrar configuração'.", "para_no_id": "Este elemento não possui um ID. Por favor adicione um ID a este elemento em 'ui-lovelace.yaml'." }, + "move_card": { + "header": "Selecione uma tela para onde mover este cartão" + }, "raw_editor": { "confirm_remove_config_text": "Geraremos automaticamente suas visualizações da interface do usuário do Lovelace com suas áreas e dispositivos se você remover a configuração da interface do usuário do Lovelace.", "confirm_remove_config_title": "Tem certeza de que deseja remover a configuração da interface Lovelace? Geraremos automaticamente visualizações da interface Lovelace com suas áreas e dispositivos.", @@ -2404,6 +2456,10 @@ "yaml_control": "Para assumir o controle no modo YAML, crie um arquivo YAML com o nome que você especificou na sua configuração para este painel ou arquivo padrão 'ui-lovelace.yaml'.", "yaml_mode": "Você está usando o modo YAML para este painel, o que significa que não é possível alterar a configuração do Lovelace na interface. Se você deseja gerenciar esse painel na interface do usuário, remova 'mode: yaml' da configuração do Lovelace em 'configuration.yaml.'" }, + "select_view": { + "dashboard_label": "Painel de controle", + "header": "Selecione uma tela" + }, "suggest_card": { "add": "Adicionar a UI do Lovelace", "create_own": "Escolha cartão diferente", @@ -2721,10 +2777,18 @@ "header": "Fechar a conexão automaticamente" }, "themes": { + "accent_color": "Cor de detalhe", + "dark_mode": { + "auto": "Automático", + "dark": "Escuro", + "light": "Claro" + }, "dropdown_label": "Tema", "error_no_theme": "Não há temas disponíveis.", "header": "Tema", - "link_promo": "Aprenda sobre temas" + "link_promo": "Aprenda sobre temas", + "primary_color": "Cor Principal", + "reset": "Redefinir" }, "vibrate": { "description": "Ative ou desative a vibração neste dispositivo ao controlar dispositivos.", diff --git a/translations/frontend/tr.json b/translations/frontend/tr.json index 0c2c4831f9..1d11c4e2d7 100644 --- a/translations/frontend/tr.json +++ b/translations/frontend/tr.json @@ -785,7 +785,7 @@ "link_profile_page": "profil sayfanız" }, "areas": { - "caption": "Alanları", + "caption": "Alanlar", "data_table": { "area": "Alan", "devices": "Cihazlar" @@ -1192,7 +1192,9 @@ "email": "E-posta", "email_error_msg": "Geçersiz e-posta", "forgot_password": "Parolanızı mı unuttunuz?", - "introduction2": "Bu hizmet ortağımız tarafından yürütülüyor", + "introduction": "Home Assistant Cloud, evden uzaktayken örneğinize güvenli bir uzaktan bağlantı sağlar. Ayrıca diğer bulut hizmetlerine bağlanmanıza olanak tanır: Amazon Alexa ve Google Assistant.", + "introduction2": "Bu hizmet ortağımız ", + "introduction2a": "tarafından verilmektedir, Home Assistant ve Hass.io kurucuları tarafından kurulan bir şirket.", "introduction3": "Home Assistant Cloud, bir aylık ücretsiz deneme sürümüne sahip bir abonelik hizmetidir. Ödeme bilgisi gerekmez.", "learn_more_link": "Home Assistant Cloud hakkında daha fazla bilgi edin", "password": "Parola", @@ -1214,8 +1216,8 @@ "headline": "Ücretsiz denemenizi başlatın", "information": "Home Assistant Cloud ile bir aylık ücretsiz denemenizi başlatmak için bir hesap oluşturun. Ödeme bilgisi gerekmez.", "information2": "Deneme, aşağıdakiler de dahil olmak üzere Home Assistant Cloud'un tüm avantajlarına erişmenizi sağlayacaktır:", - "information3": "Bu hizmet ortağımız tarafından yürütülüyor", - "information3a": ", Home Assistant ve Hass.io'nun kurucuları tarafından kurulmuş bir şirkettir.", + "information3": "Bu hizmet ortağımız ", + "information3a": "tarafından verilmektedir, Home Assistant ve Hass.io kurucuları tarafından kurulan bir şirket.", "information4": "Bir hesap kaydederek aşağıdaki şartlar ve koşulları kabul etmiş olursunuz.", "link_privacy_policy": "Gizlilik Politikası", "link_terms_conditions": "Şartlar ve koşullar", @@ -1624,9 +1626,10 @@ "name": "Ad", "name_error_msg": "Isim gereklidir", "new_person": "Yeni kişi", - "update": "Güncelleme" + "no_device_tracker_available_intro": "Bir kişinin varlığını gösteren aygıtlarınız olduğunda, bunları buradaki bir kişiye atayabilirsiniz. Entegrasyonlar sayfasından bir varlık algılama entegrasyonu ekleyerek ilk cihazınızı ekleyebilirsiniz.", + "update": "Güncelle" }, - "introduction": "Burada Home Assistant ilgi her kişi tanımlayabilirsiniz.", + "introduction": "Burada Home Assistant ile ilgili her kişiyi tanımlayabilirsiniz.", "no_persons_created_yet": "Henüz herhangi bir kişi oluşturmadığın gibi görünüyor.", "note_about_persons_configured_in_yaml": "Not: configuration.yaml aracılığıyla yapılandırılan kişiler UI aracılığıyla düzenlenemez." }, @@ -1996,7 +1999,7 @@ "available_events": "Mevcut Etkinlikler", "count_listeners": " ({count} dinleyiciler)", "data": "Olay Verileri (YAML, isteğe bağlı)", - "description": "Etkinlik otobüsünde bir etkinlik başlat.", + "description": "Olay veri yolunda bir olay tetikleyin.", "documentation": "Olaylar Dökümantasyonu.", "fire_event": "Olayı Çalıştır", "listen_to_events": "Olayları dinleyin", @@ -2014,6 +2017,7 @@ "column_example": "Örnek", "column_parameter": "Parametre", "data": "Servis Verileri (YAML, isteğe bağlı)", + "description": "Servisler geliştirici araçı, Home Assistant'taki mevcut tüm hizmetleri aramanızı sağlar.", "fill_example_data": "Örnek Verileri Doldur", "no_description": "Açıklama mevcut değil", "no_parameters": "Bu servis parametre almaz.", @@ -2137,6 +2141,7 @@ "entities": { "description": "Varlıklar kartı en yaygın kart türüdür. Öğeleri listeler halinde gruplandırır.", "name": "Varlıklar", + "show_header_toggle": "Başlık Değiştirme Gösterilsin mi?", "toggle": "Varlıklarageçiş." }, "entity-filter": { diff --git a/translations/frontend/zh-Hant.json b/translations/frontend/zh-Hant.json index d0be0db91b..adc72e651f 100644 --- a/translations/frontend/zh-Hant.json +++ b/translations/frontend/zh-Hant.json @@ -2475,7 +2475,7 @@ }, "menu": { "close": "關閉", - "configure_ui": "介面設定", + "configure_ui": "編輯主面板", "exit_edit_mode": "退出 UI 編輯模式", "help": "說明", "refresh": "更新", From 271eb614cd31d2bc24107cdc41b64b9adf64d05c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Tue, 11 Aug 2020 13:22:46 +0200 Subject: [PATCH 007/300] Use primary-background-color when it exists (#6594) --- src/html/index.html.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/html/index.html.template b/src/html/index.html.template index fe4271c0fb..5ec5dd1dc1 100644 --- a/src/html/index.html.template +++ b/src/html/index.html.template @@ -48,7 +48,7 @@ } @media (prefers-color-scheme: dark) { html { - background-color: #111111; + background-color: var(--primary-background-color, #111111); } #ha-init-skeleton::before { background-color: #1c1c1c; From 283b134d84ae2858115c77c908b53cd6a1fe8680 Mon Sep 17 00:00:00 2001 From: Ludeeus Date: Tue, 11 Aug 2020 11:57:03 +0000 Subject: [PATCH 008/300] Bumped version to 20200811.0 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 834ffe3aab..289a8db76f 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name="home-assistant-frontend", - version="20200807.1", + version="20200811.0", description="The Home Assistant frontend", url="https://github.com/home-assistant/home-assistant-polymer", author="The Home Assistant Authors", From a31f53395ffa9d8e42fcad7bb5dcc5e04cb651f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Mon, 10 Aug 2020 16:23:14 +0200 Subject: [PATCH 009/300] Set min width (#6583) --- .../lovelace/editor/view-editor/hui-dialog-edit-view.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/panels/lovelace/editor/view-editor/hui-dialog-edit-view.ts b/src/panels/lovelace/editor/view-editor/hui-dialog-edit-view.ts index a03c42f826..cc5c9daaca 100644 --- a/src/panels/lovelace/editor/view-editor/hui-dialog-edit-view.ts +++ b/src/panels/lovelace/editor/view-editor/hui-dialog-edit-view.ts @@ -411,6 +411,12 @@ export class HuiDialogEditView extends LitElement { margin: 12px 16px; flex-wrap: wrap; } + + @media all and (min-width: 600px) { + ha-dialog { + --mdc-dialog-min-width: 600px; + } + } `, ]; } From 15193fcf5f3e591ede3f6c7f8222a4b1669d8b69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Mon, 10 Aug 2020 16:42:55 +0200 Subject: [PATCH 010/300] Set header and tab color (#6582) --- src/panels/lovelace/editor/view-editor/hui-dialog-edit-view.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/panels/lovelace/editor/view-editor/hui-dialog-edit-view.ts b/src/panels/lovelace/editor/view-editor/hui-dialog-edit-view.ts index cc5c9daaca..99a4022efc 100644 --- a/src/panels/lovelace/editor/view-editor/hui-dialog-edit-view.ts +++ b/src/panels/lovelace/editor/view-editor/hui-dialog-edit-view.ts @@ -342,6 +342,7 @@ export class HuiDialogEditView extends LitElement { css` h2 { display: block; + color: var(--primary-text-color); line-height: normal; -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; @@ -380,6 +381,7 @@ export class HuiDialogEditView extends LitElement { } paper-tabs { --paper-tabs-selection-bar-color: var(--primary-color); + color: var(--primary-text-color); text-transform: uppercase; border-bottom: 1px solid rgba(0, 0, 0, 0.1); padding: 0 20px; From 71c592a0ce8de3bee3669e8a49d1bfbaf4a1a093 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Tue, 11 Aug 2020 13:22:46 +0200 Subject: [PATCH 011/300] Use primary-background-color when it exists (#6594) --- src/html/index.html.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/html/index.html.template b/src/html/index.html.template index fe4271c0fb..5ec5dd1dc1 100644 --- a/src/html/index.html.template +++ b/src/html/index.html.template @@ -48,7 +48,7 @@ } @media (prefers-color-scheme: dark) { html { - background-color: #111111; + background-color: var(--primary-background-color, #111111); } #ha-init-skeleton::before { background-color: #1c1c1c; From 3b3aeea224f5fc8cd5ce988b8091e9f41a9c4ea5 Mon Sep 17 00:00:00 2001 From: Ludeeus Date: Tue, 11 Aug 2020 11:57:03 +0000 Subject: [PATCH 012/300] Bumped version to 20200811.0 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 834ffe3aab..289a8db76f 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name="home-assistant-frontend", - version="20200807.1", + version="20200811.0", description="The Home Assistant frontend", url="https://github.com/home-assistant/home-assistant-polymer", author="The Home Assistant Authors", From 41b613a2d7c20eff5cced16c9eda86af39a44421 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Tue, 11 Aug 2020 14:01:20 +0200 Subject: [PATCH 013/300] Fix wrapping for diagnostics row (#6595) --- hassio/src/system/hassio-supervisor-info.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/hassio/src/system/hassio-supervisor-info.ts b/hassio/src/system/hassio-supervisor-info.ts index 7423da51a8..0452bd5188 100644 --- a/hassio/src/system/hassio-supervisor-info.ts +++ b/hassio/src/system/hassio-supervisor-info.ts @@ -65,7 +65,7 @@ class HassioSupervisorInfo extends LitElement { Share Diagnostics - +
Share crash reports and diagnostic information. - +

- The data does not include any private/sensetive information and you can + The data does not include any private/sensitive information and you can disable this in settings at any time you want.`, }); } From 746844dfc85469a18acee8bc399877add86d23b0 Mon Sep 17 00:00:00 2001 From: Ludeeus Date: Tue, 11 Aug 2020 12:15:08 +0000 Subject: [PATCH 014/300] Only show diagnostics if healthy --- hassio/src/system/hassio-supervisor-info.ts | 38 +++++++++++---------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/hassio/src/system/hassio-supervisor-info.ts b/hassio/src/system/hassio-supervisor-info.ts index 0452bd5188..71b21423e0 100644 --- a/hassio/src/system/hassio-supervisor-info.ts +++ b/hassio/src/system/hassio-supervisor-info.ts @@ -61,24 +61,26 @@ class HassioSupervisorInfo extends LitElement {
- - - Share Diagnostics - -
- Share crash reports and diagnostic information. - -
- -
+ ${this.supervisorInfo?.healthy + ? html` + + Share Diagnostics + +
+ Share crash reports and diagnostic information. + +
+ +
` + : ""}
${this._errors ? html`
Error: ${this._errors}
` From 2bb64e9e2fd5092f4d31f7308e1264d0577c69a4 Mon Sep 17 00:00:00 2001 From: Ludeeus Date: Tue, 11 Aug 2020 12:28:35 +0000 Subject: [PATCH 015/300] Use supported instead --- hassio/src/system/hassio-supervisor-info.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hassio/src/system/hassio-supervisor-info.ts b/hassio/src/system/hassio-supervisor-info.ts index 71b21423e0..189738ea09 100644 --- a/hassio/src/system/hassio-supervisor-info.ts +++ b/hassio/src/system/hassio-supervisor-info.ts @@ -61,7 +61,7 @@ class HassioSupervisorInfo extends LitElement {
- ${this.supervisorInfo?.healthy + ${this.supervisorInfo?.supported ? html` Share Diagnostics From 96986164a43e06924a82669f5734a913379393a2 Mon Sep 17 00:00:00 2001 From: Ludeeus Date: Tue, 11 Aug 2020 14:12:38 +0000 Subject: [PATCH 016/300] Show error if not supported --- hassio/src/system/hassio-supervisor-info.ts | 23 +++++++++++++++------ hassio/src/system/hassio-system.ts | 1 + 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/hassio/src/system/hassio-supervisor-info.ts b/hassio/src/system/hassio-supervisor-info.ts index 189738ea09..b76f791c4d 100644 --- a/hassio/src/system/hassio-supervisor-info.ts +++ b/hassio/src/system/hassio-supervisor-info.ts @@ -12,6 +12,7 @@ import { import { fireEvent } from "../../../src/common/dom/fire_event"; import "../../../src/components/buttons/ha-call-api-button"; import "../../../src/components/ha-card"; +import { HassioHostInfo as HassioHostInfoType } from "../../../src/data/hassio/host"; import { HassioSupervisorInfo as HassioSupervisorInfoType, setSupervisorOption, @@ -33,6 +34,8 @@ class HassioSupervisorInfo extends LitElement { @property() public supervisorInfo!: HassioSupervisorInfoType; + @property() public hostInfo!: HassioHostInfoType; + @internalProperty() private _errors?: string; public render(): TemplateResult | void { @@ -80,10 +83,22 @@ class HassioSupervisorInfo extends LitElement { @change=${this._toggleDiagnostics} > ` - : ""} + : html`
+ You are running an unsupported installation. + Learn More +
`}
${this._errors - ? html`
Error: ${this._errors}
` + ? html`
Error: ${this._errors}
` : ""}
@@ -145,10 +160,6 @@ class HassioSupervisorInfo extends LitElement { .info td:nth-child(2) { text-align: right; } - .errors { - color: var(--error-color); - margin-top: 16px; - } ha-settings-row { padding: 0; } diff --git a/hassio/src/system/hassio-system.ts b/hassio/src/system/hassio-system.ts index 00a304ed03..3a52347a08 100644 --- a/hassio/src/system/hassio-system.ts +++ b/hassio/src/system/hassio-system.ts @@ -56,6 +56,7 @@ class HassioSystem extends LitElement {
Date: Wed, 12 Aug 2020 13:15:24 +0000 Subject: [PATCH 017/300] Use default as fallback theme for older versions --- hassio/src/hassio-main.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/hassio/src/hassio-main.ts b/hassio/src/hassio-main.ts index 7d55a23378..b6f485b7d9 100644 --- a/hassio/src/hassio-main.ts +++ b/hassio/src/hassio-main.ts @@ -106,9 +106,13 @@ export class HassioMain extends urlSyncMixin(ProvideHassLitMixin(LitElement)) { }; } } else { - themeName = (this.hass.selectedTheme as unknown) as string; + themeName = + ((this.hass.selectedTheme as unknown) as string) || + this.hass.themes.default_theme; } + console.log(themeName); + applyThemesOnElement( this.parentElement, this.hass.themes, From d09f74d30f49b224fd7e04ff8683fff71ae3f448 Mon Sep 17 00:00:00 2001 From: Ludeeus Date: Wed, 12 Aug 2020 13:15:39 +0000 Subject: [PATCH 018/300] console.die --- hassio/src/hassio-main.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/hassio/src/hassio-main.ts b/hassio/src/hassio-main.ts index b6f485b7d9..ccabb2e426 100644 --- a/hassio/src/hassio-main.ts +++ b/hassio/src/hassio-main.ts @@ -111,8 +111,6 @@ export class HassioMain extends urlSyncMixin(ProvideHassLitMixin(LitElement)) { this.hass.themes.default_theme; } - console.log(themeName); - applyThemesOnElement( this.parentElement, this.hass.themes, From 80fc37724b7878be301429fd5f323335b1d1a72a Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Thu, 13 Aug 2020 00:32:21 +0000 Subject: [PATCH 019/300] [ci skip] Translation update --- translations/frontend/it.json | 42 ++++++++++++++++++++++++++++++++++- translations/frontend/ja.json | 25 +++++++++++++++++++-- translations/frontend/nn.json | 4 ++-- 3 files changed, 66 insertions(+), 5 deletions(-) diff --git a/translations/frontend/it.json b/translations/frontend/it.json index 2840cc38de..d22f43449c 100644 --- a/translations/frontend/it.json +++ b/translations/frontend/it.json @@ -834,9 +834,12 @@ "type_select": "Tipo di azione", "type": { "choose": { + "add_option": "Aggiungi opzione", "conditions": "Condizioni", "default": "Azione predefinita", "label": "Scegli", + "option": "Opzione {number}", + "remove_option": "Rimuovi opzione", "sequence": "Azioni" }, "condition": { @@ -858,6 +861,24 @@ "label": "Attiva Evento", "service_data": "Dati del servizio" }, + "repeat": { + "label": "Ripetere", + "sequence": "Azioni", + "type_select": "Tipo \"ripetizione\"", + "type": { + "count": { + "label": "Conteggio" + }, + "until": { + "conditions": "Condizioni \"fino a\"", + "label": "Fino a" + }, + "while": { + "conditions": "Condizioni \"mentre\"", + "label": "Mentre" + } + } + }, "scene": { "label": "Attivare la scena" }, @@ -1625,6 +1646,18 @@ "title": "MQTT", "topic": "argomento" }, + "ozw": { + "common": { + "node_id": "ID del nodo", + "ozw_instance": "Istanza OpenZWave", + "zwave": "Z-Wave" + }, + "device_info": { + "node_failed": "Nodo non riuscito", + "stage": "Fase", + "zwave_info": "Informazioni Z-Wave" + } + }, "person": { "add_person": "Aggiungi persona", "caption": "Persone", @@ -2393,6 +2426,9 @@ "para_migrate": "Home Assistant può aggiungere automaticamente gli ID a tutte le tue schede e viste in maniera automatica premendo il pulsante \"Esporta Configurazione\".", "para_no_id": "Questo elemento non ha un ID. Aggiungi un ID a questo elemento in 'ui-lovelace.yaml'." }, + "move_card": { + "header": "Scegli una visualizzazione in cui spostare la scheda" + }, "raw_editor": { "confirm_remove_config_text": "Genereremo automaticamente le tue viste dell'Interfaccia utente di Lovelace con le tue aree e dispositivi se rimuovi la tua configurazione dell'interfaccia utente di Lovelace.", "confirm_remove_config_title": "Sei sicuro di voler rimuovere la tua configurazione dell'interfaccia utente di Lovelace? Genereremo automaticamente le tue viste Lovelace con le tue aree e dispositivi.", @@ -2420,6 +2456,10 @@ "yaml_control": "Per assumere il controllo in modalità YAML, creare un file YAML con il nome specificato nella tua configurazione per questa plancia, o il predefinito 'ui-lovelace.yaml'.", "yaml_mode": "Questa plancia sta utilizzando la modalità YAML, il che significa che non è possibile modificare la configurazione di Lovelace dall'Interfaccia Utente. Se volete gestire questa plancia dall'Interfaccia Utente, rimuovere 'mode: yaml' dalla configurazione di Lovelace in 'configuration.yaml'." }, + "select_view": { + "dashboard_label": "Plancia", + "header": "Scegliere una visualizzazione" + }, "suggest_card": { "add": "Aggiungi all'interfaccia utente di Lovelace", "create_own": "Scegliere una scheda diversa", @@ -2435,7 +2475,7 @@ }, "menu": { "close": "Chiudi", - "configure_ui": "Configurare l'Interfaccia Utente", + "configure_ui": "Modifica la Plancia", "exit_edit_mode": "Esci dalla modalità di modifica dell'Interfaccia Utente", "help": "Aiuto", "refresh": "Aggiorna", diff --git a/translations/frontend/ja.json b/translations/frontend/ja.json index 7a74c95fd4..0438a1bf5b 100644 --- a/translations/frontend/ja.json +++ b/translations/frontend/ja.json @@ -512,7 +512,8 @@ }, "login-form": { "log_in": "ログイン", - "password": "パスワード" + "password": "パスワード", + "remember": "覚えて" }, "notification_drawer": { "close": "閉じる", @@ -654,6 +655,7 @@ }, "state": { "from": "変化前", + "label": "状態", "to": "変化後" }, "sun": { @@ -993,6 +995,17 @@ "title": "MQTT", "topic": "トピック" }, + "ozw": { + "common": { + "node_id": "ノードID", + "ozw_instance": "OpenZWaveインスタンス" + }, + "device_info": { + "node_failed": "ノードが失敗しました", + "stage": "段階", + "zwave_info": "Z-Wave情報" + } + }, "person": { "caption": "人", "description": "Home Assistant を追跡している人の管理。", @@ -1331,6 +1344,9 @@ "menu": { "open": "Lovelace メニューを開く" }, + "move_card": { + "header": "カードを移動するビューを選択してください" + }, "raw_editor": { "confirm_unsaved_changes": "未保存の変更があります、終了してもよろしいですか?", "confirm_unsaved_comments": "コンフィグレーションはコメントが含まれています、これらは保存されません。本当に続けますか?", @@ -1340,6 +1356,10 @@ }, "save_config": { "close": "閉じる" + }, + "select_view": { + "dashboard_label": "ダッシュボード", + "header": "ビューに移動" } }, "menu": { @@ -1363,7 +1383,8 @@ "mailbox": { "delete_button": "削除", "delete_prompt": "このメッセージを削除しますか?", - "empty": "メッセージはありません" + "empty": "メッセージはありません", + "playback_title": "メッセージの再生" }, "page-authorize": { "abort_intro": "ログインが中止されました", diff --git a/translations/frontend/nn.json b/translations/frontend/nn.json index 3e8e390309..69b3e297fb 100644 --- a/translations/frontend/nn.json +++ b/translations/frontend/nn.json @@ -354,7 +354,7 @@ "climate": { "aux_heat": "Aux-varme", "away_mode": "Bortemodus", - "currently": "Akkuratt no", + "currently": "Akkurat no", "fan_mode": "Viftemodus", "on_off": "På / av", "operation": "Operasjon", @@ -953,7 +953,7 @@ "description": "Oversikt over alle kjende oppføringar.", "picker": { "header": "Oppføringsregisteret", - "introduction": "Home Assistant har eit register over alle oppføringane den nokon gang har sett som kan unikt identifiserast. Kvar av desse oppføringane har ein eigen oppføringsidentifikasjon som er reservert for akkuratt denne oppføringa.", + "introduction": "Home Assistant har eit register over alle oppføringane den nokon gang har sett som kan unikt identifiserast. Kvar av desse oppføringane har ein eigen oppføringsidentifikasjon som er reservert for akkurat denne oppføringa.", "introduction2": "Bruk oppføringsregisteret til å skrive over namn, endre oppføringsidentifikasjonane eller fjerne oppføringar frå Home Assistant. Merk deg at å fjerne oppføringa i oppføringregisteret ikkje fjernar sjølve oppføringa. For å gjere dette, gå vidare inn på linken under og fjern oppføringa i integrasjonssida." } }, From 9c6dac8180cd9857112a2c4a010bc853ede00810 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Fri, 14 Aug 2020 00:32:15 +0000 Subject: [PATCH 020/300] [ci skip] Translation update --- translations/frontend/de.json | 5 + translations/frontend/es.json | 2 +- translations/frontend/et.json | 145 +++++++++++++++++++++++-- translations/frontend/nl.json | 45 +++++++- translations/frontend/nn.json | 2 +- translations/frontend/sk.json | 168 +++++++++++++++++++++++++++-- translations/frontend/zh-Hans.json | 2 +- 7 files changed, 348 insertions(+), 21 deletions(-) diff --git a/translations/frontend/de.json b/translations/frontend/de.json index 1d2422085d..ae49612394 100644 --- a/translations/frontend/de.json +++ b/translations/frontend/de.json @@ -1619,6 +1619,11 @@ "title": "MQTT", "topic": "Topic" }, + "ozw": { + "device_info": { + "zwave_info": "Z-wave Infos" + } + }, "person": { "add_person": "Person hinzufügen", "caption": "Personen", diff --git a/translations/frontend/es.json b/translations/frontend/es.json index f5b4dabc25..6777ea2763 100644 --- a/translations/frontend/es.json +++ b/translations/frontend/es.json @@ -2088,7 +2088,7 @@ "description": "Disparar un evento en el bus de eventos.", "documentation": "Documentación de eventos.", "event_fired": "Evento {name} disparado", - "fire_event": "Disparar evento", + "fire_event": "Lanzar evento", "listen_to_events": "Escuchar eventos", "listening_to": "Escuchando", "notification_event_fired": "¡Evento {tipe} disparado con éxito!", diff --git a/translations/frontend/et.json b/translations/frontend/et.json index d34f2027d8..51e3f2f620 100644 --- a/translations/frontend/et.json +++ b/translations/frontend/et.json @@ -386,6 +386,9 @@ "reverse": "Tagurpidi", "speed": "Kiirus" }, + "humidifier": { + "target_humidity_entity": "Soovitud niiskusemäär" + }, "light": { "brightness": "Heledus", "color_temperature": "Värvustemperatuur", @@ -471,8 +474,12 @@ "cancel": "Loobu", "close": "Sulge", "loading": "Laadimine", + "menu": "Menüü", "no": "Ei", + "previous": "Eelmine", + "refresh": "Värskenda", "save": "Salvesta", + "successfully_deleted": "Edukalt kustutatud", "successfully_saved": "Edukalt salvestatud", "yes": "Jah" }, @@ -544,7 +551,7 @@ "dismiss": "Loobu", "editor": { "confirm_delete": "Oled kindel, et soovid selle kirje kustutada?", - "delete": "KUSTUTA", + "delete": "Kustuta", "enabled_cause": "Keelatud, sest {cause}.", "enabled_description": "Keelatud olemeid ei lisata Home Assistant'i.", "enabled_label": "Luba olem", @@ -552,8 +559,9 @@ "name": "Nime muutmine", "note": "Märkus: see ei pruugi veel töötada kõigi sidumistega.", "unavailable": "See olem pole praegu saadaval.", - "update": "UUENDA" + "update": "Uuenda" }, + "no_unique_id": "Sellel olemil pole unikaalset ID-d, seetõttu ei saa selle seadeid kasutajaliidesest hallata.", "related": "Seotud", "settings": "Seaded" }, @@ -562,6 +570,28 @@ "default_confirmation_title": "Oled sa kindel?", "ok": "OK" }, + "helper_settings": { + "generic": { + "name": "Nimi" + }, + "input_datetime": { + "date": "Kuupäev", + "datetime": "Kuupäev ja kellaaeg", + "time": "Aeg" + }, + "input_number": { + "step": "Sammu suurus", + "unit_of_measurement": "Mõõtühik" + }, + "input_select": { + "add": "Lisa" + }, + "input_text": { + "max": "Maksimaalne pikkus", + "min": "Minimaalne pikkus", + "password": "Salasõna" + } + }, "more_info_control": { "dismiss": "Loobu dialoogist", "edit": "Muuda olemit", @@ -658,23 +688,35 @@ }, "notification_toast": { "connection_lost": "Ühendus kadunud. Taasühendamine...", - "service_call_failed": "Teenuse {service} väljakutsumine ebaõnnestus." + "service_call_failed": "Teenuse {service} väljakutsumine ebaõnnestus.", + "started": "Koduabiline on käivitunud!" }, "panel": { + "calendar": { + "my_calendars": "Minu kalendrid", + "today": "Täna" + }, "config": { "areas": { "caption": "Alade register", + "delete": { + "confirmation_title": "Oled kindel, et soovid selle ala kustutada?" + }, "description": "Ülevaade kõikidest oma kodu aladest.", "editor": { + "area_id": "Piirkonna ID", "create": "LOO", + "default_name": "Uus ala", "delete": "KUSTUTA", "update": "UUENDA" }, "picker": { + "create_area": "LOO ALA", "header": "Alade register", "integrations_page": "Sidumiste leht", "introduction": "Alasid kasutatakse seadmete paiknemise korraldamiseks. Seda teavet kasutatakse läbivalt kasutajaliidese, lubade ja teiste süsteemidega sidumise korraldamisel.", - "introduction2": "Seadmete paigutamiseks alale mine alloleva lingi kaudu sidumiste lehele ja seejärel klõpsa seadme kaartideni jõudmiseks seadistatud sidumisel." + "introduction2": "Seadmete paigutamiseks alale mine alloleva lingi kaudu sidumiste lehele ja seejärel klõpsa seadme kaartideni jõudmiseks seadistatud sidumisel.", + "no_areas": "Paistab, et sul pole veel alasid!" } }, "automation": { @@ -710,6 +752,9 @@ "label": "Vallanda sündmus", "service_data": "Teenuse andmed" }, + "repeat": { + "label": "Korda" + }, "scene": { "label": "Aktiveeri stseen" }, @@ -798,6 +843,9 @@ "introduction": "Kasuta oma kodule elu sisse puhumiseks automatiseeringuid.", "load_error_not_editable": "Ainult automations.yaml failis asuvad automatiseeringud on muudetavad.", "load_error_unknown": "Viga automatiseeringu laadimisel ({err_no}).", + "modes": { + "parallel": "Paralleelselt" + }, "save": "Salvesta", "triggers": { "add": "Lisa päästik", @@ -973,8 +1021,11 @@ "webhook_for": "Veebihaak {name} jaoks" }, "forgot_password": { + "check_your_email": "Parooli lähtestamise kohta saate juhiseid oma e-posti aadressilt.", "email": "E-post", "email_error_msg": "Vigane meiliaadress", + "instructions": "Sisestage oma e-posti aadress ja me saadame teile lingi parooli lähtestamiseks.", + "send_reset_email": "Saatke lähtestamismeil", "subtitle": "Unustasid oma salasõna", "title": "Unustasid salasõna" }, @@ -987,6 +1038,7 @@ "title": "Google Assistant" }, "login": { + "alert_email_confirm_necessary": "Enne sisselogimist peate oma e-posti aadressi kinnitama.", "alert_password_change_required": "Enne sisselogimist pead parooli muutma.", "dismiss": "Loobu", "email": "E-post", @@ -1001,6 +1053,7 @@ "trial_info": "Makseteavet pole vaja" }, "register": { + "account_created": "Konto loodud! Konto aktiveerimise kohta saate juhiseid oma e-posti aadressilt.", "create_account": "Loo konto", "email_address": "E-posti aadress", "email_error_msg": "Vigane meiliaadress", @@ -1013,7 +1066,8 @@ "password": "Salasõna", "password_error_msg": "Salasõnad on vähemalt 8 tähemärki", "resend_confirm_email": "Saada kinnitusmeil uuesti", - "start_trial": "Alusta proovimist" + "start_trial": "Alusta proovimist", + "title": "Loo konto" } }, "common": { @@ -1074,6 +1128,7 @@ } }, "caption": "Seadmed", + "confirm_delete": "Oled kindel, et soovid selle seadme kustutada?", "confirm_rename_entity_ids": "Kas soovid ka oma olemite ID-d ümber nimetada?", "data_table": { "area": "Ala", @@ -1083,7 +1138,9 @@ "manufacturer": "Tootja", "model": "Mudel" }, + "delete": "Kustuta", "description": "Halda ühendatud seadmeid", + "device_info": "Seadme info", "device_not_found": "Seadet ei leitud.", "entities": { "add_entities_lovelace": "Lisa Lovelace'i", @@ -1168,9 +1225,11 @@ "caption": "Sidumised", "config_entry": { "area": "alas {area}", + "delete": "Kustuta", "delete_button": "Kustuta {integration}", "delete_confirm": "Oled kindel, et soovid selle sidumise kustutada?", "device_unavailable": "seade pole saadaval", + "documentation": "Vaata dokumentatsiooni", "entity_unavailable": "olem pole saadaval", "firmware": "Püsivara: {version}", "hub": "Ühendatud", @@ -1215,6 +1274,7 @@ }, "introduction": "Siin saab seadistada oma komponente ja Home Assistant'i. Mitte kõike ei saa veel kasutajaliidese kaudu seadistada, kuid me töötame selle nimel.", "logs": { + "caption": "Logid", "clear": "Puhasta", "description": "Home Assistanti logid", "details": "Logi üksikasjad ({level})", @@ -1225,7 +1285,26 @@ "refresh": "Värskenda", "title": "Logid" }, + "lovelace": { + "dashboards": { + "detail": { + "dismiss": "Sulge", + "title": "Pealkiri" + }, + "picker": { + "open": "Ava" + } + }, + "resources": { + "detail": { + "delete": "Kustuta", + "update": "Uuenda" + }, + "refresh_header": "Kas soovite värskendada?" + } + }, "mqtt": { + "button": "Seadista", "description_listen": "Kuula teemat", "listening_to": "Kuulamas", "publish": "Avalda", @@ -1274,6 +1353,7 @@ "header": "Olemid", "without_device": "Olemid ilma seadmeta" }, + "icon": "Ikoon", "load_error_not_editable": "Ainult scenes.yaml failis asuvad stseenid on muudetavad.", "load_error_unknown": "Viga stseeni laadimisel ({err_no}).", "name": "Nimi", @@ -1302,7 +1382,12 @@ "delete_confirm": "Oled kindel, et soovid selle skripti kustutada?", "delete_script": "Kustuta skript", "header": "Skript: {name}", + "icon": "Ikoon", + "id_already_exists": "See ID on juba olemas", "load_error_not_editable": "Ainult scripts.yaml failis asuvad skriptid on muudetavad.", + "max": { + "queued": "Järjekorra pikkus" + }, "sequence": "Jada" }, "picker": { @@ -1369,7 +1454,14 @@ "id": "ID", "owner": "Omanik", "system_generated": "Süsteemi genereeritud", - "unnamed_user": "Nimetu kasutaja" + "unnamed_user": "Nimetu kasutaja", + "update_user": "Uuenda" + }, + "picker": { + "headers": { + "group": "Grupp", + "system": "Süsteem" + } } }, "zha": { @@ -1440,6 +1532,9 @@ "header": "Võrgu haldamine", "introduction": "Kogu võrku mõjutavad käsud" }, + "network": { + "caption": "Võrk" + }, "node_management": { "header": "Seadme haldus" }, @@ -1507,6 +1602,10 @@ "set_wakeup": "Määra ärkamise intervall", "true": "Tõene" }, + "node_management": { + "group": "Grupp", + "protection": "Kaitse" + }, "ozw_log": { "header": "OZW logi" }, @@ -1585,11 +1684,23 @@ }, "history": { "period": "Periood", + "ranges": { + "last_week": "Eelmine nädal", + "this_week": "See nädal", + "today": "Täna", + "yesterday": "Eile" + }, "showing_entries": "Näitan kuupäeva" }, "logbook": { "entries_not_found": "Logiraamatu kandeid ei leitud.", "period": "Periood", + "ranges": { + "last_week": "Eelmine nädal", + "this_week": "See nädal", + "today": "Täna", + "yesterday": "Eile" + }, "showing_entries": "Näitan kuupäeva" }, "lovelace": { @@ -1654,6 +1765,7 @@ "generic": { "aspect_ratio": "Proportsioonid", "camera_image": "Kaamera olem", + "camera_view": "Kaamera vaade", "entities": "Olemid", "entity": "Olem", "icon": "Ikoon", @@ -1680,6 +1792,9 @@ "horizontal-stack": { "name": "Horisontaalne pinu" }, + "humidifier": { + "name": "Niisutaja" + }, "iframe": { "name": "iFrame" }, @@ -1711,6 +1826,7 @@ "name": "Taime olek" }, "sensor": { + "graph_type": "Graafiku tüüp", "name": "Andur" }, "shopping-list": { @@ -1736,7 +1852,8 @@ "pick_card": "Vali kaart, mida soovid lisada.", "show_code_editor": "Kuva koodiredaktor", "show_visual_editor": "Kuva visuaalne redaktor", - "toggle_editor": "Lülita redaktor sisse/välja" + "toggle_editor": "Lülita redaktor sisse/välja", + "typed_header": "Kaardi seadistamine" }, "edit_lovelace": { "edit_title": "Muuda pealkirja", @@ -1752,7 +1869,8 @@ "move_left": "Liiguta vaadet vasakule", "move_right": "Liiguta vaadet paremale", "tab_badges": "Märgid", - "tab_settings": "Seaded" + "tab_settings": "Seaded", + "tab_visibility": "Nähtavus" }, "header": "Muuda kasutajaliidest", "menu": { @@ -1776,6 +1894,7 @@ }, "save_config": { "cancel": "Ära pane tähele", + "close": "Sulge", "header": "Võta Lovelace kasutajaliides oma kontrolli alla", "para": "Vaikimisi hoolitseb kasutajaliidese eest Home Assistant, värskendades seda, kui saadaval on uued olemid või Lovelace komponendid. Kui võtad kontrolli üle, ei tee me sinu jaoks enam automaatselt muudatusi.", "para_sure": "Oled kindel, et soovid kasutajaliidese oma kontrolli alla võtta?", @@ -1785,6 +1904,11 @@ "add": "Lisa Lovelace'i kasutajaliidesesse", "create_own": "Vali teine kaart", "header": "Lõime sulle ettepaneku" + }, + "view": { + "panel_mode": { + "warning_multiple_cards": "See vaade koosneb rohkem kui ühest kaardist, aga paneeli vaade saab näidata ainult ühte kaarti" + } } }, "menu": { @@ -1803,7 +1927,8 @@ "title": "Kasutamata olemid" }, "views": { - "confirm_delete": "Oled kindel, et soovid selle vaate kustutada?" + "confirm_delete": "Oled kindel, et soovid selle vaate kustutada?", + "confirm_delete_existing_cards": "Selle vaate kustutamisel eemaldatakse ka kaardid" }, "warning": { "entity_non_numeric": "Olem on mittenumbriline: {entity}", @@ -1893,6 +2018,7 @@ }, "trusted_networks": { "abort": { + "not_allowed": "Sinu arvuti ei ole lubatute nimekirjas.", "not_whitelisted": "Sinu arvuti ei ole lubatute nimekirjas." }, "step": { @@ -1905,6 +2031,7 @@ } } }, + "start_over": "Alusta uuesti", "unknown_error": "Midagi läks valesti", "working": "Palun oota" }, diff --git a/translations/frontend/nl.json b/translations/frontend/nl.json index 5cbb821fbe..65260bfdb9 100644 --- a/translations/frontend/nl.json +++ b/translations/frontend/nl.json @@ -836,7 +836,9 @@ "choose": { "add_option": "Optie toevoegen", "conditions": "Voorwaarden", + "default": "Standaardacties", "label": "Kies", + "option": "Optie {number}", "remove_option": "Verwijder optie", "sequence": "Acties" }, @@ -859,6 +861,24 @@ "label": "Gebeurtenis uitvoeren", "service_data": "Service data" }, + "repeat": { + "label": "Herhaling", + "sequence": "Acties", + "type_select": "Herhaal-type", + "type": { + "count": { + "label": "Telling" + }, + "until": { + "conditions": "Totdat voldaan is aan", + "label": "Totdat" + }, + "while": { + "conditions": "Zolang voldaan is aan voorwaarden", + "label": "Zolang" + } + } + }, "scene": { "label": "Activeer scène" }, @@ -1626,6 +1646,18 @@ "title": "MQTT", "topic": "onderwerp" }, + "ozw": { + "common": { + "node_id": "Knooppunt-ID", + "ozw_instance": "Instantie van OpenZWave", + "zwave": "Z-Wave" + }, + "device_info": { + "node_failed": "Knoop gefaald", + "stage": "Stadium", + "zwave_info": "Z-Wave informatie" + } + }, "person": { "add_person": "Persoon toevoegen", "caption": "Personen", @@ -1994,6 +2026,8 @@ "group": "Groep", "header": "Z-Wave Knooppunt-beheer", "introduction": "Voer Z-Wave commando's uit die een enkel knooppunt beïnvloeden. Kies een knooppunt om een lijst met beschikbare commando's te zien.", + "max_associations": "Maximale associaties:", + "node_group_associations": "Knooppuntgroepassociaties", "node_protection": "Node beveiliging", "node_to_control": "Node om te besturen", "nodes": "Knooppunten", @@ -2392,6 +2426,9 @@ "para_migrate": "Home Assistant kan ID's voor al je kaarten en weergaven automatisch voor je toevoegen door op de knop 'Migrate config' te klikken.", "para_no_id": "Dit element heeft geen ID. Voeg een ID toe aan dit element in 'ui-lovelace.yaml'." }, + "move_card": { + "header": "Kies een weergave om de kaart naartoe te verplaatsen" + }, "raw_editor": { "confirm_remove_config_text": "We zullen je Lovelace gebruikersinterface automatisch genereren met je gebieden en apparaten als je de huidige Lovelace gebruikersinterface verwijdert.", "confirm_remove_config_title": "Weet je zeker dat je de huidige Lovelace gebruikersinterface wilt verwijderen? We zullen automatisch een nieuwe Lovelace gebruikersinterface genereren op basis van je gebieden en apparaten.", @@ -2420,7 +2457,8 @@ "yaml_mode": "Je gebruikt de YAML-modus, wat betekent dat je jouw Lovelace-configuratie niet vanuit de gebruikersinterface kunt wijzigen. Als je Lovelace vanuit de gebruikersinterface wilt wijzigen, verwijder dan 'mode: yaml' uit de Lovelace-configuratie in 'configuration.yaml'." }, "select_view": { - "dashboard_label": "Dashboard" + "dashboard_label": "Dashboard", + "header": "Kies een weergave" }, "suggest_card": { "add": "Voeg toe aan de Lovelace gebruikersinterface", @@ -2739,7 +2777,9 @@ "header": "Verbinding automatisch verbreken" }, "themes": { + "accent_color": "Accentkleur", "dark_mode": { + "auto": "Automatisch", "dark": "Donker", "light": "Licht" }, @@ -2747,7 +2787,8 @@ "error_no_theme": "Geen thema's beschikbaar.", "header": "Thema", "link_promo": "Meer informatie over thema's", - "primary_color": "Primaire kleur" + "primary_color": "Primaire kleur", + "reset": "Herstel" }, "vibrate": { "description": "Schakel trillingen op dit apparaat in of uit wanneer u apparaten bestuurt.", diff --git a/translations/frontend/nn.json b/translations/frontend/nn.json index 69b3e297fb..75df383626 100644 --- a/translations/frontend/nn.json +++ b/translations/frontend/nn.json @@ -985,7 +985,7 @@ "no_device": "Oppføringar utan einingar", "no_devices": "Denne integrasjonen har ingen oppføringar", "options": "Val", - "rename": "Gi nytt namn", + "rename": "Endre namn", "restart_confirm": "Restart Home Assistant for å fjerne denne integrasjonen", "system_options": "Systemval", "unnamed_entry": "Oppføring utan namn" diff --git a/translations/frontend/sk.json b/translations/frontend/sk.json index d51981496a..e396769f18 100644 --- a/translations/frontend/sk.json +++ b/translations/frontend/sk.json @@ -48,6 +48,11 @@ "none": "Žiadny", "sleep": "Pohotovostný režim" } + }, + "humidifier": { + "mode": { + "auto": "Auto" + } } }, "state_badge": { @@ -206,6 +211,8 @@ "stopped": "Zastavené" }, "default": { + "off": "Vypnutý", + "on": "Zapnutý", "unavailable": "Nedostupný", "unknown": "Neznámy" }, @@ -385,6 +392,10 @@ "reverse": "Reverzný", "speed": "Rýchlosť" }, + "humidifier": { + "humidity": "Cieľová vlhkosť", + "mode": "Režim" + }, "light": { "brightness": "Jas", "color_temperature": "Teplota farby", @@ -408,6 +419,7 @@ "activate": "Aktivovať" }, "script": { + "cancel": "Zrušiť", "execute": "Vykonať" }, "service": { @@ -468,11 +480,15 @@ } }, "common": { + "and": "a", + "back": "Späť", "cancel": "Zrušiť", "close": "Zavrieť", "delete": "Odstrániť", "loading": "Načítava sa", + "next": "Ďalej", "no": "Nie", + "refresh": "Obnoviť", "save": "Uložiť", "successfully_deleted": "Úspešne odstránené", "successfully_saved": "Úspešne uložené", @@ -493,6 +509,13 @@ "clear": "Vyčistiť", "show_areas": "Zobraziť oblasti" }, + "data-table": { + "no-data": "Žiadne údaje" + }, + "date-range-picker": { + "end_date": "Dátum konca", + "start_date": "Dátum začiatku" + }, "device-picker": { "clear": "Vyčistiť", "device": "Zariadenie", @@ -609,6 +632,7 @@ }, "more_info_control": { "dismiss": "Zrušiť dialógové okno", + "edit": "Upraviť entitu", "person": { "create_zone": "Vytvoriť zónu z aktuálnej polohy" }, @@ -648,6 +672,7 @@ "deserialize": "Pokus interpretovať správy MQTT ako JSON", "entities": "Entity", "no_entities": "Žiadne entity", + "no_triggers": "Žiadne spúšťače", "recent_messages": "{n} naposledy prijaté správy", "show_as_yaml": "Zobraziť ako YAML", "title": "Informácie o ladení {device}", @@ -718,7 +743,14 @@ "triggered": "Spustené {name}" }, "panel": { + "calendar": { + "my_calendars": "Moje kalendáre", + "today": "Dnes" + }, "config": { + "advanced_mode": { + "link_profile_page": "vaša profilová stránka" + }, "areas": { "caption": "Register oblastí", "data_table": { @@ -734,6 +766,8 @@ "create": "VYTVORIŤ", "default_name": "Nová oblasť", "delete": "VYMAZAŤ", + "name": "Názov", + "name_required": "Názov je povinný", "update": "AKTUALIZOVAŤ" }, "picker": { @@ -760,6 +794,12 @@ "name": "Akcia", "type_select": "Typ akcie", "type": { + "choose": { + "add_option": "Pridať možnosť", + "conditions": "Podmienky", + "remove_option": "Odstrániť možnosť", + "sequence": "Akcie" + }, "condition": { "label": "Podmienka" }, @@ -768,6 +808,7 @@ "label": "Oneskorenie" }, "device_id": { + "action": "Akcia", "extra_fields": { "code": "Kód" }, @@ -778,6 +819,9 @@ "label": "Odpáliť udalosť", "service_data": "Dáta služby" }, + "repeat": { + "sequence": "Akcie" + }, "scene": { "label": "Aktivovať scénu" }, @@ -866,6 +910,16 @@ "introduction": "Použite automatizácie, aby váš domov ožil", "load_error_not_editable": "Len automatizácie v automations.yaml je možné upravovať.", "load_error_unknown": "Chyba pri načítaní automatizácie ({err_no}).", + "max": { + "queued": "Dĺžka fronty" + }, + "modes": { + "documentation": "dokumentácia automatizácie", + "label": "Režim", + "parallel": "Paralelne", + "queued": "Fronta", + "restart": "Reštart" + }, "save": "Uložiť", "triggers": { "add": "Pridať spúšťač", @@ -1135,7 +1189,9 @@ "edit_requires_storage": "Editor je zablokovaný, pretože konfigurácia je uložená v configuration.yaml", "elevation": "Nadmorská výška", "elevation_meters": "metrov", + "external_url": "Externá adresa URL", "imperial_example": "Fahrenheita, libry", + "internal_url": "Interná adresa URL", "latitude": "Zemepisná šírka", "location_name": "Názov vašej Home Assistant inštalácie", "longitude": "Zemepisná dĺžka", @@ -1194,12 +1250,14 @@ }, "delete": "Odstrániť", "description": "Spravovať pripojené zariadenia", + "device_info": "Informácie o zariadení", "entities": { "add_entities_lovelace": "Pridať do Lovelace", "entities": "Entity", "none": "Toto zariadenie nemá žiadne entity" }, "name": "Názov", + "no_devices": "Žiadne zariadenia", "scene": { "create": "Vytvorte scénu pomocou zariadenia", "no_scenes": "Žiadne scény", @@ -1244,6 +1302,7 @@ "introduction": "Home Assistant vedie register všetkých subjektov, ktoré kedy videl a ktoré môžu byť jednoznačne identifikované. Každá z týchto entít bude mať pridelené ID, ktoré bude vyhradené len pre tento subjekt.", "introduction2": "Použite register entít na prepísanie mena, zmenu ID entity alebo odstránenie položky z Home Assistant. Poznámka: Odstránenie položky databázy entít neodstráni entitu. Postupujte podľa nižšie uvedeného odkazu a odstráňte ho z integračnej stránky.", "remove_selected": { + "button": "Odstrániť vybraté", "confirm_partly_title": "Iba {number} vybrané entity môžu byť odstránené.", "confirm_text": "Entity je možné odstrániť, iba ak ich integrácia už neposkytuje.", "confirm_title": "Chcete odstrániť {number} entity?" @@ -1251,11 +1310,13 @@ "selected": "{number} vybrané", "status": { "ok": "Ok", - "readonly": "Len na čítanie" + "readonly": "Len na čítanie", + "unavailable": "Nedostupné" } } }, "filtering": { + "clear": "Vyčistiť", "filtering_by": "Filtrovanie podľa" }, "header": "Konfigurovať Home Assistant", @@ -1299,6 +1360,9 @@ "system_health_error": "Súčasť System Health nie je načítaná. Pridajte 'system_health:' do súboru configuration.yaml", "title": "Info" }, + "integration_panel_move": { + "link_integration_page": "stránka integrácie" + }, "integrations": { "add_integration": "Pridať integráciu", "caption": "Integrácie", @@ -1308,6 +1372,7 @@ "delete_button": "Odstrániť {integration}", "delete_confirm": "Naozaj chcete odstrániť túto integráciu?", "device_unavailable": "zariadenie nie je k dispozícii", + "documentation": "Dokumentácia", "entity_unavailable": "entita nie je k dispozícii", "firmware": "Firmvér: {version}", "hub": "Pripojené cez", @@ -1323,6 +1388,8 @@ "system_options_button": "Systémové možnosti pre {integration}" }, "config_flow": { + "aborted": "Prerušené", + "close": "Zavrieť", "created_config": "Vytvorená konfigurácia pre {name}.", "dismiss": "Zrušiť dialógové okno", "error_saving_area": "Chyba pri ukladaní oblasti: {error}", @@ -1331,7 +1398,9 @@ "open_site": "Otvoriť webovú stránku" }, "finish": "Dokončiť", - "loading_first_time": "Počkajte, kým sa nainštaluje integrácia" + "loading_first_time": "Počkajte, kým sa nainštaluje integrácia", + "not_all_required_fields": "Nie sú vyplnené všetky povinné polia.", + "submit": "Odoslať" }, "configure": "Konfigurovať", "configured": "Nakonfigurovaný", @@ -1449,6 +1518,7 @@ } }, "mqtt": { + "button": "Konfigurovať", "description_listen": "Počúvať tému", "description_publish": "Publikovať paket", "listening_to": "Počúvam", @@ -1507,6 +1577,7 @@ "introduction": "Entity, ktoré nepatria zariadeniu, môžete nastaviť tu.", "without_device": "Entity bez zariadenia" }, + "icon": "Ikona", "introduction": "Využite scény na oživenie vášho domova.", "load_error_not_editable": "Upraviť je možné iba scény zo scenes.yaml.", "load_error_unknown": "Chyba pri načítaní scény ({err_no}).", @@ -1520,6 +1591,9 @@ "delete_scene": "Odstrániť scénu", "edit_scene": "Upraviť scénu", "header": "Editor scén", + "headers": { + "name": "Názov" + }, "introduction": "Editor scén vám umožňuje vytvárať a upravovať scény. Postupujte podľa odkazu nižšie a prečítajte si pokyny, aby ste sa uistili, že ste Home Assistant nakonfigurovali správne.", "learn_more": "Získajte viac informácií o scénach", "no_scenes": "Nemohli sme nájsť žiadne editovateľné scény", @@ -1537,15 +1611,31 @@ "delete_confirm": "Naozaj chcete odstrániť tento skript?", "delete_script": "Odstrániť skript", "header": "Skript: {name}", + "icon": "Ikona", + "id": "Entity ID", + "id_already_exists": "Toto ID už existuje", "introduction": "Na vykonanie sledu akcií použite skripty.", "link_available_actions": "Získajte viac informácií o dostupných akciách.", "load_error_not_editable": "Iba skripty zo súboru scripts.yaml sú editovateľné.", + "max": { + "queued": "Dĺžka fronty" + }, + "modes": { + "documentation": "dokumentácia skriptu", + "label": "Režim", + "parallel": "Paralelne", + "queued": "Fronta", + "restart": "Reštart" + }, "sequence": "Sekvencia", "sequence_sentence": "Sled akcií tohto skriptu" }, "picker": { "add_script": "Pridať skript", "header": "Editor skriptov", + "headers": { + "name": "Názov" + }, "introduction": "Editor skriptov vám umožňuje vytvárať a upravovať skripty. Postupujte podľa odkazu nižšie a prečítajte si pokyny, aby ste sa uistili, že ste Home Assistant nakonfigurovali správne.", "learn_more": "Viac informácií o skriptoch", "no_scripts": "Nenašli sa žiadne editovateľné skripty", @@ -1605,11 +1695,20 @@ "delete_user": "Vymazať používateľa", "group": "Skupina", "id": "ID", + "name": "Názov", "owner": "Vlastník", "system_generated": "Systémom vytvorený", "system_generated_users_not_editable": "Nie je možné aktualizovať používateľov generovaných systémom.", "system_generated_users_not_removable": "Nie je možné odstrániť používateľov generovaných systémom.", - "unnamed_user": "Nepomenovaný používateľ" + "unnamed_user": "Nepomenovaný používateľ", + "update_user": "Aktualizovať" + }, + "picker": { + "headers": { + "group": "Skupina", + "name": "Názov", + "system": "Systém" + } } }, "zha": { @@ -1623,6 +1722,7 @@ "caption": "Pridať zariadenia", "description": "Pridať zariadenia do siete ZigBee" }, + "button": "Konfigurovať", "caption": "ZHA", "cluster_attributes": { "attributes_of_cluster": "Atribúty vybraného klastra", @@ -1693,6 +1793,9 @@ "header": "Správa siete", "introduction": "Príkazy, ktoré ovplyvňujú celú sieť" }, + "network": { + "caption": "Sieť" + }, "node_management": { "header": "Správa Zariadenia", "help_node_dropdown": "Vyberte zariadenie na zobrazenie možností zariadenia.", @@ -1732,6 +1835,7 @@ "no_zones_created_yet": "Zdá sa, že ste ešte nevytvorili žiadne zóny." }, "zwave": { + "button": "Konfigurovať", "caption": "Z-Wave", "common": { "index": "Index", @@ -1772,6 +1876,7 @@ "add_node_secure": "Bezpečne pridať zariadenie", "cancel_command": "Zrušiť príkaz", "heal_network": "Vyliečiť sieť", + "refresh_entity": "Obnoviť entitu", "remove_node": "Odstrániť zariadenie", "save_config": "Uložiť konfiguráciu", "soft_reset": "Softvérový reset", @@ -1843,11 +1948,23 @@ }, "history": { "period": "Obdobie", + "ranges": { + "last_week": "Minulý týždeň", + "this_week": "Tento týždeň", + "today": "Dnes", + "yesterday": "Včera" + }, "showing_entries": "Zobrazujú sa záznamy pre" }, "logbook": { "entries_not_found": "Nenašli sa žiadne záznamy v denníku.", "period": "Obdobie", + "ranges": { + "last_week": "Minulý týždeň", + "this_week": "Tento týždeň", + "today": "Dnes", + "yesterday": "Včera" + }, "showing_entries": "Zobrazujú sa záznamy za obdobie" }, "lovelace": { @@ -1883,6 +2000,10 @@ "add_item": "Pridať položku", "checked_items": "Označené položky", "clear_items": "Vymazať označené položky" + }, + "starting": { + "description": "Home Assistant sa spúšťa, čakajte prosím...", + "header": "Home Assistant sa spúšťa..." } }, "changed_toast": { @@ -1939,9 +2060,12 @@ "image": "Cesta k obrázku", "manual": "Ručne", "manual_description": "Potrebujete pridať vlastnú kartu, alebo chcete len ručne napísať yaml?", + "maximum": "Maximum", + "minimum": "Minimum", "name": "Názov", "no_theme": "Žiadna téma", "refresh_interval": "Interval obnovenia", + "search": "Hľadať", "show_icon": "Zobraziť ikonu?", "show_name": "Zobraziť názov?", "show_state": "Zobraziť stav?", @@ -1962,6 +2086,9 @@ "horizontal-stack": { "name": "Horizontálne zarovnanie" }, + "humidifier": { + "name": "Zvlhčovač" + }, "iframe": { "name": "iFrame" }, @@ -2027,7 +2154,8 @@ }, "weather-forecast": { "description": "Karta Predpoveď počasia zobrazuje počasie. Je veľmi užitočné ju zahrnúť do rozhrania, ktoré ľudia zobrazujú na stene.", - "name": "Predpoveď počasia" + "name": "Predpoveď počasia", + "show_forecast": "Zobraziť predpoveď" } }, "cardpicker": { @@ -2051,7 +2179,8 @@ "edit_lovelace": { "edit_title": "Upraviť názov", "explanation": "Tento názov sa zobrazuje nad všetkými vašimi zobrazeniami v Lovelace.", - "header": "Názov vášho Lovelace UI" + "header": "Názov vášho Lovelace UI", + "title": "Názov" }, "edit_view": { "add": "Pridať zobrazenie", @@ -2059,6 +2188,8 @@ "edit": "Upraviť zobrazenie", "header": "Konfigurácia zobrazenia", "header_name": "{name} Zobraziť konfiguráciu", + "move_left": "Presunúť zobrazenie doľava", + "move_right": "Presunúť zobrazenie doprava", "tab_badges": "Odznaky", "tab_settings": "Nastavenia", "tab_visibility": "Viditeľnosť", @@ -2077,6 +2208,9 @@ "para_migrate": "Home Assistant môže automaticky pridať identifikátory pre všetky vaše karty a zobrazenia, keď kliknete na tlačidlo 'Migrovať konfiguráciu'.", "para_no_id": "Tento prvok nemá žiadne ID. Doplňte, prosím, ID pre tento prvok v súbore 'ui-lovelace.yaml'." }, + "move_card": { + "header": "Vyberte zobrazenie, do ktorého chcete kartu presunúť" + }, "raw_editor": { "confirm_remove_config_text": "Ak odstránite svoju konfiguráciu používateľského rozhrania Lovelace, automaticky vygenerujeme vaše zobrazenia používateľského rozhrania Lovelace s vašimi oblasťami a zariadeniami.", "confirm_remove_config_title": "Naozaj chcete odstrániť konfiguráciu používateľského rozhrania Lovelace? Vaše zobrazenia používateľské rozhranie Lovelace automaticky vygenerujeme s vašimi oblasťami a zariadeniami.", @@ -2102,6 +2236,10 @@ "yaml_control": "Ak chcete prevziať kontrolu v režime YAML, vytvorte súbor YAML s názvom, ktorý ste uviedli vo svojej konfigurácii pre tento dashboard alebo predvolený súbor 'ui-lovelace.yaml'.", "yaml_mode": "Používate režim YAML, čo znamená, že nemôžete zmeniť konfiguráciu Lovelace z používateľského rozhrania. Ak chcete zmeniť Lovelace z UI, odstráňte 'mode: yaml' z vašej konfigurácie Lovelace v 'configuration.yaml.'" }, + "select_view": { + "dashboard_label": "Dashboard", + "header": "Vyberte zobrazenie" + }, "suggest_card": { "add": "Pridať do používateľského rozhrania Lovelace", "create_own": "Vyberte inú kartu", @@ -2116,6 +2254,7 @@ } }, "menu": { + "close": "Zavrieť", "configure_ui": "Konfigurovať používateľské rozhranie", "exit_edit_mode": "Skončiť režim úprav používateľského rozhrania", "help": "Pomoc", @@ -2146,7 +2285,8 @@ "attribute_not_found": "Atribút {attribute} nie je k dispozícii v: {entity}", "entity_non_numeric": "Entita je nečíselná: {entity}", "entity_not_found": "Entita nie je k dispozícií {entity}", - "entity_unavailable": "Entita momentálne nie je k dispozícií {entity}" + "entity_unavailable": "Entita momentálne nie je k dispozícií {entity}", + "starting": "Home Assistant sa spúšťa, zatiaľ nemusí byť všetko k dispozícii" } }, "mailbox": { @@ -2159,6 +2299,7 @@ "abort_intro": "Prihlásenie bolo zrušené", "authorizing_client": "Chystáte sa poskytnúť {clientId} prístup k vašej inštancii Home Assistantu.", "form": { + "next": "Ďalej", "providers": { "command_line": { "abort": { @@ -2341,6 +2482,11 @@ "submit": "Odoslať" }, "current_user": "Momentálne ste prihlásení ako {fullName}.", + "dashboard": { + "description": "Vyberte predvolený dashboard pre toto zariadenie.", + "dropdown_label": "Dashboard", + "header": "Dashboard" + }, "force_narrow": { "description": "Predvolene sa skryje bočný panel, podobne ako v prípade mobilných zariadení.", "header": "Vždy skryť bočný panel" @@ -2402,10 +2548,18 @@ "token_title": "Obnovovací token pre {clientId}" }, "themes": { + "accent_color": "Farba zvýraznenia", + "dark_mode": { + "auto": "Automaticky", + "dark": "Tmavá", + "light": "Svetlá" + }, "dropdown_label": "Téma", "error_no_theme": "Nie sú k dispozícii žiadne témy.", "header": "Téma", - "link_promo": "Získajte viac informácií o témach" + "link_promo": "Získajte viac informácií o témach", + "primary_color": "Primárna farba", + "reset": "Reset" }, "vibrate": { "description": "Pri ovládaní zariadení povoľte alebo zakážte vibrácie tohto zariadenia.", diff --git a/translations/frontend/zh-Hans.json b/translations/frontend/zh-Hans.json index 6101afd109..d7ccb3da20 100644 --- a/translations/frontend/zh-Hans.json +++ b/translations/frontend/zh-Hans.json @@ -2475,7 +2475,7 @@ }, "menu": { "close": "关闭", - "configure_ui": "配置 UI", + "configure_ui": "编辑仪表盘", "exit_edit_mode": "退出 UI 编辑模式", "help": "帮助", "refresh": "刷新", From 4163b35b32b977762d9fd38d3b2f9a8bc53e5c10 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Sat, 15 Aug 2020 00:32:27 +0000 Subject: [PATCH 021/300] [ci skip] Translation update --- translations/frontend/de.json | 10 ++++-- translations/frontend/he.json | 58 +++++++++++++++++++++++++++++++++-- translations/frontend/sk.json | 26 +++++++++------- 3 files changed, 79 insertions(+), 15 deletions(-) diff --git a/translations/frontend/de.json b/translations/frontend/de.json index ae49612394..130ade04c7 100644 --- a/translations/frontend/de.json +++ b/translations/frontend/de.json @@ -1621,7 +1621,7 @@ }, "ozw": { "device_info": { - "zwave_info": "Z-wave Infos" + "zwave_info": "Z-Wave Infos" } }, "person": { @@ -2736,10 +2736,16 @@ "header": "Verbindung automatisch schließen" }, "themes": { + "accent_color": "Akzentfarbe", + "dark_mode": { + "dark": "Dunkel", + "light": "Hell" + }, "dropdown_label": "Thema", "error_no_theme": "Keine Themen verfügbar.", "header": "Thema", - "link_promo": "Erfahre mehr über Themen" + "link_promo": "Erfahre mehr über Themen", + "primary_color": "Primärfarbe" }, "vibrate": { "description": "Aktiviere oder deaktiviere die Vibration an diesem Gerät, wenn du Geräte steuerst.", diff --git a/translations/frontend/he.json b/translations/frontend/he.json index b004705a41..e6ae133790 100644 --- a/translations/frontend/he.json +++ b/translations/frontend/he.json @@ -359,7 +359,7 @@ }, "automation": { "last_triggered": "הפעלה אחרונה", - "trigger": "מפעיל" + "trigger": "הרץ" }, "camera": { "not_available": "התמונה אינה זמינה" @@ -833,6 +833,15 @@ "name": "פעולה", "type_select": "סוג פעולה", "type": { + "choose": { + "add_option": "הוסף אפשרות", + "conditions": "תנאים", + "default": "פעולות ברירת מחדל", + "label": "בחר", + "option": "אפשרות {number}", + "remove_option": "הסר אפשרות", + "sequence": "פעולות" + }, "condition": { "label": "תנאי" }, @@ -852,6 +861,24 @@ "label": "ירה אירוע", "service_data": "נתוני שירות" }, + "repeat": { + "label": "חזור", + "sequence": "פעולות", + "type_select": "סוג חזרה", + "type": { + "count": { + "label": "ספירה" + }, + "until": { + "conditions": ")תנאי עד ש (Until", + "label": "עד ש" + }, + "while": { + "conditions": ")תנאי כל עוד (While", + "label": "כל עוד" + } + } + }, "scene": { "label": "הפעל סצנה" }, @@ -1619,6 +1646,18 @@ "title": "MQTT", "topic": "נושא" }, + "ozw": { + "common": { + "node_id": "מזהה רכיב", + "ozw_instance": "מופע OpenZWave", + "zwave": "Z-Wave" + }, + "device_info": { + "node_failed": "הרכיב נכשל", + "stage": "שלב", + "zwave_info": "מידע Z-Wave" + } + }, "person": { "add_person": "הוסף אדם", "caption": "אנשים", @@ -2387,6 +2426,9 @@ "para_migrate": "Home Assistant יכול להוסיף מזהה יחודי לכל הכרטיסיות והתצוגות שלך בצורה אוטומטית בכך שתלחץ על לחצן ״הגר הגדרה״.", "para_no_id": "האלמנט הנוכחי לא מכיל מזהה יחודיי. בבקשה הוסף מזהה יחודי לאלמט זה בקובץ 'ui-lovelace.yaml'." }, + "move_card": { + "header": "בחר תצוגה שאליה להעביר את הכרטיס" + }, "raw_editor": { "confirm_remove_config_text": "אנו ניצור אוטומטית את תצוגות ממשק המשתמש של Lovelace עם האזורים והמכשירים שלך אם תסיר את קונפיגורציית ממשק המשתמש שלך ב- Lovelace.", "confirm_remove_config_title": "האם אתה בטוח שברצונך להסיר את תצורת ממשק המשתמש של Lovelace? אנו נייצר אוטומטית את תצוגות ממשק המשתמש שלך ב- Lovelace עם האזורים והמכשירים שלך.", @@ -2414,6 +2456,10 @@ "yaml_control": "כדי לקבל שליטה במצב YAML, צור קובץ YAML עם השם שציינת ב-config עבור לוח מחוונים זה, או ברירת המחדל 'ui-lovelace.yaml'.", "yaml_mode": "אתה משתמש במצב YAML עבור לוח מחוונים זה ולכן אין באפשרותך לשנות את קונפיגורצית Lovelace מממשק המשתמש. אם ברצונך לנהל לוח מחוונים זה מממשק המשתמש, הסר 'mode: yaml' מתצורת Loverlace ב 'configuration.yaml.'." }, + "select_view": { + "dashboard_label": "לוח בקרה", + "header": "בחר תצוגה" + }, "suggest_card": { "add": "הוסף לממשק המשתמש של Lovelace", "create_own": "בחר כרטיס אחר", @@ -2731,10 +2777,18 @@ "header": "סגור חיבור באופן אוטומטי" }, "themes": { + "accent_color": "צבע הדגשה", + "dark_mode": { + "auto": "אוטומטי", + "dark": "כהה", + "light": "בהיר" + }, "dropdown_label": "ערכת נושא", "error_no_theme": "אין ערכות נושא זמינות.", "header": "ערכת נושא", - "link_promo": "למד אודות ערכות נושא" + "link_promo": "למד אודות ערכות נושא", + "primary_color": "בצע ראשי", + "reset": "איפוס" }, "vibrate": { "description": "הפעל או בטל את הרטט במכשיר זה בעת שליטה בהתקנים.", diff --git a/translations/frontend/sk.json b/translations/frontend/sk.json index e396769f18..6e865645c7 100644 --- a/translations/frontend/sk.json +++ b/translations/frontend/sk.json @@ -278,7 +278,7 @@ }, "sensor": { "off": "Neaktívny", - "on": "Aktívny" + "on": "Zapnutý" }, "sun": { "above_horizon": "Nad horizontom", @@ -628,7 +628,9 @@ "pattern": "Vzor regexu na overenie na strane klienta", "text": "Text" }, - "required_error_msg": "Toto pole je povinné" + "platform_not_loaded": "Integrácia {platform} sa nenačítala. Pridajte ju do svojej konfigurácie buď pridaním 'default_config:' alebo ''{platform}:''.", + "required_error_msg": "Toto pole je povinné", + "yaml_not_editable": "Nastavenia tejto entity nie je možné upravovať z UI. Iba entity nastavené z UI sú konfigurovateľné z UI." }, "more_info_control": { "dismiss": "Zrušiť dialógové okno", @@ -714,7 +716,7 @@ "unknown": "Neznámy", "zha_device_card": { "area_picker_label": "Oblasť", - "device_name_placeholder": "Používateľom zadaný názov", + "device_name_placeholder": "Zmeniť názov zariadenia", "update_name_button": "Aktualizovať názov" } } @@ -761,7 +763,7 @@ "confirmation_text": "Všetky zariadenia v tejto oblasti ostanú nepriradené.", "confirmation_title": "Naozaj chcete odstrániť túto oblasť?" }, - "description": "Prehľad všetkých oblastí vo vašej domácnosti.", + "description": "Spravujte všetky oblasti vo vašej domácnosti.", "editor": { "create": "VYTVORIŤ", "default_name": "Nová oblasť", @@ -1274,7 +1276,7 @@ }, "entities": { "caption": "Register entít", - "description": "Prehľad všetkých známych entít.", + "description": "Spravujte všetky známe entity.", "picker": { "disable_selected": { "button": "Zrušiť vybraté", @@ -1348,6 +1350,7 @@ "info": { "built_using": "Postavené pomocou", "custom_uis": "Vlastné používateľské rozhrania:", + "description": "Zobraziť informácie o inštalácii Home Assistant", "developed_by": "Vyvinuté partiou úžasných ľudí.", "frontend": "frontend-ui", "frontend_version": "Verzia frontendu: {version} - {type}", @@ -1482,7 +1485,7 @@ "open": "Otvoriť" } }, - "description": "Nakonfigurujte si svoje Lovelace dashboardy", + "description": "Spravujte svoje Lovelace Dashboardy", "resources": { "cant_edit_yaml": "Používate Lovelace v režime YAML, preto nemôžete spravovať svoje prostriedky cez používateľské rozhranie. Spravujte ich v configuration.yaml.", "caption": "Prostriedky", @@ -1560,7 +1563,7 @@ "scene": { "activated": "Aktivovaná scéna {name}.", "caption": "Scény", - "description": "Vytvárajte a upravujte scény", + "description": "Správa scén", "editor": { "default_name": "Nová scéna", "devices": { @@ -1666,7 +1669,7 @@ "stop": "Zastaviť" }, "validation": { - "check_config": "Skontrolujte konfiguráciu", + "check_config": "Skontrolovať konfiguráciu", "heading": "Kontrola konfigurácie", "introduction": "Overte svoju konfiguráciu, ak ste nedávno vykonali nejaké zmeny v konfigurácii a chcete sa uistiť, že je to všetko v poriadku", "invalid": "Konfigurácia je neplatná", @@ -1715,6 +1718,7 @@ "add_device_page": { "discovery_text": "Tu sa zobrazia objavené zariadenia. Postupujte podľa pokynov pre zariadenie (zariadenia) a umiestnite zariadenie (zariadenia) do režimu párovania.", "header": "Zigbee Home Automation - Pridať zariadenia", + "no_devices_found": "Neboli nájdené žiadne zariadenia, uistite sa, že sú v režime párovania a udržujte ich pri prebudené počas zisťovania.", "search_again": "Hľadať znova", "spinner": "Vyhľadávanie ZHA Zigbee zariadení ..." }, @@ -1769,7 +1773,7 @@ "create_group": "Zigbee Home Automation - Vytvoriť skupinu", "create_group_details": "Zadajte požadované údaje na vytvorenie novej skupiny ZigBee", "creating_group": "Vytvorenie skupiny", - "description": "Vytvorenie a úprava skupín ZigBee", + "description": "Správa skupín Zigbee", "group_details": "Tu sú všetky podrobnosti o vybranej skupine Zigbee.", "group_id": "ID skupiny", "group_info": "Informácie o skupine", @@ -2234,7 +2238,7 @@ "save": "Prevziať kontrolu", "yaml_config": "Na začiatok vám pomôžeme so súčasnou konfiguráciou tohto dashboardu:", "yaml_control": "Ak chcete prevziať kontrolu v režime YAML, vytvorte súbor YAML s názvom, ktorý ste uviedli vo svojej konfigurácii pre tento dashboard alebo predvolený súbor 'ui-lovelace.yaml'.", - "yaml_mode": "Používate režim YAML, čo znamená, že nemôžete zmeniť konfiguráciu Lovelace z používateľského rozhrania. Ak chcete zmeniť Lovelace z UI, odstráňte 'mode: yaml' z vašej konfigurácie Lovelace v 'configuration.yaml.'" + "yaml_mode": "Používate režim YAML, čo znamená, že nemôžete zmeniť konfiguráciu Lovelace z UI. Ak chcete zmeniť Lovelace z UI, odstráňte 'mode: yaml' z vašej konfigurácie Lovelace v 'configuration.yaml.'" }, "select_view": { "dashboard_label": "Dashboard", @@ -2255,7 +2259,7 @@ }, "menu": { "close": "Zavrieť", - "configure_ui": "Konfigurovať používateľské rozhranie", + "configure_ui": "Upraviť Dashboard", "exit_edit_mode": "Skončiť režim úprav používateľského rozhrania", "help": "Pomoc", "refresh": "Obnoviť", From 2a58726caf026571e969c2410c39291904028ff3 Mon Sep 17 00:00:00 2001 From: gibwar Date: Sun, 16 Aug 2020 16:51:50 -0600 Subject: [PATCH 022/300] Fix exceptional weither icon size (#6425) (#6634) The weather icon for the `exceptional` state uses a different DOM layout than the other icons, using a `.weather-icon` class that sets the size to 64px (52px on narrow). This updates the `forecast-icon > *` class to set the correct variable to match the expected `40px` and works on all sizes from `veryverynarrow` to normal. --- src/panels/lovelace/cards/hui-weather-forecast-card.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/panels/lovelace/cards/hui-weather-forecast-card.ts b/src/panels/lovelace/cards/hui-weather-forecast-card.ts index 0af5d4b979..234549a4fd 100644 --- a/src/panels/lovelace/cards/hui-weather-forecast-card.ts +++ b/src/panels/lovelace/cards/hui-weather-forecast-card.ts @@ -436,6 +436,7 @@ class HuiWeatherForecastCard extends LitElement implements LovelaceCard { .forecast-image-icon > * { width: 40px; height: 40px; + --mdc-icon-size: 40px; } .forecast-icon { @@ -469,7 +470,7 @@ class HuiWeatherForecastCard extends LitElement implements LovelaceCard { width: 52px; } - :host([narrow]) .weather-icon { + :host([narrow]) .icon-image .weather-icon { --mdc-icon-size: 52px; } From aab86e00ec77ec4b9a300107a0b6dd490297d251 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Mon, 17 Aug 2020 00:32:14 +0000 Subject: [PATCH 023/300] [ci skip] Translation update --- translations/frontend/ar.json | 5 +++ translations/frontend/nn.json | 75 ++++++++++++++++++++++++++++++++--- 2 files changed, 75 insertions(+), 5 deletions(-) diff --git a/translations/frontend/ar.json b/translations/frontend/ar.json index 5063aae8c7..3504230a0d 100644 --- a/translations/frontend/ar.json +++ b/translations/frontend/ar.json @@ -465,6 +465,7 @@ }, "relative_time": { "duration": { + "hour": "{count} {count, plural,\none {ساعة}\nother {ساعات}\n}", "minute": "{count} {count, plural,\n one {دقيقة}\n other {دقائق}\n}" }, "future": "قبل {time}", @@ -546,6 +547,7 @@ "zha_device_info": { "buttons": { "add": "أضف أجهزة عبر هذا الجهاز", + "clusters": "إدارة العناقيد", "zigbee_information": "معلومات Zigbee" }, "device_signature": "توقيع جهاز Zigbee", @@ -1153,6 +1155,9 @@ "discovered_text": "ستظهر الأجهزة هنا عند إكتشافها." }, "button": "كوِن", + "clusters": { + "header": "عناقيد" + }, "groups": { "zha_zigbee_groups": "مجموعات ZHA Zigbee" }, diff --git a/translations/frontend/nn.json b/translations/frontend/nn.json index 75df383626..c865e0c752 100644 --- a/translations/frontend/nn.json +++ b/translations/frontend/nn.json @@ -397,6 +397,8 @@ "activate": "Aktiver" }, "script": { + "cancel": "Avbryt", + "cancel_multiple": "Avbryt {number}", "execute": "Utfør" }, "service": { @@ -463,7 +465,9 @@ "back": "Tilbake", "cancel": "Avbryt", "delete": "Slett", + "error_required": "Påkrevd", "loading": "Lastar", + "menu": "Meny", "next": "Neste", "previous": "Førre", "refresh": "Oppdater ", @@ -485,6 +489,9 @@ "clear": "Klar ", "show_areas": "Vis områda" }, + "data-table": { + "no-data": "Ingen data" + }, "device-picker": { "device": "Enhet", "no_area": "Inga område", @@ -600,11 +607,12 @@ "services": { "reconfigure": "Konfigurer ZHA-eininga (heal device) på nytt. Bruk dette om du har problem med eininga. Dersom eininga går på batteri, ver sikker på at den er vaken og tek i mot kommandar når du brukar denne tenesta.", "remove": "Fjern eining frå Zigbee-nettverket", - "updateDeviceName": "Gje oppføringa eit eige namn i oppføringsregisteret. " + "updateDeviceName": "Gje eininga eit tilpassa namn i einingsregisteret. " }, + "unknown": "Ukjent", "zha_device_card": { "area_picker_label": "Område", - "device_name_placeholder": "Gitt brukarnamn", + "device_name_placeholder": "Endre navn på eining", "update_name_button": "Oppdater namn" } } @@ -692,6 +700,9 @@ "label": "Køyr hending", "service_data": "Tenestedata" }, + "repeat": { + "label": "Gjenta" + }, "service": { "label": "Hent teneste", "service_data": "Tenestedata" @@ -718,6 +729,10 @@ "type": { "device": { "condition": "Føresetnad ", + "extra_fields": { + "above": "Over", + "below": "Under" + }, "label": "Eining" }, "not": { @@ -764,6 +779,11 @@ "introduction": "Bruk automasjonar til å gi liv til heimen din", "load_error_not_editable": "Berre automasjonar i automations.yaml kan redigerast.", "load_error_unknown": "Feil ved lasting av automasjon ({err_no}).", + "modes": { + "restart": "Omstart" + }, + "move_down": "Flytt ned", + "move_up": "Flytt opp", "save": "Lagre", "triggers": { "add": "Legg til utløysar", @@ -777,6 +797,10 @@ "type_select": "Utløysartype", "type": { "device": { + "extra_fields": { + "above": "Over", + "below": "Under" + }, "label": "Oppføring", "trigger": "Utløysar " }, @@ -873,7 +897,19 @@ "caption": "Home Assistant Cloud", "description_features": "Kontroller når du ikkje er heime og integrer med Alexa og Google Assistant", "description_login": "Logga inn som {email}", - "description_not_login": "Ikkje logga inn" + "description_not_login": "Ikkje logga inn", + "forgot_password": { + "email": "E-post", + "subtitle": "Gløymt passordet ditt", + "title": "Gløymt passord" + }, + "login": { + "email": "E-post", + "forgot_password": "gløymt passordet?", + "password": "Passord", + "password_error_msg": "Passord er minst 8 teikn", + "sign_in": "Logg inn" + } }, "core": { "caption": "Generelt", @@ -963,6 +999,7 @@ }, "header": "Konfigurer Home Assistant", "info": { + "caption": "Info", "documentation": "Dokumentasjon ", "integrations": "Integrasjonar", "issues": "Problem ", @@ -1015,6 +1052,7 @@ }, "introduction": "Her er det mogleg å konfigurere dine komponenter og Home Assistant. Ikkje alt er mogleg å konfigurere frå brukarsnittet endå, men vi jobbar med saka.", "logs": { + "caption": "Loggar", "title": "Loggar" }, "mqtt": { @@ -1031,6 +1069,9 @@ } }, "scene": { + "editor": { + "icon": "Ikon" + }, "picker": { "headers": { "name": "Namn" @@ -1040,6 +1081,14 @@ "script": { "caption": "Skript", "description": "Lag og rediger skript", + "editor": { + "icon": "Ikon", + "id_already_exists": "Denne ID-en finnast allereie", + "modes": { + "label": "Modus", + "restart": "Omstart" + } + }, "picker": { "headers": { "name": "Namn" @@ -1307,6 +1356,10 @@ "state_equal": "Tilstanden er lik", "state_not_equal": "Tilstanden er ikkje lik" }, + "config": { + "optional": "Valfri", + "required": "Påkrevd" + }, "entities": { "description": "Oppføringskortet er den vanlegaste korttypen. Den kan gruppere ting inn i lister." }, @@ -1317,13 +1370,20 @@ "name": "Oppføring " }, "gauge": { - "description": "Målarkortet er eit enkelt kort som let deg visuelt sjå sensordata." + "description": "Målarkortet er eit enkelt kort som let deg visuelt sjå sensordata.", + "severity": { + "green": "Grøn", + "red": "Rød" + } }, "generic": { "attribute": "Attributt", "double_tap_action": "Dobbeltrykk-handling", + "icon": "Ikon", "manual": "Manuelt", "manual_description": "Vil du legge til eit tilpassa kort eller vil du berre skrive yaml manuelt?", + "maximum": "Maksimum", + "minimum": "Minimum", "name": "Namn", "secondary_info_attribute": "Sekundærinfo-attributt", "state": "Tilstand" @@ -1361,12 +1421,14 @@ }, "edit_card": { "add": "Legg til kort", + "confirm_cancel": "Er du sikker på at du vil avbryte?", "delete": "Slett", "edit": "Redigere", "header": "Kortkonfigurasjon", "move": "Rørsle", "pick_card": "Vel kortet du vil legge til.", - "toggle_editor": "Bytt redigeringsverktøy" + "toggle_editor": "Bytt redigeringsverktøy", + "unsaved_changes": "Du har endringar som ikkje er lagra" }, "edit_lovelace": { "explanation": "Denne tittelen vert vist over alle visningane dine i Lovelace", @@ -1687,6 +1749,9 @@ "error_no_theme": "Ingen tema tilgjengeleg", "header": "Tema", "link_promo": "Lær om temaer" + }, + "vibrate": { + "header": "Vibrer" } }, "shopping-list": { From bce85395722037828ba5df6b8c7b4063b9868b38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Mon, 17 Aug 2020 12:00:06 +0200 Subject: [PATCH 024/300] Add style to combobox (#6630) --- src/resources/styles.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/resources/styles.ts b/src/resources/styles.ts index c270d0a2f3..316ccf77e1 100644 --- a/src/resources/styles.ts +++ b/src/resources/styles.ts @@ -60,6 +60,7 @@ export const derivedStyles = { "material-body-text-color": "var(--primary-text-color)", "material-background-color": "var(--card-background-color)", "material-secondary-background-color": "var(--secondary-background-color)", + "material-secondary-text-color": "var(--secondary-text-color)", "mdc-checkbox-unchecked-color": "rgba(var(--rgb-primary-text-color), 0.54)", "mdc-checkbox-disabled-color": "var(--disabled-text-color)", "mdc-radio-unchecked-color": "rgba(var(--rgb-primary-text-color), 0.54)", From 6c918e346b044f1911b5cfe43698466c02b7a4ae Mon Sep 17 00:00:00 2001 From: "David F. Mulcahey" Date: Mon, 17 Aug 2020 08:17:18 -0400 Subject: [PATCH 025/300] Fix navigation after ZHA device removal (#6638) --- .../integration-elements/zha/ha-device-actions-zha.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/panels/config/devices/device-detail/integration-elements/zha/ha-device-actions-zha.ts b/src/panels/config/devices/device-detail/integration-elements/zha/ha-device-actions-zha.ts index d5d98dc68d..d6629b58c5 100644 --- a/src/panels/config/devices/device-detail/integration-elements/zha/ha-device-actions-zha.ts +++ b/src/panels/config/devices/device-detail/integration-elements/zha/ha-device-actions-zha.ts @@ -119,9 +119,11 @@ export class HaDeviceActionsZha extends LitElement { return; } - this.hass.callService("zha", "remove", { + await this.hass.callService("zha", "remove", { ieee_address: this._zhaDevice!.ieee, }); + + history.back(); } static get styles(): CSSResult[] { From 613470b44d1cc6d0e6997eb4f6a22902370c7f00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Mon, 17 Aug 2020 15:16:28 +0200 Subject: [PATCH 026/300] Set SameSite=Strict attribute for ingress_session (#6556) --- src/data/hassio/supervisor.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/hassio/supervisor.ts b/src/data/hassio/supervisor.ts index 51454ad610..f6a7d2811c 100644 --- a/src/data/hassio/supervisor.ts +++ b/src/data/hassio/supervisor.ts @@ -71,7 +71,7 @@ export const createHassioSession = async (hass: HomeAssistant) => { "POST", "hassio/ingress/session" ); - document.cookie = `ingress_session=${response.data.session};path=/api/hassio_ingress/`; + document.cookie = `ingress_session=${response.data.session};path=/api/hassio_ingress/;SameSite=Strict`; }; export const setSupervisorOption = async ( From 21644ec8899c82add87d6d6fac981f7f720d6a80 Mon Sep 17 00:00:00 2001 From: Zack Arnett Date: Mon, 17 Aug 2020 09:07:29 -0500 Subject: [PATCH 027/300] Light More Info: Convert to Lit Element (#6592) * Update more info * Remove is unavailable * Remove divs * updates * Update src/dialogs/more-info/controls/more-info-light.ts * Update src/dialogs/more-info/controls/more-info-light.ts Co-authored-by: Bram Kragten Co-authored-by: Bram Kragten --- .../more-info/controls/more-info-light.js | 361 ------------------ .../more-info/controls/more-info-light.ts | 307 +++++++++++++++ src/types.ts | 4 + 3 files changed, 311 insertions(+), 361 deletions(-) delete mode 100644 src/dialogs/more-info/controls/more-info-light.js create mode 100644 src/dialogs/more-info/controls/more-info-light.ts diff --git a/src/dialogs/more-info/controls/more-info-light.js b/src/dialogs/more-info/controls/more-info-light.js deleted file mode 100644 index 0362e44822..0000000000 --- a/src/dialogs/more-info/controls/more-info-light.js +++ /dev/null @@ -1,361 +0,0 @@ -import "@polymer/iron-flex-layout/iron-flex-layout-classes"; -import "@polymer/paper-item/paper-item"; -import "@polymer/paper-listbox/paper-listbox"; -import { html } from "@polymer/polymer/lib/utils/html-tag"; -/* eslint-plugin-disable lit */ -import { PolymerElement } from "@polymer/polymer/polymer-element"; -import { featureClassNames } from "../../../common/entity/feature_class_names"; -import "../../../components/ha-attributes"; -import "../../../components/ha-color-picker"; -import "../../../components/ha-labeled-slider"; -import "../../../components/ha-paper-dropdown-menu"; -import { EventsMixin } from "../../../mixins/events-mixin"; -import LocalizeMixin from "../../../mixins/localize-mixin"; -import "../../../components/ha-icon-button"; - -const FEATURE_CLASS_NAMES = { - 1: "has-brightness", - 2: "has-color_temp", - 4: "has-effect_list", - 16: "has-color", - 128: "has-white_value", -}; -/* - * @appliesMixin EventsMixin - */ -class MoreInfoLight extends LocalizeMixin(EventsMixin(PolymerElement)) { - static get template() { - return html` - - - -
-
- -
- -
- -
- -
- -
-
- - - -
- -
- - - - - -
- - -
- `; - } - - static get properties() { - return { - hass: { - type: Object, - }, - - stateObj: { - type: Object, - observer: "stateObjChanged", - }, - - brightnessSliderValue: { - type: Number, - value: 0, - }, - - ctSliderValue: { - type: Number, - value: 0, - }, - - wvSliderValue: { - type: Number, - value: 0, - }, - - hueSegments: { - type: Number, - value: 24, - }, - - saturationSegments: { - type: Number, - value: 8, - }, - - colorPickerColor: { - type: Object, - }, - }; - } - - stateObjChanged(newVal, oldVal) { - const props = { - brightnessSliderValue: 0, - }; - - if (newVal && newVal.state === "on") { - props.brightnessSliderValue = newVal.attributes.brightness; - props.ctSliderValue = newVal.attributes.color_temp; - props.wvSliderValue = newVal.attributes.white_value; - if (newVal.attributes.hs_color) { - props.colorPickerColor = { - h: newVal.attributes.hs_color[0], - s: newVal.attributes.hs_color[1] / 100, - }; - } - } - - this.setProperties(props); - - if (oldVal) { - setTimeout(() => { - this.fire("iron-resize"); - }, 500); - } - } - - computeClassNames(stateObj) { - const classes = [ - "content", - featureClassNames(stateObj, FEATURE_CLASS_NAMES), - ]; - if (stateObj && stateObj.state === "on") { - classes.push("is-on"); - } - if (stateObj && stateObj.state === "unavailable") { - classes.push("is-unavailable"); - } - return classes.join(" "); - } - - effectChanged(ev) { - const oldVal = this.stateObj.attributes.effect; - const newVal = ev.detail.value; - - if (!newVal || oldVal === newVal) return; - - this.hass.callService("light", "turn_on", { - entity_id: this.stateObj.entity_id, - effect: newVal, - }); - } - - brightnessSliderChanged(ev) { - const bri = parseInt(ev.target.value, 10); - - if (isNaN(bri)) return; - - this.hass.callService("light", "turn_on", { - entity_id: this.stateObj.entity_id, - brightness: bri, - }); - } - - ctSliderChanged(ev) { - const ct = parseInt(ev.target.value, 10); - - if (isNaN(ct)) return; - - this.hass.callService("light", "turn_on", { - entity_id: this.stateObj.entity_id, - color_temp: ct, - }); - } - - wvSliderChanged(ev) { - const wv = parseInt(ev.target.value, 10); - - if (isNaN(wv)) return; - - this.hass.callService("light", "turn_on", { - entity_id: this.stateObj.entity_id, - white_value: wv, - }); - } - - segmentClick() { - if (this.hueSegments === 24 && this.saturationSegments === 8) { - this.setProperties({ hueSegments: 0, saturationSegments: 0 }); - } else { - this.setProperties({ hueSegments: 24, saturationSegments: 8 }); - } - } - - serviceChangeColor(hass, entityId, color) { - hass.callService("light", "turn_on", { - entity_id: entityId, - hs_color: [color.h, color.s * 100], - }); - } - - /** - * Called when a new color has been picked. - * should be throttled with the 'throttle=' attribute of the color picker - */ - colorPicked(ev) { - this.serviceChangeColor(this.hass, this.stateObj.entity_id, ev.detail.hs); - } -} - -customElements.define("more-info-light", MoreInfoLight); diff --git a/src/dialogs/more-info/controls/more-info-light.ts b/src/dialogs/more-info/controls/more-info-light.ts new file mode 100644 index 0000000000..3abab21a99 --- /dev/null +++ b/src/dialogs/more-info/controls/more-info-light.ts @@ -0,0 +1,307 @@ +import "@polymer/paper-item/paper-item"; +import "@polymer/paper-listbox/paper-listbox"; +import { + css, + CSSResult, + customElement, + html, + LitElement, + property, + TemplateResult, + internalProperty, + PropertyValues, +} from "lit-element"; +import { classMap } from "lit-html/directives/class-map"; + +import { + SUPPORT_BRIGHTNESS, + SUPPORT_COLOR_TEMP, + SUPPORT_WHITE_VALUE, + SUPPORT_COLOR, + SUPPORT_EFFECT, +} from "../../../data/light"; +import { supportsFeature } from "../../../common/entity/supports-feature"; +import type { HomeAssistant, LightEntity } from "../../../types"; + +import "../../../components/ha-attributes"; +import "../../../components/ha-color-picker"; +import "../../../components/ha-labeled-slider"; +import "../../../components/ha-icon-button"; +import "../../../components/ha-paper-dropdown-menu"; + +interface HueSatColor { + h: number; + s: number; +} + +@customElement("more-info-light") +class MoreInfoLight extends LitElement { + @property({ attribute: false }) public hass!: HomeAssistant; + + @property({ attribute: false }) public stateObj?: LightEntity; + + @internalProperty() private _brightnessSliderValue = 0; + + @internalProperty() private _ctSliderValue = 0; + + @internalProperty() private _wvSliderValue = 0; + + @internalProperty() private _hueSegments = 24; + + @internalProperty() private _saturationSegments = 8; + + @internalProperty() private _colorPickerColor?: HueSatColor; + + protected render(): TemplateResult { + if (!this.hass || !this.stateObj) { + return html``; + } + + return html` +
+ ${this.stateObj.state === "on" + ? html` + ${supportsFeature(this.stateObj!, SUPPORT_BRIGHTNESS) + ? html` + + ` + : ""} + ${supportsFeature(this.stateObj, SUPPORT_COLOR_TEMP) + ? html` + + ` + : ""} + ${supportsFeature(this.stateObj, SUPPORT_WHITE_VALUE) + ? html` + + ` + : ""} + ${supportsFeature(this.stateObj, SUPPORT_COLOR) + ? html` +
+ + + +
+ ` + : ""} + ${supportsFeature(this.stateObj, SUPPORT_EFFECT) && + this.stateObj!.attributes.effect_list?.length + ? html` + + ${this.stateObj.attributes.effect_list.map( + (effect: string) => html` + ${effect} + ` + )} + + + ` + : ""} + ` + : ""} + +
+ `; + } + + protected updated(changedProps: PropertyValues): void { + const stateObj = this.stateObj! as LightEntity; + if (changedProps.has("stateObj") && stateObj.state === "on") { + this._brightnessSliderValue = stateObj.attributes.brightness; + this._ctSliderValue = stateObj.attributes.color_temp; + this._wvSliderValue = stateObj.attributes.white_value; + + if (stateObj.attributes.hs_color) { + this._colorPickerColor = { + h: stateObj.attributes.hs_color[0], + s: stateObj.attributes.hs_color[1] / 100, + }; + } + } + } + + private _effectChanged(ev: CustomEvent) { + const newVal = ev.detail.value; + + if (!newVal || this.stateObj!.attributes.effect === newVal) { + return; + } + + this.hass.callService("light", "turn_on", { + entity_id: this.stateObj!.entity_id, + effect: newVal, + }); + } + + private _brightnessSliderChanged(ev: CustomEvent) { + const bri = parseInt((ev.target as any).value, 10); + + if (isNaN(bri)) { + return; + } + + this.hass.callService("light", "turn_on", { + entity_id: this.stateObj!.entity_id, + brightness: bri, + }); + } + + private _ctSliderChanged(ev: CustomEvent) { + const ct = parseInt((ev.target as any).value, 10); + + if (isNaN(ct)) { + return; + } + + this.hass.callService("light", "turn_on", { + entity_id: this.stateObj!.entity_id, + color_temp: ct, + }); + } + + private _wvSliderChanged(ev: CustomEvent) { + const wv = parseInt((ev.target as any).value, 10); + + if (isNaN(wv)) { + return; + } + + this.hass.callService("light", "turn_on", { + entity_id: this.stateObj!.entity_id, + white_value: wv, + }); + } + + private _segmentClick() { + if (this._hueSegments === 24 && this._saturationSegments === 8) { + this._hueSegments = 0; + this._saturationSegments = 0; + } else { + this._hueSegments = 24; + this._saturationSegments = 8; + } + } + + /** + * Called when a new color has been picked. + * should be throttled with the 'throttle=' attribute of the color picker + */ + private _colorPicked(ev: CustomEvent) { + this.hass.callService("light", "turn_on", { + entity_id: this.stateObj!.entity_id, + hs_color: [ev.detail.hs.h, ev.detail.hs.s * 100], + }); + } + + static get styles(): CSSResult { + return css` + .content { + display: flex; + flex-direction: column; + align-items: center; + } + + .content.is-on { + margin-top: -16px; + } + + .content > * { + width: 100%; + max-height: 84px; + overflow: hidden; + padding-top: 16px; + } + + .color_temp { + --ha-slider-background: -webkit-linear-gradient( + right, + rgb(255, 160, 0) 0%, + white 50%, + rgb(166, 209, 255) 100% + ); + /* The color temp minimum value shouldn't be rendered differently. It's not "off". */ + --paper-slider-knob-start-border-color: var(--primary-color); + } + + .segmentationContainer { + position: relative; + max-height: 500px; + } + + ha-color-picker { + --ha-color-picker-wheel-borderwidth: 5; + --ha-color-picker-wheel-bordercolor: white; + --ha-color-picker-wheel-shadow: none; + --ha-color-picker-marker-borderwidth: 2; + --ha-color-picker-marker-bordercolor: white; + } + + .segmentationButton { + position: absolute; + top: 5%; + color: var(--secondary-text-color); + } + + paper-item { + cursor: pointer; + } + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + "more-info-light": MoreInfoLight; + } +} diff --git a/src/types.ts b/src/types.ts index 57a945a993..4b0af2a890 100644 --- a/src/types.ts +++ b/src/types.ts @@ -254,6 +254,10 @@ export type LightEntity = HassEntityBase & { friendly_name: string; brightness: number; hs_color: number[]; + color_temp: number; + white_value: number; + effect?: string; + effect_list: string[] | null; }; }; From 39f24c41ad05d8d33094278fd5c7b88698239327 Mon Sep 17 00:00:00 2001 From: Zack Arnett Date: Mon, 17 Aug 2020 11:24:19 -0500 Subject: [PATCH 028/300] Media More Info: Convert to Lit Element (#6619) * lit element * Remove Properties * review comments * This should be somewhat better. --- src/data/media-player.ts | 5 + .../controls/more-info-media_player.js | 421 ------------------ .../controls/more-info-media_player.ts | 381 ++++++++++++++++ .../lovelace/cards/hui-media-control-card.ts | 6 +- src/types.ts | 6 + 5 files changed, 393 insertions(+), 426 deletions(-) delete mode 100644 src/dialogs/more-info/controls/more-info-media_player.js create mode 100644 src/dialogs/more-info/controls/more-info-media_player.ts diff --git a/src/data/media-player.ts b/src/data/media-player.ts index 1f716cbee1..71a2939716 100644 --- a/src/data/media-player.ts +++ b/src/data/media-player.ts @@ -21,6 +21,11 @@ export interface MediaPlayerThumbnail { content: string; } +export interface ControlButton { + icon: string; + action: string; +} + export const getCurrentProgress = (stateObj: HassEntity): number => { let progress = stateObj.attributes.media_position; diff --git a/src/dialogs/more-info/controls/more-info-media_player.js b/src/dialogs/more-info/controls/more-info-media_player.js deleted file mode 100644 index 2e45403793..0000000000 --- a/src/dialogs/more-info/controls/more-info-media_player.js +++ /dev/null @@ -1,421 +0,0 @@ -import "@polymer/iron-flex-layout/iron-flex-layout-classes"; -import "../../../components/ha-icon-button"; -import "@polymer/paper-item/paper-item"; -import "@polymer/paper-listbox/paper-listbox"; -import { html } from "@polymer/polymer/lib/utils/html-tag"; -/* eslint-plugin-disable lit */ -import { PolymerElement } from "@polymer/polymer/polymer-element"; -import { isComponentLoaded } from "../../../common/config/is_component_loaded"; -import { attributeClassNames } from "../../../common/entity/attribute_class_names"; -import { computeRTLDirection } from "../../../common/util/compute_rtl"; -import "../../../components/ha-paper-dropdown-menu"; -import "../../../components/ha-paper-slider"; -import "../../../components/ha-icon"; -import { EventsMixin } from "../../../mixins/events-mixin"; -import LocalizeMixin from "../../../mixins/localize-mixin"; -import HassMediaPlayerEntity from "../../../util/hass-media-player-model"; - -/* - * @appliesMixin LocalizeMixin - * @appliesMixin EventsMixin - */ -class MoreInfoMediaPlayer extends LocalizeMixin(EventsMixin(PolymerElement)) { - static get template() { - return html` - - - -
-
-
- -
-
- -
-
- -
- - - -
-
- - - -
- -
- - - - - - -
- - - -
- - -
-
- `; - } - - static get properties() { - return { - hass: Object, - stateObj: Object, - playerObj: { - type: Object, - computed: "computePlayerObj(hass, stateObj)", - observer: "playerObjChanged", - }, - - ttsLoaded: { - type: Boolean, - computed: "computeTTSLoaded(hass)", - }, - - ttsMessage: { - type: String, - value: "", - }, - - rtl: { - type: String, - computed: "_computeRTLDirection(hass)", - }, - }; - } - - computePlayerObj(hass, stateObj) { - return new HassMediaPlayerEntity(hass, stateObj); - } - - playerObjChanged(newVal, oldVal) { - if (oldVal) { - setTimeout(() => { - this.fire("iron-resize"); - }, 500); - } - } - - computeClassNames(stateObj) { - return attributeClassNames(stateObj, ["volume_level"]); - } - - computeMuteVolumeIcon(playerObj) { - return playerObj.isMuted ? "hass:volume-off" : "hass:volume-high"; - } - - computeHideVolumeButtons(playerObj) { - return !playerObj.supportsVolumeButtons || playerObj.isOff; - } - - computeShowPlaybackControls(playerObj) { - return !playerObj.isOff && playerObj.hasMediaControl; - } - - computePlaybackControlIcon(playerObj) { - if (playerObj.isPlaying) { - return playerObj.supportsPause ? "hass:pause" : "hass:stop"; - } - if (playerObj.hasMediaControl || playerObj.isOff || playerObj.isIdle) { - if ( - playerObj.hasMediaControl && - playerObj.supportsPause && - !playerObj.isPaused - ) { - return "hass:play-pause"; - } - return playerObj.supportsPlay ? "hass:play" : null; - } - return ""; - } - - computeHidePowerButton(playerObj) { - return playerObj.isOff - ? !playerObj.supportsTurnOn - : !playerObj.supportsTurnOff; - } - - computeHideSelectSource(playerObj) { - return ( - playerObj.isOff || - !playerObj.supportsSelectSource || - !playerObj.sourceList - ); - } - - computeHideSelectSoundMode(playerObj) { - return ( - playerObj.isOff || - !playerObj.supportsSelectSoundMode || - !playerObj.soundModeList - ); - } - - computeHideTTS(ttsLoaded, playerObj) { - return !ttsLoaded || !playerObj.supportsPlayMedia; - } - - computeTTSLoaded(hass) { - return isComponentLoaded(hass, "tts"); - } - - handleTogglePower() { - this.playerObj.togglePower(); - } - - handlePrevious() { - this.playerObj.previousTrack(); - } - - handlePlaybackControl() { - this.playerObj.mediaPlayPause(); - } - - handleNext() { - this.playerObj.nextTrack(); - } - - handleSourceChanged(ev) { - if (!this.playerObj) return; - - const oldVal = this.playerObj.source; - const newVal = ev.detail.value; - - if (!newVal || oldVal === newVal) return; - - this.playerObj.selectSource(newVal); - } - - handleSoundModeChanged(ev) { - if (!this.playerObj) return; - - const oldVal = this.playerObj.soundMode; - const newVal = ev.detail.value; - - if (!newVal || oldVal === newVal) return; - - this.playerObj.selectSoundMode(newVal); - } - - handleVolumeTap() { - if (!this.playerObj.supportsVolumeMute) { - return; - } - this.playerObj.volumeMute(!this.playerObj.isMuted); - } - - handleVolumeTouchEnd(ev) { - /* when touch ends, we must prevent this from - * becoming a mousedown, up, click by emulation */ - ev.preventDefault(); - } - - handleVolumeUp() { - const obj = this.$.volumeUp; - this.handleVolumeWorker("volume_up", obj, true); - } - - handleVolumeDown() { - const obj = this.$.volumeDown; - this.handleVolumeWorker("volume_down", obj, true); - } - - handleVolumeWorker(service, obj, force) { - if (force || (obj !== undefined && obj.pointerDown)) { - this.playerObj.callService(service); - setTimeout(() => this.handleVolumeWorker(service, obj, false), 500); - } - } - - volumeSliderChanged(ev) { - const volPercentage = parseFloat(ev.target.value); - const volume = volPercentage > 0 ? volPercentage / 100 : 0; - this.playerObj.setVolume(volume); - } - - ttsCheckForEnter(ev) { - if (ev.keyCode === 13) this.sendTTS(); - } - - sendTTS() { - const services = this.hass.services.tts; - const serviceKeys = Object.keys(services).sort(); - let service; - let i; - - for (i = 0; i < serviceKeys.length; i++) { - if (serviceKeys[i].indexOf("_say") !== -1) { - service = serviceKeys[i]; - break; - } - } - - if (!service) { - return; - } - - this.hass.callService("tts", service, { - entity_id: this.stateObj.entity_id, - message: this.ttsMessage, - }); - this.ttsMessage = ""; - this.$.ttsInput.focus(); - } - - _computeRTLDirection(hass) { - return computeRTLDirection(hass); - } -} - -customElements.define("more-info-media_player", MoreInfoMediaPlayer); diff --git a/src/dialogs/more-info/controls/more-info-media_player.ts b/src/dialogs/more-info/controls/more-info-media_player.ts new file mode 100644 index 0000000000..efa96dec86 --- /dev/null +++ b/src/dialogs/more-info/controls/more-info-media_player.ts @@ -0,0 +1,381 @@ +import "@polymer/paper-item/paper-item"; +import "@polymer/paper-listbox/paper-listbox"; +import "@polymer/paper-input/paper-input"; + +import { + css, + CSSResult, + html, + LitElement, + property, + TemplateResult, + customElement, + query, +} from "lit-element"; +import { computeRTLDirection } from "../../../common/util/compute_rtl"; +import { HomeAssistant, MediaEntity } from "../../../types"; +import { supportsFeature } from "../../../common/entity/supports-feature"; +import { UNAVAILABLE_STATES, UNAVAILABLE, UNKNOWN } from "../../../data/entity"; +import { + SUPPORT_TURN_ON, + SUPPORT_TURN_OFF, + SUPPORTS_PLAY, + SUPPORT_PREVIOUS_TRACK, + SUPPORT_PAUSE, + SUPPORT_STOP, + SUPPORT_NEXT_TRACK, + SUPPORT_VOLUME_MUTE, + SUPPORT_VOLUME_SET, + SUPPORT_VOLUME_BUTTONS, + SUPPORT_SELECT_SOURCE, + SUPPORT_SELECT_SOUND_MODE, + SUPPORT_PLAY_MEDIA, + ControlButton, +} from "../../../data/media-player"; +import { isComponentLoaded } from "../../../common/config/is_component_loaded"; + +import "../../../components/ha-paper-dropdown-menu"; +import "../../../components/ha-icon-button"; +import "../../../components/ha-slider"; +import "../../../components/ha-icon"; + +@customElement("more-info-media_player") +class MoreInfoMediaPlayer extends LitElement { + @property({ attribute: false }) public hass!: HomeAssistant; + + @property({ attribute: false }) public stateObj?: MediaEntity; + + @query("#ttsInput") private _ttsInput?: HTMLInputElement; + + protected render(): TemplateResult { + if (!this.stateObj) { + return html``; + } + + const controls = this._getControls(); + const stateObj = this.stateObj; + + return html` + ${!controls + ? "" + : html` +
+ ${controls!.map( + (control) => html` + + ` + )} +
+ `} + ${(supportsFeature(stateObj, SUPPORT_VOLUME_SET) || + supportsFeature(stateObj, SUPPORT_VOLUME_BUTTONS)) && + ![UNAVAILABLE, UNKNOWN, "off"].includes(stateObj.state) + ? html` +
+ ${supportsFeature(stateObj, SUPPORT_VOLUME_MUTE) + ? html` + + ` + : ""} + ${supportsFeature(stateObj, SUPPORT_VOLUME_SET) + ? html` + + ` + : supportsFeature(stateObj, SUPPORT_VOLUME_BUTTONS) + ? html` + + + ` + : ""} +
+ ` + : ""} + ${stateObj.state !== "off" && + supportsFeature(stateObj, SUPPORT_SELECT_SOURCE) && + stateObj.attributes.source_list?.length + ? html` +
+ + + + ${stateObj.attributes.source_list!.map( + (source) => + html` + ${source} + ` + )} + + +
+ ` + : ""} + ${supportsFeature(stateObj, SUPPORT_SELECT_SOUND_MODE) && + stateObj.attributes.sound_mode_list?.length + ? html` +
+ + + + ${stateObj.attributes.sound_mode_list.map( + (mode) => html` + ${mode} + ` + )} + + +
+ ` + : ""} + ${isComponentLoaded(this.hass, "tts") && + supportsFeature(stateObj, SUPPORT_PLAY_MEDIA) + ? html` +
+ + +
+
+ ` + : ""} + `; + } + + static get styles(): CSSResult { + return css` + ha-icon-button[action="turn_off"], + ha-icon-button[action="turn_on"], + ha-slider, + #ttsInput { + flex-grow: 1; + } + + .volume, + .controls, + .source-input, + .sound-input, + .tts { + display: flex; + align-items: center; + justify-content: space-between; + } + + .source-input ha-icon, + .sound-input ha-icon { + padding: 7px; + margin-top: 24px; + } + + .source-input ha-paper-dropdown-menu, + .sound-input ha-paper-dropdown-menu { + margin-left: 10px; + flex-grow: 1; + } + + paper-item { + cursor: pointer; + } + `; + } + + private _getControls(): ControlButton[] | undefined { + const stateObj = this.stateObj; + + if (!stateObj) { + return undefined; + } + + const state = stateObj.state; + + if (UNAVAILABLE_STATES.includes(state)) { + return undefined; + } + + if (state === "off") { + return supportsFeature(stateObj, SUPPORT_TURN_ON) + ? [ + { + icon: "hass:power", + action: "turn_on", + }, + ] + : undefined; + } + + if (state === "idle") { + return supportsFeature(stateObj, SUPPORTS_PLAY) + ? [ + { + icon: "hass:play", + action: "media_play", + }, + ] + : undefined; + } + + const buttons: ControlButton[] = []; + + if (supportsFeature(stateObj, SUPPORT_TURN_OFF)) { + buttons.push({ + icon: "hass:power", + action: "turn_off", + }); + } + + if (supportsFeature(stateObj, SUPPORT_PREVIOUS_TRACK)) { + buttons.push({ + icon: "hass:skip-previous", + action: "media_previous_track", + }); + } + + if ( + (state === "playing" && + (supportsFeature(stateObj, SUPPORT_PAUSE) || + supportsFeature(stateObj, SUPPORT_STOP))) || + (state === "paused" && supportsFeature(stateObj, SUPPORTS_PLAY)) + ) { + buttons.push({ + icon: + state !== "playing" + ? "hass:play" + : supportsFeature(stateObj, SUPPORT_PAUSE) + ? "hass:pause" + : "hass:stop", + action: "media_play_pause", + }); + } + + if (supportsFeature(stateObj, SUPPORT_NEXT_TRACK)) { + buttons.push({ + icon: "hass:skip-next", + action: "media_next_track", + }); + } + + return buttons.length > 0 ? buttons : undefined; + } + + private _handleClick(e: MouseEvent): void { + this.hass!.callService( + "media_player", + (e.currentTarget! as HTMLElement).getAttribute("action")!, + { + entity_id: this.stateObj!.entity_id, + } + ); + } + + private _toggleMute() { + this.hass!.callService("media_player", "volume_mute", { + entity_id: this.stateObj!.entity_id, + is_volume_muted: !this.stateObj!.attributes.is_volume_muted, + }); + } + + private _selectedValueChanged(e: Event): void { + this.hass!.callService("media_player", "volume_set", { + entity_id: this.stateObj!.entity_id, + volume_level: + Number((e.currentTarget! as HTMLElement).getAttribute("value")!) / 100, + }); + } + + private _handleSourceChanged(e: CustomEvent) { + const newVal = e.detail.value; + + if (!newVal || this.stateObj!.attributes.source === newVal) return; + + this.hass.callService("media_player", "select_source", { + source: newVal, + }); + } + + private _handleSoundModeChanged(e: CustomEvent) { + const newVal = e.detail.value; + + if (!newVal || this.stateObj?.attributes.sound_mode === newVal) return; + + this.hass.callService("media_player", "select_sound_mode", { + sound_mode: newVal, + }); + } + + private _ttsCheckForEnter(e: KeyboardEvent) { + if (e.keyCode === 13) this._sendTTS(); + } + + private _sendTTS() { + const ttsInput = this._ttsInput; + if (!ttsInput) { + return; + } + + const services = this.hass.services.tts; + const serviceKeys = Object.keys(services).sort(); + + const service = serviceKeys.find((key) => key.indexOf("_say") !== -1); + + if (!service) { + return; + } + + this.hass.callService("tts", service, { + entity_id: this.stateObj!.entity_id, + message: ttsInput.value, + }); + ttsInput.value = ""; + } +} + +declare global { + interface HTMLElementTagNameMap { + "more-info-media_player": MoreInfoMediaPlayer; + } +} diff --git a/src/panels/lovelace/cards/hui-media-control-card.ts b/src/panels/lovelace/cards/hui-media-control-card.ts index 51528d8d32..cb6df43058 100644 --- a/src/panels/lovelace/cards/hui-media-control-card.ts +++ b/src/panels/lovelace/cards/hui-media-control-card.ts @@ -38,6 +38,7 @@ import { SUPPORT_STOP, SUPPORT_TURN_OFF, SUPPORT_TURN_ON, + ControlButton, } from "../../../data/media-player"; import type { HomeAssistant, MediaEntity } from "../../../types"; import { contrast } from "../common/color/contrast"; @@ -157,11 +158,6 @@ const customGenerator = (colors: Swatch[]) => { return [foregroundColor, backgroundColor.hex]; }; -interface ControlButton { - icon: string; - action: string; -} - @customElement("hui-media-control-card") export class HuiMediaControlCard extends LitElement implements LovelaceCard { public static async getConfigElement(): Promise { diff --git a/src/types.ts b/src/types.ts index 4b0af2a890..7639f1ea43 100644 --- a/src/types.ts +++ b/src/types.ts @@ -287,6 +287,12 @@ export type MediaEntity = HassEntityBase & { media_title: string; icon?: string; entity_picture_local?: string; + is_volume_muted?: boolean; + volume_level?: number; + source?: string; + source_list?: string[]; + sound_mode?: string; + sound_mode_list?: string[]; }; state: | "playing" From c4d8aba5c8fbcfe48a0e36f396e4b3d7cf9da952 Mon Sep 17 00:00:00 2001 From: Charles Garwood Date: Mon, 17 Aug 2020 13:54:03 -0400 Subject: [PATCH 029/300] Add OZW Refresh Node Dialog (#6530) --- src/data/ozw.ts | 97 ++++++- .../ozw/ha-device-info-ozw.ts | 48 +++- .../ozw/dialog-ozw-refresh-node.ts | 272 ++++++++++++++++++ .../ozw/show-dialog-ozw-refresh-node.ts | 22 ++ src/translations/en.json | 35 ++- 5 files changed, 459 insertions(+), 15 deletions(-) create mode 100644 src/panels/config/integrations/integration-panels/ozw/dialog-ozw-refresh-node.ts create mode 100644 src/panels/config/integrations/integration-panels/ozw/show-dialog-ozw-refresh-node.ts diff --git a/src/data/ozw.ts b/src/data/ozw.ts index 491b0168a2..cbef2a8dbc 100644 --- a/src/data/ozw.ts +++ b/src/data/ozw.ts @@ -1,4 +1,10 @@ import { HomeAssistant } from "../types"; +import { DeviceRegistryEntry } from "./device_registry"; + +export interface OZWNodeIdentifiers { + ozw_instance: number; + node_id: number; +} export interface OZWDevice { node_id: number; @@ -7,15 +13,102 @@ export interface OZWDevice { is_failed: boolean; is_zwave_plus: boolean; ozw_instance: number; + event: string; } +export interface OZWDeviceMetaDataResponse { + node_id: number; + ozw_instance: number; + metadata: OZWDeviceMetaData; +} + +export interface OZWDeviceMetaData { + OZWInfoURL: string; + ZWAProductURL: string; + ProductPic: string; + Description: string; + ProductManualURL: string; + ProductPageURL: string; + InclusionHelp: string; + ExclusionHelp: string; + ResetHelp: string; + WakeupHelp: string; + ProductSupportURL: string; + Frequency: string; + Name: string; + ProductPicBase64: string; +} + +export const nodeQueryStages = [ + "ProtocolInfo", + "Probe", + "WakeUp", + "ManufacturerSpecific1", + "NodeInfo", + "NodePlusInfo", + "ManufacturerSpecific2", + "Versions", + "Instances", + "Static", + "CacheLoad", + "Associations", + "Neighbors", + "Session", + "Dynamic", + "Configuration", + "Complete", +]; + +export const getIdentifiersFromDevice = function ( + device: DeviceRegistryEntry +): OZWNodeIdentifiers | undefined { + if (!device) { + return undefined; + } + + const ozwIdentifier = device.identifiers.find( + (identifier) => identifier[0] === "ozw" + ); + if (!ozwIdentifier) { + return undefined; + } + + const identifiers = ozwIdentifier[1].split("."); + return { + node_id: parseInt(identifiers[1]), + ozw_instance: parseInt(identifiers[0]), + }; +}; + export const fetchOZWNodeStatus = ( hass: HomeAssistant, - ozw_instance: string, - node_id: string + ozw_instance: number, + node_id: number ): Promise => hass.callWS({ type: "ozw/node_status", ozw_instance: ozw_instance, node_id: node_id, }); + +export const fetchOZWNodeMetadata = ( + hass: HomeAssistant, + ozw_instance: number, + node_id: number +): Promise => + hass.callWS({ + type: "ozw/node_metadata", + ozw_instance: ozw_instance, + node_id: node_id, + }); + +export const refreshNodeInfo = ( + hass: HomeAssistant, + ozw_instance: number, + node_id: number +): Promise => + hass.callWS({ + type: "ozw/refresh_node_info", + ozw_instance: ozw_instance, + node_id: node_id, + }); diff --git a/src/panels/config/devices/device-detail/integration-elements/ozw/ha-device-info-ozw.ts b/src/panels/config/devices/device-detail/integration-elements/ozw/ha-device-info-ozw.ts index b82ba363f0..2197fe689b 100644 --- a/src/panels/config/devices/device-detail/integration-elements/ozw/ha-device-info-ozw.ts +++ b/src/panels/config/devices/device-detail/integration-elements/ozw/ha-device-info-ozw.ts @@ -12,7 +12,13 @@ import { import { DeviceRegistryEntry } from "../../../../../../data/device_registry"; import { haStyle } from "../../../../../../resources/styles"; import { HomeAssistant } from "../../../../../../types"; -import { OZWDevice, fetchOZWNodeStatus } from "../../../../../../data/ozw"; +import { + OZWDevice, + fetchOZWNodeStatus, + getIdentifiersFromDevice, + OZWNodeIdentifiers, +} from "../../../../../../data/ozw"; +import { showOZWRefreshNodeDialog } from "../../../../integrations/integration-panels/ozw/show-dialog-ozw-refresh-node"; @customElement("ha-device-info-ozw") export class HaDeviceInfoOzw extends LitElement { @@ -20,26 +26,34 @@ export class HaDeviceInfoOzw extends LitElement { @property() public device!: DeviceRegistryEntry; + @property() + private node_id = 0; + + @property() + private ozw_instance = 1; + @internalProperty() private _ozwDevice?: OZWDevice; protected updated(changedProperties: PropertyValues) { if (changedProperties.has("device")) { - this._fetchNodeDetails(this.device); + const identifiers: + | OZWNodeIdentifiers + | undefined = getIdentifiersFromDevice(this.device); + if (!identifiers) { + return; + } + this.ozw_instance = identifiers.ozw_instance; + this.node_id = identifiers.node_id; + + this._fetchNodeDetails(); } } - protected async _fetchNodeDetails(device) { - const ozwIdentifier = device.identifiers.find( - (identifier) => identifier[0] === "ozw" - ); - if (!ozwIdentifier) { - return; - } - const identifiers = ozwIdentifier[1].split("."); + protected async _fetchNodeDetails() { this._ozwDevice = await fetchOZWNodeStatus( this.hass, - identifiers[0], - identifiers[1] + this.ozw_instance, + this.node_id ); } @@ -69,9 +83,19 @@ export class HaDeviceInfoOzw extends LitElement { ? this.hass.localize("ui.common.yes") : this.hass.localize("ui.common.no")}
+ + Refresh Node + `; } + private async _refreshNodeClicked() { + showOZWRefreshNodeDialog(this, { + node_id: this.node_id, + ozw_instance: this.ozw_instance, + }); + } + static get styles(): CSSResult[] { return [ haStyle, diff --git a/src/panels/config/integrations/integration-panels/ozw/dialog-ozw-refresh-node.ts b/src/panels/config/integrations/integration-panels/ozw/dialog-ozw-refresh-node.ts new file mode 100644 index 0000000000..6f86fbc7bc --- /dev/null +++ b/src/panels/config/integrations/integration-panels/ozw/dialog-ozw-refresh-node.ts @@ -0,0 +1,272 @@ +import { + CSSResult, + customElement, + html, + LitElement, + property, + internalProperty, + TemplateResult, + PropertyValues, + css, +} from "lit-element"; +import "../../../../../components/ha-code-editor"; +import "../../../../../components/ha-circular-progress"; +import { createCloseHeading } from "../../../../../components/ha-dialog"; +import { haStyleDialog } from "../../../../../resources/styles"; +import { HomeAssistant } from "../../../../../types"; +import { OZWRefreshNodeDialogParams } from "./show-dialog-ozw-refresh-node"; + +import { + fetchOZWNodeMetadata, + OZWDeviceMetaData, + OZWDevice, + nodeQueryStages, +} from "../../../../../data/ozw"; + +@customElement("dialog-ozw-refresh-node") +class DialogOZWRefreshNode extends LitElement { + @property({ attribute: false }) public hass!: HomeAssistant; + + @internalProperty() private _node_id?: number; + + @internalProperty() private _ozw_instance = 1; + + @internalProperty() private _nodeMetaData?: OZWDeviceMetaData; + + @internalProperty() private _node?: OZWDevice; + + @internalProperty() private _active = false; + + @internalProperty() private _complete = false; + + private _refreshDevicesTimeoutHandle?: number; + + private _subscribed?: Promise<() => Promise>; + + public disconnectedCallback(): void { + super.disconnectedCallback(); + this._unsubscribe(); + } + + protected updated(changedProperties: PropertyValues): void { + super.update(changedProperties); + if (changedProperties.has("node_id")) { + this._fetchData(); + } + } + + private async _fetchData() { + if (!this._node_id) { + return; + } + const metaDataResponse = await fetchOZWNodeMetadata( + this.hass, + this._ozw_instance, + this._node_id + ); + + this._nodeMetaData = metaDataResponse.metadata; + } + + public async showDialog(params: OZWRefreshNodeDialogParams): Promise { + this._node_id = params.node_id; + this._ozw_instance = params.ozw_instance; + this._fetchData(); + } + + protected render(): TemplateResult { + if (!this._node_id) { + return html``; + } + + return html` + + ${this._complete + ? html` +

+ ${this.hass.localize( + "ui.panel.config.ozw.refresh_node.complete" + )} +

+ + ${this.hass.localize("ui.common.close")} + + ` + : html` + ${this._active + ? html` +
+ +
+

+ + ${this.hass.localize( + "ui.panel.config.ozw.refresh_node.refreshing_description" + )} + +

+ ${this._node + ? html` +

+ ${this.hass.localize( + "ui.panel.config.ozw.refresh_node.node_status" + )}: + ${this._node.node_query_stage} + (${this.hass.localize( + "ui.panel.config.ozw.refresh_node.step" + )} + ${nodeQueryStages.indexOf( + this._node.node_query_stage + ) + 1}/17) +

+

+ + ${this.hass.localize( + "ui.panel.config.ozw.node_query_stages." + + this._node.node_query_stage.toLowerCase() + )} +

+ ` + : ``} +
+
+ ` + : html` + ${this.hass.localize( + "ui.panel.config.ozw.refresh_node.description" + )} +

+ ${this.hass.localize( + "ui.panel.config.ozw.refresh_node.battery_note" + )} +

+ `} + ${this._nodeMetaData?.WakeupHelp !== "" + ? html` + + ${this.hass.localize( + "ui.panel.config.ozw.refresh_node.wakeup_header" + )} + ${this._nodeMetaData!.Name} + +
+ ${this._nodeMetaData!.WakeupHelp} +
+ + ${this.hass.localize( + "ui.panel.config.ozw.refresh_node.wakeup_instructions_source" + )} + +
+ ` + : ""} + ${!this._active + ? html` + + ${this.hass.localize( + "ui.panel.config.ozw.refresh_node.start_refresh_button" + )} + + ` + : html``} + `} +
+ `; + } + + private _startRefresh(): void { + this._subscribe(); + } + + private _handleMessage(message: any): void { + if (message.type === "node_updated") { + this._node = message; + if (message.node_query_stage === "Complete") { + this._unsubscribe(); + this._complete = true; + } + } + } + + private _unsubscribe(): void { + this._active = false; + if (this._refreshDevicesTimeoutHandle) { + clearTimeout(this._refreshDevicesTimeoutHandle); + } + if (this._subscribed) { + this._subscribed.then((unsub) => unsub()); + this._subscribed = undefined; + } + } + + private _subscribe(): void { + if (!this.hass) { + return; + } + this._active = true; + this._subscribed = this.hass.connection.subscribeMessage( + (message) => this._handleMessage(message), + { + type: "ozw/refresh_node_info", + node_id: this._node_id, + ozw_instance: this._ozw_instance, + } + ); + this._refreshDevicesTimeoutHandle = window.setTimeout( + () => this._unsubscribe(), + 120000 + ); + } + + private _close(): void { + this._complete = false; + this._node_id = undefined; + this._node = undefined; + } + + static get styles(): CSSResult[] { + return [ + haStyleDialog, + css` + blockquote { + display: block; + background-color: #ddd; + padding: 8px; + margin: 8px 0; + font-size: 0.9em; + } + + blockquote em { + font-size: 0.9em; + margin-top: 6px; + } + + .flex-container { + display: flex; + align-items: center; + } + + .flex-container ha-circular-progress { + margin-right: 20px; + } + `, + ]; + } +} + +declare global { + interface HTMLElementTagNameMap { + "dialog-ozw-refresh-node": DialogOZWRefreshNode; + } +} diff --git a/src/panels/config/integrations/integration-panels/ozw/show-dialog-ozw-refresh-node.ts b/src/panels/config/integrations/integration-panels/ozw/show-dialog-ozw-refresh-node.ts new file mode 100644 index 0000000000..0c956f9ffe --- /dev/null +++ b/src/panels/config/integrations/integration-panels/ozw/show-dialog-ozw-refresh-node.ts @@ -0,0 +1,22 @@ +import { fireEvent } from "../../../../../common/dom/fire_event"; + +export interface OZWRefreshNodeDialogParams { + ozw_instance: number; + node_id: number; +} + +export const loadRefreshNodeDialog = () => + import( + /* webpackChunkName: "dialog-ozw-refresh-node" */ "./dialog-ozw-refresh-node" + ); + +export const showOZWRefreshNodeDialog = ( + element: HTMLElement, + refreshNodeDialogParams: OZWRefreshNodeDialogParams +): void => { + fireEvent(element, "show-dialog", { + dialogTag: "dialog-ozw-refresh-node", + dialogImport: loadRefreshNodeDialog, + dialogParams: refreshNodeDialogParams, + }); +}; diff --git a/src/translations/en.json b/src/translations/en.json index 48d51fa5aa..41f54a7386 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1066,7 +1066,9 @@ "label": "Repeat", "type_select": "Repeat type", "type": { - "count": { "label": "Count" }, + "count": { + "label": "Count" + }, "while": { "label": "While", "conditions": "While conditions" @@ -1628,6 +1630,37 @@ "zwave_info": "Z-Wave Info", "stage": "Stage", "node_failed": "Node Failed" + }, + "node_query_stages": { + "protocolinfo": "Obtaining basic Z-Wave capabilities of this node from the controller", + "probe": "Checking if the node is awake/alive", + "wakeup": "Setting up support for wakeup queues and messages", + "manufacturerspecific1": "Obtaining manufacturer and product ID codes from the node", + "nodeinfo": "Obtaining supported command classes from the node", + "nodeplusinfo": "Obtaining Z-Wave+ information from the node", + "manufacturerspecific2": "Obtaining additional manufacturer and product ID codes from the node", + "versions": "Obtaining information about firmware and command class versions", + "instances": "Obtaining details about what instances or channels a device supports", + "static": "Obtaining static values from the device", + "cacheload": "Loading information from the OpenZWave cache file. Battery nodes will stay at this stage until the node wakes up.", + "associations": "Refreshing association groups and memberships", + "neighbors": "Obtaining a list of the node's neighbors", + "session": "Obtaining infrequently changing values from the node", + "dynamic": "Obtaining frequently changing values from the node", + "configuration": "Obtaining configuration values from the node", + "complete": "Interview process is complete" + }, + "refresh_node": { + "title": "Refresh Node Information", + "complete": "Node Refresh Complete", + "description": "This will tell OpenZWave to re-interview a node and update the node's command classes, capabilities, and values.", + "battery_note": "If the node is battery powered, be sure to wake it before proceeding", + "wakeup_header": "Wakeup Instructions for", + "wakeup_instructions_source": "Wakeup instructions are sourced from the OpenZWave community device database.", + "start_refresh_button": "Start Refresh", + "refreshing_description": "Refreshing node information...", + "node_status": "Node Status", + "step": "Step" } }, "zha": { From f1503f871bc2fb508402e4b2a250221c89cad630 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Tue, 18 Aug 2020 00:32:11 +0000 Subject: [PATCH 030/300] [ci skip] Translation update --- translations/frontend/el.json | 259 ++++++++++++++++++++++++++++++---- translations/frontend/en.json | 31 ++++ translations/frontend/fy.json | 17 ++- translations/frontend/he.json | 8 +- translations/frontend/it.json | 4 +- translations/frontend/ko.json | 78 ++++++++-- translations/frontend/nn.json | 43 ++++-- translations/frontend/pt.json | 1 + 8 files changed, 382 insertions(+), 59 deletions(-) diff --git a/translations/frontend/el.json b/translations/frontend/el.json index 0b8152cc24..10dd95d0cf 100644 --- a/translations/frontend/el.json +++ b/translations/frontend/el.json @@ -219,6 +219,8 @@ "stopped": "Σταμάτησε" }, "default": { + "off": "Μη Ενεργό", + "on": "Ενεργό", "unavailable": "Μη Διαθέσιμο", "unknown": "Άγνωστη" }, @@ -401,7 +403,9 @@ }, "humidifier": { "humidity": "Επιθυμητή υγρασία", - "mode": "Λειτουργία" + "mode": "Λειτουργία", + "on_entity": "{name} ενεργοποιημένο", + "target_humidity_entity": "{name} στόχος υγρασίας" }, "light": { "brightness": "Φωτεινότητα", @@ -427,6 +431,7 @@ }, "script": { "cancel": "Ακύρωση", + "cancel_multiple": "Ακύρωση {αριθμός}", "execute": "Εκτέλεση" }, "service": { @@ -489,11 +494,16 @@ } }, "common": { + "and": "και", + "back": "Πίσω", "cancel": "Ακύρωση", "close": "Κλείστε", "delete": "Διαγραφή", + "error_required": "Υποχρεωτικό", "loading": "Φόρτωση", + "menu": "Μενού", "no": "Όχι", + "overflow_menu": "Μενού υπερχείλισης", "save": "Αποθήκευση", "successfully_deleted": "Η διαγραφή ολοκληρώθηκε με επιτυχία", "successfully_saved": "Αποθηκεύτηκε με επιτυχία", @@ -515,6 +525,7 @@ "show_areas": "Εμφάνιση περιοχών" }, "data-table": { + "no-data": "Δεν υπάρχουν δεδομένα", "search": "Αναζήτηση" }, "date-range-picker": { @@ -525,6 +536,7 @@ "device-picker": { "clear": "Καθαρός", "device": "Συσκευή", + "no_area": "Καμία περιοχή", "show_devices": "Εμφάνιση συσκευών", "toggle": "Εναλλαγή" }, @@ -572,7 +584,8 @@ "entity_id": "Αναγνωριστικό οντότητας", "unavailable": "Αυτή η οντότητα δεν είναι προς το παρόν διαθέσιμη.", "update": "Ενημέρωση" - } + }, + "no_unique_id": "Αυτή η οντότητα δεν έχει μοναδικό αναγνωριστικό, επομένως δεν είναι δυνατή η διαχείριση των ρυθμίσεών της από το περιβάλλον χρήστη." }, "generic": { "cancel": "Ακύρωση", @@ -585,10 +598,15 @@ "datetime": "Ημερομηνία και ώρα", "time": "Ώρα" }, + "input_number": { + "step": "Μέγεθος βήματος" + }, "input_text": { "max": "Μέγιστο μήκος", "min": "Ελάχιστο μήκος" - } + }, + "platform_not_loaded": "Η ενσωμάτωση {platform} δεν έχει φορτωθεί. Προσθέστε το στη διαμόρφωσή σας είτε προσθέτοντας 'default_config:' ή '' {platform} : ''.", + "yaml_not_editable": "Δεν είναι δυνατή η επεξεργασία των ρυθμίσεων αυτής της οντότητας από το περιβάλλον χρήστη. Μόνο οντότητες που έχουν δημιουργηθεί από το περιβάλλον χρήστη μπορούν να διαμορφωθούν από το περιβάλλον χρήστη." }, "more_info_control": { "dismiss": "Κλείσιμο διαλόγου.", @@ -612,6 +630,16 @@ "title": "Οδηγίες Ενημέρωσης" } }, + "mqtt_device_debug_info": { + "deserialize": "Προσπάθεια ανάλυσης μηνυμάτων MQTT ως JSON", + "entities": "Οντότητες", + "no_entities": "Δεν υπάρχουν οντότητες", + "no_triggers": "Δεν υπάρχουν εναύσματα", + "payload_display": "Εμφάνιση ωφέλιμου φορτίου", + "recent_messages": "{n} πιο πρόσφατα ληφθέντα μηνύματα", + "show_as_yaml": "Εμφάνιση ως YAML", + "title": "Πληροφορίες εντοπισμού σφαλμάτων {device}" + }, "options_flow": { "form": { "header": "Επιλογές" @@ -633,8 +661,10 @@ "add": "Προσθήκη συσκευών", "clusters": "Διαχείριση συμπλεγμάτων", "reconfigure": "Ρυθμίστε Ξανά Τη Συσκευή", - "remove": "Κατάργηση συσκευής" + "remove": "Κατάργηση συσκευής", + "zigbee_information": "Υπογραφή συσκευής Zigbee" }, + "device_signature": "Υπογραφή συσκευής Zigbee", "last_seen": "Εθεάθη τελευταία", "manuf": "από τον {manufacturer}", "no_area": "Καμία περιοχή", @@ -643,7 +673,8 @@ "services": { "reconfigure": "Ρυθμίστε ξανά τη συσκευή ZHA (θεραπεία συσκευής). Χρησιμοποιήστε αυτήν την επιλογή εάν αντιμετωπίζετε προβλήματα με τη συσκευή. Εάν η συγκεκριμένη συσκευή τροφοδοτείται από μπαταρία παρακαλώ βεβαιωθείτε ότι είναι ενεργοποιημένη και δέχεται εντολές όταν χρησιμοποιείτε αυτή την υπηρεσία.", "remove": "Καταργήστε μια συσκευή από το δίκτυο Zigbee.", - "updateDeviceName": "Ορίστε ένα προσαρμοσμένο όνομα γι αυτήν τη συσκευή στο μητρώο συσκευών." + "updateDeviceName": "Ορίστε ένα προσαρμοσμένο όνομα γι αυτήν τη συσκευή στο μητρώο συσκευών.", + "zigbee_information": "Δείτε τις πληροφορίες Zigbee για τη συσκευή." }, "unknown": "Άγνωστη", "zha_device_card": { @@ -674,9 +705,15 @@ "notification_toast": { "connection_lost": "Η σύνδεση χάθηκε. Επανασύνδεση…", "service_call_failed": "Απέτυχε η κλήση στην υπηρεσία {service}.", + "started": "Το Home Assistant έχει ξεκινήσει!", + "starting": "Το Home Assistant ξεκινά, ενδέχεται να μην είναι ακόμη διαθέσιμα όλα.", "triggered": "Ενεργοποιήθηκε το {name}" }, "panel": { + "calendar": { + "my_calendars": "Τα ημερολόγιά μου", + "today": "Σήμερα" + }, "config": { "advanced_mode": { "hint_enable": "Λείπουν επιλογές ρύθμισης παραμέτρων; Ενεργοποίηση σύνθετης λειτουργίας", @@ -694,8 +731,12 @@ }, "description": "Επισκόπηση όλων των περιοχών στο σπίτι σας.", "editor": { + "area_id": "Αναγνωριστικό περιοχής", "create": "Δημιουργία", "delete": "Διαγραφή", + "name": "Ονομασία", + "name_required": "Απαιτείται όνομα", + "unknown_error": "Άγνωστο σφάλμα", "update": "Ενημέρωση" }, "picker": { @@ -703,7 +744,8 @@ "header": "Περιοχή Μητρώου", "integrations_page": "Σελίδα ενσωματώσεων", "introduction": "Οι περιοχές χρησιμοποιούνται για την οργάνωση της τοποθεσίας των συσκευών. Αυτές οι πληροφορίες θα χρησιμοποιηθούν σε όλο το Home Assistant για να σας βοηθήσουν στην οργάνωση της διασύνδεσης, των αδειών και των ενσωματώσεων σας σε άλλα συστήματα.", - "introduction2": "Για να τοποθετήσετε συσκευές σε μια περιοχή, χρησιμοποιήστε τον παρακάτω σύνδεσμο για να μεταβείτε στη σελίδα ενοποιήσεων και στη συνέχεια κάντε κλικ στην ρυθμισμένη ενοποίηση για να μεταβείτε στις κάρτες της συσκευής." + "introduction2": "Για να τοποθετήσετε συσκευές σε μια περιοχή, χρησιμοποιήστε τον παρακάτω σύνδεσμο για να μεταβείτε στη σελίδα ενοποιήσεων και στη συνέχεια κάντε κλικ στην ρυθμισμένη ενοποίηση για να μεταβείτε στις κάρτες της συσκευής.", + "no_areas": "Φαίνεται ότι δεν έχετε περιοχές ακόμα!" } }, "automation": { @@ -721,6 +763,15 @@ "name": "Ενέργεια", "type_select": "Τύπος ενέργειας", "type": { + "choose": { + "add_option": "Προσθήκη επιλογής", + "conditions": "Συνθήκες", + "default": "Προεπιλεγμένες ενέργειες", + "label": "Επιλέξτε", + "option": "Επιλογή {αριθμός}", + "remove_option": "Κατάργηση επιλογής", + "sequence": "Ενέργειες" + }, "condition": { "label": "Προϋπόθεση" }, @@ -729,6 +780,7 @@ "label": "Καθυστέρηση" }, "device_id": { + "action": "Ενέργεια", "extra_fields": { "code": "Κώδικας" }, @@ -739,6 +791,24 @@ "label": "Εκκίνηση συμβάντος", "service_data": "Δεδομένα υπηρεσίας" }, + "repeat": { + "label": "Επανάληψη", + "sequence": "Ενέργειες", + "type_select": "Επανάληψη τύπου", + "type": { + "count": { + "label": "Αρίθμηση" + }, + "until": { + "conditions": "Μέχρι τις συνθήκες", + "label": "Μέχρι" + }, + "while": { + "conditions": "\"Μέχρι\" συνθήκες", + "label": "Μέχρι" + } + } + }, "scene": { "label": "Ενεργοποίηση σκηνής" }, @@ -770,6 +840,7 @@ "label": "Και" }, "device": { + "condition": "Προϋπόθεση", "extra_fields": { "above": "Πάνω από", "below": "Κάτω από", @@ -827,12 +898,20 @@ "load_error_not_editable": "Μόνο οι αυτοματισμοί στο automations.yaml είναι επεξεργάσιμοι.", "load_error_unknown": "Σφάλμα κατά τη φόρτωση αυτοματισμού ({err_no}).", "max": { + "parallel": "Μέγιστος αριθμός παράλληλων διαδρομών", "queued": "Μήκος ουράς" }, "modes": { + "description": "Η κατάσταση λειτουργίας ελέγχει τι συμβαίνει όταν ενεργοποιείται η αυτοματοποίηση ενώ οι ενέργειες εξακολουθούν να εκτελούνται από ένα προηγούμενο έναυσμα. Ελέγξτε το {documentation_link} για περισσότερες πληροφορίες.", "documentation": "τεκμηρίωση αυτοματισμού", - "restart": "Επανεκκίνηση" + "label": "Λειτουργία", + "parallel": "Παράλληλα", + "queued": "Στην ουρά", + "restart": "Επανεκκίνηση", + "single": "Μονό (προεπιλογή)" }, + "move_down": "Μετακίνηση προς τα κάτω", + "move_up": "Μετακίνηση προς τα επάνω", "save": "Αποθήκευση", "triggers": { "add": "Προσθήκη εναύσματος", @@ -851,7 +930,8 @@ "below": "Κάτω από", "for": "Διάρκεια" }, - "label": "Συσκευή" + "label": "Συσκευή", + "trigger": "Έναυσμα" }, "event": { "event_data": "Δεδομένα συμβάντος", @@ -1113,7 +1193,9 @@ "edit_requires_storage": "Ο επεξεργαστής απενεργοποιήθηκε επειδή οι ρυθμίσεις παραμέτρων αποθηκεύτηκαν στο αρχείο configuration.yaml.", "elevation": "Ανύψωση", "elevation_meters": "μέτρα", + "external_url": "Εξωτερική διεύθυνση URL", "imperial_example": "Φαρενάιτ, λίρες", + "internal_url": "Εσωτερική διεύθυνση URL", "latitude": "Γεωγραφικό πλάτος", "location_name": "Όνομα της εγκατάστασης του Home Assistant", "longitude": "Γεωγραφικό μήκος", @@ -1140,6 +1222,7 @@ "different_include": "Ίσως μέσω ενός τομέα, ενός glob ή μιας διαφορετικής προσθήκης.", "pick_attribute": "Επιλέξτε ένα χαρακτηριστικό για να το παρακάμψετε", "picker": { + "entity": "Οντότητα", "header": "Προσαρμογή", "introduction": "Αλλαγή ρυθμίσεων ανά οντότητα. Οι προσαρμοσμένες προσθήκες / επεξεργασίες θα τεθούν αμέσως σε ισχύ. Οι αφαιρεθείσες προσαρμογές θα ισχύσουν όταν ενημερωθεί η οντότητα." }, @@ -1176,14 +1259,18 @@ "integration": "Ενσωμάτωση", "manufacturer": "Κατασκευαστής", "model": "Μοντέλο", + "no_area": "Καμία περιοχή", "no_devices": "Δεν υπάρχουν συσκευές" }, "delete": "Διαγραφή", "description": "Διαχείριση συνδεδεμένων συσκευών", + "device_info": "Πληροφορίες συσκευής", "device_not_found": "Η συσκευή δε βρέθηκε.", "entities": { "add_entities_lovelace": "Προσθήκη στο Lovelace", + "disabled_entities": "+{count} {count, πληθυντικός,\n μία {απενεργοποιημένη οντότητα}\n άλλες {απενεργοποιημένες οντότητες}\n}", "entities": "Οντότητες", + "hide_disabled": "Η απόκρυψη είναι απενεργοποιημένη", "none": "Αυτή η συσκευή δεν έχει οντότητες" }, "name": "Όνομα", @@ -1224,11 +1311,13 @@ "status": "Κατάσταση" }, "introduction": "Ο Home Assistant διατηρεί μητρώο από κάθε μοναδική οντότητα που ανιχνεύει. Αυτές οι οντότητες έχουν το δικό τους μοναδικό αναγνωριστικό ID.", - "introduction2": "Χρησιμοποιήστε το μητρώο οντοτήτων για να παρακάμψετε το όνομα, να αλλάξετε το αναγνωριστικό οντότητας ή να καταργήσετε την καταχώρηση από το Home Assistant. Σημειώστε ότι η κατάργηση της καταχώρησης δεν θα καταργήσει την οντότητα. Για να το κάνετε αυτό, ακολουθήστε τον παρακάτω σύνδεσμο και αφαιρέστε την από τη σελίδα ενσωματώσεων.", + "introduction2": "Χρησιμοποιήστε το μητρώο οντοτήτων για να παρακάμψετε το όνομα, να αλλάξετε το αναγνωριστικό οντότητας ή να καταργήσετε την καταχώριση από το Home Assistant.", "remove_selected": { "button": "Αφαίρεση επιλεγμένων", + "confirm_text": "Θα πρέπει να τα αφαιρέσετε από το Lovelace config και τους αυτοματισμούς σας εάν περιέχουν αυτές τις οντότητες.", "confirm_title": "θέλετε να αφαιρέσετε {number} οντότητες;" }, + "search": "Οντότητες αναζήτησης", "selected": "Επιλέχθηκαν {number} ", "status": { "disabled": "Απενεργοποιημένη", @@ -1239,11 +1328,13 @@ }, "header": "Διαμόρφωση του Home Assistant", "helpers": { + "description": "Διαχειριστείτε στοιχεία που βοηθούν στη δημιουργία αυτοματισμών", "picker": { "headers": { "entity_id": "Αναγνωριστικό οντότητας", "name": "Ονομασία" - } + }, + "no_helpers": "Φαίνεται ότι δεν έχετε ακόμα βοηθούς!" }, "types": { "input_number": "Αριθμός", @@ -1252,12 +1343,17 @@ }, "info": { "built_using": "Κατασκευάστηκε με χρήση", + "caption": "Πληροφορίες", "custom_uis": "Προσαρμοσμένα περιβάλλοντα χρήστη:", + "description": "Δείτε πληροφορίες σχετικά με την εγκατάσταση του Home Assistant", "developed_by": "Αναπτύχθηκε από ένα μάτσο απίθανων ανθρώπων.", + "documentation": "Τεκμηρίωση", "frontend": "Τελική επιφάνεια εργασίας χρήστη", "frontend_version": "Έκδοση Frontend: {version} - {type}", "home_assistant_logo": "Λογότυπο του Home Assistant", "icons_by": "Εικόνες από", + "integrations": "Ενσωματώσεις", + "issues": "Ζητήματα", "license": "Δημοσιεύτηκε κάτω από την άδεια χρήσης Apache 2.0", "path_configuration": "Διαδρομή στo configuration.yaml: {path}", "server": "Διακομιστής", @@ -1266,7 +1362,9 @@ "title": "Πληροφορίες" }, "integration_panel_move": { - "link_integration_page": "Σελίδα ενσωματώσεων" + "link_integration_page": "Σελίδα ενσωματώσεων", + "missing_zha": "Λείπει ο πίνακας διαμόρφωσης ZHA; Μετακινήθηκε στην καταχώριση ZHA στο {integrations_page} .", + "missing_zwave": "Λείπει ο πίνακας διαμόρφωσης Z-Wave; Μετακινήθηκε στην καταχώριση Z-Wave στο {integrations_page} ." }, "integrations": { "caption": "Ενσωματώσεις", @@ -1285,7 +1383,8 @@ "no_devices": "Αυτή η ενοποίηση δεν έχει συσκευές.", "restart_confirm": "Επανεκκινήστε το Home Assistant για να ολοκληρώσετε την κατάργηση αυτής της ενοποίησης", "settings_button": "Επεξεργασία ρυθμίσεων για {integration}", - "system_options_button": "Επιλογές συστήματος για {integration}" + "system_options_button": "Επιλογές συστήματος για {integration}", + "unnamed_entry": "Ανώνυμη καταχώριση" }, "config_flow": { "aborted": "Ματαιώθηκε", @@ -1310,7 +1409,7 @@ "ignore": { "confirm_delete_ignore": "Αυτό θα κάνει την ενσωμάτωση να εμφανιστεί ξανά στις ενσωματώσεις που ανακαλύφθηκαν όταν ανακαλυφθεί. Αυτό μπορεί να απαιτήσει επανεκκίνηση ή να πάρει κάποιο χρόνο.", "confirm_delete_ignore_title": "Διακόψτε την παράβλεψη του {name};", - "confirm_ignore": "Είστε βέβαιοι ότι δε θέλετε να ρυθμίσετε αυτήν την ενσωμάτωση; Μπορείτε να αναιρέσετε αυτήν την επιλογή κάνοντας κλικ στο \"Εμφάνιση ενσωματώσεων που παραβλέφθηκαν\" στο μενού υπερχείλισης στην επάνω δεξιά γωνία.", + "confirm_ignore": "Είστε βέβαιοι ότι δεν θέλετε να ρυθμίσετε αυτήν την ενσωμάτωση; Μπορείτε να αναιρέσετε αυτό κάνοντας κλικ στην επιλογή \"Εμφάνιση αγνοημένων ενσωματώσεων\" στο μενού υπερχείλισης επάνω δεξιά.", "confirm_ignore_title": "Παράβλεψη της ανακάλυψη του {name} ;", "hide_ignored": "Απόκρυψη των ενσωματώσεων που παραβλέφθηκαν", "ignore": "Παράβλεψη", @@ -1327,7 +1426,9 @@ }, "introduction": "Εδώ είναι δυνατή η διαμόρφωση του Home Assistant και των εξαρτημάτων. Δεν είναι δυνατή η διαμόρφωση όλων από την διεπαφή χρήστη (UI) αλλά εργαζόμαστε πάνω σε αυτό.", "logs": { + "caption": "Αρχεία καταγραφής", "clear": "Καθαρισμός", + "description": "Δείτε τα αρχεία καταγραφής του Home Assistant", "details": "Λεπτομέρειες καταγραφής ({level})", "load_full_log": "Φόρτωση ολόκληρου του αρχείου καταγραφής του Home Assistant.", "loading_log": "Φόρτωση αρχείου καταγραφής σφαλμάτων…", @@ -1339,20 +1440,26 @@ }, "lovelace": { "dashboards": { + "cant_edit_default": "Δεν είναι δυνατή η επεξεργασία του τυπικού πίνακα ελέγχου Lovelace από τη διεπαφή χρήστη. Μπορείτε να το αποκρύψετε ορίζοντας έναν άλλο πίνακα ελέγχου ως προεπιλογή.", + "cant_edit_yaml": "Δεν είναι δυνατή η επεξεργασία πινάκων εργαλείων που ορίζονται στο YAML από το περιβάλλον εργασίας χρήστη. Αλλάξτε τα στο configuration.yaml.", "caption": "Επισκόπηση", "default_dashboard": "Αυτή είναι η προεπιλεγμένη επισκόπηση", "detail": { "icon": "Εικονίδιο", "title": "Τίτλος", - "title_required": "Απαιτείται τίτλος." + "title_required": "Απαιτείται τίτλος.", + "url_error_msg": "Η διεύθυνση URL πρέπει να περιέχει ένα - και δεν μπορεί να περιέχει κενά ή ειδικούς χαρακτήρες, εκτός από _ και -" }, "picker": { "headers": { "default": "Προεπιλογή" - } + }, + "open": "Άνοιγμα" } }, + "description": "Διαχειριστείτε τους πίνακες ελέγχου Lovelace", "resources": { + "cant_edit_yaml": "Χρησιμοποιείτε το Lovelace σε λειτουργία YAML, επομένως δεν μπορείτε να διαχειριστείτε τους πόρους σας μέσω του περιβάλλοντος εργασίας χρήστη. Διαχειριστείτε τους στο configuration.yaml.", "picker": { "no_resources": "Δεν υπάρχουν πόροι" } @@ -1372,6 +1479,18 @@ "title": "MQTT", "topic": "θέμα" }, + "ozw": { + "common": { + "node_id": "Αναγνωριστικό κόμβου", + "ozw_instance": "Παρουσία OpenZWave", + "zwave": "Z-Wave" + }, + "device_info": { + "node_failed": "Ο κόμβος απέτυχε", + "stage": "Στάδιο", + "zwave_info": "Πληροφορίες Z-Wave" + } + }, "person": { "add_person": "Προσθέστε Άτομο", "caption": "Άτομα", @@ -1453,14 +1572,20 @@ "delete_script": "Διαγραφή δέσμης ενεργειών", "header": "Δέσμη ενεργειών: {name}", "icon": "Εικονίδιο", + "id": "Αναγνωριστικό οντότητας", + "id_already_exists": "Αυτό το αναγνωριστικό υπάρχει ήδη", + "id_already_exists_save_error": "Δεν μπορείτε να αποθηκεύσετε αυτό το script επειδή το αναγνωριστικό δεν είναι μοναδικό, επιλέξτε άλλο αναγνωριστικό ή αφήστε το κενό για αυτόματη δημιουργία ενός.", "introduction": "Χρησιμοποιήστε δέσμες ενεργειών για να εκτελέσετε μια ακολουθία ενεργειών.", "link_available_actions": "Μάθετε περισσότερα σχετικά με τις διαθέσιμες ενέργειες.", "load_error_not_editable": "Μόνο οι δέσμες ενεργειών που βρίσκονται μέσα στο scripts.yaml είναι επεξεργάσιμες", "max": { + "parallel": "Μέγιστος αριθμός παράλληλων διαδρομών", "queued": "Μήκος ουράς" }, "modes": { + "description": "Η λειτουργία ελέγχει τι συμβαίνει όταν γίνεται κλήση σεναρίου, ενώ εξακολουθεί να εκτελείται από μία ή περισσότερες προηγούμενες προσκλήσεις. Ελέγξτε το {documentation_link} για περισσότερες πληροφορίες.", "documentation": "τεκμηρίωση δέσμης ενεργειών", + "label": "Λειτουργία", "parallel": "Παράλληλα", "queued": "Στην ουρά", "restart": "Επανεκκίνηση", @@ -1479,6 +1604,7 @@ "introduction": "Ο επεξεργαστής δέσμης ενεργειών σας επιτρέπει να δημιουργείτε και να επεξεργάζεστε σκηνές. Παρακαλώ ακολουθήστε τον παρακάτω σύνδεσμο για να διαβάσετε τις οδηγίες για να βεβαιωθείτε ότι έχετε διαμορφώσει σωστά το Home Assistant.", "learn_more": "Μάθετε περισσότερα σχετικά με τα σενάρια", "no_scripts": "Δεν μπορέσαμε να βρούμε δέσμες ενεργειών με δυνατότητα επεξεργασίας", + "show_info": "Εμφάνιση πληροφοριών σχετικά με τη δέσμη ενεργειών", "trigger_script": "Δέσμη ενεργειών εναύσματος" } }, @@ -1491,6 +1617,11 @@ "core": "Επαναφόρτωση τοποθεσίας και προσαρμογών", "group": "Επαναφόρτωση ομάδων", "heading": "Επαναφόρτωση παραμετροποίησης YAML ", + "input_boolean": "Επαναφόρτωση δυαδικών μεταβλητών εισόδου", + "input_datetime": "Επαναφόρτωση ημερομηνίας εισαγωγής", + "input_number": "Επαναφόρτωση αριθμών εισόδου", + "input_select": "Επαναφόρτωση δέσμης εντολών", + "input_text": "Επαναφόρτωση κειμένων εισόδου", "introduction": "Ορισμένα τμήματα του Home Assistant μπορούν να επαναφορτωθούν χωρίς να απαιτείται επανεκκίνηση. Πατώντας \"επαναφόρτωση\" θα ξεφορτωθεί η τρέχουσα παραμετροποίηση YAML και θα φορτωθεί η νέα.", "scene": "Επαναφόρτωση σκηνών", "script": "Επαναφόρτωση δέσμης εντολών" @@ -1536,6 +1667,7 @@ "name": "Ονομασία", "owner": "Ιδιοκτήτης", "system_generated": "Δημιουργήθηκε από το σύστημα", + "system_generated_users_not_editable": "Δεν είναι δυνατή η ενημέρωση των χρηστών που δημιουργούνται από το σύστημα.", "system_generated_users_not_removable": "Δεν είναι δυνατή η διαγραφή χρηστών που δημιουργήθηκαν από το σύστημα", "unnamed_user": "Χρήστης χωρίς όνομα", "update_user": "Ενημέρωση" @@ -1546,13 +1678,16 @@ "name": "Ονομασία", "system": "Σύστημα" } - } + }, + "users_privileges_note": "Η ομάδα χρηστών είναι ένα έργο σε εξέλιξη. Ο χρήστης δεν θα μπορεί να διαχειριστεί την παρουσία μέσω της διεπαφής χρήστη. Εξακολουθούμε να ελέγχουμε όλα τα τελικά σημεία API διαχείρισης για να διασφαλίσουμε ότι περιορίζουν σωστά την πρόσβαση στους διαχειριστές." }, "zha": { "add_device_page": { "discovered_text": "Οι συσκευές θα εμφανιστούν εδώ μόλις ανακαλυφθούν.", "discovery_text": "Οι ανακαλυφθείσες συσκευές θα εμφανιστούν εδώ. Ακολουθήστε τις οδηγίες για τις συσκευές σας και τοποθετήστε τις συσκευές στη λειτουργία αντιστοίχισης.", "header": "Zigbee Home Automation - Προσθήκη Συσκευών", + "no_devices_found": "Δεν βρέθηκαν συσκευές, βεβαιωθείτε ότι βρίσκονται σε λειτουργία ζευγαρώματος και κρατήστε τις ξύπνιες ενώ η ανακάλυψη εκτελείται.", + "pairing_mode": "Βεβαιωθείτε ότι οι συσκευές σας είναι σε λειτουργία σύζευξης. Ελέγξτε τις οδηγίες της συσκευής σας για το πώς να το κάνετε αυτό.", "search_again": "Αναζήτηση ξανά", "spinner": "Αναζήτηση συσκευών ZHA Zigbee…" }, @@ -1602,7 +1737,7 @@ "create_group": "Zigbee Home Automation - Δημιουργία ομάδας", "create_group_details": "Καταχωρείστε τις απαραίτητες πληροφορίες για να δημιουργήσετε μια νέα ομάδα Zigbee", "creating_group": "Δημιουργία ομάδας", - "description": "Δημιούργησε και τροποποίησε ομάδες Zigbee", + "description": "Διαχείριση ομάδων Zigbee", "group_details": "Εδώ βρίσκονται όλες οι πληροφορίες για την επιλεγμένη ομάδα", "group_id": "Αναγνωριστικό ομάδας", "group_info": "Πληροφορίες ομάδας", @@ -1638,7 +1773,11 @@ "title": "Zigbee Home Automation" }, "zone": { - "edit_home_zone": "Η τοποθεσία του σπιτιού σας μπορεί να αλλαχτεί από τις γενικές ρυθμίσεις." + "description": "Διαχειριστείτε τις ζώνες στις οποίες θέλετε να παρακολουθείτε άτομα", + "detail": { + "passive_note": "Οι παθητικές ζώνες είναι κρυμμένες στο μπροστινό μέρος και δεν χρησιμοποιούνται ως θέση για ιχνηλάτες συσκευών. Αυτό είναι χρήσιμο εάν θέλετε ακριβώς να το χρησιμοποιήσετε για τους αυτοματισμούς." + }, + "edit_home_zone": "Δεν είναι δυνατή η επεξεργασία της ακτίνας της ζώνης Home από το Frontend. Σύρετε το δείκτη στο χάρτη για να μετακινήσετε τη ζώνη της αρχικής σελίδας." }, "zwave": { "button": "Διαμόρφωση", @@ -1674,21 +1813,45 @@ "set_wakeup": "Ορισμός διαστήματος αφύπνισης", "true": "Αληθής" }, + "node_management": { + "add_to_group": "Προσθήκη σε ομάδα", + "group": "Ομάδα", + "header": "Διαχείριση κόμβων Z-Wave", + "max_associations": "Μέγιστες ενώσεις:", + "node_group_associations": "Κόμβοι συσχετίσεων ομάδων", + "node_to_control": "Κόμβος προς έλεγχο", + "nodes_in_group": "Άλλοι κόμβοι σε αυτήν την ομάδα:", + "protection": "Προστασία", + "remove_broadcast": "Κατάργηση εκπομπής", + "remove_from_group": "Κατάργηση από ομάδα", + "set_protection": "Ορισμός προστασίας" + }, "ozw_log": { "header": "Αρχείο καταγραφής OZW", - "introduction": "Δείτε το αρχείο καταγραφής. 0 είναι το ελάχιστο (φορτώνει ολόκληρο το αρχείο καταγραφής) και 1000 είναι το μέγιστο. Η φόρτωση θα εμφανίσει ένα στατικό αρχείο καταγραφής και η ουρά θα ενημερωθεί αυτόματα με τον τελευταίο καθορισμένο αριθμό γραμμών του αρχείου καταγραφής." + "introduction": "Δείτε το αρχείο καταγραφής. 0 είναι το ελάχιστο (φορτώνει ολόκληρο το αρχείο καταγραφής) και 1000 είναι το μέγιστο. Η φόρτωση θα εμφανίσει ένα στατικό αρχείο καταγραφής και η ουρά θα ενημερωθεί αυτόματα με τον τελευταίο καθορισμένο αριθμό γραμμών του αρχείου καταγραφής.", + "last_log_lines": "Αριθμός τελευταίων γραμμών καταγραφής", + "load": "Φόρτωση", + "tail": "Ουρά" }, "services": { "add_node": "Προσθήκη κόμβου", "add_node_secure": "Ασφαλής προσθήκη κόμβου", "cancel_command": "Ακύρωση εντολής", "heal_network": "Θεραπεία δικτύου", + "heal_node": "Θεραπεία κόμβου", + "node_info": "Πληροφορίες κόμβου", + "print_node": "Εκτύπωση κόμβου", + "refresh_entity": "Ανανέωση οντότητας", + "refresh_node": "Ανανέωση κόμβου", + "remove_failed_node": "Κατάργηση αποτυχημένου κόμβου", "remove_node": "Κατάργηση κόμβου", + "replace_failed_node": "Αντικατάσταση αποτυχημένου κόμβου", "save_config": "Αποθήκευση Παραμετροποίησης", "soft_reset": "Επαναφορά μέσω λογισμικού", "start_network": "Έναρξη δικτύου", "stop_network": "Διακοπή δικτύου", - "test_network": "Δοκιμή δικτύου" + "test_network": "Δοκιμή δικτύου", + "test_node": "Δοκιμή κόμβου" }, "values": { "header": "Τιμές κόμβου" @@ -1786,7 +1949,9 @@ }, "lovelace": { "add_entities": { - "saving_failed": "Η αποθήκευση της παραμετροποίησης του Lovelace απέτυχε" + "generated_unsupported": "Μπορείτε να χρησιμοποιήσετε αυτήν τη λειτουργία μόνο όταν έχετε πάρει τον έλεγχο του Lovelace UI.", + "saving_failed": "Η αποθήκευση της παραμετροποίησης του Lovelace απέτυχε", + "yaml_unsupported": "Δεν μπορείτε να χρησιμοποιήσετε αυτήν τη λειτουργία όταν χρησιμοποιείτε το Lovelace UI σε λειτουργία YAML." }, "cards": { "confirm_delete": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν την κάρτα;", @@ -1876,6 +2041,7 @@ "no_theme": "Χωρίς θέμα", "refresh_interval": "Χρονικό διάστημα ανανέωσης", "search": "Αναζήτηση", + "secondary_info_attribute": "Χαρακτηριστικό δευτερευουσών πληροφοριών", "show_icon": "Εμφάνιση εικονιδίου;", "show_name": "Εμφάνιση ονόματος;", "show_state": "Εμφάνιση κατάστασης;", @@ -1897,6 +2063,7 @@ "name": "Οριζόντια διάταξη" }, "humidifier": { + "description": "Η κάρτα υγραντήρα δίνει τον έλεγχο της οντότητας υγραντήρα σας. Σας επιτρέπει να αλλάξετε την υγρασία και τον τρόπο της οντότητας.", "name": "Υγραντήρας" }, "iframe": { @@ -1909,6 +2076,7 @@ "dark_mode": "Σκοτεινή λειτουργία;", "default_zoom": "Προεπιλεγμένο ζουμ", "geo_location_sources": "Πηγές γεωγραφικής θέσης", + "hours_to_show": "Ώρες για εμφάνιση", "name": "Χάρτης", "source": "Πηγή" }, @@ -1949,7 +2117,8 @@ "name": "Κάθετη διάταξη" }, "weather-forecast": { - "name": "Πρόγνωση καιρού" + "name": "Πρόγνωση καιρού", + "show_forecast": "Πρόγνωση καιρού" } }, "cardpicker": { @@ -1958,6 +2127,7 @@ }, "edit_card": { "add": "Προσθήκη κάρτας", + "confirm_cancel": "Είστε βέβαιοι ότι θέλετε να ακυρώσετε;", "delete": "Διαγραφή", "duplicate": "Διπλότυπη κάρτα", "edit": "Επεξεργασία", @@ -1968,7 +2138,9 @@ "pick_card_view_title": "Ποια κάρτα θέλετε να προσθέσετε στην προβολή {name} ;", "show_code_editor": "Εμφάνιση επεξεργαστή κώδικα", "show_visual_editor": "Εμφάνιση οπτικού προγράμματος επεξεργασίας", - "toggle_editor": "Εναλλαγή κειμενογράφου" + "toggle_editor": "Εναλλαγή κειμενογράφου", + "typed_header": "{τύπος} Διαμόρφωση κάρτας", + "unsaved_changes": "Έχετε μη αποθηκευμένες αλλαγές" }, "edit_lovelace": { "edit_title": "Επεξεργασία τίτλου", @@ -1997,13 +2169,19 @@ "para_migrate": "Ο Home Assistant μπορεί να προσθέσει αυτόματα όλα τα αναγνωριστικά από τις κάρτες και τις προβολές σας πατώντας το πλήκτρο 'Ρυθμίσεις μετεγκατάστασης'.", "para_no_id": "Αυτό το στοιχείο δεν έχει αναγνωριστικό. Προσθέστε ένα αναγνωριστικό σε αυτό το στοιχείο στο 'ui-lovelace.yaml'." }, + "move_card": { + "header": "Επιλέξτε μια προβολή για να μετακινήσετε την κάρτα" + }, "raw_editor": { + "confirm_remove_config_text": "Θα δημιουργήσουμε αυτόματα τις προβολές του Lovelace UI με τις περιοχές και τις συσκευές σας, εάν καταργήσετε τη διαμόρφωση του Lovelace UI.", + "confirm_remove_config_title": "Είστε βέβαιοι ότι θέλετε να καταργήσετε τη διαμόρφωση διεπαφής χρήστη Lovelace; Θα δημιουργήσουμε αυτόματα τις προβολές διεπαφής χρήστη Lovelace με τις περιοχές και τις συσκευές σας.", "confirm_unsaved_changes": "Έχετε μη-αποθηκευμένες αλλαγές, είστε βέβαιοι ότι θέλετε να βγείτε;", "confirm_unsaved_comments": "Η παραμετροποίηση σας περιέχει σχόλιο(α), αυτά δεν θα αποθηκευτούν. Θέλετε να συνεχίσετε;", - "error_invalid_config": "Το αρχείο config δεν είναι έγκυρο: {error}", + "error_invalid_config": "Η διαμόρφωσή σας δεν είναι έγκυρη: {error}", "error_parse_yaml": "Δεν είναι δυνατή η ανάλυση του YAML: {error}", + "error_remove": "Δεν είναι δυνατή η κατάργηση της διαμόρφωσης: {error}", "error_save_yaml": "Δεν είναι δυνατή η αποθήκευση του YAML: {error}", - "header": "Επεξεργαστείτε το Config", + "header": "Επεξεργασία διαμόρφωσης", "save": "Αποθήκευση", "saved": "Αποθηκεύτηκε", "unsaved_changes": "Μη αποθηκευμένες αλλαγές" @@ -2014,9 +2192,15 @@ "header": "Πάρτε τον έλεγχο του περιβάλλοντος χρήστη στο Lovelace", "para": "Από προεπιλογή, το Home Assistant θα διατηρήσει το περιβάλλον χρήστη που έχετε ενημερώνοντας το όταν θα γίνονται διαθέσιμες νέες οντότητες ή στοιχεία Lovelace. Αν πάρετε τον έλεγχο, δεν θα πραγματοποιούμε πλέον αλλαγές για εσάς.", "para_sure": "Είστε βέβαιος ότι θέλετε να πάρετε τον έλεγχο του περιβάλλοντος χρήστη;", - "save": "Πάρτε τον έλεγχο" + "save": "Πάρτε τον έλεγχο", + "yaml_mode": "Χρησιμοποιείτε τη λειτουργία YAML για αυτόν τον πίνακα εργαλείων, πράγμα που σημαίνει ότι δεν μπορείτε να αλλάξετε τη διαμόρφωση Lovelace από το περιβάλλον εργασίας χρήστη. Εάν θέλετε να διαχειριστείτε αυτόν τον πίνακα εργαλείων από το περιβάλλον εργασίας χρήστη, καταργήστε το 'mode: yaml' από τη διαμόρφωση Lovelace στο 'configuration.yaml.'." + }, + "select_view": { + "dashboard_label": "Επισκόπηση", + "header": "Επιλέξτε μια προβολή" }, "suggest_card": { + "add": "Προσθήκη στο Lovelace UI", "create_own": "Επιλέξτε άλλη κάρτα" }, "view": { @@ -2043,15 +2227,20 @@ "entity": "Οντότητα", "entity_id": "Αναγνωριστικό οντότητας", "last_changed": "Τελευταία αλλαγή", + "no_data": "Δεν βρέθηκαν αχρησιμοποίητες οντότητες", + "search": "Οντότητες αναζήτησης", "select_to_add": "Επιλέξτε τις οντότητες που θέλετε να προσθέσετε σε μια κάρτα και, στη συνέχεια, κάντε κλικ στο κουμπί Προσθήκη κάρτας.", "title": "Αχρησιμοποίητες οντότητες" }, "views": { - "confirm_delete": "Θέλετε να διαγράψετε αυτήν την προβολή;" + "confirm_delete": "Θέλετε να διαγράψετε αυτήν την προβολή;", + "confirm_delete_existing_cards_text": "Είστε βέβαιοι ότι θέλετε να διαγράψετε την προβολή '' {name} ''; Η προβολή περιέχει {number} κάρτες που θα διαγραφούν. Αυτή η πράξη δε μπορεί να αναιρεθεί.", + "confirm_delete_text": "Είστε βέβαιοι ότι θέλετε να διαγράψετε την προβολή '' {name} '';" }, "warning": { "entity_non_numeric": "Η οντότητα δεν είναι αριθμητική: {entity}", - "entity_not_found": "Η οντότητα δεν είναι διαθέσιμη: {entity}" + "entity_not_found": "Η οντότητα δεν είναι διαθέσιμη: {entity}", + "starting": "Το Home Assistant ξεκινά, ενδέχεται να μην είναι ακόμη διαθέσιμα όλα" } }, "mailbox": { @@ -2064,6 +2253,8 @@ "abort_intro": "Σύνδεση ματαιώθηκε", "authorizing_client": "Πρόκειται να δώσετε στο {clientId} πρόσβαση στο Home Assistant.", "form": { + "error": "Σφάλμα: {error}", + "next": "Επόμενο", "providers": { "command_line": { "abort": { @@ -2150,6 +2341,7 @@ } } }, + "start_over": "Ξεκινήστε από την αρχή", "unknown_error": "Κάτι πήγε στραβά", "working": "Παρακαλώ περιμένετε" }, @@ -2311,13 +2503,22 @@ "token_title": "Ανανέωση διακριτικού για το {clientId}" }, "suspend": { + "description": "Θα πρέπει να κλείσουμε τη σύνδεση με το διακομιστή μετά την απόκρυψη για 5 λεπτά;", "header": "Αυτόματο κλείσιμο σύνδεσης" }, "themes": { + "accent_color": "Χρώμα έμφασης", + "dark_mode": { + "auto": "Αυτόματο", + "dark": "Σκούρο", + "light": "Φωτεινό" + }, "dropdown_label": "Θέμα", "error_no_theme": "Δεν υπάρχουν διαθέσιμα θέματα.", "header": "Θέμα", - "link_promo": "Μάθετε σχετικά με τα θέματα" + "link_promo": "Μάθετε σχετικά με τα θέματα", + "primary_color": "Πρωτεύον χρώμα", + "reset": "Επαναφορά" }, "vibrate": { "description": "Ενεργοποιήστε ή απενεργοποιήστε τις δονήσεις σε αυτήν τη συσκευή κατά τον έλεγχο συσκευών.", diff --git a/translations/frontend/en.json b/translations/frontend/en.json index e43714330a..7abcf52ea9 100644 --- a/translations/frontend/en.json +++ b/translations/frontend/en.json @@ -1656,6 +1656,37 @@ "node_failed": "Node Failed", "stage": "Stage", "zwave_info": "Z-Wave Info" + }, + "node_query_stages": { + "associations": "Refreshing association groups and memberships", + "cacheload": "Loading information from the OpenZWave cache file. Battery nodes will stay at this stage until the node wakes up.", + "complete": "Interview process is complete", + "configuration": "Obtaining configuration values from the node", + "dynamic": "Obtaining frequently changing values from the node", + "instances": "Obtaining details about what instances or channels a device supports", + "manufacturerspecific1": "Obtaining manufacturer and product ID codes from the node", + "manufacturerspecific2": "Obtaining additional manufacturer and product ID codes from the node", + "neighbors": "Obtaining a list of the node's neighbors", + "nodeinfo": "Obtaining supported command classes from the node", + "nodeplusinfo": "Obtaining Z-Wave+ information from the node", + "probe": "Checking if the node is awake/alive", + "protocolinfo": "Obtaining basic Z-Wave capabilities of this node from the controller", + "session": "Obtaining infrequently changing values from the node", + "static": "Obtaining static values from the device", + "versions": "Obtaining information about firmware and command class versions", + "wakeup": "Setting up support for wakeup queues and messages" + }, + "refresh_node": { + "battery_note": "If the node is battery powered, be sure to wake it before proceeding", + "complete": "Node Refresh Complete", + "description": "This will tell OpenZWave to re-interview a node and update the node's command classes, capabilities, and values.", + "node_status": "Node Status", + "refreshing_description": "Refreshing node information...", + "start_refresh_button": "Start Refresh", + "step": "Step", + "title": "Refresh Node Information", + "wakeup_header": "Wakeup Instructions for", + "wakeup_instructions_source": "Wakeup instructions are sourced from the OpenZWave community device database." } }, "person": { diff --git a/translations/frontend/fy.json b/translations/frontend/fy.json index 9d3024376c..119c6b7034 100644 --- a/translations/frontend/fy.json +++ b/translations/frontend/fy.json @@ -9,11 +9,15 @@ "state_attributes": { "climate": { "fan_mode": { - "off": "Út" + "off": "Út", + "on": "Oan" } } }, "state_badge": { + "default": { + "unknown": "Ûnbek." + }, "person": { "home": "Thús" } @@ -22,6 +26,10 @@ "alarm_control_panel": { "triggered": "Aktivearre" }, + "automation": { + "off": "Út", + "on": "Oan" + }, "binary_sensor": { "cold": { "on": "Kâld" @@ -30,6 +38,7 @@ "on": "Ferbûn" }, "default": { + "off": "Út", "on": "Oan" }, "door": { @@ -71,7 +80,9 @@ "heat": "Ferwaarmje" }, "cover": { - "open": "Iepen" + "closing": "Slút", + "open": "Iepen", + "opening": "Iepent" }, "default": { "off": "Út", @@ -87,6 +98,8 @@ "group": { "home": "Thús", "locked": "Beskoattele", + "off": "Út", + "on": "Oan", "open": "Iepen", "stopped": "Stoppe" }, diff --git a/translations/frontend/he.json b/translations/frontend/he.json index e6ae133790..933e5bb3c8 100644 --- a/translations/frontend/he.json +++ b/translations/frontend/he.json @@ -162,7 +162,7 @@ "on": "פתוח" }, "presence": { - "off": "לא נוכח", + "off": "לא נמצא", "on": "בבית" }, "problem": { @@ -306,7 +306,7 @@ "docked": "בעגינה", "error": "שגיאה", "idle": "ממתין", - "off": "מכובה", + "off": "כבוי", "on": "מופעל", "paused": "מושהה", "returning": "חזור לעגינה" @@ -344,7 +344,7 @@ "ui": { "auth_store": { "ask": "האם ברצונך לשמור את ההתחברות הזו?", - "confirm": "שמור התחברות", + "confirm": "כן", "decline": "לא תודה" }, "card": { @@ -748,7 +748,7 @@ "unknown": "לא ידוע", "zha_device_card": { "area_picker_label": "אזור", - "device_name_placeholder": "שם פרטי", + "device_name_placeholder": "שנה שם התקן", "update_name_button": "עדכן שם" } } diff --git a/translations/frontend/it.json b/translations/frontend/it.json index d22f43449c..fc6980fc46 100644 --- a/translations/frontend/it.json +++ b/translations/frontend/it.json @@ -836,7 +836,7 @@ "choose": { "add_option": "Aggiungi opzione", "conditions": "Condizioni", - "default": "Azione predefinita", + "default": "Azioni predefinite", "label": "Scegli", "option": "Opzione {number}", "remove_option": "Rimuovi opzione", @@ -2050,7 +2050,7 @@ "add_node": "Aggiungi Nodo", "add_node_secure": "Aggiungi nodo sicuro", "cancel_command": "Annulla Comando", - "heal_network": "Testa la rete", + "heal_network": "Risana la rete", "heal_node": "Resuscita Nodo", "node_info": "Informazioni sul Nodo", "print_node": "Stampa Nodo", diff --git a/translations/frontend/ko.json b/translations/frontend/ko.json index 521c567b22..0a74b9f1ea 100644 --- a/translations/frontend/ko.json +++ b/translations/frontend/ko.json @@ -798,7 +798,7 @@ "confirmation_text": "이 영역에 속한 모든 장치가 할당 해제됩니다.", "confirmation_title": "이 영역을 삭제하시겠습니까?" }, - "description": "영역을 만들고 편집합니다", + "description": "집의 영역을 관리합니다", "editor": { "area_id": "영역 ID", "create": "만들기", @@ -820,7 +820,7 @@ }, "automation": { "caption": "자동화", - "description": "자동화를 만들고 편집합니다", + "description": "자동화를 관리합니다", "editor": { "actions": { "add": "동작 추가", @@ -833,6 +833,15 @@ "name": "동작", "type_select": "동작 유형", "type": { + "choose": { + "add_option": "옵션 추가", + "conditions": "조건", + "default": "기본 동작", + "label": "선택", + "option": "옵션 {number}", + "remove_option": "옵션 제거", + "sequence": "동작" + }, "condition": { "label": "조건" }, @@ -852,6 +861,24 @@ "label": "이벤트 발생", "service_data": "서비스 데이터" }, + "repeat": { + "label": "반복", + "sequence": "동작", + "type_select": "반복 유형", + "type": { + "count": { + "label": "횟수" + }, + "until": { + "conditions": "~일 때 까지 (조건)", + "label": "~일 때 까지" + }, + "while": { + "conditions": "~인 동안 (조건)", + "label": "~인 동안" + } + } + }, "scene": { "label": "씬 활성화" }, @@ -1341,7 +1368,7 @@ }, "entities": { "caption": "구성요소", - "description": "등록된 구성요소를 편집합니다", + "description": "등록된 구성요소를 관리합니다", "picker": { "disable_selected": { "button": "선택된 구성요소 비활성화", @@ -1393,7 +1420,7 @@ "header": "Home Assistant 설정", "helpers": { "caption": "도우미", - "description": "자동화 구축에 도움이 되는 요소입니다", + "description": "자동화 구축에 도움이 되는 요소를 관리합니다", "dialog": { "add_helper": "도우미 추가", "add_platform": "{platform} 추가", @@ -1486,7 +1513,7 @@ }, "configure": "설정하기", "configured": "설정된 통합 구성요소", - "description": "통합 구성요소를 관리하고 설정합니다", + "description": "통합 구성요소를 관리합니다", "details": "통합 구성요소 상세정보", "discovered": "발견된 구성요소", "home_assistant_website": "Home Assistant 웹 사이트", @@ -1514,7 +1541,7 @@ "rename_input_label": "구성 항목의 이름", "search": "통합 구성요소 검색" }, - "introduction": "여기에서 구성요소와 Home Assistant 를 설정할 수 있습니다. 아직 여기서 모두 설정할 수는 없지만, 모든 내용을 설정할 수 있도록 작업 중입니다.", + "introduction": "이 뷰에서 구성요소와 Home Assistant 를 설정할 수 있습니다. 아직 여기서 모두 설정할 수는 없지만, 모든 내용을 설정할 수 있도록 작업 중입니다.", "logs": { "caption": "로그", "clear": "지우기", @@ -1570,7 +1597,7 @@ "open": "열기" } }, - "description": "Lovelace 대시보드를 구성합니다", + "description": "Lovelace 대시보드를 관리합니다", "resources": { "cant_edit_yaml": "YAML 모드에서 Lovelace 를 사용하고 있으므로 UI 를 통해 리소스를 관리할 수 없습니다. configuration.yaml 에서 관리해주세요.", "caption": "리소스", @@ -1619,6 +1646,18 @@ "title": "MQTT", "topic": "토픽" }, + "ozw": { + "common": { + "node_id": "노드 ID", + "ozw_instance": "OpenZWave 인스턴스", + "zwave": "Z-Wave" + }, + "device_info": { + "node_failed": "노드 실패", + "stage": "단계", + "zwave_info": "Z-Wave 정보" + } + }, "person": { "add_person": "구성원 추가하기", "caption": "구성원", @@ -1648,7 +1687,7 @@ "scene": { "activated": "{name} 씬이 활성화 됨.", "caption": "씬", - "description": "씬을 만들고 편집합니다", + "description": "씬을 관리합니다", "editor": { "default_name": "새로운 씬", "devices": { @@ -1692,7 +1731,7 @@ }, "script": { "caption": "스크립트", - "description": "스크립트를 만들고 편집합니다", + "description": "스크립트를 관리합니다", "editor": { "alias": "이름", "default_name": "새로운 스크립트", @@ -1879,7 +1918,7 @@ "create_group": "Zigbee Home Automation - 그룹 만들기", "create_group_details": "새로운 Zigbee 그룹을 생성하기 위해 필요한 세부 사항을 입력해주세요", "creating_group": "그룹 생성", - "description": "Zigbee 그룹을 생성하거나 수정합니다", + "description": "Zigbee 그룹을 관리합니다", "group_details": "선택된 Zigbee 그룹의 모든 세부 정보는 다음과 같습니다.", "group_id": "그룹 ID", "group_info": "그룹 정보", @@ -2387,6 +2426,9 @@ "para_migrate": "Home Assistant 는 '구성 마이그레이션' 버튼을 눌러 자동으로 모든 카드와 뷰에 ID를 추가할 수 있습니다.", "para_no_id": "이 요소에는 ID가 없습니다. 'ui-lovelace.yaml' 에 요소의 ID를 추가해주세요." }, + "move_card": { + "header": "카드를 이동할 뷰를 선택해주세요" + }, "raw_editor": { "confirm_remove_config_text": "Lovelace UI 구성을 제거하면, 영역 및 기기와 함께 Lovelace UI 뷰가 자동으로 생성됩니다.", "confirm_remove_config_title": "Lovelace UI 구성을 제거하시겠습니까? 영역 및 기기와 함께 Lovelace UI 뷰를 자동으로 생성해드립니다.", @@ -2414,6 +2456,10 @@ "yaml_control": "YAML 모드로 제어하려면 대시보드의 구성에서 지정한 이름의 YAML 파일을 만들거나 기본 제공된 'ui-lovelace.yaml' 을 사용해주세요.", "yaml_mode": "이 대시보드는 YAML 모드를 사용 중이므로 UI 에서 Lovelace 구성을 변경할 수 없습니다. Lovelace 를 UI 에서 변경하려면 'configuration.yaml' 의 Lovelace 구성에서 'mode:yaml' 을 제거해주세요." }, + "select_view": { + "dashboard_label": "대시보드", + "header": "뷰 선택" + }, "suggest_card": { "add": "Lovelace UI 에 추가", "create_own": "다른 카드 선택", @@ -2429,7 +2475,7 @@ }, "menu": { "close": "닫기", - "configure_ui": "UI 구성", + "configure_ui": "대시보드 편집", "exit_edit_mode": "UI 편집 모드 종료", "help": "도움말", "refresh": "새로고침", @@ -2731,10 +2777,18 @@ "header": "자동 연결 종료" }, "themes": { + "accent_color": "강조 색상", + "dark_mode": { + "auto": "자동", + "dark": "어둡게", + "light": "밝게" + }, "dropdown_label": "테마", "error_no_theme": "사용할 수 있는 테마가 없습니다.", "header": "테마", - "link_promo": "테마에 대해 더 알아보기" + "link_promo": "테마에 대해 더 알아보기", + "primary_color": "주 색상", + "reset": "초기화" }, "vibrate": { "description": "기기를 제어할 때 이 기기에서 진동을 활성화 또는 비활성화합니다.", diff --git a/translations/frontend/nn.json b/translations/frontend/nn.json index c865e0c752..56b1204383 100644 --- a/translations/frontend/nn.json +++ b/translations/frontend/nn.json @@ -346,7 +346,7 @@ }, "automation": { "last_triggered": "Sist utløyst", - "trigger": "Utløysar" + "trigger": "Utfør" }, "camera": { "not_available": "Bilete ikkje tilgjengeleg" @@ -499,7 +499,8 @@ }, "entity": { "entity-picker": { - "entity": "Eining" + "entity": "Eining", + "show_entities": "Vis oppføringar" } }, "history_charts": { @@ -583,6 +584,7 @@ } }, "mqtt_device_debug_info": { + "entities": "Oppføringar", "no_entities": "Ingen oppføringar", "no_triggers": "Ingen utløysarar", "payload_display": "Nyttelastvisning", @@ -704,7 +706,7 @@ "label": "Gjenta" }, "service": { - "label": "Hent teneste", + "label": "Utfør tenestekall", "service_data": "Tenestedata" }, "wait_template": { @@ -802,7 +804,7 @@ "below": "Under" }, "label": "Oppføring", - "trigger": "Utløysar " + "trigger": "Utfør" }, "event": { "event_data": "TIlstandsdata", @@ -955,6 +957,7 @@ }, "cant_edit": "Du kan berre redigere element som er laga i brukargrensesnittet.", "caption": "Einingar", + "confirm_rename_entity_ids": "Vil du også endre ID-ane til oppføringane dine?", "data_table": { "area": "Område", "battery": "Batteri", @@ -965,7 +968,8 @@ "description": "Administrer tilkopla einingar", "device_info": "Einingsinfo ", "entities": { - "disabled_entities": "+{count} {count, plural,\n one {disabled entity}\n other {disabled entities}\n}", + "disabled_entities": "+{count} {count, plural,\n one {deaktivert oppføring}\n other {deaktiverte oppføringar}\n}", + "entities": "Oppføringar", "hide_disabled": "Skjul deaktiverte" }, "name": "Namn", @@ -989,8 +993,14 @@ "description": "Oversikt over alle kjende oppføringar.", "picker": { "header": "Oppføringsregisteret", + "headers": { + "entity_id": "Oppførings-ID", + "integration": "Integrasjon", + "name": "Namn" + }, "introduction": "Home Assistant har eit register over alle oppføringane den nokon gang har sett som kan unikt identifiserast. Kvar av desse oppføringane har ein eigen oppføringsidentifikasjon som er reservert for akkurat denne oppføringa.", - "introduction2": "Bruk oppføringsregisteret til å skrive over namn, endre oppføringsidentifikasjonane eller fjerne oppføringar frå Home Assistant. Merk deg at å fjerne oppføringa i oppføringregisteret ikkje fjernar sjølve oppføringa. For å gjere dette, gå vidare inn på linken under og fjern oppføringa i integrasjonssida." + "introduction2": "Bruk oppføringsregisteret til å skrive over namn, endre oppføringsidentifikasjonane eller fjerne oppføringar frå Home Assistant. Merk deg at å fjerne oppføringa i oppføringregisteret ikkje fjernar sjølve oppføringa. For å gjere dette, gå vidare inn på linken under og fjern oppføringa i integrasjonssida.", + "search": "Søk i oppføringar" } }, "filtering": { @@ -1012,8 +1022,8 @@ "delete": "Slett", "delete_confirm": "Er du sikker på at du vil slette denne integrasjonen?", "device_unavailable": "Eininga utilgjengelig", - "devices": "{count} {count, plural,\n one {device}\n other {devices}\n}", - "entities": "{count} {count, plural,\n one {entity}\n other {entities}\n}", + "devices": "{count} {count, plural,\n one {eining}\n other {einingar}\n}", + "entities": "{count} {count, plural,\n one {oppføring}\n other {oppføringar}\n}", "entity_unavailable": "Oppføringa utilgjengelig", "firmware": "Firmware: {version}", "hub": "Tilkopla via", @@ -1070,6 +1080,11 @@ }, "scene": { "editor": { + "entities": { + "add": "Legg til ei oppføring", + "delete": "Slett oppføring", + "header": "Oppføringar" + }, "icon": "Ikon" }, "picker": { @@ -1294,6 +1309,7 @@ "title": "Tenester" }, "states": { + "no_entities": "Ingen oppføringar", "title": "Statusar" }, "templates": { @@ -1361,7 +1377,8 @@ "required": "Påkrevd" }, "entities": { - "description": "Oppføringskortet er den vanlegaste korttypen. Den kan gruppere ting inn i lister." + "description": "Oppføringskortet er den vanlegaste korttypen. Den kan gruppere ting inn i lister.", + "name": "Oppføringar" }, "entity-filter": { "description": "Oppføringsfilterkortet let deg definere ei liste med oppføringar som du vil vise berre når dei har ein spesiell tilstand." @@ -1478,7 +1495,13 @@ }, "reload_lovelace": "Omlast Lovelace", "unused_entities": { - "domain": "Domene" + "domain": "Domene", + "entity": "Oppføring ", + "entity_id": "Oppførings-ID", + "last_changed": "Sist endra", + "no_data": "Ingen ubrukte oppføringar funne", + "search": "Søk i oppføringar", + "title": "Ubrukte oppføringar" }, "warning": { "entity_non_numeric": "Oppføringa er ikkje numerisk: {entity}", diff --git a/translations/frontend/pt.json b/translations/frontend/pt.json index 911e0e5131..e47bae1da7 100644 --- a/translations/frontend/pt.json +++ b/translations/frontend/pt.json @@ -1648,6 +1648,7 @@ }, "ozw": { "common": { + "node_id": "ID de nó", "ozw_instance": "Instância OpenZWave", "zwave": "Z-Wave" }, From 6835b73e4928778b3b9eba17b14af0014675df58 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Wed, 19 Aug 2020 00:33:28 +0000 Subject: [PATCH 031/300] [ci skip] Translation update --- translations/frontend/ca.json | 4 ++ translations/frontend/es.json | 31 ++++++++++++++ translations/frontend/fr.json | 22 ++++++++++ translations/frontend/fy.json | 69 +++++++++++++++++++++++++++++- translations/frontend/ko.json | 4 +- translations/frontend/lb.json | 68 ++++++++++++++++++++++++++++- translations/frontend/nb.json | 31 ++++++++++++++ translations/frontend/pt.json | 6 +++ translations/frontend/ru.json | 31 ++++++++++++++ translations/frontend/zh-Hans.json | 31 ++++++++++++++ 10 files changed, 292 insertions(+), 5 deletions(-) diff --git a/translations/frontend/ca.json b/translations/frontend/ca.json index cb4122cf4a..28184bc2eb 100644 --- a/translations/frontend/ca.json +++ b/translations/frontend/ca.json @@ -1656,6 +1656,10 @@ "node_failed": "Ha fallat el node", "stage": "Etapa", "zwave_info": "Informació Z-Wave" + }, + "refresh_node": { + "node_status": "Estat del node", + "step": "Pas" } }, "person": { diff --git a/translations/frontend/es.json b/translations/frontend/es.json index 6777ea2763..b7a8f86dba 100644 --- a/translations/frontend/es.json +++ b/translations/frontend/es.json @@ -1656,6 +1656,37 @@ "node_failed": "Error en el Nodo", "stage": "Etapa", "zwave_info": "Información Z-Wave" + }, + "node_query_stages": { + "associations": "Refrescando grupos de asociaciones y miembros", + "cacheload": "Cargando información del archivo de caché de OpenZWave. Los nodos con batería permanecerán en esta etapa hasta que el nodo se active.", + "complete": "El proceso de entrevista está completo", + "configuration": "Obteniendo valores de configuración del nodo", + "dynamic": "Obteniendo valores que cambian con frecuencia del nodo", + "instances": "Obteniendo detalles sobre qué instancias o canales admite un dispositivo", + "manufacturerspecific1": "Obteniendo del nodo los códigos de identificación de producto y del fabricante", + "manufacturerspecific2": "Obteniendo del nodo códigos de identificación de producto y del fabricante adicionales", + "neighbors": "Obteniendo una lista de los vecinos del nodo", + "nodeinfo": "Obteniendo clases de órdenes admitidas por el nodo", + "nodeplusinfo": "Obteniendo información Z-Wave+ del nodo", + "probe": "Comprobando si el nodo está despierto/vivo", + "protocolinfo": "Obteniendo las capacidades básicas de Z-Wave de este nodo desde el controlador", + "session": "Obteniendo valores que cambian con poca frecuencia del nodo", + "static": "Obteniendo valores estáticos del dispositivo", + "versions": "Obteniendo información sobre versiones de firmware y clases de órdenes", + "wakeup": "Configurando soporte para colas de despertador y mensajes" + }, + "refresh_node": { + "battery_note": "Si el nodo funciona con batería, asegúrate de despertarlo antes de continuar", + "complete": "Refresco del Nodo Finalizado", + "description": "Esto le indicará a OpenZWave que vuelva a entrevistar un nodo y actualice las clases de órdenes, las capacidades y los valores del mismo.", + "node_status": "Estado del Nodo", + "refreshing_description": "Refrescando la información del nodo ...", + "start_refresh_button": "Iniciar Refresco", + "step": "Paso", + "title": "Refrescar Información del Nodo", + "wakeup_header": "Instrucciones para despertar a", + "wakeup_instructions_source": "Las instrucciones para despertarlo se obtienen de la base de datos de dispositivos de la comunidad OpenZWave." } }, "person": { diff --git a/translations/frontend/fr.json b/translations/frontend/fr.json index dd5e569a1d..5a6dcc52ca 100644 --- a/translations/frontend/fr.json +++ b/translations/frontend/fr.json @@ -1656,6 +1656,28 @@ "node_failed": "Nœud Défaillant", "stage": "Étape", "zwave_info": "Informations Z-Wave" + }, + "node_query_stages": { + "associations": "Rafraîchissement les associations et les membres", + "cacheload": "Chargement des informations à partir du fichier de cache OpenZWave. Les nœuds de batterie resteront à cette étape jusqu'à ce que le nœud se réveille.", + "complete": "Le processus d'interrogation est terminé", + "configuration": "Obtention la configuration à partir du nœud", + "dynamic": "Obtention de valeurs fréquemment modifiées du nœud", + "neighbors": "Obtenir une liste des nœuds voisins", + "session": "Obtention de valeurs rarement modifiées du nœud", + "static": "Obtention des valeurs statiques de l'appareil" + }, + "refresh_node": { + "battery_note": "Si le nœud est alimenté par batterie, assurez-vous de l'activer avant de continuer", + "complete": "Actualisation du nœud terminée", + "description": "Cela indiquera à OpenZWave de réinterroger le nœud et de le mettre à jour (commandes, possibilités et valeurs).", + "node_status": "État du nœud", + "refreshing_description": "Rafraîchissement des informations sur le nœud...", + "start_refresh_button": "Démarrer l'actualisation", + "step": "Étape", + "title": "Actualiser les informations du nœud", + "wakeup_header": "Instructions de réveil pour", + "wakeup_instructions_source": "Les instructions de réveil proviennent de la base de données de la communauté OpenZWave." } }, "person": { diff --git a/translations/frontend/fy.json b/translations/frontend/fy.json index 119c6b7034..918eb995c3 100644 --- a/translations/frontend/fy.json +++ b/translations/frontend/fy.json @@ -15,6 +15,9 @@ } }, "state_badge": { + "alarm_control_panel": { + "armed_custom_bypass": "Ynskeakele" + }, "default": { "unknown": "Ûnbek." }, @@ -24,6 +27,10 @@ }, "state": { "alarm_control_panel": { + "armed": "Ynskeakele", + "armed_away": "Ynskeakele ôfwêzich", + "armed_home": "Ynskeakele thús", + "armed_night": "Ynskeakele nacht", "triggered": "Aktivearre" }, "automation": { @@ -86,6 +93,7 @@ }, "default": { "off": "Út", + "on": "Oan", "unavailable": "Net beskikber", "unknown": "Ûnbekend" }, @@ -137,10 +145,32 @@ } }, "ui": { + "card": { + "script": { + "cancel": "Annulearje", + "cancel_multiple": "Annulearje {number}" + }, + "timer": { + "actions": { + "cancel": "Annulearje" + } + }, + "weather": { + "attributes": { + "precipitation": "Delslach" + }, + "high": "Heech", + "low": "Leech" + } + }, "common": { + "cancel": "Annulearje", "loading": "Oan it laden" }, "dialogs": { + "generic": { + "cancel": "Annulearje" + }, "zha_device_info": { "zha_device_card": { "device_name_placeholder": "Feroarje apparaatnamme" @@ -173,6 +203,7 @@ "start": "Opstarte" }, "mqtt": { + "label": "MQTT", "payload": "Payload (opsjoneel)" }, "state": { @@ -181,6 +212,11 @@ } } } + }, + "picker": { + "headers": { + "name": "Namme" + } } }, "helpers": { @@ -200,8 +236,30 @@ } } }, + "mqtt": { + "title": "MQTT" + }, + "scene": { + "picker": { + "headers": { + "name": "Namme" + } + } + }, "script": { - "description": "Meitsje en bewurkje scripts" + "description": "Meitsje en bewurkje scripts", + "picker": { + "headers": { + "name": "Namme" + } + } + }, + "users": { + "picker": { + "headers": { + "name": "Namme" + } + } }, "zha": { "groups": { @@ -211,6 +269,9 @@ "zwave": { "node_config": { "config_value": "Konfiguraasje wearde" + }, + "services": { + "cancel_command": "Opdracht annulearje" } } }, @@ -228,10 +289,14 @@ "playback_title": "Berjocht ôfspylje" }, "profile": { + "dashboard": { + "dropdown_label": "Dashboard", + "header": "Dashboard" + }, "themes": { "dark_mode": { "dark": "Tsjuster", - "light": "ljocht" + "light": "Ljocht" }, "primary_color": "Primêre kleur" } diff --git a/translations/frontend/ko.json b/translations/frontend/ko.json index 0a74b9f1ea..f525c91cad 100644 --- a/translations/frontend/ko.json +++ b/translations/frontend/ko.json @@ -870,11 +870,11 @@ "label": "횟수" }, "until": { - "conditions": "~일 때 까지 (조건)", + "conditions": "~일 때 까지 조건", "label": "~일 때 까지" }, "while": { - "conditions": "~인 동안 (조건)", + "conditions": "~인 동안 조건", "label": "~인 동안" } } diff --git a/translations/frontend/lb.json b/translations/frontend/lb.json index 39803ff861..91c2754fc2 100644 --- a/translations/frontend/lb.json +++ b/translations/frontend/lb.json @@ -833,6 +833,15 @@ "name": "Aktioun", "type_select": "Aktioun Typ", "type": { + "choose": { + "add_option": "Optioun dobäisetzen", + "conditions": "Konditiounen", + "default": "Standard Aktiounen", + "label": "Auswielen", + "option": "Optioun {number}", + "remove_option": "Optioun läschen", + "sequence": "Aktiounen" + }, "condition": { "label": "Konditioun" }, @@ -852,6 +861,24 @@ "label": "Evenement starten", "service_data": "Service-Donnéeën" }, + "repeat": { + "label": "Widderhuelen", + "sequence": "Aktiounen", + "type_select": "Widderhuelen Typ", + "type": { + "count": { + "label": "Ziel" + }, + "until": { + "conditions": "Bis Konditiounen", + "label": "Bis" + }, + "while": { + "conditions": "Während Konditiounen", + "label": "Während" + } + } + }, "scene": { "label": "Zeen aktivéieren" }, @@ -1619,6 +1646,30 @@ "title": "MQTT", "topic": "Sujet" }, + "ozw": { + "common": { + "node_id": "Node ID", + "zwave": "Z-Wave" + }, + "node_query_stages": { + "complete": "Interview Prozess ass komplett", + "configuration": "Konfiguratiounswerter vum Node kréien", + "instances": "Detailer kréien iwwert wéieng Instanzen oder Kanäl en Apparat ënnerstëtzt", + "manufacturerspecific2": "Zousätzlech Hiersteller a Produkt ID Coden vum Node kréien", + "neighbors": "Eng Lëscht vun den Nopere vum Node kréien", + "static": "Statesch Wäerter vum Apparat kréien", + "versions": "Informatioun kréien iwwert Firmware a Kommando Klass Versiounen" + }, + "refresh_node": { + "complete": "Aktualiséierung vun den Node Informatioune komplett", + "node_status": "Status vum Node", + "refreshing_description": "Node Informatiounen aktualiséieren...", + "start_refresh_button": "Aktualiséierung starten", + "step": "Schrëtt", + "title": "Node Informatiounen aktualiséieren", + "wakeup_header": "Instruktioune fir d'erwäche vun" + } + }, "person": { "add_person": "Persoun dobäisetzen", "caption": "Persounen", @@ -2385,6 +2436,9 @@ "para_migrate": "Home Assistant kann ID's zu all äre Kaarten automatesch dobäisetzen andeem dir de Knäppche 'Konfiguratioun migréieren' dréckt.", "para_no_id": "Dëst Element huet keng ID. Definéiert w.e.g. eng ID fir dëst Element am 'ui-lovelace.yaml'." }, + "move_card": { + "header": "Vue auswielen wou d'Kaart geréckelt soll ginn." + }, "raw_editor": { "confirm_remove_config_text": "Mir erstellen automatesch är Lovelace Usiichte mat äre Beräicher an Apparaten wann dir är Lovelace Konfiguratioun läscht.", "confirm_remove_config_title": "Sécher fir är Lovelace Konfiguratioun ze läschen? Mir erstellen automatesch är Lovelace Usiichte mat äre Beräicher an Apparaten.", @@ -2412,6 +2466,10 @@ "yaml_control": "Fir d'Kontroll am YAML Modus z'iwwerhuelen, erstell ee YAML Fichier mam Numm deen an der Konfiguratioun vun dësem Tableau de Bord uginn ass, oder de Standard 'ui-lovelace.yaml'", "yaml_mode": "Du benotz de YAML Modus fir dësen Tableau de Bord, dëst bedeit dass du d'Lovelace Konfiguratioun net kanns aus dem Benotzer Interface änneren. Wann's du Lovelace vum Benotzer Interface aus wëlls änneren, läsch de 'mode: yaml' aus denger Lovelace Konfiguratioun am 'configuration.yaml'" }, + "select_view": { + "dashboard_label": "Tableau de Bord", + "header": "Vue auswielen" + }, "suggest_card": { "add": "Zu Lovelace bäisetzen", "create_own": "Aner Kaart auswielen", @@ -2729,10 +2787,18 @@ "header": "Verbindung autmatesch zoumaachen" }, "themes": { + "accent_color": "Faarf vum Accent", + "dark_mode": { + "auto": "Auto", + "dark": "Däischter", + "light": "Hell" + }, "dropdown_label": "Thema", "error_no_theme": "Keen Thema disponibel", "header": "Thema", - "link_promo": "Méi iwwert Thema liesen" + "link_promo": "Méi iwwert Thema liesen", + "primary_color": "Primär Faarf", + "reset": "Reset" }, "vibrate": { "description": "Vibratioun op dësem Apparat un oder ausschalte wann aner Apparater gesteiert ginn.", diff --git a/translations/frontend/nb.json b/translations/frontend/nb.json index 36496f4f21..6a5167233e 100644 --- a/translations/frontend/nb.json +++ b/translations/frontend/nb.json @@ -1656,6 +1656,37 @@ "node_failed": "Noden mislyktes", "stage": "Scene", "zwave_info": "Z-Wave Info" + }, + "node_query_stages": { + "associations": "Oppdatere tilknytningsgrupper og medlemskap", + "cacheload": "Laste inn informasjon fra Cachefilen for OpenZWave. Batterinoder vil bli på dette stadiet til noden våkner.", + "complete": "Intervjuprosessen er fullført", + "configuration": "Innhenting av konfigurasjonsverdier fra noden", + "dynamic": "Få ofte endrede verdier fra noden", + "instances": "Innhenting av detaljer om hvilke forekomster eller kanaler en enhet støtter", + "manufacturerspecific1": "Hente produsent- og produkt-ID-koder fra noden", + "manufacturerspecific2": "Hente flere produsent- og produkt-ID-koder fra noden", + "neighbors": "Få en liste over nodens naboer", + "nodeinfo": "Innhenting av støttede kommandoklasser fra noden", + "nodeplusinfo": "Innhenting av Z-Wave + informasjon fra noden", + "probe": "Kontrollere om noden er våken/levende", + "protocolinfo": "Få grunnleggende Z-Wave-funksjoner i denne noden fra kontrolleren", + "session": "\nFå sjelden endrede verdier fra noden", + "static": "Innhenting av statiske verdier fra enheten", + "versions": "Hente informasjon om fastvare- og kommandoklasseversjoner", + "wakeup": "Sette opp støtte for vekkingskøer og meldinger" + }, + "refresh_node": { + "battery_note": "Hvis noden er batteridrevet, må du passe på å vekke den før du fortsetter", + "complete": "Node oppdatering fullført", + "description": "Dette vil fortelle OpenZWave å re-intervjue en node og oppdatere nodens kommandoklasser, evner og verdier.", + "node_status": "Node-status", + "refreshing_description": "Oppdaterer nodeinformasjon...", + "start_refresh_button": "Start oppdatering", + "step": "Steg", + "title": "Oppdater nodeinformasjon", + "wakeup_header": "Wakeup Instruksjoner for", + "wakeup_instructions_source": "Wakeup-instruksjoner hentes fra OpenZWave-fellesskapets enhetsdatabase." } }, "person": { diff --git a/translations/frontend/pt.json b/translations/frontend/pt.json index e47bae1da7..06c63122e4 100644 --- a/translations/frontend/pt.json +++ b/translations/frontend/pt.json @@ -1655,6 +1655,12 @@ "device_info": { "node_failed": "Falha no nó", "zwave_info": "Informações sobre Z-Wave" + }, + "refresh_node": { + "node_status": "Estado do Nó", + "refreshing_description": "A atualizar as informações do nó ...", + "start_refresh_button": "Iniciar atualização", + "step": "Passo" } }, "person": { diff --git a/translations/frontend/ru.json b/translations/frontend/ru.json index 6abedb94c4..208f067158 100644 --- a/translations/frontend/ru.json +++ b/translations/frontend/ru.json @@ -1656,6 +1656,37 @@ "node_failed": "Ошибка узла", "stage": "Этап", "zwave_info": "Информация о Z-Wave" + }, + "node_query_stages": { + "associations": "Обновление ассоциативных групп и членства", + "cacheload": "Загрузка информации из кеш-файла OpenZWave. Узлы батареи останутся на этом этапе, пока узел не проснется.", + "complete": "Процесс интервьюирования завершен", + "configuration": "Получение значений конфигурации от узла", + "dynamic": "Получение часто меняющихся значений от узла", + "instances": "Получение сведений о том, какие экземпляры или каналы поддерживает устройство", + "manufacturerspecific1": "Получение идентификационных кодов производителя и продукта от узла", + "manufacturerspecific2": "Получение дополнительных кодов производителя и идентификатора продукта от узла", + "neighbors": "Получение списка соседних узлов", + "nodeinfo": "Получение поддерживаемых классов команд от узла", + "nodeplusinfo": "Получение информации Z-Wave+ от узла", + "probe": "Проверка активности узла", + "protocolinfo": "Получение базовых возможностей этого узла от контроллера", + "session": "Получение редко меняющихся значений от узла", + "static": "Получение статических значений от устройства", + "versions": "Получение информации о версиях прошивки и классов команд", + "wakeup": "Настройка поддержки очередей пробуждения и сообщений" + }, + "refresh_node": { + "battery_note": "Если узел работает от батареи, обязательно разбудите его, прежде чем продолжить", + "complete": "Обновление узла завершено", + "description": "Повторный опрос узла и обновление классов команд, возможностей и значений узла.", + "node_status": "Статус узла", + "refreshing_description": "Обновление информации об узле ...", + "start_refresh_button": "Начать обновление", + "step": "Шаг", + "title": "Обновить информацию об узле", + "wakeup_header": "Инструкции по пробуждению для", + "wakeup_instructions_source": "Инструкции по пробуждению взяты из базы данных устройств сообщества OpenZWave." } }, "person": { diff --git a/translations/frontend/zh-Hans.json b/translations/frontend/zh-Hans.json index d7ccb3da20..6f350d1bb0 100644 --- a/translations/frontend/zh-Hans.json +++ b/translations/frontend/zh-Hans.json @@ -1656,6 +1656,37 @@ "node_failed": "节点故障", "stage": "阶段", "zwave_info": "Z-Wave 信息" + }, + "node_query_stages": { + "associations": "正在刷新关联组和成员", + "cacheload": "正在从 OpenZWave 缓存文件加载信息。电池供电的节点将停留在此阶段,直到节点唤醒。", + "complete": "协商完成", + "configuration": "正在从节点获取配置值", + "dynamic": "正在从节点获取频繁更改的值", + "instances": "正在获取设备支持的实例或通道的详细信息", + "manufacturerspecific1": "正在从节点获取制造商和产品 ID 代码", + "manufacturerspecific2": "从节点获取附加制造商和产品 ID 代码", + "neighbors": "正在获取邻居节点的列表", + "nodeinfo": "正在从节点获取受支持的命令类", + "nodeplusinfo": "正在从节点获取 Z-Wave+ 信息", + "probe": "正在检查节点是否处于唤醒状态", + "protocolinfo": "正在从控制器获取此节点的基本 Z-Wave 功能", + "session": "正在从节点获取不经常更改的值", + "static": "正在从设备获取静态值", + "versions": "正在获取固件和命令类版本信息", + "wakeup": "正在设置对唤醒队列和消息的支持" + }, + "refresh_node": { + "battery_note": "如果节点由电池供电,请确保在继续操作之前将其唤醒", + "complete": "节点刷新完成", + "description": "这将通知 OpenZWave 重新访问节点并更新节点的命令类、功能和值。", + "node_status": "节点状态", + "refreshing_description": "正在刷新节点信息...", + "start_refresh_button": "开始刷新", + "step": "步骤", + "title": "刷新节点信息", + "wakeup_header": "唤醒方法:", + "wakeup_instructions_source": "唤醒方法来自 OpenZWave 社区设备数据库。" } }, "person": { From e352768388a48b15c4717594909600609aabb0b1 Mon Sep 17 00:00:00 2001 From: Zack Arnett Date: Wed, 19 Aug 2020 04:02:21 -0500 Subject: [PATCH 032/300] Save Config Dialog - Convert to MWC (#6590) --- .../lovelace/editor/hui-dialog-save-config.ts | 139 +++++++++--------- 1 file changed, 73 insertions(+), 66 deletions(-) diff --git a/src/panels/lovelace/editor/hui-dialog-save-config.ts b/src/panels/lovelace/editor/hui-dialog-save-config.ts index 83c46f3593..f056413258 100644 --- a/src/panels/lovelace/editor/hui-dialog-save-config.ts +++ b/src/panels/lovelace/editor/hui-dialog-save-config.ts @@ -1,6 +1,5 @@ import "@material/mwc-button"; -import "@polymer/paper-dialog-scrollable/paper-dialog-scrollable"; -import "../../../components/ha-circular-progress"; +import "@material/mwc-icon-button/mwc-icon-button"; import { css, CSSResult, @@ -9,25 +8,28 @@ import { LitElement, property, internalProperty, - query, TemplateResult, } from "lit-element"; +import { mdiHelpCircle } from "@mdi/js"; import { fireEvent } from "../../../common/dom/fire_event"; -import "../../../components/dialog/ha-paper-dialog"; -import type { HaPaperDialog } from "../../../components/dialog/ha-paper-dialog"; -import "../../../components/ha-switch"; -import "../../../components/ha-formfield"; -import "../../../components/ha-yaml-editor"; -import type { PolymerChangedEvent } from "../../../polymer-types"; import { haStyleDialog } from "../../../resources/styles"; import type { HomeAssistant } from "../../../types"; 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 { +export class HuiSaveConfig extends LitElement implements HassDialog { @property({ attribute: false }) public hass?: HomeAssistant; @internalProperty() private _params?: SaveDialogParams; @@ -36,18 +38,20 @@ export class HuiSaveConfig extends LitElement { @internalProperty() private _saving: boolean; - @query("ha-paper-dialog") private _dialog?: HaPaperDialog; - public constructor() { super(); this._saving = false; } - public async showDialog(params: SaveDialogParams): Promise { + public showDialog(params: SaveDialogParams): void { this._params = params; this._emptyConfig = false; - await this.updateComplete; - this._dialog!.open(); + } + + public closeDialog(): boolean { + this._params = undefined; + fireEvent(this, "dialog-closed", { dialog: this.localName }); + return true; } protected render(): TemplateResult { @@ -55,15 +59,27 @@ export class HuiSaveConfig extends LitElement { return html``; } return html` - + + + + `} > -

- ${this.hass!.localize("ui.panel.lovelace.editor.save_config.header")} -

- +

${this.hass!.localize("ui.panel.lovelace.editor.save_config.para")}

@@ -105,55 +121,46 @@ export class HuiSaveConfig extends LitElement {

`} - -
- ${this._params.mode === "storage" - ? html` - ${this.hass!.localize( - "ui.panel.lovelace.editor.save_config.cancel" - )} - - - - ${this.hass!.localize( - "ui.panel.lovelace.editor.save_config.save" - )} - - ` - : html` - ${this.hass!.localize( - "ui.panel.lovelace.editor.save_config.close" - )} - - `}
- + ${this._params.mode === "storage" + ? html` + ${this.hass!.localize( + "ui.panel.lovelace.editor.save_config.cancel" + )} + + + + ${this.hass!.localize( + "ui.panel.lovelace.editor.save_config.save" + )} + + ` + : html` + ${this.hass!.localize( + "ui.panel.lovelace.editor.save_config.close" + )} + + `} + `; } - private _closeDialog(): void { - this._dialog!.close(); - } - - private _openedChanged(ev: PolymerChangedEvent): void { - if (!ev.detail.value) { - this._params = undefined; + private _close(ev?: Event) { + if (ev) { + ev.stopPropagation(); } - } - - private _editorRefreshed() { - fireEvent(this._dialog! as HTMLElement, "iron-resize"); + this.closeDialog(); } private _emptyConfigChanged(ev) { @@ -172,7 +179,7 @@ export class HuiSaveConfig extends LitElement { ); lovelace.setEditMode(true); this._saving = false; - this._closeDialog(); + this.closeDialog(); } catch (err) { alert(`Saving failed: ${err.message}`); this._saving = false; From 0bc4b3d0faeac45111f5c82af96d0c801ca95516 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 19 Aug 2020 11:04:05 +0200 Subject: [PATCH 033/300] Adds theming and dark mode to code editor (#6547) --- src/components/ha-code-editor.ts | 101 +++++++++++++++++++++++++++++-- src/resources/styles.ts | 18 ++++++ 2 files changed, 113 insertions(+), 6 deletions(-) diff --git a/src/components/ha-code-editor.ts b/src/components/ha-code-editor.ts index aac917e31a..d4d74adef5 100644 --- a/src/components/ha-code-editor.ts +++ b/src/components/ha-code-editor.ts @@ -101,11 +101,6 @@ export class HaCodeEditor extends UpdatingElement { .CodeMirror-scroll { max-height: var(--code-mirror-max-height, --code-mirror-height); } - .CodeMirror-gutters { - border-right: 1px solid var(--paper-input-container-color, var(--secondary-text-color)); - background-color: var(--paper-dialog-background-color, var(--primary-background-color)); - transition: 0.2s ease border-right; - } :host(.error-state) .CodeMirror-gutters { border-color: var(--error-state-color, red); } @@ -113,7 +108,7 @@ export class HaCodeEditor extends UpdatingElement { border-right: 2px solid var(--paper-input-container-focus-color, var(--primary-color)); } .CodeMirror-linenumber { - color: var(--paper-dialog-color, var(--primary-text-color)); + color: var(--paper-dialog-color, var(--secondary-text-color)); } .rtl .CodeMirror-vscrollbar { right: auto; @@ -122,6 +117,100 @@ export class HaCodeEditor extends UpdatingElement { .rtl-gutter { width: 20px; } + .CodeMirror-gutters { + border-right: 1px solid var(--paper-input-container-color, var(--secondary-text-color)); + background-color: var(--paper-dialog-background-color, var(--primary-background-color)); + transition: 0.2s ease border-right; + } + .cm-s-default.CodeMirror { + background-color: var(--card-background-color); + color: var(--primary-text-color); + } + .cm-s-default .CodeMirror-cursor { + border-left: 1px solid var(--secondary-text-color); + } + + .cm-s-default div.CodeMirror-selected, .cm-s-default.CodeMirror-focused div.CodeMirror-selected { + background: rgba(var(--rgb-primary-color), 0.2); + } + + .cm-s-default .CodeMirror-line::selection, + .cm-s-default .CodeMirror-line>span::selection, + .cm-s-default .CodeMirror-line>span>span::selection { + background: rgba(var(--rgb-primary-color), 0.2); + } + + .cm-s-default .cm-keyword { + color: var(--codemirror-keyword, #6262FF); + } + + .cm-s-default .cm-operator { + color: var(--codemirror-operator, #cda869); + } + + .cm-s-default .cm-variable-2 { + color: var(--codemirror-variable-2, #690); + } + + .cm-s-default .cm-builtin { + color: var(--codemirror-builtin, #9B7536); + } + + .cm-s-default .cm-atom { + color: var(--codemirror-atom, #F90); + } + + .cm-s-default .cm-number { + color: var(--codemirror-number, #ca7841); + } + + .cm-s-default .cm-def { + color: var(--codemirror-def, #8DA6CE); + } + + .cm-s-default .cm-string { + color: var(--codemirror-string, #07a); + } + + .cm-s-default .cm-string-2 { + color: var(--codemirror-string-2, #bd6b18); + } + + .cm-s-default .cm-comment { + color: var(--codemirror-comment, #777); + } + + .cm-s-default .cm-variable { + color: var(--codemirror-variable, #07a); + } + + .cm-s-default .cm-tag { + color: var(--codemirror-tag, #997643); + } + + .cm-s-default .cm-meta { + color: var(--codemirror-meta, #000); + } + + .cm-s-default .cm-attribute { + color: var(--codemirror-attribute, #d6bb6d); + } + + .cm-s-default .cm-property { + color: var(--codemirror-property, #905); + } + + .cm-s-default .cm-qualifier { + color: var(--codemirror-qualifier, #690); + } + + .cm-s-default .cm-variable-3 { + color: var(--codemirror-variable-3, #07a); + } + + .cm-s-default .cm-type { + color: var(--codemirror-type, #07a); + } `; this.codemirror = codeMirror(shadowRoot, { diff --git a/src/resources/styles.ts b/src/resources/styles.ts index 316ccf77e1..89699a83a2 100644 --- a/src/resources/styles.ts +++ b/src/resources/styles.ts @@ -11,6 +11,24 @@ export const darkStyles = { "switch-unchecked-button-color": "#999999", "switch-unchecked-track-color": "#9b9b9b", "divider-color": "rgba(225, 225, 225, .12)", + "codemirror-keyword": "#C792EA", + "codemirror-operator": "#89DDFF", + "codemirror-variable": "#f07178", + "codemirror-variable-2": "#EEFFFF", + "codemirror-variable-3": "#DECB6B", + "codemirror-builtin": "#FFCB6B", + "codemirror-atom": "#F78C6C", + "codemirror-number": "#FF5370", + "codemirror-def": "#82AAFF", + "codemirror-string": "#C3E88D", + "codemirror-string-2": "#f07178", + "codemirror-comment": "#545454", + "codemirror-tag": "#FF5370", + "codemirror-meta": "#FFCB6B", + "codemirror-attribute": "#C792EA", + "codemirror-property": "#C792EA", + "codemirror-qualifier": "#DECB6B", + "codemirror-type": "#DECB6B", }; export const derivedStyles = { From f928a8e58e8cb4561b67f4a8fad138f51d3dad0d Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 19 Aug 2020 11:33:18 +0200 Subject: [PATCH 034/300] Add picture upload component (#6646) Co-authored-by: Bram Kragten --- package.json | 1 + src/components/ha-picture-upload.ts | 226 ++++++++++++++++++ src/data/image.ts | 54 +++++ src/data/person.ts | 2 + .../image-cropper-dialog.ts | 136 +++++++++++ .../show-image-cropper-dialog.ts | 30 +++ .../config/person/dialog-person-detail.ts | 33 ++- src/panels/config/person/ha-config-person.ts | 39 ++- src/state/connection-mixin.ts | 6 +- src/translations/en.json | 7 + yarn.lock | 11 +- 11 files changed, 532 insertions(+), 13 deletions(-) create mode 100644 src/components/ha-picture-upload.ts create mode 100644 src/data/image.ts create mode 100644 src/dialogs/image-cropper-dialog/image-cropper-dialog.ts create mode 100644 src/dialogs/image-cropper-dialog/show-image-cropper-dialog.ts diff --git a/package.json b/package.json index 47bf3b8ec9..f2fe5f1c72 100644 --- a/package.json +++ b/package.json @@ -85,6 +85,7 @@ "codemirror": "^5.49.0", "comlink": "^4.3.0", "cpx": "^1.5.0", + "cropperjs": "^1.5.7", "deep-clone-simple": "^1.1.1", "deep-freeze": "^0.0.1", "es6-object-assign": "^1.1.0", diff --git a/src/components/ha-picture-upload.ts b/src/components/ha-picture-upload.ts new file mode 100644 index 0000000000..411984d555 --- /dev/null +++ b/src/components/ha-picture-upload.ts @@ -0,0 +1,226 @@ +import "@material/mwc-icon-button/mwc-icon-button"; +import { mdiClose, mdiImagePlus } from "@mdi/js"; +import "@polymer/iron-input/iron-input"; +import "@polymer/paper-input/paper-input-container"; +import { + css, + customElement, + html, + internalProperty, + LitElement, + property, + PropertyValues, + TemplateResult, +} from "lit-element"; +import { classMap } from "lit-html/directives/class-map"; +import { fireEvent } from "../common/dom/fire_event"; +import { createImage, generateImageThumbnailUrl } from "../data/image"; +import { HomeAssistant } from "../types"; +import "./ha-circular-progress"; +import "./ha-svg-icon"; +import { + showImageCropperDialog, + CropOptions, +} from "../dialogs/image-cropper-dialog/show-image-cropper-dialog"; + +@customElement("ha-picture-upload") +export class HaPictureUpload extends LitElement { + public hass!: HomeAssistant; + + @property() public value: string | null = null; + + @property() public label?: string; + + @property({ type: Boolean }) public crop = false; + + @property({ attribute: false }) public cropOptions?: CropOptions; + + @property({ type: Number }) public size = 512; + + @internalProperty() private _error = ""; + + @internalProperty() private _uploading = false; + + @internalProperty() private _drag = false; + + protected updated(changedProperties: PropertyValues) { + if (changedProperties.has("_drag")) { + (this.shadowRoot!.querySelector( + "paper-input-container" + ) as any)._setFocused(this._drag); + } + } + + public render(): TemplateResult { + return html` + ${this._uploading + ? html`` + : html` + ${this._error ? html`
${this._error}
` : ""} + + `} + `; + } + + private _handleDrop(ev: DragEvent) { + ev.preventDefault(); + ev.stopPropagation(); + if (ev.dataTransfer?.files) { + if (this.crop) { + this._cropFile(ev.dataTransfer.files[0]); + } else { + this._uploadFile(ev.dataTransfer.files[0]); + } + } + this._drag = false; + } + + private _handleDragStart(ev: DragEvent) { + ev.preventDefault(); + ev.stopPropagation(); + this._drag = true; + } + + private _handleDragEnd(ev: DragEvent) { + ev.preventDefault(); + ev.stopPropagation(); + this._drag = false; + } + + private async _handleFilePicked(ev) { + if (this.crop) { + this._cropFile(ev.target.files[0]); + } else { + this._uploadFile(ev.target.files[0]); + } + } + + private async _cropFile(file: File) { + if (!["image/png", "image/jpeg", "image/gif"].includes(file.type)) { + this._error = this.hass.localize( + "ui.components.picture-upload.unsupported_format" + ); + return; + } + showImageCropperDialog(this, { + file, + options: this.cropOptions || { + round: false, + aspectRatio: NaN, + }, + croppedCallback: (croppedFile) => { + this._uploadFile(croppedFile); + }, + }); + } + + private async _uploadFile(file: File) { + if (!["image/png", "image/jpeg", "image/gif"].includes(file.type)) { + this._error = this.hass.localize( + "ui.components.picture-upload.unsupported_format" + ); + return; + } + this._uploading = true; + this._error = ""; + try { + const media = await createImage(this.hass, file); + this.value = generateImageThumbnailUrl(media.id, this.size); + fireEvent(this, "change"); + } catch (err) { + this._error = err.toString(); + } finally { + this._uploading = false; + } + } + + private _clearPicture(ev: Event) { + ev.preventDefault(); + this.value = null; + this._error = ""; + fireEvent(this, "change"); + } + + static get styles() { + return css` + .error { + color: var(--error-color); + } + paper-input-container { + position: relative; + padding: 8px; + margin: 0 -8px; + } + paper-input-container.dragged:before { + position: var(--layout-fit_-_position); + top: var(--layout-fit_-_top); + right: var(--layout-fit_-_right); + bottom: var(--layout-fit_-_bottom); + left: var(--layout-fit_-_left); + background: currentColor; + content: ""; + opacity: var(--dark-divider-opacity); + pointer-events: none; + border-radius: 4px; + } + img { + max-width: 125px; + max-height: 125px; + } + input.file { + display: none; + } + mwc-icon-button { + --mdc-icon-button-size: 24px; + --mdc-icon-size: 20px; + } + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + "ha-picture-upload": HaPictureUpload; + } +} diff --git a/src/data/image.ts b/src/data/image.ts new file mode 100644 index 0000000000..b81499f002 --- /dev/null +++ b/src/data/image.ts @@ -0,0 +1,54 @@ +import { HomeAssistant } from "../types"; + +interface Image { + filesize: number; + name: string; + uploaded_at: string; // isoformat date + content_type: string; + id: string; +} + +export interface ImageMutableParams { + name: string; +} + +export const generateImageThumbnailUrl = (mediaId: string, size: number) => + `/api/image/serve/${mediaId}/${size}x${size}`; + +export const fetchImages = (hass: HomeAssistant) => + hass.callWS({ type: "image/list" }); + +export const createImage = async ( + hass: HomeAssistant, + file: File +): Promise => { + const fd = new FormData(); + fd.append("file", file); + const resp = await hass.fetchWithAuth("/api/image/upload", { + method: "POST", + body: fd, + }); + if (resp.status === 413) { + throw new Error("Uploaded image is too large"); + } else if (resp.status !== 200) { + throw new Error("Unknown error"); + } + return await resp.json(); +}; + +export const updateImage = ( + hass: HomeAssistant, + id: string, + updates: Partial +) => + hass.callWS({ + type: "image/update", + media_id: id, + ...updates, + }); + +export const deleteImage = (hass: HomeAssistant, id: string) => + hass.callWS({ + type: "image/delete", + media_id: id, + }); diff --git a/src/data/person.ts b/src/data/person.ts index 00e77a838f..eb3b358729 100644 --- a/src/data/person.ts +++ b/src/data/person.ts @@ -5,12 +5,14 @@ export interface Person { name: string; user_id?: string; device_trackers?: string[]; + picture?: string; } export interface PersonMutableParams { name: string; user_id: string | null; device_trackers: string[]; + picture: string | null; } export const fetchPersons = (hass: HomeAssistant) => diff --git a/src/dialogs/image-cropper-dialog/image-cropper-dialog.ts b/src/dialogs/image-cropper-dialog/image-cropper-dialog.ts new file mode 100644 index 0000000000..ed9e3a05aa --- /dev/null +++ b/src/dialogs/image-cropper-dialog/image-cropper-dialog.ts @@ -0,0 +1,136 @@ +import "@material/mwc-button/mwc-button"; +import Cropper from "cropperjs"; +// @ts-ignore +import cropperCss from "cropperjs/dist/cropper.css"; +import { + css, + CSSResult, + customElement, + html, + internalProperty, + LitElement, + property, + PropertyValues, + query, + TemplateResult, + unsafeCSS, +} from "lit-element"; +import "../../components/ha-dialog"; +import { haStyleDialog } from "../../resources/styles"; +import type { HomeAssistant } from "../../types"; +import { HaImageCropperDialogParams } from "./show-image-cropper-dialog"; +import { classMap } from "lit-html/directives/class-map"; + +@customElement("image-cropper-dialog") +export class HaImagecropperDialog extends LitElement { + @property({ attribute: false }) public hass!: HomeAssistant; + + @internalProperty() private _params?: HaImageCropperDialogParams; + + @internalProperty() private _open = false; + + @query("img") private _image!: HTMLImageElement; + + private _cropper?: Cropper; + + public showDialog(params: HaImageCropperDialogParams): void { + this._params = params; + this._open = true; + } + + public closeDialog() { + this._open = false; + this._params = undefined; + this._cropper?.destroy(); + } + + protected updated(changedProperties: PropertyValues) { + if (!changedProperties.has("_params") || !this._params) { + return; + } + if (!this._cropper) { + this._image.src = URL.createObjectURL(this._params.file); + this._cropper = new Cropper(this._image, { + aspectRatio: this._params.options.aspectRatio, + viewMode: 1, + dragMode: "move", + minCropBoxWidth: 50, + ready: () => { + URL.revokeObjectURL(this._image!.src); + }, + }); + } else { + this._cropper.replace(URL.createObjectURL(this._params.file)); + } + } + + protected render(): TemplateResult { + return html` +
+ +
+ + ${this.hass.localize("ui.common.cancel")} + + + ${this.hass.localize("ui.dialogs.image_cropper.crop")} + +
`; + } + + private _cropImage() { + this._cropper!.getCroppedCanvas().toBlob( + (blob) => { + if (!blob) { + return; + } + const file = new File([blob], this._params!.file.name, { + type: this._params!.options.type || this._params!.file.type, + }); + this._params!.croppedCallback(file); + this.closeDialog(); + }, + this._params!.options.type || this._params!.file.type, + this._params!.options.quality + ); + } + + static get styles(): CSSResult[] { + return [ + haStyleDialog, + css` + ${unsafeCSS(cropperCss)} + .container { + max-width: 640px; + } + img { + max-width: 100%; + } + .container.round .cropper-view-box, + .container.round .cropper-face { + border-radius: 50%; + } + .cropper-line, + .cropper-point, + .cropper-point.point-se::before { + background-color: var(--primary-color); + } + `, + ]; + } +} + +declare global { + interface HTMLElementTagNameMap { + "image-cropper-dialog": HaImagecropperDialog; + } +} diff --git a/src/dialogs/image-cropper-dialog/show-image-cropper-dialog.ts b/src/dialogs/image-cropper-dialog/show-image-cropper-dialog.ts new file mode 100644 index 0000000000..3ca19001c8 --- /dev/null +++ b/src/dialogs/image-cropper-dialog/show-image-cropper-dialog.ts @@ -0,0 +1,30 @@ +import { fireEvent } from "../../common/dom/fire_event"; + +export interface CropOptions { + round: boolean; + type?: "image/jpeg" | "image/png"; + quality?: number; + aspectRatio: number; +} + +export interface HaImageCropperDialogParams { + file: File; + options: CropOptions; + croppedCallback: (file: File) => void; +} + +const loadImageCropperDialog = () => + import( + /* webpackChunkName: "image-cropper-dialog" */ "./image-cropper-dialog" + ); + +export const showImageCropperDialog = ( + element: HTMLElement, + dialogParams: HaImageCropperDialogParams +): void => { + fireEvent(element, "show-dialog", { + dialogTag: "image-cropper-dialog", + dialogImport: loadImageCropperDialog, + dialogParams, + }); +}; diff --git a/src/panels/config/person/dialog-person-detail.ts b/src/panels/config/person/dialog-person-detail.ts index b146cf4074..94c50807c1 100644 --- a/src/panels/config/person/dialog-person-detail.ts +++ b/src/panels/config/person/dialog-person-detail.ts @@ -10,6 +10,8 @@ import { 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/user/ha-user-picker"; @@ -18,9 +20,17 @@ import { PolymerChangedEvent } from "../../../polymer-types"; import { haStyleDialog } from "../../../resources/styles"; import { HomeAssistant } from "../../../types"; import { PersonDetailDialogParams } from "./show-dialog-person-detail"; +import { CropOptions } from "../../../dialogs/image-cropper-dialog/show-image-cropper-dialog"; const includeDomains = ["device_tracker"]; +const cropOptions: CropOptions = { + round: true, + type: "image/jpeg", + quality: 0.75, + aspectRatio: 1, +}; + class DialogPersonDetail extends LitElement { @property({ attribute: false }) public hass!: HomeAssistant; @@ -30,6 +40,8 @@ class DialogPersonDetail extends LitElement { @internalProperty() private _deviceTrackers!: string[]; + @internalProperty() private _picture!: string | null; + @internalProperty() private _error?: string; @internalProperty() private _params?: PersonDetailDialogParams; @@ -50,10 +62,12 @@ class DialogPersonDetail extends LitElement { this._name = this._params.entry.name || ""; this._userId = this._params.entry.user_id || undefined; this._deviceTrackers = this._params.entry.device_trackers || []; + this._picture = this._params.entry.picture || null; } else { this._name = ""; this._userId = undefined; this._deviceTrackers = []; + this._picture = null; } await this.updateComplete; } @@ -66,7 +80,7 @@ class DialogPersonDetail extends LitElement { return html` + + ) { + this._error = undefined; + this._picture = (ev.target as HaPictureUpload).value; + } + private async _updateEntry() { this._submitting = true; try { @@ -204,6 +231,7 @@ class DialogPersonDetail extends LitElement { name: this._name.trim(), device_trackers: this._deviceTrackers, user_id: this._userId || null, + picture: this._picture, }; if (this._params!.entry) { await this._params!.updateEntry(values); @@ -240,6 +268,9 @@ class DialogPersonDetail extends LitElement { .form { padding-bottom: 24px; } + ha-picture-upload { + display: block; + } ha-user-picker { margin-top: 16px; } diff --git a/src/panels/config/person/ha-config-person.ts b/src/panels/config/person/ha-config-person.ts index 94934fe200..764ae63b28 100644 --- a/src/panels/config/person/ha-config-person.ts +++ b/src/panels/config/person/ha-config-person.ts @@ -1,4 +1,4 @@ -import "@polymer/paper-item/paper-item"; +import "@polymer/paper-item/paper-icon-item"; import "@polymer/paper-item/paper-item-body"; import { css, @@ -32,6 +32,7 @@ import { } from "./show-dialog-person-detail"; import "../../../components/ha-svg-icon"; import { mdiPlus } from "@mdi/js"; +import { styleMap } from "lit-html/directives/style-map"; class HaConfigPerson extends LitElement { @property({ attribute: false }) public hass?: HomeAssistant; @@ -84,11 +85,20 @@ class HaConfigPerson extends LitElement { ${this._storageItems.map((entry) => { return html` - + + ${entry.picture + ? html`
` + : ""} ${entry.name} -
+ `; })} ${this._storageItems.length === 0 @@ -111,11 +121,20 @@ class HaConfigPerson extends LitElement { ${this._configItems.map((entry) => { return html` - + + ${entry.picture + ? html`
` + : ""} ${entry.name} -
+ `; })}
@@ -228,15 +247,21 @@ class HaConfigPerson extends LitElement { margin: 16px auto; overflow: hidden; } + .picture { + width: 40px; + height: 40px; + background-size: cover; + border-radius: 50%; + } .empty { text-align: center; padding: 8px; } - paper-item { + paper-icon-item { padding-top: 4px; padding-bottom: 4px; } - ha-card.storage paper-item { + ha-card.storage paper-icon-item { cursor: pointer; } `; diff --git a/src/state/connection-mixin.ts b/src/state/connection-mixin.ts index a5bb5daa2b..7af421029d 100644 --- a/src/state/connection-mixin.ts +++ b/src/state/connection-mixin.ts @@ -86,8 +86,10 @@ export const connectionMixin = >( }, callApi: async (method, path, parameters) => hassCallApi(auth, method, path, parameters), - fetchWithAuth: (path, init) => - fetchWithAuth(auth, `${auth.data.hassUrl}${path}`, init), + fetchWithAuth: ( + path: string, + init: Parameters[2] + ) => fetchWithAuth(auth, `${auth.data.hassUrl}${path}`, init), // For messages that do not get a response sendWS: (msg) => { if (__DEV__) { diff --git a/src/translations/en.json b/src/translations/en.json index 41f54a7386..cf43d60daa 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -299,6 +299,10 @@ "failed_create_area": "Failed to create area." } }, + "picture-upload": { + "label": "Picture", + "unsupported_format": "Unsupported format, please choose a JPEG, PNG or GIF image." + }, "date-range-picker": { "start_date": "Start date", "end_date": "End date", @@ -354,6 +358,9 @@ "default_confirmation_title": "Are you sure?", "close": "close" }, + "image_cropper": { + "crop": "Crop" + }, "more_info_control": { "dismiss": "Dismiss dialog", "settings": "Entity settings", diff --git a/yarn.lock b/yarn.lock index e6976c9b36..5fbc9e27ca 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1345,7 +1345,7 @@ "@babel/runtime" "^7.7.2" core-js "^3.4.1" -"@material/animation@8.0.0-canary.096a7a066.0", "@material/animation@8.0.0-canary.a78ceb112.0", "@material/animation@=8.0.0-canary.096a7a066.0": +"@material/animation@8.0.0-canary.096a7a066.0", "@material/animation@8.0.0-canary.a78ceb112.0": version "8.0.0-canary.096a7a066.0" resolved "https://registry.yarnpkg.com/@material/animation/-/animation-8.0.0-canary.096a7a066.0.tgz#9c1b3d31858889e04e722ca8f1ade7ae3c54f7e6" integrity sha512-hGL6sMGcyd9JoxcyhRkAhD6KKQwZVRkhaFcra9YMBYHUbWRxfUbfDTjUZ3ZxmLDDcsjL4Hqjblet6Xmtq3Br5g== @@ -1463,7 +1463,7 @@ "@material/feature-targeting" "8.0.0-canary.096a7a066.0" "@material/theme" "8.0.0-canary.096a7a066.0" -"@material/feature-targeting@8.0.0-canary.096a7a066.0", "@material/feature-targeting@8.0.0-canary.a78ceb112.0", "@material/feature-targeting@=8.0.0-canary.096a7a066.0": +"@material/feature-targeting@8.0.0-canary.096a7a066.0", "@material/feature-targeting@8.0.0-canary.a78ceb112.0": version "8.0.0-canary.096a7a066.0" resolved "https://registry.yarnpkg.com/@material/feature-targeting/-/feature-targeting-8.0.0-canary.096a7a066.0.tgz#fca721c287b08e0868467ee60daa5d32aad16430" integrity sha512-5nxnG08PjdwhrLMNxfeCOImbdEtP/bVveOVr72hdqldHuwfnzNjp0lwWAAh/QZrpJNl4Ve2Cnp/LkRnlOELIkw== @@ -1839,7 +1839,7 @@ "@material/typography" "8.0.0-canary.096a7a066.0" tslib "^1.9.3" -"@material/theme@8.0.0-canary.096a7a066.0", "@material/theme@8.0.0-canary.a78ceb112.0", "@material/theme@=8.0.0-canary.096a7a066.0": +"@material/theme@8.0.0-canary.096a7a066.0", "@material/theme@8.0.0-canary.a78ceb112.0": version "8.0.0-canary.096a7a066.0" resolved "https://registry.yarnpkg.com/@material/theme/-/theme-8.0.0-canary.096a7a066.0.tgz#f657eaa545797ee3e6a2d96e4a61f844ad3dc425" integrity sha512-FdAUEjq7KJ835sobJQL0w0XWD5PabXl77HmBuy5F3bEYbYterWOutvuHbTkAEN6sTzgHCKhdoMubRxMKidqafA== @@ -4782,6 +4782,11 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: safe-buffer "^5.0.1" sha.js "^2.4.8" +cropperjs@^1.5.7: + version "1.5.7" + resolved "https://registry.yarnpkg.com/cropperjs/-/cropperjs-1.5.7.tgz#b65019725bae1c6285e881fb661b2141fa57025b" + integrity sha512-sGj+G/ofKh+f6A4BtXLJwtcKJgMUsXYVUubfTo9grERiDGXncttefmue/fyQFvn8wfdyoD1KhDRYLfjkJFl0yw== + cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" From a0b28e8ad182a94f2ba75cdd8077a2a94a5574f6 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Thu, 20 Aug 2020 00:32:18 +0000 Subject: [PATCH 035/300] [ci skip] Translation update --- translations/frontend/cs.json | 4 +-- translations/frontend/el.json | 42 +++++++++++++++++++++++------- translations/frontend/en.json | 7 +++++ translations/frontend/lb.json | 20 ++++++++++++-- translations/frontend/zh-Hant.json | 31 ++++++++++++++++++++++ 5 files changed, 91 insertions(+), 13 deletions(-) diff --git a/translations/frontend/cs.json b/translations/frontend/cs.json index 6ec56b85ff..884e231eb2 100644 --- a/translations/frontend/cs.json +++ b/translations/frontend/cs.json @@ -1769,9 +1769,9 @@ "core": "Znovu načíst umístění a přizpůsobení", "group": "Znovu načíst skupiny", "heading": "Konfigurace se načítá", - "input_boolean": "Znovu načíst pomocníky - čísla", + "input_boolean": "Znovu načíst pomocníky - přepínače", "input_datetime": "Znovu načíst pomocníky - data/časy", - "input_number": "Znovu načíst pomocníky - přepínače", + "input_number": "Znovu načíst pomocníky - čísla", "input_select": "Znovu načíst pomocníky - výběry", "input_text": "Znovu načíst pomocníky - texty", "introduction": "Některé části Home Assistant lze načíst bez nutnosti restartování. Volba načtení zahodí jejich aktuální konfiguraci a načte novou.", diff --git a/translations/frontend/el.json b/translations/frontend/el.json index 10dd95d0cf..e2d9b9b2d6 100644 --- a/translations/frontend/el.json +++ b/translations/frontend/el.json @@ -658,7 +658,7 @@ }, "zha_device_info": { "buttons": { - "add": "Προσθήκη συσκευών", + "add": "Προσθήκη συσκευών μέσω αυτής της συσκευής", "clusters": "Διαχείριση συμπλεγμάτων", "reconfigure": "Ρυθμίστε Ξανά Τη Συσκευή", "remove": "Κατάργηση συσκευής", @@ -679,7 +679,7 @@ "unknown": "Άγνωστη", "zha_device_card": { "area_picker_label": "Περιοχή", - "device_name_placeholder": "Όνομα δοσμένο από τον χρήστη", + "device_name_placeholder": "Αλλαγή ονόματος συσκευής", "update_name_button": "Ενημέρωση ονόματος" } } @@ -729,7 +729,7 @@ "confirmation_text": "Όλες οι συσκευές αυτής της περιοχής θα καταστούν μη εκχωρημένες", "confirmation_title": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτή την περιοχή;" }, - "description": "Επισκόπηση όλων των περιοχών στο σπίτι σας.", + "description": "Διαχειριστείτε περιοχές στο σπίτι σας", "editor": { "area_id": "Αναγνωριστικό περιοχής", "create": "Δημιουργία", @@ -1027,7 +1027,7 @@ "cloud": { "account": { "alexa": { - "config_documentation": "Έγγραφα παραμετροποίησης", + "config_documentation": "Τεκμηρίωση παραμετροποίησης", "disable": "Απενεργοποίηση", "enable": "Ενεργοποίηση", "enable_ha_skill": "Ενεργοποιήστε την ικανότητα του Home Assistant για την Alexa", @@ -1489,6 +1489,28 @@ "node_failed": "Ο κόμβος απέτυχε", "stage": "Στάδιο", "zwave_info": "Πληροφορίες Z-Wave" + }, + "node_query_stages": { + "complete": "Η διαδικασία της συνέντευξης ολοκληρώθηκε", + "configuration": "Λήψη τιμών διαμόρφωσης από τον κόμβο", + "dynamic": "Λήψη τιμών που αλλάζουν συχνά από τον κόμβο", + "instances": "Λήψη λεπτομερειών σχετικά με τις παρουσίες ή τα κανάλια που υποστηρίζει μια συσκευή", + "neighbors": "Απόκτηση λίστας των γειτονικών κόμβων", + "probe": "Έλεγχος εάν ο κόμβος είναι ξύπνιος / ενεργός", + "session": "Λήψη σπάνια μεταβαλλόμενων τιμών από τον κόμβο", + "static": "Λήψη στατικών τιμών από τη συσκευή", + "versions": "Λήψη πληροφοριών σχετικά με εκδόσεις υλικολογισμικού και κλάσης εντολών", + "wakeup": "Ρύθμιση υποστήριξης για ουρές αφύπνισης και μηνύματα" + }, + "refresh_node": { + "battery_note": "Εάν ο κόμβος τροφοδοτείται με μπαταρία, φροντίστε να τον ενεργοποιήσετε πριν συνεχίσετε", + "complete": "Ολοκληρώθηκε η ανανέωση κόμβου", + "node_status": "Κατάσταση Κόμβου", + "refreshing_description": "Ανανέωση δεδομένων κόμβου σε εξέλιξη...", + "start_refresh_button": "Εναρξη Ανανέωσης", + "step": "Βήμα", + "title": "Ανανέωση πληροφοριών κόμβου", + "wakeup_header": "Οδηγίες εκκίνησης απο" } }, "person": { @@ -1520,7 +1542,7 @@ "scene": { "activated": "Ενεργοποιημένη σκηνή {name}.", "caption": "Σκηνές", - "description": "Δημιουργία και επεξεργασία σκηνών", + "description": "Διαχείρηση σκηνών", "editor": { "default_name": "Νέα σκηνή", "devices": { @@ -1815,10 +1837,12 @@ }, "node_management": { "add_to_group": "Προσθήκη σε ομάδα", + "exclude_entity": "Εξαίρεση αυτής της οντότητας από τον Home Assistant", "group": "Ομάδα", "header": "Διαχείριση κόμβων Z-Wave", "max_associations": "Μέγιστες ενώσεις:", "node_group_associations": "Κόμβοι συσχετίσεων ομάδων", + "node_protection": "Προστασία κόμβου", "node_to_control": "Κόμβος προς έλεγχο", "nodes_in_group": "Άλλοι κόμβοι σε αυτήν την ομάδα:", "protection": "Προστασία", @@ -2161,7 +2185,7 @@ "header": "Επεξεργασία περιβάλλοντος χρήστη", "menu": { "open": "Ανοίξτε το μενού Lovelace", - "raw_editor": "Επεξεργαστής ρυθμίσεων Raw" + "raw_editor": "Πρόγραμμα επεξεργασίας ρύθμισης παραμέτρων raw" }, "migrate": { "header": "Μη συμβατή διαμόρφωση", @@ -2190,13 +2214,13 @@ "cancel": "Δεν πειράζει", "empty_config": "Ξεκινήστε με μια κενή επισκόπηση", "header": "Πάρτε τον έλεγχο του περιβάλλοντος χρήστη στο Lovelace", - "para": "Από προεπιλογή, το Home Assistant θα διατηρήσει το περιβάλλον χρήστη που έχετε ενημερώνοντας το όταν θα γίνονται διαθέσιμες νέες οντότητες ή στοιχεία Lovelace. Αν πάρετε τον έλεγχο, δεν θα πραγματοποιούμε πλέον αλλαγές για εσάς.", + "para": "Ο πίνακας προεπισκόπησης διαχειρίζεται από το Home Assistant. Αυτό θα ενημερωθεί αυτόματα όταν νέες οντότητες ή στοιχεία διεπαφής Lovelace γίνουν διαθέσιμα. Αν αναλάβετε τον έλεγχο ο πίνακας προεπισκόπισης δεν θα ανανεώνεται αυτόματα. Μπορείτε οποιαδήποτε στιγμή να δημιουργήσετε νέο πίνακα προεπισκόπισης για να πειραματιστείτε", "para_sure": "Είστε βέβαιος ότι θέλετε να πάρετε τον έλεγχο του περιβάλλοντος χρήστη;", "save": "Πάρτε τον έλεγχο", "yaml_mode": "Χρησιμοποιείτε τη λειτουργία YAML για αυτόν τον πίνακα εργαλείων, πράγμα που σημαίνει ότι δεν μπορείτε να αλλάξετε τη διαμόρφωση Lovelace από το περιβάλλον εργασίας χρήστη. Εάν θέλετε να διαχειριστείτε αυτόν τον πίνακα εργαλείων από το περιβάλλον εργασίας χρήστη, καταργήστε το 'mode: yaml' από τη διαμόρφωση Lovelace στο 'configuration.yaml.'." }, "select_view": { - "dashboard_label": "Επισκόπηση", + "dashboard_label": "Πίνακας Επισκόπησης", "header": "Επιλέξτε μια προβολή" }, "suggest_card": { @@ -2426,7 +2450,7 @@ }, "profile": { "advanced_mode": { - "description": "εξειδικευμένη λειτουργία", + "description": "Ξεκλειδώνει προηγμένες δυνατότητες.", "link_promo": "Μάθετε περισσότερα", "title": "Εξειδικευμένη λειτουργία" }, diff --git a/translations/frontend/en.json b/translations/frontend/en.json index 7abcf52ea9..461f4c7471 100644 --- a/translations/frontend/en.json +++ b/translations/frontend/en.json @@ -554,6 +554,10 @@ "loading_history": "Loading state history...", "no_history_found": "No state history found." }, + "picture-upload": { + "label": "Picture", + "unsupported_format": "Unsupported format, please choose a JPEG, PNG or GIF image." + }, "related-items": { "area": "Area", "automation": "Part of the following automations", @@ -656,6 +660,9 @@ "required_error_msg": "This field is required", "yaml_not_editable": "The settings of this entity cannot be edited from the UI. Only entities set up from the UI are configurable from the UI." }, + "image_cropper": { + "crop": "Crop" + }, "more_info_control": { "dismiss": "Dismiss dialog", "edit": "Edit entity", diff --git a/translations/frontend/lb.json b/translations/frontend/lb.json index 91c2754fc2..c2f3ef2afc 100644 --- a/translations/frontend/lb.json +++ b/translations/frontend/lb.json @@ -1649,25 +1649,41 @@ "ozw": { "common": { "node_id": "Node ID", + "ozw_instance": "OpenZWave Instanz", "zwave": "Z-Wave" }, + "device_info": { + "node_failed": "Feeler am Node", + "stage": "Stage", + "zwave_info": "Z-Wave Info" + }, "node_query_stages": { + "associations": "Associatiounsgruppen a Memberen aktualiséieren", "complete": "Interview Prozess ass komplett", "configuration": "Konfiguratiounswerter vum Node kréien", "instances": "Detailer kréien iwwert wéieng Instanzen oder Kanäl en Apparat ënnerstëtzt", + "manufacturerspecific1": "Hiersteller a Produkt ID Code vum Node kréien", "manufacturerspecific2": "Zousätzlech Hiersteller a Produkt ID Coden vum Node kréien", "neighbors": "Eng Lëscht vun den Nopere vum Node kréien", + "nodeinfo": "Kommando Klassen vum Node kréien", + "nodeplusinfo": "Z-Wave+ Informatiounen vum Node kréien", + "probe": "Checken op de Node un ass", + "protocolinfo": "Basis Z-Wave Fäegkeeten fir dësem Node vum Kontroller kréien", "static": "Statesch Wäerter vum Apparat kréien", - "versions": "Informatioun kréien iwwert Firmware a Kommando Klass Versiounen" + "versions": "Informatioun kréien iwwert Firmware a Kommando Klass Versiounen", + "wakeup": "Ënnerstëtzung fir Erwäche Waardeschlaangen an Noriichten astellen" }, "refresh_node": { + "battery_note": "Falls den Node Batterie bedriwwen ass, stell sécher fir en z'erwächen iers de weiderfiers", "complete": "Aktualiséierung vun den Node Informatioune komplett", + "description": "Dëst befeelt OpenZWave fir en Node ofzefroen a Kommando Klassen, Fäegkeeten a Wäerter vum Node aktualiséieren.", "node_status": "Status vum Node", "refreshing_description": "Node Informatiounen aktualiséieren...", "start_refresh_button": "Aktualiséierung starten", "step": "Schrëtt", "title": "Node Informatiounen aktualiséieren", - "wakeup_header": "Instruktioune fir d'erwäche vun" + "wakeup_header": "Instruktioune fir d'erwäche vun", + "wakeup_instructions_source": "D'Instruktioune fir d'erwäche si vun der OpenZwave Communautéit Datebank." } }, "person": { diff --git a/translations/frontend/zh-Hant.json b/translations/frontend/zh-Hant.json index adc72e651f..300057102a 100644 --- a/translations/frontend/zh-Hant.json +++ b/translations/frontend/zh-Hant.json @@ -1656,6 +1656,37 @@ "node_failed": "節點失敗", "stage": "階段", "zwave_info": "Z-Wave 資訊" + }, + "node_query_stages": { + "associations": "更新相關群組與成員", + "cacheload": "由 OpenZwave 暫存檔載入資訊。電池供電節點將會保持此階段直到節點喚醒。", + "complete": "探訪過程完成", + "configuration": "由節點獲得設定值", + "dynamic": "由節點獲得頻率變更值", + "instances": "獲得設備或頻道支援的詳細資料", + "manufacturerspecific1": "由節點獲得製造廠商與產品 ID 代碼", + "manufacturerspecific2": "由節點獲得附加製造商與產品 ID 代碼", + "neighbors": "獲得節點週邊設備列表", + "nodeinfo": "由節點獲得支援命令 Class", + "nodeplusinfo": "由節點獲得 Z-Wave+ 資訊", + "probe": "檢查節點是否為喚醒狀態", + "protocolinfo": "由控制器獲得此節點基本 Z-Wave 相容性資訊", + "session": "由節點獲得非頻率變更值", + "static": "由設備獲得靜態值", + "versions": "獲得韌體與命令 Class 版本資訊", + "wakeup": "設定喚醒序列與訊息之支援" + }, + "refresh_node": { + "battery_note": "假如節點為電池供電、請確定先行喚醒以繼續", + "complete": "節點更新完成", + "description": "將會通知 OpenZWave 重新探訪節點並更新節點命令 Class、相容性與數值。", + "node_status": "節點狀態", + "refreshing_description": "正在更新節點資訊...", + "start_refresh_button": "開始更新", + "step": "階段", + "title": "更新節點資訊", + "wakeup_header": "喚醒說明", + "wakeup_instructions_source": "喚醒說明為來自 OpenZWave 社群的設備資料庫。" } }, "person": { From d7e409b042d1823a303f6271e23c99155c87f55d Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 20 Aug 2020 15:34:52 +0200 Subject: [PATCH 036/300] Add tag config panel (#6601) Co-authored-by: Bram Kragten --- src/data/automation.ts | 7 + src/data/tag.ts | 57 ++++ src/external_app/external_config.ts | 1 + .../trigger/ha-automation-trigger-row.ts | 2 + .../types/ha-automation-trigger-tag.ts | 72 +++++ src/panels/config/ha-panel-config.ts | 17 + src/panels/config/tags/dialog-tag-detail.ts | 209 +++++++++++++ src/panels/config/tags/ha-config-tags.ts | 293 ++++++++++++++++++ .../config/tags/show-dialog-tag-detail.ts | 27 ++ src/panels/config/tags/tag-image.ts | 93 ++++++ src/translations/en.json | 34 +- 11 files changed, 809 insertions(+), 3 deletions(-) create mode 100644 src/data/tag.ts create mode 100644 src/panels/config/automation/trigger/types/ha-automation-trigger-tag.ts create mode 100644 src/panels/config/tags/dialog-tag-detail.ts create mode 100644 src/panels/config/tags/ha-config-tags.ts create mode 100644 src/panels/config/tags/show-dialog-tag-detail.ts create mode 100644 src/panels/config/tags/tag-image.ts diff --git a/src/data/automation.ts b/src/data/automation.ts index b3e8d0b0f8..d4eaa843c7 100644 --- a/src/data/automation.ts +++ b/src/data/automation.ts @@ -90,6 +90,12 @@ export interface ZoneTrigger { event: "enter" | "leave"; } +export interface TagTrigger { + platform: "tag"; + tag_id: string; + device_id?: string; +} + export interface TimeTrigger { platform: "time"; at: string; @@ -116,6 +122,7 @@ export type Trigger = | TimePatternTrigger | WebhookTrigger | ZoneTrigger + | TagTrigger | TimeTrigger | TemplateTrigger | EventTrigger diff --git a/src/data/tag.ts b/src/data/tag.ts new file mode 100644 index 0000000000..870777f7cb --- /dev/null +++ b/src/data/tag.ts @@ -0,0 +1,57 @@ +import { HomeAssistant } from "../types"; +import { HassEventBase } from "home-assistant-js-websocket"; + +export const EVENT_TAG_SCANNED = "tag_scanned"; + +export interface TagScannedEvent extends HassEventBase { + event_type: "tag_scanned"; + data: { + tag_id: string; + device_id?: string; + }; +} + +export interface Tag { + id: string; + name?: string; + description?: string; + last_scanned?: string; +} + +export interface UpdateTagParams { + name?: Tag["name"]; + description?: Tag["description"]; +} + +export const fetchTags = async (hass: HomeAssistant) => + hass.callWS({ + type: "tag/list", + }); + +export const createTag = async ( + hass: HomeAssistant, + params: UpdateTagParams, + tagId?: string +) => + hass.callWS({ + type: "tag/create", + tag_id: tagId, + ...params, + }); + +export const updateTag = async ( + hass: HomeAssistant, + tagId: string, + params: UpdateTagParams +) => + hass.callWS({ + ...params, + type: "tag/update", + tag_id: tagId, + }); + +export const deleteTag = async (hass: HomeAssistant, tagId: string) => + hass.callWS({ + type: "tag/delete", + tag_id: tagId, + }); diff --git a/src/external_app/external_config.ts b/src/external_app/external_config.ts index 7651b1307b..d911ea2593 100644 --- a/src/external_app/external_config.ts +++ b/src/external_app/external_config.ts @@ -2,6 +2,7 @@ import { ExternalMessaging } from "./external_messaging"; export interface ExternalConfig { hasSettingsScreen: boolean; + canWriteTag: boolean; } export const getExternalConfig = ( diff --git a/src/panels/config/automation/trigger/ha-automation-trigger-row.ts b/src/panels/config/automation/trigger/ha-automation-trigger-row.ts index c88c644683..a50373bbc8 100644 --- a/src/panels/config/automation/trigger/ha-automation-trigger-row.ts +++ b/src/panels/config/automation/trigger/ha-automation-trigger-row.ts @@ -34,6 +34,7 @@ import "./types/ha-automation-trigger-time"; import "./types/ha-automation-trigger-time_pattern"; import "./types/ha-automation-trigger-webhook"; import "./types/ha-automation-trigger-zone"; +import "./types/ha-automation-trigger-tag"; import { ActionDetail } from "@material/mwc-list/mwc-list-foundation"; import { haStyle } from "../../../../resources/styles"; @@ -46,6 +47,7 @@ const OPTIONS = [ "mqtt", "numeric_state", "sun", + "tag", "template", "time", "time_pattern", diff --git a/src/panels/config/automation/trigger/types/ha-automation-trigger-tag.ts b/src/panels/config/automation/trigger/types/ha-automation-trigger-tag.ts new file mode 100644 index 0000000000..954e1ef144 --- /dev/null +++ b/src/panels/config/automation/trigger/types/ha-automation-trigger-tag.ts @@ -0,0 +1,72 @@ +import "@polymer/paper-input/paper-input"; +import { + customElement, + html, + LitElement, + property, + internalProperty, + PropertyValues, +} from "lit-element"; +import { TagTrigger } from "../../../../../data/automation"; +import { HomeAssistant } from "../../../../../types"; +import { TriggerElement } from "../ha-automation-trigger-row"; +import { Tag, fetchTags } from "../../../../../data/tag"; +import { fireEvent } from "../../../../../common/dom/fire_event"; + +@customElement("ha-automation-trigger-tag") +export class HaTagTrigger extends LitElement implements TriggerElement { + @property({ attribute: false }) public hass!: HomeAssistant; + + @property() public trigger!: TagTrigger; + + @internalProperty() private _tags: Tag[] = []; + + public static get defaultConfig() { + return { tag_id: "" }; + } + + protected firstUpdated(changedProperties: PropertyValues) { + super.firstUpdated(changedProperties); + this._fetchTags(); + } + + protected render() { + const { tag_id } = this.trigger; + return html` + + + ${this._tags.map( + (tag) => html` + + ${tag.name || tag.id} + + ` + )} + + + `; + } + + private async _fetchTags() { + this._tags = await fetchTags(this.hass); + } + + private _tagChanged(ev) { + fireEvent(this, "value-changed", { + value: { + ...this.trigger, + tag_id: ev.detail.item.tag.id, + }, + }); + } +} diff --git a/src/panels/config/ha-panel-config.ts b/src/panels/config/ha-panel-config.ts index 649e6168ae..dad0e22ee4 100644 --- a/src/panels/config/ha-panel-config.ts +++ b/src/panels/config/ha-panel-config.ts @@ -32,6 +32,7 @@ import { mdiInformation, mdiMathLog, mdiPencil, + mdiNfcVariant, } from "@mdi/js"; declare global { @@ -99,6 +100,15 @@ export const configSections: { [name: string]: PageNavigation[] } = { core: true, }, ], + experimental: [ + { + component: "tags", + path: "/config/tags", + translationKey: "ui.panel.config.tags.caption", + iconPath: mdiNfcVariant, + core: true, + }, + ], lovelace: [ { component: "lovelace", @@ -195,6 +205,13 @@ class HaPanelConfig extends HassRouterPage { /* webpackChunkName: "panel-config-automation" */ "./automation/ha-config-automation" ), }, + tags: { + tag: "ha-config-tags", + load: () => + import( + /* webpackChunkName: "panel-config-tags" */ "./tags/ha-config-tags" + ), + }, cloud: { tag: "ha-config-cloud", load: () => diff --git a/src/panels/config/tags/dialog-tag-detail.ts b/src/panels/config/tags/dialog-tag-detail.ts new file mode 100644 index 0000000000..f4edecf711 --- /dev/null +++ b/src/panels/config/tags/dialog-tag-detail.ts @@ -0,0 +1,209 @@ +import "@material/mwc-button"; +import "@polymer/paper-input/paper-input"; +import { + css, + CSSResult, + html, + LitElement, + property, + internalProperty, + TemplateResult, + customElement, +} from "lit-element"; +import { fireEvent } from "../../../common/dom/fire_event"; +import { createCloseHeading } from "../../../components/ha-dialog"; +import "../../../components/ha-switch"; +import "../../../components/ha-formfield"; +import "../../../components/map/ha-location-editor"; +import { haStyleDialog } from "../../../resources/styles"; +import { HomeAssistant } from "../../../types"; +import { HassDialog } from "../../../dialogs/make-dialog-manager"; +import { TagDetailDialogParams } from "./show-dialog-tag-detail"; +import { UpdateTagParams, Tag } from "../../../data/tag"; + +@customElement("dialog-tag-detail") +class DialogTagDetail extends LitElement implements HassDialog { + @property({ attribute: false }) public hass!: HomeAssistant; + + @internalProperty() private _id?: string; + + @internalProperty() private _name!: string; + + @internalProperty() private _error?: string; + + @internalProperty() private _params?: TagDetailDialogParams; + + @internalProperty() private _submitting = false; + + public showDialog(params: TagDetailDialogParams): void { + this._params = params; + this._error = undefined; + if (this._params.entry) { + this._name = this._params.entry.name || ""; + } else { + this._id = ""; + this._name = ""; + } + } + + public closeDialog(): void { + this._params = undefined; + fireEvent(this, "dialog-closed", { dialog: this.localName }); + } + + protected render(): TemplateResult { + if (!this._params) { + return html``; + } + + return html` + +
+ ${this._error ? html`
${this._error}
` : ""} +
+ ${this._params.entry + ? html`${this.hass!.localize( + "ui.panel.config.tags.detail.tag_id" + )}: + ${this._params.entry.id}` + : ""} + + ${!this._params.entry + ? html` ` + : ""} +
+
+ ${this._params.entry + ? html` + + ${this.hass!.localize("ui.panel.config.tags.detail.delete")} + + ` + : html``} + + ${this._params.entry + ? this.hass!.localize("ui.panel.config.tags.detail.update") + : this.hass!.localize("ui.panel.config.tags.detail.create")} + + ${this._params.openWrite && !this._params.entry + ? html` + ${this.hass!.localize( + "ui.panel.config.tags.detail.create_and_write" + )} + ` + : ""} +
+ `; + } + + private _valueChanged(ev: CustomEvent) { + const configValue = (ev.target as any).configValue; + + this._error = undefined; + this[`_${configValue}`] = ev.detail.value; + } + + private async _updateEntry() { + this._submitting = true; + let newValue: Tag | undefined; + try { + const values: UpdateTagParams = { + name: this._name.trim(), + }; + if (this._params!.entry) { + newValue = await this._params!.updateEntry!(values); + } else { + newValue = await this._params!.createEntry(values, this._id); + } + this._params = undefined; + } catch (err) { + this._error = err ? err.message : "Unknown error"; + } finally { + this._submitting = false; + } + return newValue; + } + + private async _updateWriteEntry() { + const tag = await this._updateEntry(); + if (!tag) { + return; + } + this._params?.openWrite!(tag); + } + + private async _deleteEntry() { + this._submitting = true; + try { + if (await this._params!.removeEntry!()) { + this._params = undefined; + } + } finally { + this._submitting = false; + } + } + + static get styles(): CSSResult[] { + return [ + haStyleDialog, + css` + a { + color: var(--primary-color); + } + `, + ]; + } +} + +declare global { + interface HTMLElementTagNameMap { + "dialog-tag-detail": DialogTagDetail; + } +} diff --git a/src/panels/config/tags/ha-config-tags.ts b/src/panels/config/tags/ha-config-tags.ts new file mode 100644 index 0000000000..8abdc49d13 --- /dev/null +++ b/src/panels/config/tags/ha-config-tags.ts @@ -0,0 +1,293 @@ +import "@material/mwc-fab"; +import { mdiCog, mdiContentDuplicate, mdiPlus, mdiRobot } from "@mdi/js"; +import { + customElement, + html, + internalProperty, + LitElement, + property, + PropertyValues, +} from "lit-element"; +import memoizeOne from "memoize-one"; +import { DataTableColumnContainer } from "../../../components/data-table/ha-data-table"; +import "../../../components/ha-card"; +import "../../../components/ha-relative-time"; +import { + createTag, + deleteTag, + EVENT_TAG_SCANNED, + fetchTags, + Tag, + TagScannedEvent, + updateTag, + UpdateTagParams, +} from "../../../data/tag"; +import { showConfirmationDialog } from "../../../dialogs/generic/show-dialog-box"; +import "../../../layouts/hass-tabs-subpage-data-table"; +import { SubscribeMixin } from "../../../mixins/subscribe-mixin"; +import { HomeAssistant, Route } from "../../../types"; +import { configSections } from "../ha-panel-config"; +import { showTagDetailDialog } from "./show-dialog-tag-detail"; +import "./tag-image"; +import { getExternalConfig } from "../../../external_app/external_config"; +import { showAutomationEditor, TagTrigger } from "../../../data/automation"; + +export interface TagRowData extends Tag { + last_scanned_datetime: Date | null; +} + +@customElement("ha-config-tags") +export class HaConfigTags extends SubscribeMixin(LitElement) { + @property({ attribute: false }) public hass!: HomeAssistant; + + @property() public isWide!: boolean; + + @property() public narrow!: boolean; + + @property() public route!: Route; + + @internalProperty() private _tags: Tag[] = []; + + @internalProperty() private _canWriteTags = false; + + private _columns = memoizeOne( + ( + narrow: boolean, + canWriteTags: boolean, + _language + ): DataTableColumnContainer => { + const columns: DataTableColumnContainer = { + icon: { + title: "", + type: "icon", + template: (_icon, tag) => html``, + }, + display_name: { + title: this.hass.localize("ui.panel.config.tags.headers.name"), + sortable: true, + filterable: true, + grows: true, + template: (name, tag: any) => html`${name} + ${narrow + ? html`
+ ${tag.last_scanned + ? html`` + : this.hass.localize("ui.components.relative_time.never")} +
` + : ""}`, + }, + }; + if (!narrow) { + columns.last_scanned_datetime = { + title: this.hass.localize( + "ui.panel.config.tags.headers.last_scanned" + ), + sortable: true, + direction: "desc", + width: "20%", + template: (last_scanned_datetime) => html` + ${last_scanned_datetime + ? html`` + : this.hass.localize("ui.components.relative_time.never")} + `, + }; + } + if (canWriteTags) { + columns.write = { + title: "", + type: "icon-button", + template: (_write, tag: any) => html` + this._openWrite((ev.currentTarget as any).tag)} + title=${this.hass.localize("ui.panel.config.tags.write")} + > + + `, + }; + } + columns.automation = { + title: "", + type: "icon-button", + template: (_automation, tag: any) => html` + this._createAutomation((ev.currentTarget as any).tag)} + title=${this.hass.localize("ui.panel.config.tags.create_automation")} + > + + `, + }; + columns.edit = { + title: "", + type: "icon-button", + template: (_settings, tag: any) => html` + this._openDialog((ev.currentTarget as any).tag)} + title=${this.hass.localize("ui.panel.config.tags.edit")} + > + + `, + }; + return columns; + } + ); + + private _data = memoizeOne((tags: Tag[]): TagRowData[] => { + return tags.map((tag) => { + return { + ...tag, + display_name: tag.name || tag.id, + last_scanned_datetime: tag.last_scanned + ? new Date(tag.last_scanned) + : null, + }; + }); + }); + + protected firstUpdated(changedProperties: PropertyValues) { + super.firstUpdated(changedProperties); + this._fetchTags(); + if (this.hass && this.hass.auth.external) { + getExternalConfig(this.hass.auth.external).then((conf) => { + this._canWriteTags = conf.canWriteTag; + }); + } + } + + protected hassSubscribe() { + return [ + this.hass.connection.subscribeEvents((ev) => { + const foundTag = this._tags.find((tag) => tag.id === ev.data.tag_id); + if (!foundTag) { + this._fetchTags(); + return; + } + foundTag.last_scanned = ev.time_fired; + this._tags = [...this._tags]; + }, EVENT_TAG_SCANNED), + ]; + } + + protected render() { + return html` + + + + + + `; + } + + private async _fetchTags() { + this._tags = await fetchTags(this.hass); + } + + private _openWrite(tag: Tag) { + this.hass.auth.external!.fireMessage({ + type: "tag/write", + payload: { name: tag.name || null, tag: tag.id }, + }); + } + + private _createAutomation(tag: Tag) { + const data = { + alias: this.hass.localize( + "ui.panel.config.tags.automation_title", + "name", + tag.name || tag.id + ), + trigger: [{ platform: "tag", tag_id: tag.id } as TagTrigger], + }; + showAutomationEditor(this, data); + } + + private _addTag() { + this._openDialog(); + } + + private _openDialog(entry?: Tag) { + showTagDetailDialog(this, { + entry, + openWrite: this._canWriteTags ? (tag) => this._openWrite(tag) : undefined, + createEntry: (values, tagId) => this._createTag(values, tagId), + updateEntry: entry + ? (values) => this._updateTag(entry, values) + : undefined, + removeEntry: entry ? () => this._removeTag(entry) : undefined, + }); + } + + private async _createTag( + values: Partial, + tagId?: string + ): Promise { + const newTag = await createTag(this.hass, values, tagId); + this._tags = [...this._tags, newTag]; + return newTag; + } + + private async _updateTag( + selectedTag: Tag, + values: Partial + ): Promise { + const updated = await updateTag(this.hass, selectedTag.id, values); + this._tags = this._tags.map((tag) => + tag.id === selectedTag.id ? updated : tag + ); + return updated; + } + + private async _removeTag(selectedTag: Tag) { + if ( + !(await showConfirmationDialog(this, { + title: "Remove tag?", + text: `Are you sure you want to remove tag ${ + selectedTag.name || selectedTag.id + }?`, + dismissText: this.hass!.localize("ui.common.no"), + confirmText: this.hass!.localize("ui.common.yes"), + })) + ) { + return false; + } + try { + await deleteTag(this.hass, selectedTag.id); + this._tags = this._tags.filter((tag) => tag.id !== selectedTag.id); + return true; + } catch (err) { + return false; + } + } +} + +declare global { + interface HTMLElementTagNameMap { + "ha-config-tags": HaConfigTags; + } +} diff --git a/src/panels/config/tags/show-dialog-tag-detail.ts b/src/panels/config/tags/show-dialog-tag-detail.ts new file mode 100644 index 0000000000..1088a0778c --- /dev/null +++ b/src/panels/config/tags/show-dialog-tag-detail.ts @@ -0,0 +1,27 @@ +import { fireEvent } from "../../../common/dom/fire_event"; +import { Tag, UpdateTagParams } from "../../../data/tag"; + +export interface TagDetailDialogParams { + entry?: Tag; + openWrite?: (tag: Tag) => void; + createEntry: ( + values: Partial, + tagId?: string + ) => Promise; + updateEntry?: (updates: Partial) => Promise; + removeEntry?: () => Promise; +} + +export const loadTagDetailDialog = () => + import(/* webpackChunkName: "dialog-tag-detail" */ "./dialog-tag-detail"); + +export const showTagDetailDialog = ( + element: HTMLElement, + systemLogDetailParams: TagDetailDialogParams +): void => { + fireEvent(element, "show-dialog", { + dialogTag: "dialog-tag-detail", + dialogImport: loadTagDetailDialog, + dialogParams: systemLogDetailParams, + }); +}; diff --git a/src/panels/config/tags/tag-image.ts b/src/panels/config/tags/tag-image.ts new file mode 100644 index 0000000000..c1b10ca86c --- /dev/null +++ b/src/panels/config/tags/tag-image.ts @@ -0,0 +1,93 @@ +import { + property, + customElement, + LitElement, + html, + CSSResult, + css, +} from "lit-element"; +import "../../../components/ha-svg-icon"; +import { mdiNfcVariant } from "@mdi/js"; +import { TagRowData } from "./ha-config-tags"; + +@customElement("tag-image") +export class HaTagImage extends LitElement { + @property() public tag?: TagRowData; + + private _timeout?: number; + + protected updated() { + const msSinceLastScaned = this.tag?.last_scanned_datetime + ? new Date().getTime() - this.tag.last_scanned_datetime.getTime() + : undefined; + + if (msSinceLastScaned && msSinceLastScaned < 1000) { + if (this._timeout) { + clearTimeout(this._timeout); + this._timeout = undefined; + this.classList.remove("just-scanned"); + requestAnimationFrame(() => this.classList.add("just-scanned")); + } else { + this.classList.add("just-scanned"); + } + this._timeout = window.setTimeout(() => { + this.classList.remove("just-scanned"); + this._timeout = undefined; + }, 10000); + } else if (!msSinceLastScaned || msSinceLastScaned > 10000) { + clearTimeout(this._timeout); + this._timeout = undefined; + this.classList.remove("just-scanned"); + } + } + + protected render() { + if (!this.tag) { + return html``; + } + return html`
+
+ +
+
`; + } + + static get styles(): CSSResult { + return css` + .image { + height: 100%; + width: 100%; + background-size: cover; + border-radius: 50%; + display: flex; + justify-content: center; + align-items: center; + } + .container { + height: 40px; + width: 40px; + border-radius: 50%; + } + :host(.just-scanned) .container { + animation: glow 10s; + } + @keyframes glow { + 0% { + box-shadow: 0px 0px 24px 0px rgba(var(--rgb-primary-color), 0); + } + 10% { + box-shadow: 0px 0px 24px 0px rgba(var(--rgb-primary-color), 1); + } + 100% { + box-shadow: 0px 0px 24px 0px rgba(var(--rgb-primary-color), 0); + } + } + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + "tag-image": HaTagImage; + } +} diff --git a/src/translations/en.json b/src/translations/en.json index cf43d60daa..6630adb0e6 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -601,6 +601,31 @@ "confirmation_text": "All devices in this area will become unassigned." } }, + "tags": { + "caption": "Tags", + "description": "Manage tags", + "no_tags": "No tags", + "add_tag": "Add tag", + "write": "Write", + "edit": "Edit", + "create_automation": "Create automation with tag", + "automation_title": "Tag {name} is scanned", + "headers": { + "name": "Name", + "last_scanned": "Last scanned" + }, + "detail": { + "new_tag": "New tag", + "name": "Name", + "description": "Description", + "tag_id": "Tag id", + "tag_id_placeholder": "Autogenerated when left empty", + "delete": "Delete", + "update": "Update", + "create": "Create", + "create_and_write": "Create and Write" + } + }, "helpers": { "caption": "Helpers", "description": "Manage elements that help build automations", @@ -878,7 +903,7 @@ "duplicate": "Duplicate", "delete": "[%key:ui::panel::mailbox::delete_button%]", "delete_confirm": "Are you sure you want to delete this?", - "unsupported_platform": "Unsupported platform: {platform}", + "unsupported_platform": "No UI support for platform: {platform}", "type_select": "Trigger type", "type": { "device": { @@ -933,6 +958,9 @@ "sunset": "Sunset", "offset": "Offset (optional)" }, + "tag": { + "label": "Tag" + }, "template": { "label": "Template", "value_template": "Value template" @@ -970,7 +998,7 @@ "duplicate": "[%key:ui::panel::config::automation::editor::triggers::duplicate%]", "delete": "[%key:ui::panel::mailbox::delete_button%]", "delete_confirm": "[%key:ui::panel::config::automation::editor::triggers::delete_confirm%]", - "unsupported_condition": "Unsupported condition: {condition}", + "unsupported_condition": "No UI support for condition: {condition}", "type_select": "Condition type", "type": { "and": { @@ -1035,7 +1063,7 @@ "duplicate": "[%key:ui::panel::config::automation::editor::triggers::duplicate%]", "delete": "[%key:ui::panel::mailbox::delete_button%]", "delete_confirm": "[%key:ui::panel::config::automation::editor::triggers::delete_confirm%]", - "unsupported_action": "Unsupported action: {action}", + "unsupported_action": "No UI support for action: {action}", "type_select": "Action type", "type": { "service": { From 3367fadc3a714191a71e034de2f342062d8a3d9d Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Thu, 20 Aug 2020 15:52:06 +0200 Subject: [PATCH 037/300] Bumped version to 20200820.0 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 289a8db76f..2c255baf5d 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name="home-assistant-frontend", - version="20200811.0", + version="20200820.0", description="The Home Assistant frontend", url="https://github.com/home-assistant/home-assistant-polymer", author="The Home Assistant Authors", From 7d05855ee027c49e4bf9891e435682c7ce07ca5e Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Fri, 21 Aug 2020 00:32:24 +0000 Subject: [PATCH 038/300] [ci skip] Translation update --- translations/frontend/en.json | 34 ++++++++++++++++++++++--- translations/frontend/es.json | 7 ++++++ translations/frontend/ko.json | 40 +++++++++++++++++++++++++++++- translations/frontend/lb.json | 8 ++++++ translations/frontend/nb.json | 7 ++++++ translations/frontend/pl.json | 38 ++++++++++++++++++++++++++++ translations/frontend/ru.json | 7 ++++++ translations/frontend/zh-Hans.json | 7 ++++++ 8 files changed, 144 insertions(+), 4 deletions(-) diff --git a/translations/frontend/en.json b/translations/frontend/en.json index 461f4c7471..a734befcf8 100644 --- a/translations/frontend/en.json +++ b/translations/frontend/en.json @@ -899,7 +899,7 @@ "wait_template": "Wait Template" } }, - "unsupported_action": "Unsupported action: {action}" + "unsupported_action": "No UI support for action: {action}" }, "alias": "Name", "conditions": { @@ -965,7 +965,7 @@ "zone": "Zone" } }, - "unsupported_condition": "Unsupported condition: {condition}" + "unsupported_condition": "No UI support for condition: {condition}" }, "default_name": "New Automation", "description": { @@ -1057,6 +1057,9 @@ "sunrise": "Sunrise", "sunset": "Sunset" }, + "tag": { + "label": "Tag" + }, "template": { "label": "Template", "value_template": "Value template" @@ -1084,7 +1087,7 @@ "zone": "Zone" } }, - "unsupported_platform": "Unsupported platform: {platform}" + "unsupported_platform": "No UI support for platform: {platform}" }, "unsaved_confirm": "You have unsaved changes. Are you sure you want to leave?" }, @@ -1850,6 +1853,31 @@ } } }, + "tags": { + "add_tag": "Add tag", + "automation_title": "Tag {name} is scanned", + "caption": "Tags", + "create_automation": "Create automation with tag", + "description": "Manage tags", + "detail": { + "create": "Create", + "create_and_write": "Create and Write", + "delete": "Delete", + "description": "Description", + "name": "Name", + "new_tag": "New tag", + "tag_id": "Tag id", + "tag_id_placeholder": "Autogenerated when left empty", + "update": "Update" + }, + "edit": "Edit", + "headers": { + "last_scanned": "Last scanned", + "name": "Name" + }, + "no_tags": "No tags", + "write": "Write" + }, "users": { "add_user": { "caption": "Add user", diff --git a/translations/frontend/es.json b/translations/frontend/es.json index b7a8f86dba..d1c32fc9ac 100644 --- a/translations/frontend/es.json +++ b/translations/frontend/es.json @@ -554,6 +554,10 @@ "loading_history": "Cargando historial de estado...", "no_history_found": "No se encontró historial de estado." }, + "picture-upload": { + "label": "Imagen", + "unsupported_format": "Formato no soportado, por favor, selecciona una imagen JPEG, PNG o GIF." + }, "related-items": { "area": "Área", "automation": "Parte de las siguientes automatizaciones", @@ -656,6 +660,9 @@ "required_error_msg": "Este campo es obligatorio", "yaml_not_editable": "La configuración de esta entidad no se puede editar desde la IU. Solo las entidades configuradas desde la IU se pueden configurar desde la IU" }, + "image_cropper": { + "crop": "Recortar" + }, "more_info_control": { "dismiss": "Descartar diálogo", "edit": "Editar entidad", diff --git a/translations/frontend/ko.json b/translations/frontend/ko.json index f525c91cad..0198e803e4 100644 --- a/translations/frontend/ko.json +++ b/translations/frontend/ko.json @@ -554,6 +554,10 @@ "loading_history": "상태 기록 내용 읽는 중...", "no_history_found": "상태 기록 내용이 없습니다." }, + "picture-upload": { + "label": "그림", + "unsupported_format": "지원되지 않는 형식입니다. JPEG, PNG 또는 GIF 이미지를 선택해주세요." + }, "related-items": { "area": "영역", "automation": "관련된 자동화", @@ -656,6 +660,9 @@ "required_error_msg": "이 입력란은 필수 요소입니다", "yaml_not_editable": "이 구성요소의 설정은 UI 에서 편집할 수 없습니다. UI 에서 설정한 구성요소만 UI 에서 구성할 수 있습니다." }, + "image_cropper": { + "crop": "자르기" + }, "more_info_control": { "dismiss": "대화창 닫기", "edit": "구성요소 편집", @@ -1656,6 +1663,37 @@ "node_failed": "노드 실패", "stage": "단계", "zwave_info": "Z-Wave 정보" + }, + "node_query_stages": { + "associations": "연결 그룹 및 구성원 자격 새로고침", + "cacheload": "OpenZWave 캐시 파일에서 정보를 읽어오기. 배터리 노드는 노드가 절전 해제 상태가 될 때까지 이 단계를 유지합니다.", + "complete": "인터뷰 과정이 완료되었습니다", + "configuration": "노드에서 구성 값 가져오기", + "dynamic": "노드에서 자주 변경되는 값 가져오기", + "instances": "기기가 지원하는 인스턴스 또는 채널에 대한 세부 정보 가져오기", + "manufacturerspecific1": "노드에서 제조업체 및 제품 ID 코드 가져오기", + "manufacturerspecific2": "노드에서 추가 제조업체 및 제품 ID 코드 가져오기", + "neighbors": "노드의 연관 항목 목록 가져오기", + "nodeinfo": "노드에서 지원되는 명령 클래스 가져오기", + "nodeplusinfo": "노드에서 Z-Wave+ 정보 가져오기", + "probe": "노드가 절전 해제 상태 또는 활성 상태인지 확인", + "protocolinfo": "컨트롤러에서 이 노드의 기본 Z-Wave 기능 가져오기", + "session": "노드에서 간헐적으로 변경되는 값 가져오기", + "static": "기기에서 정적 값 가져오기", + "versions": "펌웨어 및 명령 클래스 버전에 대한 정보 가져오기", + "wakeup": "절전 해제 대기열 및 메시지에 대한 지원 설정" + }, + "refresh_node": { + "battery_note": "노드가 배터리 전원을 사용하는 경우 계속하기 전에 절전 모드가 해제되어 있는지 확인해주세요", + "complete": "노드 새로고침 완료", + "description": "OpenZWave 가 노드를 다시 인터뷰하고 노드의 명령 클래스, 기능 및 값을 업데이트하도록 지시합니다.", + "node_status": "노드 상태", + "refreshing_description": "노드 정보를 새로고침 하는 중...", + "start_refresh_button": "새로고침 시작", + "step": "단계", + "title": "노드 정보 새로고침", + "wakeup_header": "절전 해제 지침", + "wakeup_instructions_source": "절전 해제 지침은 OpenZWave 커뮤니티 기기 데이터베이스에서 제공됩니다." } }, "person": { @@ -2272,7 +2310,7 @@ "minimum": "최소", "name": "이름", "no_theme": "테마 없음", - "refresh_interval": "새로 고침 간격", + "refresh_interval": "새로고침 간격", "search": "검색", "secondary_info_attribute": "보조 정보 속성", "show_icon": "아이콘 표시", diff --git a/translations/frontend/lb.json b/translations/frontend/lb.json index c2f3ef2afc..f3bc24879d 100644 --- a/translations/frontend/lb.json +++ b/translations/frontend/lb.json @@ -554,6 +554,10 @@ "loading_history": "Lued Status Verlaaf", "no_history_found": "Keen Status Verlaaf fonnt" }, + "picture-upload": { + "label": "Bild", + "unsupported_format": "Net ënnerstëtzte Format, wiel e JPEG, PNG oder GIF Bild." + }, "related-items": { "area": "Beräich", "automation": "Deel vun de folgenden Automatismen", @@ -656,6 +660,9 @@ "required_error_msg": "Dëst Feld ass erfuerderlech", "yaml_not_editable": "D'Astellunge vun dëser Entitéit kënnen net vun vum Benotzer Interface as geännert ginn. Nëmmen Entitéiten déi iwwer den Benotzer Interface aus konfiguréiert sinn kënnen vun do aus geännert ginn." }, + "image_cropper": { + "crop": "Kierzen" + }, "more_info_control": { "dismiss": "Dialog ofbriechen", "edit": "Entitéit änneren", @@ -1659,6 +1666,7 @@ }, "node_query_stages": { "associations": "Associatiounsgruppen a Memberen aktualiséieren", + "cacheload": "Lued Informatioune vun der OpenZWave Cache Datei. Batterie Nodes bleiwen op dëser Etapp bis de Node erwächt.", "complete": "Interview Prozess ass komplett", "configuration": "Konfiguratiounswerter vum Node kréien", "instances": "Detailer kréien iwwert wéieng Instanzen oder Kanäl en Apparat ënnerstëtzt", diff --git a/translations/frontend/nb.json b/translations/frontend/nb.json index 6a5167233e..aab4a1b4b1 100644 --- a/translations/frontend/nb.json +++ b/translations/frontend/nb.json @@ -554,6 +554,10 @@ "loading_history": "Laster statushistorikk...", "no_history_found": "Ingen statushistorikk funnet." }, + "picture-upload": { + "label": "Bilde", + "unsupported_format": "Formatet støttes ikke, vennligst velge et JPEG-, PNG- eller GIF-bilde." + }, "related-items": { "area": "Område", "automation": "Del av følgende automasjoner", @@ -656,6 +660,9 @@ "required_error_msg": "Dette feltet er påkrevd", "yaml_not_editable": "Innstillingene for denne entiteten kan ikke redigeres fra brukergrensesnittet. Bare entiteter som er satt opp fra brukergrensesnittet, kan konfigureres fra brukergrensesnittet." }, + "image_cropper": { + "crop": "Beskjære" + }, "more_info_control": { "dismiss": "Avvis dialogboksen", "edit": "Redigér entitet", diff --git a/translations/frontend/pl.json b/translations/frontend/pl.json index 3f772729ec..9e8fee8fe5 100644 --- a/translations/frontend/pl.json +++ b/translations/frontend/pl.json @@ -554,6 +554,10 @@ "loading_history": "Ładowanie historii...", "no_history_found": "Nie znaleziono historii." }, + "picture-upload": { + "label": "Obraz", + "unsupported_format": "Nieobsługiwany format, wybierz obraz JPEG, PNG lub GIF." + }, "related-items": { "area": "Obszar", "automation": "Element następujących automatyzacji", @@ -656,6 +660,9 @@ "required_error_msg": "To pole jest wymagane", "yaml_not_editable": "Ustawienia tej encji nie mogą być edytowane z interfejsu użytkownika. Tylko encje dodane z interfejsu użytkownika można konfigurować z poziomu interfejsu użytkownika." }, + "image_cropper": { + "crop": "Przytnij" + }, "more_info_control": { "dismiss": "Zamknij okno dialogowe", "edit": "Edytuj encję", @@ -1656,6 +1663,37 @@ "node_failed": "Węzeł uszkodzony", "stage": "Etap", "zwave_info": "Informacje Z-Wave" + }, + "node_query_stages": { + "associations": "Odświeżanie grup skojarzeń i członkostwa", + "cacheload": "Ładowanie informacji z pliku pamięci podręcznej OpenZWave. Węzły baterii pozostaną na tym etapie, dopóki węzeł się nie wybudzi.", + "complete": "Proces wywiadu jest zakończony", + "configuration": "Pobieranie wartości konfiguracyjnych z węzła", + "dynamic": "Pobieranie często zmieniających się wartości z węzła", + "instances": "Pobieranie szczegółowych informacji o instancjach lub kanałach obsługiwanych przez urządzenie", + "manufacturerspecific1": "Pobieranie kodów producenta i produktu z węzła", + "manufacturerspecific2": "Pobieranie dodatkowych kodów producenta i produktu z węzła", + "neighbors": "Pobieranie listy sąsiadów węzła", + "nodeinfo": "Pobieranie obsługiwanych klas poleceń z węzła", + "nodeplusinfo": "Pobieranie informacji Z-Wave+ z węzła", + "probe": "Sprawdzanie, czy węzeł jest wybudzony/żywy", + "protocolinfo": "Pobieranie z kontrolera informacji o podstawowych możliwościach Z-Wave tego węzła", + "session": "Pobieranie rzadko zmieniających się wartości z węzła", + "static": "Pobieranie wartości statycznych z urządzenia", + "versions": "Pobieranie informacji o wersjach oprogramowania i klas poleceń", + "wakeup": "Konfigurowanie obsługi kolejek wybudzania i wiadomości" + }, + "refresh_node": { + "battery_note": "Jeśli węzeł jest zasilany bateryjnie, przed kontynuowaniem należy go wybudzić", + "complete": "Odświeżanie węzła zakończone", + "description": "Poinformuje to OpenZWave o konieczności ponownego odpytania węzła i zaktualizowaniu jego klas poleceń, możliwości i wartości.", + "node_status": "Stan węzła", + "refreshing_description": "Odświeżanie informacji o węźle...", + "start_refresh_button": "Rozpocznij odświeżanie", + "step": "Krok", + "title": "Odświeżanie informacji o węźle", + "wakeup_header": "Instrukcje budzenia dla", + "wakeup_instructions_source": "Instrukcje budzenia pochodzą z bazy danych urządzeń społeczności OpenZWave." } }, "person": { diff --git a/translations/frontend/ru.json b/translations/frontend/ru.json index 208f067158..3c3bcc6a7a 100644 --- a/translations/frontend/ru.json +++ b/translations/frontend/ru.json @@ -554,6 +554,10 @@ "loading_history": "Загрузка истории...", "no_history_found": "История не найдена." }, + "picture-upload": { + "label": "Изображение", + "unsupported_format": "Неподдерживаемый формат. Выберите изображение в формате JPEG, PNG или GIF." + }, "related-items": { "area": "Помещение", "automation": "Используется в автоматизациях", @@ -656,6 +660,9 @@ "required_error_msg": "Обязательное поле", "yaml_not_editable": "Настройки этого объекта нельзя изменить из пользовательского интерфейса. Настраиваться из пользовательского интерфейса могут только те объекты, которые были созданы в нём." }, + "image_cropper": { + "crop": "Обрезать" + }, "more_info_control": { "dismiss": "Закрыть диалог", "edit": "Изменить объект", diff --git a/translations/frontend/zh-Hans.json b/translations/frontend/zh-Hans.json index 6f350d1bb0..cccea64731 100644 --- a/translations/frontend/zh-Hans.json +++ b/translations/frontend/zh-Hans.json @@ -554,6 +554,10 @@ "loading_history": "正在加载历史状态...", "no_history_found": "没有找到历史状态。" }, + "picture-upload": { + "label": "图片", + "unsupported_format": "格式不受支持,请选择 JPEG、PNG 或 GIF 图像。" + }, "related-items": { "area": "区域", "automation": "以下自动化的一部分", @@ -656,6 +660,9 @@ "required_error_msg": "此字段为必填字段", "yaml_not_editable": "无法从 UI 编辑此实体的设置。只有通过 UI 设置的实体可以从 UI 配置。" }, + "image_cropper": { + "crop": "剪裁" + }, "more_info_control": { "dismiss": "关闭对话框", "edit": "编辑实体", From 22210b740076fde3535f8f1cd22ff32f055557e5 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Fri, 21 Aug 2020 16:25:33 +0200 Subject: [PATCH 039/300] Clarify renaming entity ids (#6668) --- src/panels/config/devices/ha-config-device-page.ts | 12 ++++++++---- src/translations/en.json | 1 + 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/panels/config/devices/ha-config-device-page.ts b/src/panels/config/devices/ha-config-device-page.ts index ec2e67ea68..dbc73f7bf8 100644 --- a/src/panels/config/devices/ha-config-device-page.ts +++ b/src/panels/config/devices/ha-config-device-page.ts @@ -44,6 +44,7 @@ import "./device-detail/ha-device-entities-card"; import "./device-detail/ha-device-info-card"; import { showDeviceAutomationDialog } from "./device-detail/show-dialog-device-automation"; import { slugify } from "../../../common/string/slugify"; +import { showConfirmationDialog } from "../../../dialogs/generic/show-dialog-box"; export interface EntityRegistryStateEntry extends EntityRegistryEntry { stateName?: string | null; @@ -549,11 +550,14 @@ export class HaConfigDevicePage extends LitElement { const renameEntityid = this.showAdvanced && - confirm( - this.hass.localize( + (await showConfirmationDialog(this, { + title: this.hass.localize( "ui.panel.config.devices.confirm_rename_entity_ids" - ) - ); + ), + text: this.hass.localize( + "ui.panel.config.devices.confirm_rename_entity_ids_warning" + ), + })); const updateProms = entities.map((entity) => { const name = entity.name || entity.stateName; diff --git a/src/translations/en.json b/src/translations/en.json index 6630adb0e6..7b020a8164 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1421,6 +1421,7 @@ "scripts": "Scripts", "scenes": "Scenes", "confirm_rename_entity_ids": "Do you also want to rename the entity id's of your entities?", + "confirm_rename_entity_ids_warning": "This will not change any configuration (like automations, scripts, scenes, Lovelace) that is currently using these entities, you will have to update them yourself.", "data_table": { "device": "Device", "manufacturer": "Manufacturer", From 8f48f5b45cc981016751b304b6537a7462fc42f9 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Sat, 22 Aug 2020 00:32:43 +0000 Subject: [PATCH 040/300] [ci skip] Translation update --- translations/frontend/cs.json | 42 ++++++++++++++++++++++++++++-- translations/frontend/de.json | 8 +++--- translations/frontend/en.json | 1 + translations/frontend/es.json | 34 +++++++++++++++++++++--- translations/frontend/nb.json | 34 +++++++++++++++++++++--- translations/frontend/ru.json | 34 +++++++++++++++++++++--- translations/frontend/zh-Hant.json | 41 ++++++++++++++++++++++++++--- 7 files changed, 176 insertions(+), 18 deletions(-) diff --git a/translations/frontend/cs.json b/translations/frontend/cs.json index 884e231eb2..6986910f9b 100644 --- a/translations/frontend/cs.json +++ b/translations/frontend/cs.json @@ -554,6 +554,10 @@ "loading_history": "Historie stavu se načítá...", "no_history_found": "Historie stavu chybí." }, + "picture-upload": { + "label": "Obrázek", + "unsupported_format": "Nepodporovaný formát, prosím vyberte obrázek typu JPEG, PNG nebo GIF." + }, "related-items": { "area": "Oblast", "automation": "Část následujících automatizací", @@ -656,6 +660,9 @@ "required_error_msg": "Toto pole je povinné", "yaml_not_editable": "Nastavení této entity nelze upravovat z uživatelského rozhraní. Pouze entity nastavené z uživatelského rozhraní lze konfigurovat v uživatelském rozhraní." }, + "image_cropper": { + "crop": "Ořiznout" + }, "more_info_control": { "dismiss": "Zavřít dialog", "edit": "Upravit entitu", @@ -837,7 +844,7 @@ "add_option": "Přidat volbu", "conditions": "Podmínky", "default": "Výchozí akce", - "label": "Vybrat", + "label": "Volby", "option": "Volba {number}", "remove_option": "Odebrat volbu", "sequence": "Akce" @@ -862,7 +869,7 @@ "service_data": "Data služby" }, "repeat": { - "label": "Opakovat", + "label": "Opakovaní", "sequence": "Akce", "type_select": "Typ opakování", "type": { @@ -1042,6 +1049,9 @@ "sunrise": "Východ slunce", "sunset": "Západ slunce" }, + "tag": { + "label": "Značka" + }, "template": { "label": "Šablona", "value_template": "Šablona hodnoty" @@ -1641,6 +1651,9 @@ "ozw": { "common": { "zwave": "Z-Wave" + }, + "refresh_node": { + "step": "Krok" } }, "person": { @@ -1797,6 +1810,31 @@ } } }, + "tags": { + "add_tag": "Přidat značku", + "automation_title": "Značka {name} je naskenována", + "caption": "Značky", + "create_automation": "Vytvořit automatizaci se značkou", + "description": "Správa značek", + "detail": { + "create": "Vytvořit", + "create_and_write": "Vytvořit a zapsat", + "delete": "Smazat", + "description": "Popis", + "name": "Název", + "new_tag": "Nová značka", + "tag_id": "ID značky", + "tag_id_placeholder": "Automaticky vygenerováno, pokud zůstane prázdné", + "update": "Aktualizovat" + }, + "edit": "Upravit", + "headers": { + "last_scanned": "Naposledy naskenováno", + "name": "Název" + }, + "no_tags": "Žádné značky", + "write": "Zapsat" + }, "users": { "add_user": { "caption": "Přidat uživatele", diff --git a/translations/frontend/de.json b/translations/frontend/de.json index 130ade04c7..6bd1aa079d 100644 --- a/translations/frontend/de.json +++ b/translations/frontend/de.json @@ -57,7 +57,7 @@ "boost": "Boost", "comfort": "Komfort", "eco": "Eco", - "home": "Zu Hause", + "home": "Zuhause", "normal": "Normal", "sleep": "Schlafen" } @@ -96,7 +96,7 @@ "armed": "Aktiv", "armed_away": "Aktiv, abwesend", "armed_custom_bypass": "Aktiv, benutzerdefiniert", - "armed_home": "Aktiv, zu Hause", + "armed_home": "Aktiv, Zuhause", "armed_night": "Aktiv, Nacht", "arming": "Aktiviere", "disarmed": "Inaktiv", @@ -267,7 +267,7 @@ "standby": "Standby" }, "person": { - "home": "Zu Hause" + "home": "Zuhause" }, "plant": { "ok": "OK", @@ -2137,7 +2137,7 @@ "empty_state": { "go_to_integrations_page": "Gehe zur Integrationsseite.", "no_devices": "Auf dieser Seite können Sie Ihre Geräte steuern, es sieht jedoch so aus, als hätten Sie noch keine eingerichtet. Gehen Sie zur Integrationsseite, um damit zu beginnen.", - "title": "Willkommen zu Hause" + "title": "Willkommen Zuhause" }, "entities": { "never_triggered": "Nie ausgelöst" diff --git a/translations/frontend/en.json b/translations/frontend/en.json index a734befcf8..24b2f221a9 100644 --- a/translations/frontend/en.json +++ b/translations/frontend/en.json @@ -1337,6 +1337,7 @@ "caption": "Devices", "confirm_delete": "Are you sure you want to delete this device?", "confirm_rename_entity_ids": "Do you also want to rename the entity id's of your entities?", + "confirm_rename_entity_ids_warning": "This will not change any configuration (like automations, scripts, scenes, Lovelace) that is currently using these entities, you will have to update them yourself.", "data_table": { "area": "Area", "battery": "Battery", diff --git a/translations/frontend/es.json b/translations/frontend/es.json index d1c32fc9ac..87f4e15546 100644 --- a/translations/frontend/es.json +++ b/translations/frontend/es.json @@ -899,7 +899,7 @@ "wait_template": "Plantilla de espera" } }, - "unsupported_action": "Acción no admitida: {action}" + "unsupported_action": "No hay soporte en la IU para la acción: {action}" }, "alias": "Nombre", "conditions": { @@ -965,7 +965,7 @@ "zone": "Zona" } }, - "unsupported_condition": "Condición no admitida: {condition}" + "unsupported_condition": "No hay soporte en la IU para la condición: {condition}" }, "default_name": "Nueva automatización", "description": { @@ -1057,6 +1057,9 @@ "sunrise": "Amanecer", "sunset": "Puesta de sol" }, + "tag": { + "label": "Etiqueta" + }, "template": { "label": "Plantilla", "value_template": "Valor de la plantilla" @@ -1084,7 +1087,7 @@ "zone": "Zona" } }, - "unsupported_platform": "Plataforma no admitida: {platform}" + "unsupported_platform": "No hay soporte en la IU para la plataforma: {platform}" }, "unsaved_confirm": "Tienes cambios sin guardar. ¿Estás seguro de que quieres salir?" }, @@ -1850,6 +1853,31 @@ } } }, + "tags": { + "add_tag": "Añadir etiqueta", + "automation_title": "Se escanea la etiqueta {name}", + "caption": "Etiquetas", + "create_automation": "Crear automatización con etiqueta", + "description": "Administrar 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": "Última vez escaneada", + "name": "Nombre" + }, + "no_tags": "Sin etiquetas", + "write": "Escribir" + }, "users": { "add_user": { "caption": "Añadir usuario", diff --git a/translations/frontend/nb.json b/translations/frontend/nb.json index aab4a1b4b1..dacd48e75b 100644 --- a/translations/frontend/nb.json +++ b/translations/frontend/nb.json @@ -899,7 +899,7 @@ "wait_template": "Ventemal" } }, - "unsupported_action": "Ikke-støttet handling: {action}" + "unsupported_action": "Ingen brukergrensesnitt for handling: {action}" }, "alias": "Navn", "conditions": { @@ -965,7 +965,7 @@ "zone": "Sone" } }, - "unsupported_condition": "Ikke-støttet tilstand: {condition}" + "unsupported_condition": "Ingen brukergrensesnitt for bruk: {condition}" }, "default_name": "Ny automasjon", "description": { @@ -1057,6 +1057,9 @@ "sunrise": "Soloppgang", "sunset": "Solnedgang" }, + "tag": { + "label": "Tag" + }, "template": { "label": "Mal", "value_template": "Verdi mal" @@ -1084,7 +1087,7 @@ "zone": "Sone" } }, - "unsupported_platform": "Ikke-støttet plattform: {platform}" + "unsupported_platform": "Ingen UI-støtte for plattform: {platform}" }, "unsaved_confirm": "Du har ulagrede endringer. Er du sikker på at du vil lukke?" }, @@ -1850,6 +1853,31 @@ } } }, + "tags": { + "add_tag": "Legg til tag", + "automation_title": "Tag {name} skannes", + "caption": "Tags", + "create_automation": "Opprett automatisering med tag", + "description": "Administrer tagger", + "detail": { + "create": "Opprett", + "create_and_write": "Opprette og skrive", + "delete": "Slett", + "description": "Beskrivelse", + "name": "Navn", + "new_tag": "Ny tag", + "tag_id": "Tag id", + "tag_id_placeholder": "Automatisk generert når den er tom", + "update": "Oppdater" + }, + "edit": "Redigere", + "headers": { + "last_scanned": "Sist skannet", + "name": "Navn" + }, + "no_tags": "Ingen tagger", + "write": "Skrive" + }, "users": { "add_user": { "caption": "Legg til bruker", diff --git a/translations/frontend/ru.json b/translations/frontend/ru.json index 3c3bcc6a7a..5f5f1eb2c4 100644 --- a/translations/frontend/ru.json +++ b/translations/frontend/ru.json @@ -899,7 +899,7 @@ "wait_template": "Шаблон ожидания" } }, - "unsupported_action": "Неподдерживаемое действие: {action}" + "unsupported_action": "Отсутствует форма ввода для этого действия: {action}" }, "alias": "Название", "conditions": { @@ -965,7 +965,7 @@ "zone": "Зона" } }, - "unsupported_condition": "Неподдерживаемое условие: {condition}" + "unsupported_condition": "Отсутствует форма ввода для этого условия: {condition}" }, "default_name": "Новая автоматизация", "description": { @@ -1057,6 +1057,9 @@ "sunrise": "Восход", "sunset": "Закат" }, + "tag": { + "label": "Метка" + }, "template": { "label": "Шаблон", "value_template": "Значение шаблона" @@ -1084,7 +1087,7 @@ "zone": "Зона" } }, - "unsupported_platform": "Неподдерживаемая платформа: {platform}" + "unsupported_platform": "Отсутствует форма ввода для этой платформы: {platform}" }, "unsaved_confirm": "У вас есть несохраненные изменения. Вы уверены, что хотите выйти?" }, @@ -1850,6 +1853,31 @@ } } }, + "tags": { + "add_tag": "Добавить метку", + "automation_title": "Считана метка {name}", + "caption": "Метки", + "create_automation": "Создать автоматизацию с меткой", + "description": "Управление метками", + "detail": { + "create": "Добавить", + "create_and_write": "Добавить и записать", + "delete": "Удалить", + "description": "Описание", + "name": "Название", + "new_tag": "Новая метка", + "tag_id": "ID метки", + "tag_id_placeholder": "Если не указан, создается автоматически", + "update": "Обновить" + }, + "edit": "Изменить", + "headers": { + "last_scanned": "Последнее считывание", + "name": "Название" + }, + "no_tags": "Нет меток", + "write": "Записать" + }, "users": { "add_user": { "caption": "Добавить пользователя", diff --git a/translations/frontend/zh-Hant.json b/translations/frontend/zh-Hant.json index 300057102a..e542d910a0 100644 --- a/translations/frontend/zh-Hant.json +++ b/translations/frontend/zh-Hant.json @@ -554,6 +554,10 @@ "loading_history": "正在載入狀態歷史...", "no_history_found": "找不到狀態歷史。" }, + "picture-upload": { + "label": "照片", + "unsupported_format": "不支援的格式,請選擇 JPEG、PNG 或 GIF 圖檔。" + }, "related-items": { "area": "分區", "automation": "以下自動化部分", @@ -656,6 +660,9 @@ "required_error_msg": "必填欄位", "yaml_not_editable": "此物件的設定無法藉由 UI 編輯、僅有透過 UI 設定的物件可於 UI 進行設定。" }, + "image_cropper": { + "crop": "裁切" + }, "more_info_control": { "dismiss": "忽略對話", "edit": "編輯物件", @@ -892,7 +899,7 @@ "wait_template": "等待模板" } }, - "unsupported_action": "不支援的觸發動作: {action}" + "unsupported_action": "UI 介面不支援觸發動作:{action}" }, "alias": "名稱", "conditions": { @@ -958,7 +965,7 @@ "zone": "區域" } }, - "unsupported_condition": "不支援的觸發判斷: {condition}" + "unsupported_condition": "UI 介面不支援觸發判斷:{condition}" }, "default_name": "建立新的自動化", "description": { @@ -1050,6 +1057,9 @@ "sunrise": "日出", "sunset": "日落" }, + "tag": { + "label": "標籤" + }, "template": { "label": "模板", "value_template": "數值模板" @@ -1077,7 +1087,7 @@ "zone": "區域" } }, - "unsupported_platform": "不支持的平台: {platform}" + "unsupported_platform": "UI 介面不支援平台:{platform}" }, "unsaved_confirm": "設定尚未儲存,確定要放棄嗎?" }, @@ -1843,6 +1853,31 @@ } } }, + "tags": { + "add_tag": "新增標籤", + "automation_title": "標籤 {name} 已掃描", + "caption": "標籤", + "create_automation": "以標籤新增自動化", + "description": "管理標籤", + "detail": { + "create": "新增", + "create_and_write": "新增與編寫", + "delete": "刪除", + "description": "說明", + "name": "名稱", + "new_tag": "新標籤", + "tag_id": "標籤 ID", + "tag_id_placeholder": "空白時將自動產生", + "update": "更新" + }, + "edit": "編輯", + "headers": { + "last_scanned": "最後掃描時間", + "name": "名稱" + }, + "no_tags": "無標籤", + "write": "編寫" + }, "users": { "add_user": { "caption": "新增用戶", From 2d4bd9857ace6c0f5fcd718346bd520c4e94c204 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Sun, 23 Aug 2020 00:32:24 +0000 Subject: [PATCH 041/300] [ci skip] Translation update --- translations/frontend/cs.json | 3 +- translations/frontend/fr.json | 55 +++++++++++++++++++++++++++++++---- translations/frontend/ro.json | 53 ++++++++++++++++++++++++++++++++- translations/frontend/ru.json | 1 + 4 files changed, 105 insertions(+), 7 deletions(-) diff --git a/translations/frontend/cs.json b/translations/frontend/cs.json index 6986910f9b..a94228f0a4 100644 --- a/translations/frontend/cs.json +++ b/translations/frontend/cs.json @@ -661,7 +661,7 @@ "yaml_not_editable": "Nastavení této entity nelze upravovat z uživatelského rozhraní. Pouze entity nastavené z uživatelského rozhraní lze konfigurovat v uživatelském rozhraní." }, "image_cropper": { - "crop": "Ořiznout" + "crop": "Oříznout" }, "more_info_control": { "dismiss": "Zavřít dialog", @@ -1329,6 +1329,7 @@ "caption": "Zařízení", "confirm_delete": "Opravdu chcete toto zařízení odstranit?", "confirm_rename_entity_ids": "Chcete také přejmenovat ID entit vašich entit?", + "confirm_rename_entity_ids_warning": "Žádná konfigurace (např. automatizace, skripty, scény, Lovelace), která tyto entity aktuálně používá, nebude změněna. Budete je muset aktualizovat sami.", "data_table": { "area": "Oblast", "battery": "Baterie", diff --git a/translations/frontend/fr.json b/translations/frontend/fr.json index 5a6dcc52ca..e60b28d5d7 100644 --- a/translations/frontend/fr.json +++ b/translations/frontend/fr.json @@ -554,6 +554,10 @@ "loading_history": "Chargement de l'historique des valeurs ...", "no_history_found": "Aucun historique des valeurs trouvé." }, + "picture-upload": { + "label": "Image", + "unsupported_format": "Format non pris en charge, veuillez choisir une image JPEG, PNG ou GIF." + }, "related-items": { "area": "Pièce", "automation": "Partie des automatisations suivantes", @@ -656,6 +660,9 @@ "required_error_msg": "Ce champ est requis", "yaml_not_editable": "Les paramètres de cette entité ne peuvent pas être modifiés à partir de l'interface utilisateur. Seules les entités configurées à partir de l'interface utilisateur sont configurables à partir de l'interface utilisateur." }, + "image_cropper": { + "crop": "Recadrer" + }, "more_info_control": { "dismiss": "Fermer la fenêtre de dialogue", "edit": "Modifier l'entité", @@ -892,7 +899,7 @@ "wait_template": "Template d'attente" } }, - "unsupported_action": "Action non supportée : {action}" + "unsupported_action": "Pas d'interface utilisateur pour l'action : {action}" }, "alias": "Nom", "conditions": { @@ -958,7 +965,7 @@ "zone": "Zone" } }, - "unsupported_condition": "Condition non supportée: {condition}" + "unsupported_condition": "Pas d'interface utilisateur pour la condition : {condition}" }, "default_name": "Nouvelle automatisation", "description": { @@ -1050,6 +1057,9 @@ "sunrise": "Lever du soleil", "sunset": "Coucher du soleil" }, + "tag": { + "label": "Balise" + }, "template": { "label": "Template", "value_template": "Contenu du template" @@ -1077,7 +1087,7 @@ "zone": "Zone" } }, - "unsupported_platform": "Plateforme non supportée : {platform}" + "unsupported_platform": "Pas d'interface utilisateur pour la plateforme : {platform}" }, "unsaved_confirm": "Vous avez des changements non enregistrés. Êtes-vous sûr de vouloir quitter?" }, @@ -1327,6 +1337,7 @@ "caption": "Appareils", "confirm_delete": "Voulez-vous vraiment supprimer cet appareil ?", "confirm_rename_entity_ids": "Voulez-vous aussi renommer les ID de vos entités?", + "confirm_rename_entity_ids_warning": "Cela ne changera aucune configuration (comme les automatismes, les scripts, les scènes, Lovelace) qui utilise actuellement ces entités, vous devrez les mettre à jour vous-même.", "data_table": { "area": "Zone", "battery": "Batterie", @@ -1663,9 +1674,18 @@ "complete": "Le processus d'interrogation est terminé", "configuration": "Obtention la configuration à partir du nœud", "dynamic": "Obtention de valeurs fréquemment modifiées du nœud", + "instances": "Obtention des détails sur les instances ou les canaux pris en charge par un appareil", + "manufacturerspecific1": "Obtention des codes d'identification du fabricant et du produit auprès du nœud", + "manufacturerspecific2": "Obtention de codes d’identification supplémentaires du fabricant et du produit à partir du nœud", "neighbors": "Obtenir une liste des nœuds voisins", + "nodeinfo": "Obtention des classes de commande prises en charge à partir du nœud", + "nodeplusinfo": "Obtention d'informations Z-Wave + à partir du nœud", + "probe": "Vérification si le nœud est éveillé/vivant", + "protocolinfo": "Obtention des capacités Z-Wave de base de ce nœud à partir du contrôleur", "session": "Obtention de valeurs rarement modifiées du nœud", - "static": "Obtention des valeurs statiques de l'appareil" + "static": "Obtention des valeurs statiques de l'appareil", + "versions": "Obtention d'informations sur les versions des microprogrammes et des classes de commande", + "wakeup": "Configuration de la prise en charge des files d'attente et des messages de réveil" }, "refresh_node": { "battery_note": "Si le nœud est alimenté par batterie, assurez-vous de l'activer avant de continuer", @@ -1834,6 +1854,31 @@ } } }, + "tags": { + "add_tag": "Ajouter une balise", + "automation_title": "La balise {name} est analysée", + "caption": "Balises", + "create_automation": "Créer une automatisation avec une balise", + "description": "Gérer les balises", + "detail": { + "create": "Créer", + "create_and_write": "Créer et Ecrire", + "delete": "Supprimer", + "description": "Description", + "name": "Nom", + "new_tag": "Nouvelle balise", + "tag_id": "Id de balise", + "tag_id_placeholder": "Généré automatiquement lorsque laissé vide", + "update": "Mise à jour" + }, + "edit": "Modifier", + "headers": { + "last_scanned": "Dernière analyse", + "name": "Nom" + }, + "no_tags": "Aucunes balises", + "write": "Écrire" + }, "users": { "add_user": { "caption": "Ajouter un utilisateur", @@ -2497,7 +2542,7 @@ }, "menu": { "close": "Fermer", - "configure_ui": "Configurer l'interface utilisateur", + "configure_ui": "Modifier le tableau de bord", "exit_edit_mode": "Quitter le mode d'édition de l'interface utilisateur", "help": "Aide", "refresh": "Actualiser", diff --git a/translations/frontend/ro.json b/translations/frontend/ro.json index 8143847c60..b0bcdb48cd 100644 --- a/translations/frontend/ro.json +++ b/translations/frontend/ro.json @@ -804,6 +804,14 @@ "name": "Acțiune", "type_select": "Tip acțiune", "type": { + "choose": { + "add_option": "Adauga optiune", + "conditions": "Condiții", + "default": "Acţiuni implicite", + "label": "Alege", + "remove_option": "Elimina optiune", + "sequence": "Acţiuni" + }, "condition": { "label": "Condiție" }, @@ -822,6 +830,22 @@ "label": "Eveniment declansare", "service_data": "Date servicii" }, + "repeat": { + "label": "Repetaţi", + "sequence": "Acţiuni", + "type": { + "count": { + "label": "Numara" + }, + "until": { + "label": "Pana cand" + }, + "while": { + "conditions": "Condiții in timp ce", + "label": "In timp ce" + } + } + }, "service": { "label": "Cheama serviciu", "service_data": "Date serviciu" @@ -1398,6 +1422,18 @@ "title": "MQTT", "topic": "subiect" }, + "ozw": { + "common": { + "node_id": "ID Nod", + "ozw_instance": "Instanta OpenZWave", + "zwave": "Z-Wave" + }, + "device_info": { + "node_failed": "Nod nereușit", + "stage": "Etapă", + "zwave_info": "Z-Wave Info" + } + }, "person": { "caption": "Persoane", "description": "Gestionează persoanele pe care Home Assistant le urmărește.", @@ -2040,6 +2076,9 @@ "para_migrate": "Home Assistant poate adăuga ID-ul la toate cărțile și vizualizările în mod automat pentru tine apăsând butonul \"Migrează configurația\".", "para_no_id": "Acest element nu are un ID. Adăugați un ID la acest element în \"ui-lovelace.yaml\"." }, + "move_card": { + "header": "Alegeți o vedere pentru a muta cardul în" + }, "raw_editor": { "confirm_remove_config_text": "Vom genera automat vizualizările UI Lovelace cu zonele și dispozitivele dvs., dacă eliminați configurația UI Lovelace.", "confirm_remove_config_title": "Sigur eliminați configurația Ui Lovelace? Vom genera automat vizualizările UI Lovelace cu zonele și dispozitivele dvs.", @@ -2067,6 +2106,10 @@ "yaml_control": "Pentru a prelua controlul în modul YAML, creați un fișier YAML cu numele pe care l-ați specificat în configurația dvs. pentru acest tablou de bord sau implicit „ui-lovelace.yaml”.", "yaml_mode": "Utilizați modul YAML, ceea ce înseamnă că nu puteți modifica configurația Lovelace din UI. Dacă doriți să schimbați Lovelace din interfața de utilizator, eliminați „modul: yaml” din configurația dvs. Lovelace din „configuration.yaml”." }, + "select_view": { + "dashboard_label": "Tablou de bord", + "header": "Alegeți o vizualizare" + }, "suggest_card": { "add": "Adăugați la Lovelace UI", "create_own": "Alege alt card", @@ -2379,10 +2422,18 @@ "header": "Închideți automat conexiunea" }, "themes": { + "accent_color": "Culoare de accent", + "dark_mode": { + "auto": "Auto", + "dark": "Întuneric", + "light": "Lumina" + }, "dropdown_label": "Temă", "error_no_theme": "Nu există teme disponibile.", "header": "Temă", - "link_promo": "Aflați mai multe despre teme" + "link_promo": "Aflați mai multe despre teme", + "primary_color": "Culoare primară", + "reset": "Resetați" } }, "shopping-list": { diff --git a/translations/frontend/ru.json b/translations/frontend/ru.json index 5f5f1eb2c4..7f25c55495 100644 --- a/translations/frontend/ru.json +++ b/translations/frontend/ru.json @@ -1337,6 +1337,7 @@ "caption": "Устройства", "confirm_delete": "Вы уверены, что хотите удалить это устройство?", "confirm_rename_entity_ids": "Хотите ли Вы также переименовать идентификаторы объектов?", + "confirm_rename_entity_ids_warning": "Переименование повлечёт за собой необходимость вручную обновлять изменённые данные в правилах автоматизации, сценариях, сценах и пользовательском интерфейсе", "data_table": { "area": "Помещение", "battery": "Аккумулятор", From 026fc1d2e34c2aa25174137a0031a8eaee36ab24 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 23 Aug 2020 17:00:27 -0500 Subject: [PATCH 042/300] Show the entity id that first used the context in logbook --- src/data/logbook.ts | 2 ++ src/panels/logbook/ha-logbook.ts | 12 ++++++++++++ 2 files changed, 14 insertions(+) diff --git a/src/data/logbook.ts b/src/data/logbook.ts index fd79c87301..ac6f342f7b 100644 --- a/src/data/logbook.ts +++ b/src/data/logbook.ts @@ -7,6 +7,8 @@ export interface LogbookEntry { entity_id?: string; domain: string; context_user_id?: string; + context_entity_id?: string; + context_entity_id_name?: string; } const DATA_CACHE: { diff --git a/src/panels/logbook/ha-logbook.ts b/src/panels/logbook/ha-logbook.ts index 3fb8bf7a0c..d95ee7e156 100644 --- a/src/panels/logbook/ha-logbook.ts +++ b/src/panels/logbook/ha-logbook.ts @@ -118,6 +118,18 @@ class HaLogbook extends LitElement { ? ` (${item_username})` : ``} + ${!item.context_entity_id + ? "" + : html` + by + ${item.context_entity_id_name} + `}
From 1e477226ea3a9dc90d50306c460cbaeb712e7d45 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Mon, 24 Aug 2020 00:32:13 +0000 Subject: [PATCH 043/300] [ci skip] Translation update --- translations/frontend/cs.json | 8 ++ translations/frontend/es.json | 1 + translations/frontend/he.json | 67 ++++++++++++++ translations/frontend/lt.json | 144 +++++++++++++++++++++++++++-- translations/frontend/zh-Hant.json | 1 + 5 files changed, 214 insertions(+), 7 deletions(-) diff --git a/translations/frontend/cs.json b/translations/frontend/cs.json index a94228f0a4..1d8ef955dc 100644 --- a/translations/frontend/cs.json +++ b/translations/frontend/cs.json @@ -875,6 +875,14 @@ "type": { "count": { "label": "Počet" + }, + "until": { + "conditions": "Podmínky \"Dokud nenastane\"", + "label": "Dokud nenastane" + }, + "while": { + "conditions": "Podmínky \"Pokud platí\"", + "label": "Pokud platí" } } }, diff --git a/translations/frontend/es.json b/translations/frontend/es.json index 87f4e15546..921ef74f4c 100644 --- a/translations/frontend/es.json +++ b/translations/frontend/es.json @@ -1337,6 +1337,7 @@ "caption": "Dispositivos", "confirm_delete": "¿Estás seguro de que quieres eliminar este dispositivo?", "confirm_rename_entity_ids": "¿También quieres cambiar el nombre de los identificadores de entidad de tus entidades?", + "confirm_rename_entity_ids_warning": "Esto no cambiará ninguna configuración (como automatizaciones, scripts, escenas, Lovelace) que estén utilizando actualmente estas entidades, tendrá que actualizarlas usted mismo.", "data_table": { "area": "Área", "battery": "Batería", diff --git a/translations/frontend/he.json b/translations/frontend/he.json index 933e5bb3c8..1d7b6fe533 100644 --- a/translations/frontend/he.json +++ b/translations/frontend/he.json @@ -554,6 +554,10 @@ "loading_history": "טוען היסטוריה...", "no_history_found": "לא נמצאה היסטוריה" }, + "picture-upload": { + "label": "תמונה", + "unsupported_format": "פורמט לא נתמך, בחר תמונת JPEG, PNG או GIF." + }, "related-items": { "area": "אֵזוֹר", "automation": "חלק מהאוטומציות הבאות", @@ -656,6 +660,9 @@ "required_error_msg": "שדה זה הוא חובה", "yaml_not_editable": "אין אפשרות לערוך את ההגדרות של ישות זו מממשק המשתמש. רק ישויות שהוגדרו מממשק המשתמש ניתנות להגדרה מתוך ממשק המשתמש." }, + "image_cropper": { + "crop": "חתוך" + }, "more_info_control": { "dismiss": "סגור", "edit": "ערוך יישות", @@ -1050,6 +1057,9 @@ "sunrise": "זריחה", "sunset": "שקיעה" }, + "tag": { + "label": "תג " + }, "template": { "label": "תבנית", "value_template": "תבנית ערך" @@ -1327,6 +1337,7 @@ "caption": "התקנים", "confirm_delete": "האם אתה בטוח שברצונך למחוק מכשיר זה?", "confirm_rename_entity_ids": "האם אתה רוצה גם לשנות את המזהים של הישויות שלך?", + "confirm_rename_entity_ids_warning": "שינוי זה לא ישפיע על התצורה (כמו אוטומציות, קבצי Script, סצנות, Lovelace) המשתמשת כעת בישויות אלה, יהיה עליך לעדכן אותן בעצמך.", "data_table": { "area": "אזור", "battery": "סוללה", @@ -1656,6 +1667,37 @@ "node_failed": "הרכיב נכשל", "stage": "שלב", "zwave_info": "מידע Z-Wave" + }, + "node_query_stages": { + "associations": "מרענן קבוצות וחברויות", + "cacheload": "טוען מידע מקובץ המטמון של OpenZWave. רכיבי סוללה יישארו בשלב זה עד שהרכיב יתעורר.", + "complete": "תהליך הראיון הושלם", + "configuration": "מקבל ערכי תצורה מהרכיב", + "dynamic": "מקבל ערכים המשתנים לעתים קרובות מהרכיב", + "instances": "מקבל פרטים אודות המופעים או הערוצים שבהם הרכיב תומך", + "manufacturerspecific1": "קבלת קודי יצרן ומזהי מוצר מהרכיב", + "manufacturerspecific2": "מקבל קודי יצרן ומזהי מוצר נוספים מהרכיב", + "neighbors": "קבלת רשימת שכנים מהרכיב", + "nodeinfo": "קבלת מחלקות פקודות נתמכות מהרכיב", + "nodeplusinfo": "קבלת מידע Z-Wave+ מהרכיב", + "probe": "בדיקה האם הרכיב ער/חי", + "protocolinfo": "קבלת יכולות Z-Wave בסיסיות של רכיב זה מהבקר", + "session": "מקבל ערכים המשתנים לעתים רחוקות מהרכיב", + "static": "מקבל ערכים סטטיים מהרכיב", + "versions": "מקבל מידע אודות גירסאות קושחה ומחלקות פקודות", + "wakeup": "הגדרת תמיכה עבור תורי התעוררות והודעות" + }, + "refresh_node": { + "battery_note": "אם הרכיב מופעל באמצעות סוללה, הקפד להעיר אותו לפני שתמשיך", + "complete": "רענון הרכיב הושלם", + "description": "זה יגיד ל- OpenZWave לראיין מחדש את הרכיב ולעדכן את הפקודות, היכולות והערכים של הרכיב.", + "node_status": "מצה הרכיב", + "refreshing_description": "מרענן מידע על הרכיב", + "start_refresh_button": "התחל לרענן", + "step": "שלב", + "title": "רענן מידע הרכיב", + "wakeup_header": "הוראות התעוררות עבור", + "wakeup_instructions_source": "הוראות ההתעוררות מקורן במסד הנתונים של קהילת ה OpenZWave." } }, "person": { @@ -1812,6 +1854,31 @@ } } }, + "tags": { + "add_tag": "הוסף תג", + "automation_title": "התג {name} נסרק", + "caption": "תגים", + "create_automation": "צור אוטומציה עם תג", + "description": "ניהול תגים", + "detail": { + "create": "צור", + "create_and_write": "צור וכתוב", + "delete": "מחק", + "description": "תיאור", + "name": "שם", + "new_tag": "תג חדש", + "tag_id": "מזהה תג", + "tag_id_placeholder": "מחולל אוטומטית אם ריק", + "update": "עדכן" + }, + "edit": "ערוך", + "headers": { + "last_scanned": "נסרק לאחרונה", + "name": "שם" + }, + "no_tags": "אין תגים", + "write": "כתוב" + }, "users": { "add_user": { "caption": "הוסף משתמש", diff --git a/translations/frontend/lt.json b/translations/frontend/lt.json index 568dd51c70..95f47e7a3a 100644 --- a/translations/frontend/lt.json +++ b/translations/frontend/lt.json @@ -6,6 +6,7 @@ }, "panel": { "config": "Konfigūracija", + "developer_tools": "Kūrėjo įrankiai", "history": "Istorija", "logbook": "Veiksmų žurnalas", "mailbox": "Pašto dėžutė", @@ -17,6 +18,7 @@ "state_attributes": { "climate": { "fan_mode": { + "auto": "Auto", "off": "Išjungta", "on": "Įjungta" } @@ -40,9 +42,11 @@ "unknown": "Nžn" }, "device_tracker": { + "home": "Namai", "not_home": "Išvykęs" }, "person": { + "home": "Namai", "not_home": "Išvykęs" } }, @@ -61,6 +65,13 @@ "on": "Įjungta" }, "binary_sensor": { + "battery": { + "off": "Normalus", + "on": "Žemas" + }, + "cold": { + "on": "Šalta" + }, "connectivity": { "off": "Atsijungęs", "on": "Prisijungęs" @@ -81,6 +92,9 @@ "off": "Neaptikta", "on": "Aptikta" }, + "heat": { + "on": "Karšta" + }, "moisture": { "off": "Sausa", "on": "Šlapia" @@ -98,7 +112,12 @@ "on": "Atidaryta" }, "presence": { - "off": "Išvykęs" + "off": "Išvykęs", + "on": "Namai" + }, + "problem": { + "off": "Ok", + "on": "Problema" }, "safety": { "off": "Saugu", @@ -131,21 +150,44 @@ "streaming": "Transliuojama" }, "climate": { + "cool": "Šaltas", + "dry": "Sausa", + "fan_only": "Tik ventiliatorius", + "heat": "Šiluma", "off": "Išjungta" }, + "configurator": { + "configure": "Konfigūruoti", + "configured": "Sukonfigūruotas" + }, + "cover": { + "closed": "Uždarytas", + "closing": "Uždarymas", + "open": "Atidarytas", + "opening": "Atidarymas", + "stopped": "Sustabdytas" + }, "default": { "unavailable": "(nepasiekiamas)", "unknown": "Nežinoma" }, + "device_tracker": { + "not_home": "Išvykęs" + }, "fan": { "off": "Išjungta", "on": "Įjungta" }, "group": { + "closing": "Uždarymas", + "home": "Namai", "not_home": "Išvykęs", "off": "Išjungta", "ok": "Ok", - "on": "Įjungta" + "on": "Įjungta", + "open": "Atidarytas", + "stopped": "Sustabdytas", + "unlocked": "Atrakinta" }, "input_boolean": { "on": "Įjungta" @@ -154,9 +196,17 @@ "off": "Išjungta", "on": "Įjungta" }, + "lock": { + "locked": "Užrakintas", + "unlocked": "Atrakinta" + }, "media_player": { + "idle": "Laukimo režimas", "off": "Išjungta", - "on": "Įjungta" + "on": "Įjungta", + "paused": "pristabdytas", + "playing": "Groja", + "standby": "Laukimo" }, "person": { "home": "Namuose" @@ -173,6 +223,9 @@ "off": "Išjungta", "on": "Įjungta" }, + "sun": { + "above_horizon": "Virš horizonto" + }, "switch": { "off": "Išjungta", "on": "Įjungta" @@ -200,6 +253,12 @@ "alarm_control_panel": { "arm_custom_bypass": "Individualizuotas apėjimas" }, + "camera": { + "not_available": "Vaizdas negalimas" + }, + "persistent_notification": { + "dismiss": "Atmesti" + }, "weather": { "attributes": { "air_pressure": "Atmosferos slėgis", @@ -221,6 +280,8 @@ } }, "common": { + "cancel": "Atšaukti", + "loading": "Pakrovimas", "save": "Išsaugoti" }, "components": { @@ -250,6 +311,11 @@ "second": "{count} {count, plural,\n one {sekundė}\n other {sekundės}\n}", "week": "{count} {count, plural,\n one {savaitė}\n other {savaitės}\n}" }, + "login-form": { + "log_in": "Prisijungti", + "password": "Slaptažodis", + "remember": "Prisiminti" + }, "notification_drawer": { "close": "Uždaryti" }, @@ -328,10 +394,20 @@ "edit_ui": "Redaguoti naudojant vartotojo sąsają", "edit_yaml": "Redaguoti kaip YAML", "triggers": { + "add": "Pridėti trigerį", "delete": "Ištrinti", + "delete_confirm": "Ar tikrai norite tai ištrinti?", + "duplicate": "Pasikartojantys", + "introduction": "Trigeriai yra tai, kas pradeda automatizavimo taisyklės apdorojimą. Tai pačiai taisyklei galima nurodyti kelis aktyviklius. Kai tik įsijungs trigeris, Home Assistant patikrins sąlygas, jei tokių yra, ir iškviečia veiksmą.", "learn_more": "Sužinokite daugiau apie trigerius", "name": "Trigeris", + "type_select": "Trigerio tipas", "type": { + "event": { + "event_data": "Įvykio duomenys", + "event_type": "Įvykio tipas", + "label": "Įvykis:" + }, "geo_location": { "enter": "Įveskite", "event": "Įvykis:", @@ -340,11 +416,32 @@ "source": "Šaltinis", "zone": "Zona" }, + "homeassistant": { + "event": "Įvykis:", + "label": "Home Assistant", + "shutdown": "Išjungti", + "start": "Pradėti" + }, "mqtt": { - "label": "MQTT" + "label": "MQTT", + "topic": "Tema" + }, + "numeric_state": { + "above": "Aukščiau", + "below": "Žemiau", + "label": "Skaitinė būsena", + "value_template": "Vertės šablonas (pasirinktinai)" + }, + "state": { + "from": "Iš", + "to": "Kam" }, "sun": { - "event": "Ivykis" + "event": "Ivykis", + "label": "Saulė", + "offset": "Poslinkis (pasirinktinai)", + "sunrise": "Saulėtekis", + "sunset": "Saulėlydis" }, "time_pattern": { "hours": "Valandos", @@ -360,7 +457,8 @@ "event": "Įvykis", "zone": "Vieta" } - } + }, + "unsupported_platform": "Nėra UI palaikymo platformai: {platform}" } }, "picker": { @@ -374,6 +472,9 @@ }, "caption": "Home Assistant Cloud" }, + "core": { + "caption": "Bendra" + }, "customize": { "picker": { "header": "Pritaikymas" @@ -395,6 +496,7 @@ "introduction2": "Naudokite subjekto registrą, kad perrašytumėte pavadinimą, pakeiskite subjekto ID arba pašalintumėte įrašą iš namų asistento. Atminkite, kad pašalindami registro įrašą tai nepanaikins pačio subjekto. Norėdami tai padaryti, sekite toliau pateiktą nuorodą ir pašalinkite ją iš integracijos puslapio." } }, + "header": "Konfigūruoti Home Assistant", "integrations": { "config_entry": { "hub": "Prijungtas per", @@ -408,6 +510,7 @@ }, "details": "Integravimo informacija" }, + "introduction": "Šiame vaizde galima sukonfigūruoti savo komponentus ir Home Assistant. Dar ne viską galima sukonfigūruoti iš vartotojo sąsajos (UI ), tačiau mes prie to dirbame.", "mqtt": { "title": "MQTT" }, @@ -454,11 +557,29 @@ "question_trust": "Ar pasitikite išoriniu skydeliu {name} adresu {link}?" } }, + "developer-tools": { + "tabs": { + "events": { + "title": "Įvykiai" + }, + "services": { + "title": "Paslaugos" + }, + "states": { + "title": "Būsenos" + }, + "templates": { + "title": "Šablonas" + } + } + }, "history": { + "period": "Laikotarpis", "ranges": { "today": "Šiandien", "yesterday": "Vakar" - } + }, + "showing_entries": "Rodomi įrašai, skirti" }, "logbook": { "period": "Laikotarpis", @@ -535,6 +656,12 @@ "entity_not_found": "Subjektas nepasiekiamas: {entity}" } }, + "mailbox": { + "delete_button": "Ištrinti", + "delete_prompt": "Ištrinti šį pranešimą?", + "empty": "Neturite jokių pranešimų", + "playback_title": "Pranešimų atkūrimas" + }, "page-authorize": { "form": { "providers": { @@ -587,6 +714,9 @@ "push_notifications": { "description": "Siųsti pranešimus į šį įrenginį." } + }, + "shopping-list": { + "microphone_tip": "Bakstelėkite mikrofoną viršutinėje dešinėje ir pasakykite arba įveskite „Pridėti saldainių prie mano pirkinių sąrašo“" } } } diff --git a/translations/frontend/zh-Hant.json b/translations/frontend/zh-Hant.json index e542d910a0..fc07d69502 100644 --- a/translations/frontend/zh-Hant.json +++ b/translations/frontend/zh-Hant.json @@ -1337,6 +1337,7 @@ "caption": "設備", "confirm_delete": "確定要刪除此設備?", "confirm_rename_entity_ids": "是否也要變更物件的物件 ID?", + "confirm_rename_entity_ids_warning": "將不會變更任何物件正在使用的設定(例如自動化、腳本、場景與 Lovelace),必須自行更新。", "data_table": { "area": "分區", "battery": "電量", From d263b19910f384159744c6298605ce5ab98228f3 Mon Sep 17 00:00:00 2001 From: uvjustin <46082645+uvjustin@users.noreply.github.com> Date: Mon, 24 Aug 2020 17:50:40 +0800 Subject: [PATCH 044/300] Play HLS with Exoplayer on Android (#6606) --- src/components/ha-camera-stream.ts | 72 +++++++++++++++++++++++------ src/external_app/external_config.ts | 1 + 2 files changed, 59 insertions(+), 14 deletions(-) diff --git a/src/components/ha-camera-stream.ts b/src/components/ha-camera-stream.ts index 61b3d89d96..e4eda4b3d8 100644 --- a/src/components/ha-camera-stream.ts +++ b/src/components/ha-camera-stream.ts @@ -12,6 +12,8 @@ import { import { fireEvent } from "../common/dom/fire_event"; import { computeStateName } from "../common/entity/compute_state_name"; import { supportsFeature } from "../common/entity/supports-feature"; +import { nextRender } from "../common/util/render-status"; +import { getExternalConfig } from "../external_app/external_config"; import { CAMERA_SUPPORT_STREAM, computeMJPEGStreamUrl, @@ -37,6 +39,8 @@ class HaCameraStream extends LitElement { private _hlsPolyfillInstance?: Hls; + private _useExoPlayer = false; + public connectedCallback() { super.connectedCallback(); this._attached = true; @@ -125,22 +129,33 @@ class HaCameraStream extends LitElement { return this.shadowRoot!.querySelector("video")!; } + private async _getUseExoPlayer(): Promise { + if (!this.hass!.auth.external) { + return false; + } + const externalConfig = await getExternalConfig(this.hass!.auth.external); + return externalConfig && externalConfig.hasExoPlayer; + } + private async _startHls(): Promise { // eslint-disable-next-line - const Hls = ((await import( - /* webpackChunkName: "hls.js" */ "hls.js" - )) as any).default as HLSModule; - let hlsSupported = Hls.isSupported(); + let hls; const videoEl = this._videoEl; + this._useExoPlayer = await this._getUseExoPlayer(); + if (!this._useExoPlayer) { + hls = ((await import(/* webpackChunkName: "hls.js" */ "hls.js")) as any) + .default as HLSModule; + let hlsSupported = hls.isSupported(); - if (!hlsSupported) { - hlsSupported = - videoEl.canPlayType("application/vnd.apple.mpegurl") !== ""; - } + if (!hlsSupported) { + hlsSupported = + videoEl.canPlayType("application/vnd.apple.mpegurl") !== ""; + } - if (!hlsSupported) { - this._forceMJPEG = this.stateObj!.entity_id; - return; + if (!hlsSupported) { + this._forceMJPEG = this.stateObj!.entity_id; + return; + } } try { @@ -149,8 +164,10 @@ class HaCameraStream extends LitElement { this.stateObj!.entity_id ); - if (Hls.isSupported()) { - this._renderHLSPolyfill(videoEl, Hls, url); + if (this._useExoPlayer) { + this._renderHLSExoPlayer(url); + } else if (hls.isSupported()) { + this._renderHLSPolyfill(videoEl, hls, url); } else { this._renderHLSNative(videoEl, url); } @@ -163,6 +180,29 @@ class HaCameraStream extends LitElement { } } + private async _renderHLSExoPlayer(url: string) { + window.addEventListener("resize", this._resizeExoPlayer); + this.updateComplete.then(() => nextRender()).then(this._resizeExoPlayer); + this._videoEl.style.visibility = "hidden"; + await this.hass!.auth.external!.sendMessage({ + type: "exoplayer/play_hls", + payload: new URL(url, window.location.href).toString(), + }); + } + + private _resizeExoPlayer = () => { + const rect = this._videoEl.getBoundingClientRect(); + this.hass!.auth.external!.fireMessage({ + type: "exoplayer/resize", + payload: { + left: rect.left, + top: rect.top, + right: rect.right, + bottom: rect.bottom, + }, + }); + }; + private async _renderHLSNative(videoEl: HTMLVideoElement, url: string) { videoEl.src = url; await new Promise((resolve) => @@ -194,11 +234,15 @@ class HaCameraStream extends LitElement { fireEvent(this, "iron-resize"); } - private _destroyPolyfill(): void { + private _destroyPolyfill() { if (this._hlsPolyfillInstance) { this._hlsPolyfillInstance.destroy(); this._hlsPolyfillInstance = undefined; } + if (this._useExoPlayer) { + window.removeEventListener("resize", this._resizeExoPlayer); + this.hass!.auth.external!.fireMessage({ type: "exoplayer/stop" }); + } } static get styles(): CSSResult { diff --git a/src/external_app/external_config.ts b/src/external_app/external_config.ts index d911ea2593..27728deaf0 100644 --- a/src/external_app/external_config.ts +++ b/src/external_app/external_config.ts @@ -3,6 +3,7 @@ import { ExternalMessaging } from "./external_messaging"; export interface ExternalConfig { hasSettingsScreen: boolean; canWriteTag: boolean; + hasExoPlayer: boolean; } export const getExternalConfig = ( From 1439afcd9cf480d0c859cbc1942420346f222202 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Mon, 24 Aug 2020 13:59:31 +0200 Subject: [PATCH 045/300] Update MDI to 5.5.55 (#6598) --- package.json | 4 ++-- src/components/ha-icon.ts | 1 + yarn.lock | 16 ++++++++-------- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index f2fe5f1c72..92a27b8a24 100644 --- a/package.json +++ b/package.json @@ -41,8 +41,8 @@ "@material/mwc-tab": "^0.18.0", "@material/mwc-tab-bar": "^0.18.0", "@material/top-app-bar": "=8.0.0-canary.096a7a066.0", - "@mdi/js": "5.4.55", - "@mdi/svg": "5.4.55", + "@mdi/js": "5.5.55", + "@mdi/svg": "5.5.55", "@polymer/app-layout": "^3.0.2", "@polymer/app-route": "^3.0.2", "@polymer/app-storage": "^3.0.2", diff --git a/src/components/ha-icon.ts b/src/components/ha-icon.ts index 8eeac2e2d4..d7cb0dffae 100644 --- a/src/components/ha-icon.ts +++ b/src/components/ha-icon.ts @@ -106,6 +106,7 @@ const mdiRenameMapping = { pot: "pot-steam", ruby: "language-ruby", sailing: "sail-boat", + scooter: "human-scooter", settings: "cog", "settings-box": "cog-box", "settings-outline": "cog-outline", diff --git a/yarn.lock b/yarn.lock index 5fbc9e27ca..8c017d0bff 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1877,15 +1877,15 @@ "@material/feature-targeting" "8.0.0-canary.096a7a066.0" "@material/theme" "8.0.0-canary.096a7a066.0" -"@mdi/js@5.4.55": - version "5.4.55" - resolved "https://registry.yarnpkg.com/@mdi/js/-/js-5.4.55.tgz#7798c38da36a705ee6d635eb4507be63e914b05f" - integrity sha512-9kWM1mGB8KiiKgGjPV1CRoF4aQifzAegvIR2zODm6VpuXDHDOVn7yOFH4D/K6imKVp9HE02N9uxHuxUKB0gjRg== +"@mdi/js@5.5.55": + version "5.5.55" + resolved "https://registry.yarnpkg.com/@mdi/js/-/js-5.5.55.tgz#8dc97fbcc47d1f6bfa3343d4f7c7f5c0e2990151" + integrity sha512-vbw1QW3M9A4vObU9WmTETTG7n7feC9HSn/3up8ZYk/M3K9fGL9FPtw0+bdASRu1UOBgEsqC9eBhNW10IOcwMIg== -"@mdi/svg@5.4.55": - version "5.4.55" - resolved "https://registry.yarnpkg.com/@mdi/svg/-/svg-5.4.55.tgz#3bff467d65efceba14af39027d4c7cba0115e824" - integrity sha512-ZsVup6j9WWApjBsBtC8rM1CQ8Udu8025WJOCXVCofneVCVLKXClE5eSddYNYm565BCG/3ac9b0WPkfRV42Dh6w== +"@mdi/svg@5.5.55": + version "5.5.55" + resolved "https://registry.yarnpkg.com/@mdi/svg/-/svg-5.5.55.tgz#758f443ed1288c13833e1d6e8008d36cb1a6e703" + integrity sha512-6IMyytWUsCOOgKqxBronThVrtHDbxinDtfDFl6RL26vy/L+x5jWGqYSHbMEgamtquWOy8EAV0AJXUlUHp1tamg== "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" From c3ef79caa9651cfde89cf3494921ec1bdd490d75 Mon Sep 17 00:00:00 2001 From: Aidan Timson Date: Mon, 24 Aug 2020 13:20:32 +0100 Subject: [PATCH 046/300] Improve messaging of empty device info cards (#6628) --- .../config/devices/ha-config-device-page.ts | 42 +++++++++++++------ src/translations/en.json | 1 + 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/src/panels/config/devices/ha-config-device-page.ts b/src/panels/config/devices/ha-config-device-page.ts index dbc73f7bf8..e3577eb5dd 100644 --- a/src/panels/config/devices/ha-config-device-page.ts +++ b/src/panels/config/devices/ha-config-device-page.ts @@ -308,11 +308,15 @@ export class HaConfigDevicePage extends LitElement { : ""; }) : html` - ${this.hass.localize( - "ui.panel.config.devices.automation.no_automations" - )} + + ${this.hass.localize( + "ui.panel.config.devices.add_prompt", + "name", + this.hass.localize( + "ui.panel.config.devices.automation.automations" + ) + )} + `} ` @@ -376,11 +380,15 @@ export class HaConfigDevicePage extends LitElement { : ""; }) : html` - ${this.hass.localize( - "ui.panel.config.devices.scene.no_scenes" - )} + + ${this.hass.localize( + "ui.panel.config.devices.add_prompt", + "name", + this.hass.localize( + "ui.panel.config.devices.scene.scenes" + ) + )} + ` } @@ -429,9 +437,13 @@ export class HaConfigDevicePage extends LitElement { : html` ${this.hass.localize( - "ui.panel.config.devices.script.no_scripts" - )} + "ui.panel.config.devices.add_prompt", + "name", + this.hass.localize( + "ui.panel.config.devices.script.scripts" + ) + )} + `} ` @@ -706,6 +718,10 @@ export class HaConfigDevicePage extends LitElement { color: var(--primary-color); } + ha-card { + padding-bottom: 8px; + } + ha-card a { color: var(--primary-text-color); } diff --git a/src/translations/en.json b/src/translations/en.json index 7b020a8164..0e9d097214 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1376,6 +1376,7 @@ } }, "devices": { + "add_prompt": "No {name} have been added using this device yet. You can add one by clicking the + button above.", "caption": "Devices", "description": "Manage connected devices", "device_info": "Device info", From a90203f256054ae9660b7444d2a61a1897967d8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Mon, 24 Aug 2020 14:21:57 +0200 Subject: [PATCH 047/300] Use secure cookie if https (#6644) --- src/data/hassio/supervisor.ts | 6 ++- test-mocha/hassio/create_session.spec.ts | 57 ++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 test-mocha/hassio/create_session.spec.ts diff --git a/src/data/hassio/supervisor.ts b/src/data/hassio/supervisor.ts index f6a7d2811c..aaf854ac81 100644 --- a/src/data/hassio/supervisor.ts +++ b/src/data/hassio/supervisor.ts @@ -71,7 +71,11 @@ export const createHassioSession = async (hass: HomeAssistant) => { "POST", "hassio/ingress/session" ); - document.cookie = `ingress_session=${response.data.session};path=/api/hassio_ingress/;SameSite=Strict`; + document.cookie = `ingress_session=${ + response.data.session + };path=/api/hassio_ingress/;SameSite=Strict${ + location.protocol === "https:" ? ";Secure" : "" + }`; }; export const setSupervisorOption = async ( diff --git a/test-mocha/hassio/create_session.spec.ts b/test-mocha/hassio/create_session.spec.ts new file mode 100644 index 0000000000..79bf728ea7 --- /dev/null +++ b/test-mocha/hassio/create_session.spec.ts @@ -0,0 +1,57 @@ +import * as assert from "assert"; +import { createHassioSession } from "../../src/data/hassio/supervisor"; + +const sessionID = "fhdsu73rh3io4h8f3irhjel8ousafehf8f3yh"; + +describe("Create hassio session", function () { + it("Test create session without HTTPS", async function () { + // @ts-ignore + global.document = {}; + // @ts-ignore + global.location = {}; + await createHassioSession({ + // @ts-ignore + callApi: async function () { + return { data: { session: sessionID } }; + }, + }); + assert.equal( + // @ts-ignore + global.document.cookie, + "ingress_session=fhdsu73rh3io4h8f3irhjel8ousafehf8f3yh;path=/api/hassio_ingress/;SameSite=Strict" + ); + }); + it("Test create session with HTTPS", async function () { + // @ts-ignore + global.document = {}; + // @ts-ignore + global.location = { protocol: "https:" }; + await createHassioSession({ + // @ts-ignore + callApi: async function () { + return { data: { session: sessionID } }; + }, + }); + assert.equal( + // @ts-ignore + global.document.cookie, + "ingress_session=fhdsu73rh3io4h8f3irhjel8ousafehf8f3yh;path=/api/hassio_ingress/;SameSite=Strict;Secure" + ); + + // Clean up in case they will be used in other tests + // @ts-ignore + global.document = {}; + // @ts-ignore + global.location = {}; + }); + it("Test fail to create", async function () { + const createSessionPromise = createHassioSession({ + // @ts-ignore + callApi: async function () {}, + }).then( + () => true, + () => false + ); + assert.equal(await createSessionPromise, false); + }); +}); From 42d421a6fc63a8d1067f7f041dad82588ef9cb46 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 24 Aug 2020 07:32:52 -0500 Subject: [PATCH 048/300] Add template to the list of reloadables (#6673) Make reloadable check to see if the service is loaded instead of the component --- src/common/config/is_service_loaded.ts | 9 +++++++++ .../config/server_control/ha-config-server-control.ts | 5 +++-- src/translations/en.json | 3 ++- 3 files changed, 14 insertions(+), 3 deletions(-) create mode 100644 src/common/config/is_service_loaded.ts diff --git a/src/common/config/is_service_loaded.ts b/src/common/config/is_service_loaded.ts new file mode 100644 index 0000000000..c8a7824a5a --- /dev/null +++ b/src/common/config/is_service_loaded.ts @@ -0,0 +1,9 @@ +import { HomeAssistant } from "../../types"; + +/** Return if a service is loaded. */ +export const isServiceLoaded = ( + hass: HomeAssistant, + domain: string, + service: string +): boolean => + hass && domain in hass.services && service in hass.services[domain]; diff --git a/src/panels/config/server_control/ha-config-server-control.ts b/src/panels/config/server_control/ha-config-server-control.ts index a08b26f072..fe19018906 100644 --- a/src/panels/config/server_control/ha-config-server-control.ts +++ b/src/panels/config/server_control/ha-config-server-control.ts @@ -16,7 +16,7 @@ import { HomeAssistant, Route } from "../../../types"; import "@material/mwc-button"; import "@polymer/paper-input/paper-input"; -import { isComponentLoaded } from "../../../common/config/is_component_loaded"; +import { isServiceLoaded } from "../../../common/config/is_service_loaded"; import "../../../components/buttons/ha-call-service-button"; import "../../../components/ha-card"; import "../ha-config-section"; @@ -35,6 +35,7 @@ const reloadableDomains = [ "input_number", "input_datetime", "input_select", + "template", ]; @customElement("ha-config-server-control") @@ -202,7 +203,7 @@ export class HaConfigServerControl extends LitElement { ${reloadableDomains.map((domain) => - isComponentLoaded(this.hass, domain) + isServiceLoaded(this.hass, domain, "reload") ? html`
Date: Mon, 24 Aug 2020 14:35:50 +0200 Subject: [PATCH 049/300] Update mocha and eslint-import-resolver-webpack (#6497) --- package.json | 8 +- yarn.lock | 499 ++++++++++++++++++++++++++++++--------------------- 2 files changed, 298 insertions(+), 209 deletions(-) diff --git a/package.json b/package.json index 92a27b8a24..89fb7c3e93 100644 --- a/package.json +++ b/package.json @@ -146,7 +146,7 @@ "@types/leaflet-draw": "^1.0.1", "@types/marked": "^1.1.0", "@types/memoize-one": "4.1.0", - "@types/mocha": "^5.2.6", + "@types/mocha": "^7.0.2", "@types/resize-observer-browser": "^0.1.3", "@types/webspeechapi": "^0.0.29", "@typescript-eslint/eslint-plugin": "^2.28.0", @@ -157,7 +157,7 @@ "eslint": "^6.8.0", "eslint-config-airbnb-typescript": "^7.2.1", "eslint-config-prettier": "^6.10.1", - "eslint-import-resolver-webpack": "^0.12.1", + "eslint-import-resolver-webpack": "^0.12.2", "eslint-plugin-disable": "^2.0.1", "eslint-plugin-import": "^2.20.2", "eslint-plugin-lit": "^1.2.0", @@ -180,7 +180,7 @@ "magic-string": "^0.25.7", "map-stream": "^0.0.7", "merge-stream": "^1.0.1", - "mocha": "^6.0.2", + "mocha": "^7.2.0", "object-hash": "^2.0.3", "open": "^7.0.4", "prettier": "^2.0.4", @@ -197,7 +197,7 @@ "systemjs": "^6.3.2", "terser-webpack-plugin": "^3.0.6", "ts-lit-plugin": "^1.2.0", - "ts-mocha": "^6.0.0", + "ts-mocha": "^7.0.0", "typescript": "^3.8.3", "vinyl-buffer": "^1.0.1", "vinyl-source-stream": "^2.0.0", diff --git a/yarn.lock b/yarn.lock index 8c017d0bff..1e7c5ffa8d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2658,10 +2658,10 @@ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== -"@types/mocha@^5.2.6": - version "5.2.6" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.6.tgz#b8622d50557dd155e9f2f634b7d68fd38de5e94b" - integrity sha512-1axi39YdtBI7z957vdqXI4Ac25e7YihYQtJa+Clnxg1zTJEaIRbndt71O3sP4GAMgiAm0pY26/b9BrY4MR/PMw== +"@types/mocha@^7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-7.0.2.tgz#b17f16cf933597e10d6d78eae3251e692ce8b0ce" + integrity sha512-ZvO2tAcjmMi8V/5Z3JsyofMe3hasRcaw88cto5etSVMwVQfeivGAlEYmaQgceUSVYFofVjT+ioHsATjdWcFt1w== "@types/node@*": version "11.12.1" @@ -3323,6 +3323,14 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" +anymatch@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + append-buffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/append-buffer/-/append-buffer-1.0.2.tgz#d8220cf466081525efea50614f3de6514dfa58f1" @@ -3551,10 +3559,11 @@ asn1.js@^4.0.0: minimalistic-assert "^1.0.0" assert@^1.1.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" - integrity sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE= + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== dependencies: + object-assign "^4.1.1" util "0.10.3" assertion-error@^1.1.0: @@ -3689,7 +3698,12 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= -base64-js@^1.0.2, base64-js@^1.3.0: +base64-js@^1.0.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" + integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== + +base64-js@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== @@ -3722,6 +3736,11 @@ binary-extensions@^1.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== +binary-extensions@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" + integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== + bl@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c" @@ -3745,11 +3764,16 @@ bmp-js@^0.1.0: resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.1.0.tgz#e05a63f796a6c1ff25f4771ec7adadc148c07233" integrity sha1-4Fpj95amwf8l9Hcex62twUjAcjM= -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.4.0: version "4.11.9" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== +bn.js@^5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.2.tgz#c9686902d3c9a27729f43ab10f9d79c2004da7b0" + integrity sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA== + body-parser@1.19.0: version "1.19.0" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" @@ -3824,7 +3848,7 @@ braces@^2.3.1, braces@^2.3.2: split-string "^3.0.2" to-regex "^3.0.1" -braces@^3.0.1: +braces@^3.0.1, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== @@ -3872,7 +3896,7 @@ browserify-des@^1.0.0: inherits "^2.0.1" safe-buffer "^5.1.2" -browserify-rsa@^4.0.0: +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= @@ -3881,17 +3905,19 @@ browserify-rsa@^4.0.0: randombytes "^2.0.1" browserify-sign@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" - integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= + version "4.2.0" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.0.tgz#545d0b1b07e6b2c99211082bf1b12cce7a0b0e11" + integrity sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA== dependencies: - bn.js "^4.1.1" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.2" - elliptic "^6.0.0" - inherits "^2.0.1" - parse-asn1 "^5.0.0" + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.2" + inherits "^2.0.4" + parse-asn1 "^5.1.5" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" browserify-zlib@^0.2.0: version "0.2.0" @@ -3955,9 +3981,9 @@ buffer-xor@^1.0.3: integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= buffer@^4.3.0: - version "4.9.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" - integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg= + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== dependencies: base64-js "^1.0.2" ieee754 "^1.1.4" @@ -4231,6 +4257,21 @@ check-error@^1.0.2: resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= +chokidar@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" + integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.2.0" + optionalDependencies: + fsevents "~2.1.1" + chokidar@^1.6.0: version "1.7.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" @@ -4609,11 +4650,9 @@ connect-history-api-fallback@^1.6.0: integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== console-browserify@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" - integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA= - dependencies: - date-now "^0.1.4" + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" @@ -4759,7 +4798,7 @@ create-ecdh@^4.0.0: bn.js "^4.1.0" elliptic "^6.0.0" -create-hash@^1.1.0, create-hash@^1.1.2: +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== @@ -4770,7 +4809,7 @@ create-hash@^1.1.0, create-hash@^1.1.2: ripemd160 "^2.0.1" sha.js "^2.4.0" -create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== @@ -4858,11 +4897,6 @@ date-fns@^1.27.2: resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== -date-now@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" - integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= - dateformat@^1.0.7-1.2.3: version "1.0.12" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" @@ -5060,9 +5094,9 @@ deprecate@^1.0.0: integrity sha512-b5dDNQYdy2vW9WXUD8+RQlfoxvqztLLhDE+T7Gd37I5E8My7nJkKu6FmhdDeRWJ8B+yjZKuwjCta8pgi8kgSqA== des.js@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" - integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw= + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== dependencies: inherits "^2.0.1" minimalistic-assert "^1.0.0" @@ -5215,7 +5249,7 @@ elegant-spinner@^1.0.1: resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4= -elliptic@^6.0.0: +elliptic@^6.0.0, elliptic@^6.5.2: version "6.5.3" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw== @@ -5292,7 +5326,7 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.12.0, es-abstract@^1.5.1, es-abstract@^1.7.0: +es-abstract@^1.12.0, es-abstract@^1.7.0: version "1.13.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== @@ -5437,10 +5471,10 @@ eslint-import-resolver-node@^0.3.2: debug "^2.6.9" resolve "^1.5.0" -eslint-import-resolver-webpack@^0.12.1: - version "0.12.1" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.12.1.tgz#771ae561e887ca4e53ee87605fbb36c5e290b0f5" - integrity sha512-O/sUAXk6GWrICiN8JUkkjdt9uZpqZHP+FVnTxtEILL6EZMaPSrnP4lGPSFwcKsv7O211maqq4Nz60+dh236hVg== +eslint-import-resolver-webpack@^0.12.2: + version "0.12.2" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.12.2.tgz#769e86cd0c752a1536c19855ebd90aa14ce384ee" + integrity sha512-7Jnm4YAoNNkvqPaZkKdIHsKGmv8/uNnYC5QsXkiSodvX4XEEfH2AKOna98FK52fCDXm3q4HzuX+7pRMKkJ64EQ== dependencies: array-find "^1.0.0" debug "^2.6.9" @@ -5653,9 +5687,9 @@ eventemitter3@3.1.0, eventemitter3@^3.0.0: integrity sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA== events@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88" - integrity sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA== + version "3.2.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379" + integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg== eventsource@^1.0.7: version "1.0.7" @@ -6058,6 +6092,13 @@ find-root@^1.1.0: resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== +find-up@3.0.0, find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" @@ -6073,13 +6114,6 @@ find-up@^2.0.0, find-up@^2.1.0: dependencies: locate-path "^2.0.0" -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" @@ -6088,16 +6122,6 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -findup-sync@2.0.0, findup-sync@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" - integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw= - dependencies: - detect-file "^1.0.0" - is-glob "^3.1.0" - micromatch "^3.0.4" - resolve-dir "^1.0.1" - findup-sync@3.0.0, findup-sync@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" @@ -6108,6 +6132,16 @@ findup-sync@3.0.0, findup-sync@^3.0.0: micromatch "^3.0.4" resolve-dir "^1.0.1" +findup-sync@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" + integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw= + dependencies: + detect-file "^1.0.0" + is-glob "^3.1.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + fined@^1.0.1: version "1.1.1" resolved "https://registry.yarnpkg.com/fined/-/fined-1.1.1.tgz#95d88ff329123dd1a6950fdfcd321f746271e01f" @@ -6272,6 +6306,11 @@ fsevents@^1.0.0, fsevents@^1.2.7: nan "^2.12.1" node-pre-gyp "^0.12.0" +fsevents@~2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" + integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== + fsevents@~2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" @@ -6397,7 +6436,7 @@ glob-parent@^5.0.0: dependencies: is-glob "^4.0.1" -glob-parent@^5.1.0: +glob-parent@^5.1.0, glob-parent@~5.1.0: version "5.1.1" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== @@ -6559,12 +6598,12 @@ google-timezones-json@^1.0.2: resolved "https://registry.yarnpkg.com/google-timezones-json/-/google-timezones-json-1.0.2.tgz#6800000d7ebc2dd660611aad8c1c68196db78cab" integrity sha512-UWXQ7BpSCW8erDespU2I4cri22xsKgwOCyhsJal0OJhi2tFpwJpsYNJt4vCiFPL1p2HzCGiS713LKpNR25n9Kg== -graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6: +graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.6: version "4.1.15" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== -graceful-fs@^4.2.0: +graceful-fs@^4.1.2, graceful-fs@^4.2.0: version "4.2.4" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== @@ -6772,12 +6811,13 @@ has@^1.0.1, has@^1.0.3: function-bind "^1.1.1" hash-base@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" - integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.7" @@ -7016,11 +7056,6 @@ indent-string@^4.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== -indexof@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" - integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= - infer-owner@^1.0.3, infer-owner@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" @@ -7034,20 +7069,20 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +inherits@2, inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= inherits@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= +inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: version "1.3.5" @@ -7081,11 +7116,16 @@ internal-ip@^4.3.0: default-gateway "^4.2.0" ipaddr.js "^1.9.0" -interpret@1.2.0, interpret@^1.1.0, interpret@^1.2.0: +interpret@1.2.0, interpret@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== +interpret@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + intl-format-cache@^4.2.26: version "4.2.26" resolved "https://registry.yarnpkg.com/intl-format-cache/-/intl-format-cache-4.2.26.tgz#ba5e2ee6cec25217f688b68ecdd58eec3703a827" @@ -7188,6 +7228,13 @@ is-binary-path@^1.0.0: dependencies: binary-extensions "^1.0.0" +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" @@ -7339,7 +7386,7 @@ is-glob@^3.1.0: dependencies: is-extglob "^2.1.0" -is-glob@^4.0.0, is-glob@^4.0.1: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== @@ -7587,15 +7634,7 @@ js-levenshtein-esm@^1.2.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@3.12.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" - integrity sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^3.13.0, js-yaml@^3.13.1: +js-yaml@3.13.1, js-yaml@^3.13.0, js-yaml@^3.13.1: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== @@ -8124,17 +8163,22 @@ lodash.values@~2.4.1: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== -lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15: +lodash@^4.17.13, lodash@^4.17.14: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== -log-symbols@2.2.0, log-symbols@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" - integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== +lodash@^4.17.15: + version "4.17.19" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" + integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== + +log-symbols@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" + integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== dependencies: - chalk "^2.0.1" + chalk "^2.4.2" log-symbols@^1.0.0, log-symbols@^1.0.2: version "1.0.2" @@ -8143,6 +8187,13 @@ log-symbols@^1.0.0, log-symbols@^1.0.2: dependencies: chalk "^1.0.0" +log-symbols@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== + dependencies: + chalk "^2.0.1" + log-update@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708" @@ -8632,7 +8683,7 @@ mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@^0.5.1: dependencies: minimist "0.0.8" -mkdirp@^0.5.3: +mkdirp@0.5.5, mkdirp@^0.5.3: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== @@ -8644,34 +8695,35 @@ mkdirp@^1.0.3, mkdirp@^1.0.4: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -mocha@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-6.0.2.tgz#cdc1a6fdf66472c079b5605bac59d29807702d2c" - integrity sha512-RtTJsmmToGyeTznSOMoM6TPEk1A84FQaHIciKrRqARZx+B5ccJ5tXlmJzEKGBxZdqk9UjpRsesZTUkZmR5YnuQ== +mocha@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.2.0.tgz#01cc227b00d875ab1eed03a75106689cfed5a604" + integrity sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ== dependencies: ansi-colors "3.2.3" browser-stdout "1.3.1" + chokidar "3.3.0" debug "3.2.6" diff "3.5.0" escape-string-regexp "1.0.5" - findup-sync "2.0.0" + find-up "3.0.0" glob "7.1.3" growl "1.10.5" he "1.2.0" - js-yaml "3.12.0" - log-symbols "2.2.0" + js-yaml "3.13.1" + log-symbols "3.0.0" minimatch "3.0.4" - mkdirp "0.5.1" + mkdirp "0.5.5" ms "2.1.1" - node-environment-flags "1.0.4" + node-environment-flags "1.0.6" object.assign "4.1.0" strip-json-comments "2.0.1" supports-color "6.0.0" which "1.3.1" wide-align "1.1.3" - yargs "12.0.5" - yargs-parser "11.1.1" - yargs-unparser "1.5.0" + yargs "13.3.2" + yargs-parser "13.1.2" + yargs-unparser "1.6.0" moment@^2.10.2, moment@^2.22.0: version "2.24.0" @@ -8824,48 +8876,20 @@ no-case@^2.2.0: dependencies: lower-case "^1.1.1" -node-environment-flags@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.4.tgz#0b784a6551426bfc16d3b2208424dcbc2b2ff038" - integrity sha512-M9rwCnWVLW7PX+NUWe3ejEdiLYinRpsEre9hMkU/6NS4h+EEulYaDH1gCEZ2gyXsmw+RXYDaV2JkkTNcsPDJ0Q== +node-environment-flags@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.6.tgz#a30ac13621f6f7d674260a54dede048c3982c088" + integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw== dependencies: object.getownpropertydescriptors "^2.0.3" + semver "^5.7.0" node-forge@0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579" integrity sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ== -"node-libs-browser@^1.0.0 || ^2.0.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.0.tgz#c72f60d9d46de08a940dedbb25f3ffa2f9bbaa77" - integrity sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA== - dependencies: - assert "^1.1.1" - browserify-zlib "^0.2.0" - buffer "^4.3.0" - console-browserify "^1.1.0" - constants-browserify "^1.0.0" - crypto-browserify "^3.11.0" - domain-browser "^1.1.1" - events "^3.0.0" - https-browserify "^1.0.0" - os-browserify "^0.3.0" - path-browserify "0.0.0" - process "^0.11.10" - punycode "^1.2.4" - querystring-es3 "^0.2.0" - readable-stream "^2.3.3" - stream-browserify "^2.0.1" - stream-http "^2.7.2" - string_decoder "^1.0.0" - timers-browserify "^2.0.4" - tty-browserify "0.0.0" - url "^0.11.0" - util "^0.11.0" - vm-browserify "0.0.4" - -node-libs-browser@^2.2.1: +"node-libs-browser@^1.0.0 || ^2.0.0", node-libs-browser@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== @@ -8960,7 +8984,7 @@ normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: dependencies: remove-trailing-separator "^1.0.1" -normalize-path@^3.0.0: +normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== @@ -9023,7 +9047,7 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= -object-assign@^4.0.1, object-assign@^4.1.0: +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -9095,12 +9119,12 @@ object.entries@^1.1.1: has "^1.0.3" object.getownpropertydescriptors@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" - integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= + version "2.1.0" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" + integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== dependencies: - define-properties "^1.1.2" - es-abstract "^1.5.1" + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" object.map@^1.0.0: version "1.0.1" @@ -9364,16 +9388,11 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.1.0.tgz#c1a0f1030e97de018bb2c718929d2af59463e505" integrity sha512-H2RyIJ7+A3rjkwKC2l5GGtU4H1vkxKCAGsWasNVd0Set+6i4znxbWy6/j16YDPJDWxhsgZiKAstMEP8wCdSpjA== -pako@^1.0.5: +pako@^1.0.5, pako@~1.0.5: version "1.0.11" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== -pako@~1.0.5: - version "1.0.10" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" - integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw== - parallel-transform@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" @@ -9397,10 +9416,10 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-asn1@^5.0.0: - version "5.1.4" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.4.tgz#37f6628f823fbdeb2273b4d540434a22f3ef1fcc" - integrity sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw== +parse-asn1@^5.0.0, parse-asn1@^5.1.5: + version "5.1.5" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" + integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== dependencies: asn1.js "^4.0.0" browserify-aes "^1.0.0" @@ -9508,11 +9527,6 @@ pascalcase@^0.1.1: resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= -path-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" - integrity sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo= - path-browserify@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" @@ -9611,9 +9625,9 @@ pathval@^1.1.0: integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= pbkdf2@^3.0.3: - version "3.0.17" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" - integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== + version "3.1.1" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" + integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== dependencies: create-hash "^1.1.2" create-hmac "^1.1.4" @@ -9626,7 +9640,7 @@ phin@^2.9.1: resolved "https://registry.yarnpkg.com/phin/-/phin-2.9.3.tgz#f9b6ac10a035636fb65dfc576aaaa17b8743125c" integrity sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA== -picomatch@^2.0.5, picomatch@^2.2.1, picomatch@^2.2.2: +picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1, picomatch@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== @@ -9787,11 +9801,16 @@ process-nextick-args@^1.0.7: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= -process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: +process-nextick-args@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" @@ -10031,7 +10050,7 @@ read-pkg@^4.0.1: parse-json "^4.0.0" pify "^3.0.0" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.5, readable-stream@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== @@ -10063,6 +10082,28 @@ read-pkg@^4.0.1: isarray "0.0.1" string_decoder "~0.10.x" +readable-stream@^2.0.2, readable-stream@^2.3.3, readable-stream@^2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readable-stream@~1.1.9: version "1.1.14" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" @@ -10082,6 +10123,13 @@ readdirp@^2.0.0, readdirp@^2.2.1: micromatch "^3.1.10" readable-stream "^2.0.2" +readdirp@~3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" + integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ== + dependencies: + picomatch "^2.0.4" + rechoir@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" @@ -10376,13 +10424,20 @@ resolve@^1.11.0: dependencies: path-parse "^1.0.6" -resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2: +resolve@^1.12.0, resolve@^1.14.2: version "1.15.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== dependencies: path-parse "^1.0.6" +resolve@^1.13.1: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" @@ -10546,11 +10601,16 @@ rxjs@^6.5.3: dependencies: tslib "^1.9.0" -safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" @@ -10628,7 +10688,7 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@^5.7.1: +semver@^5.7.0, semver@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -11168,7 +11228,14 @@ string.prototype.trimstart@^1.0.0: define-properties "^1.1.3" es-abstract "^1.17.5" -string_decoder@^1.0.0, string_decoder@^1.1.1: +string_decoder@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== @@ -11534,9 +11601,9 @@ time-stamp@^1.0.0: integrity sha1-dkpaEa9QVhkhsTPztE5hhofg9cM= timers-browserify@^2.0.4: - version "2.0.10" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" - integrity sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg== + version "2.0.11" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" + integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ== dependencies: setimmediate "^1.0.4" @@ -11636,10 +11703,10 @@ ts-lit-plugin@^1.2.0: dependencies: lit-analyzer "1.2.0" -ts-mocha@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/ts-mocha/-/ts-mocha-6.0.0.tgz#40b8c5462ffce6f5dcee5ff729655b2958f26e50" - integrity sha512-ZCtJK8WXxHNbFNjvUKQIXZby/+ybQQkaBcM/3QhBQUfwjpdGFE9F6iWsHhF5ifQNFV/lWiOODi2VMD5AyPcQyg== +ts-mocha@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/ts-mocha/-/ts-mocha-7.0.0.tgz#f1549b48b46f53d7ae1dccbb26313c7879acb190" + integrity sha512-7WfkQw1W6JZXG5m4E1w2e945uWzBoZqmnOHvpMu0v+zvyKLdUQeTtRMfcQsVEKsUnYL6nTyH4okRt2PZucmFXQ== dependencies: ts-node "7.0.1" optionalDependencies: @@ -12071,13 +12138,6 @@ vinyl@^2.0.0, vinyl@^2.1.0: remove-trailing-separator "^1.0.1" replace-ext "^1.0.0" -vm-browserify@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" - integrity sha1-XX6kW7755Kb/ZflUOOCofDV9WnM= - dependencies: - indexof "0.0.1" - vm-browserify@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.0.tgz#bd76d6a23323e2ca8ffa12028dc04559c75f9019" @@ -12592,11 +12652,16 @@ xss@^1.0.6: commander "^2.9.0" cssfilter "0.0.10" -"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1: +"xtend@>=4.0.0 <4.1.0-0", xtend@~4.0.0, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= +xtend@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + xtend@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a" @@ -12627,7 +12692,15 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yargs-parser@11.1.1, yargs-parser@^11.1.1: +yargs-parser@13.1.2, yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^11.1.1: version "11.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== @@ -12658,16 +12731,16 @@ yargs-parser@^5.0.0: dependencies: camelcase "^3.0.0" -yargs-unparser@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.5.0.tgz#f2bb2a7e83cbc87bb95c8e572828a06c9add6e0d" - integrity sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw== +yargs-unparser@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" + integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== dependencies: flat "^4.1.0" - lodash "^4.17.11" - yargs "^12.0.5" + lodash "^4.17.15" + yargs "^13.3.0" -yargs@12.0.5, yargs@^12.0.5: +yargs@12.0.5: version "12.0.5" resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== @@ -12702,6 +12775,22 @@ yargs@13.2.4: y18n "^4.0.0" yargs-parser "^13.1.0" +yargs@13.3.2, yargs@^13.3.0: + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.2" + yargs@^15.0.0: version "15.3.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.1.tgz#9505b472763963e54afe60148ad27a330818e98b" From 5fd8b5c5b93f0465153f56747c7cbd74601f8f82 Mon Sep 17 00:00:00 2001 From: Zack Arnett Date: Mon, 24 Aug 2020 09:31:25 -0500 Subject: [PATCH 050/300] Media browser (#6672) * Add media browser stub * Updates from first night * Visual updates * First pr push? * Updates * Add to dialog Havent tested it idk where to put it * comments - Add overflow menu * change to flex end * lint * Refresh the previous item * simplify child render logic * Add show media browser dialog func (thanks bram) * Add to more info dialog. Not perfect. Visual bugs * Change play/picked event to callback * Don't use data table * Move play button * Fix dialog getting too wide * Style tweaks * tweaks * Fix padding mobile * Update ha-media-player-browse.ts * Remove Color on folder icon * Leave dialog open on play * Move more info icon * Remove unneeded files Co-authored-by: Paulus Schoutsen Co-authored-by: Bram Kragten --- src/components/data-table/ha-data-table.ts | 8 +- .../dialog-media-player-browse.ts | 115 ++++ .../media-player/ha-media-player-browse.ts | 581 ++++++++++++++++++ .../media-player/show-media-browser-dialog.ts | 27 + src/data/media-player.ts | 34 +- .../controls/more-info-media_player.ts | 110 +++- .../lovelace/cards/hui-media-control-card.ts | 75 ++- src/translations/en.json | 23 + 8 files changed, 920 insertions(+), 53 deletions(-) create mode 100644 src/components/media-player/dialog-media-player-browse.ts create mode 100644 src/components/media-player/ha-media-player-browse.ts create mode 100644 src/components/media-player/show-media-browser-dialog.ts diff --git a/src/components/data-table/ha-data-table.ts b/src/components/data-table/ha-data-table.ts index ba2bf0f35e..69c30633b6 100644 --- a/src/components/data-table/ha-data-table.ts +++ b/src/components/data-table/ha-data-table.ts @@ -3,19 +3,21 @@ import { css, CSSResult, customElement, + eventOptions, html, + internalProperty, LitElement, property, - internalProperty, PropertyValues, query, TemplateResult, - eventOptions, } from "lit-element"; import { classMap } from "lit-html/directives/class-map"; import { ifDefined } from "lit-html/directives/if-defined"; import { styleMap } from "lit-html/directives/style-map"; import { scroll } from "lit-virtualizer"; +import memoizeOne from "memoize-one"; +import { restoreScroll } from "../../common/decorators/restore-scroll"; import { fireEvent } from "../../common/dom/fire_event"; import "../../common/search/search-input"; import { debounce } from "../../common/util/debounce"; @@ -24,8 +26,6 @@ import "../ha-checkbox"; import type { HaCheckbox } from "../ha-checkbox"; import "../ha-icon"; import { filterData, sortData } from "./sort-filter"; -import memoizeOne from "memoize-one"; -import { restoreScroll } from "../../common/decorators/restore-scroll"; declare global { // for fire event diff --git a/src/components/media-player/dialog-media-player-browse.ts b/src/components/media-player/dialog-media-player-browse.ts new file mode 100644 index 0000000000..c686f5ef94 --- /dev/null +++ b/src/components/media-player/dialog-media-player-browse.ts @@ -0,0 +1,115 @@ +import { + css, + CSSResultArray, + customElement, + html, + internalProperty, + LitElement, + property, + TemplateResult, +} from "lit-element"; +import { HASSDomEvent } from "../../common/dom/fire_event"; +import type { + MediaPickedEvent, + MediaPlayerBrowseAction, +} from "../../data/media-player"; +import { haStyleDialog } from "../../resources/styles"; +import type { HomeAssistant } from "../../types"; +import { createCloseHeading } from "../ha-dialog"; +import "./ha-media-player-browse"; +import { MediaPlayerBrowseDialogParams } from "./show-media-browser-dialog"; + +@customElement("dialog-media-player-browse") +class DialogMediaPlayerBrowse extends LitElement { + @property({ attribute: false }) public hass!: HomeAssistant; + + @internalProperty() private _entityId!: string; + + @internalProperty() private _mediaContentId?: string; + + @internalProperty() private _mediaContentType?: string; + + @internalProperty() private _action?: MediaPlayerBrowseAction; + + @internalProperty() private _params?: MediaPlayerBrowseDialogParams; + + public async showDialog( + params: MediaPlayerBrowseDialogParams + ): Promise { + this._params = params; + this._entityId = this._params.entityId; + this._mediaContentId = this._params.mediaContentId; + this._mediaContentType = this._params.mediaContentType; + this._action = this._params.action || "play"; + + await this.updateComplete; + } + + protected render(): TemplateResult { + if (!this._params) { + return html``; + } + + return html` + + + + `; + } + + private _closeDialog() { + this._params = undefined; + } + + private _mediaPicked(ev: HASSDomEvent): void { + this._params!.mediaPickedCallback(ev.detail); + if (this._action !== "play") { + this._closeDialog(); + } + } + + static get styles(): CSSResultArray { + return [ + haStyleDialog, + css` + ha-dialog { + --dialog-z-index: 8; + --dialog-content-padding: 0; + } + + @media (min-width: 800px) { + ha-dialog { + --mdc-dialog-max-width: 800px; + } + ha-media-player-browse { + width: 700px; + padding: 20px 24px; + } + } + `, + ]; + } +} + +declare global { + interface HTMLElementTagNameMap { + "dialog-media-player-browse": DialogMediaPlayerBrowse; + } +} diff --git a/src/components/media-player/ha-media-player-browse.ts b/src/components/media-player/ha-media-player-browse.ts new file mode 100644 index 0000000000..8c7bb34414 --- /dev/null +++ b/src/components/media-player/ha-media-player-browse.ts @@ -0,0 +1,581 @@ +import "@material/mwc-button/mwc-button"; +import "@material/mwc-fab/mwc-fab"; +import "@material/mwc-list/mwc-list"; +import "@material/mwc-list/mwc-list-item"; +import { mdiArrowLeft, mdiFolder, mdiPlay, mdiPlus } from "@mdi/js"; +import "@polymer/paper-item/paper-item"; +import "@polymer/paper-listbox/paper-listbox"; +import { + css, + CSSResultArray, + customElement, + html, + internalProperty, + LitElement, + property, + PropertyValues, + TemplateResult, +} from "lit-element"; +import memoizeOne from "memoize-one"; +import { fireEvent } from "../../common/dom/fire_event"; +import { debounce } from "../../common/util/debounce"; +import { browseMediaPlayer, MediaPickedEvent } from "../../data/media-player"; +import type { MediaPlayerItem } from "../../data/media-player"; +import { installResizeObserver } from "../../panels/lovelace/common/install-resize-observer"; +import { haStyle } from "../../resources/styles"; +import type { HomeAssistant } from "../../types"; +import "../entity/ha-entity-picker"; +import "../ha-button-menu"; +import "../ha-card"; +import "../ha-circular-progress"; +import "../ha-paper-dropdown-menu"; +import "../ha-svg-icon"; + +declare global { + interface HASSDomEvents { + "media-picked": MediaPickedEvent; + } +} + +@customElement("ha-media-player-browse") +export class HaMediaPlayerBrowse extends LitElement { + @property({ attribute: false }) public hass!: HomeAssistant; + + @property() public entityId!: string; + + @property() public mediaContentId?: string; + + @property() public mediaContentType?: string; + + @property() public action: "pick" | "play" = "play"; + + @property({ type: Boolean, attribute: "narrow", reflect: true }) + private _narrow = false; + + @internalProperty() private _loading = false; + + @internalProperty() private _mediaPlayerItems: MediaPlayerItem[] = []; + + private _resizeObserver?: ResizeObserver; + + public connectedCallback(): void { + super.connectedCallback(); + this.updateComplete.then(() => this._attachObserver()); + } + + public disconnectedCallback(): void { + if (this._resizeObserver) { + this._resizeObserver.disconnect(); + } + } + + protected render(): TemplateResult { + if (!this._mediaPlayerItems.length) { + return html``; + } + + if (this._loading) { + return html``; + } + + const mostRecentItem = this._mediaPlayerItems[ + this._mediaPlayerItems.length - 1 + ]; + const previousItem = + this._mediaPlayerItems.length > 1 + ? this._mediaPlayerItems[this._mediaPlayerItems.length - 2] + : undefined; + + const hasExpandableChildren: + | MediaPlayerItem + | undefined = this._hasExpandableChildren(mostRecentItem.children); + + return html` +
+
+ ${mostRecentItem.thumbnail + ? html` +
+ ${this._narrow && mostRecentItem?.can_play + ? html` + + + ${this.hass.localize( + `ui.components.media-browser.${this.action}` + )} + + ` + : ""} +
+ ` + : html``} +
+ + ${mostRecentItem?.can_play && + (!this._narrow || (this._narrow && !mostRecentItem.thumbnail)) + ? html` +
+ + + ${this.hass.localize( + `ui.components.media-browser.${this.action}` + )} + +
+ ` + : ""} +
+
+
+
+ ${mostRecentItem.children?.length + ? hasExpandableChildren + ? html` +
+ ${mostRecentItem.children?.length + ? html` + ${mostRecentItem.children.map( + (child) => html` +
+
+ + ${child.can_expand && !child.thumbnail + ? html` + + ` + : ""} + + ${child.can_play + ? html` + + + + ` + : ""} +
+
${child.title}
+
+ ${this.hass.localize( + `ui.components.media-browser.content-type.${child.media_content_type}` + )} +
+
+ ` + )} + ` + : ""} +
+ ` + : html` + + ${mostRecentItem.children.map( + (child) => html` + ${child.title} + +
  • ` + )} +
    + ` + : this.hass.localize("ui.components.media-browser.no_items")} + `; + } + + protected firstUpdated(): void { + this._measureCard(); + this._attachObserver(); + } + + protected updated(changedProps: PropertyValues): void { + super.updated(changedProps); + + if ( + !changedProps.has("entityId") && + !changedProps.has("mediaContentId") && + !changedProps.has("mediaContentType") && + !changedProps.has("action") + ) { + return; + } + + this._fetchData(this.mediaContentId, this.mediaContentType).then( + (itemData) => { + this._mediaPlayerItems = [itemData]; + } + ); + } + + private _actionClicked(ev: MouseEvent): void { + ev.stopPropagation(); + const item = (ev.currentTarget as any).item; + + this._runAction(item); + } + + private _runAction(item: MediaPlayerItem): void { + fireEvent(this, "media-picked", { + media_content_id: item.media_content_id, + media_content_type: item.media_content_type, + }); + } + + private async _navigate(ev: MouseEvent): Promise { + const target = ev.currentTarget as any; + let item: MediaPlayerItem | undefined; + + if (target.previous) { + this._mediaPlayerItems!.pop(); + item = this._mediaPlayerItems!.pop(); + } + + item = target.item; + + if (!item) { + return; + } + + const itemData = await this._fetchData( + item.media_content_id, + item.media_content_type + ); + this._mediaPlayerItems = [...this._mediaPlayerItems, itemData]; + } + + private async _fetchData( + mediaContentId?: string, + mediaContentType?: string + ): Promise { + const itemData = await browseMediaPlayer( + this.hass, + this.entityId, + !mediaContentId ? undefined : mediaContentId, + mediaContentType + ); + + return itemData; + } + + private _measureCard(): void { + this._narrow = this.offsetWidth < 500; + } + + private async _attachObserver(): Promise { + if (!this._resizeObserver) { + await installResizeObserver(); + this._resizeObserver = new ResizeObserver( + debounce(() => this._measureCard(), 250, false) + ); + } + + this._resizeObserver.observe(this); + } + + private _hasExpandableChildren = memoizeOne((children) => + children.find((item: MediaPlayerItem) => item.can_expand) + ); + + static get styles(): CSSResultArray { + return [ + haStyle, + css` + :host { + display: block; + } + + .header { + display: flex; + justify-content: space-between; + } + + .breadcrumb-overflow { + display: flex; + justify-content: space-between; + } + + .header-content { + display: flex; + flex-wrap: wrap; + flex-grow: 1; + align-items: flex-start; + } + + .header-content .img { + height: 200px; + width: 200px; + margin-right: 16px; + background-size: cover; + } + + .header-info { + display: flex; + flex-direction: column; + justify-content: space-between; + align-self: stretch; + min-width: 0; + flex: 1; + } + + .header-info .actions { + padding-top: 24px; + --mdc-theme-primary: var(--primary-color); + } + + .breadcrumb { + display: flex; + flex-direction: column; + overflow: hidden; + flex-grow: 1; + } + + .breadcrumb .title { + font-size: 48px; + line-height: 1.2; + font-weight: bold; + margin: 0; + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + } + + .breadcrumb .previous-title { + font-size: 14px; + padding-bottom: 8px; + color: var(--secondary-text-color); + overflow: hidden; + text-overflow: ellipsis; + cursor: pointer; + --mdc-icon-size: 14px; + } + + .breadcrumb .subtitle { + font-size: 16px; + overflow: hidden; + text-overflow: ellipsis; + } + + .divider { + padding: 10px 0; + } + + .divider::before { + height: 1px; + display: block; + background-color: var(--divider-color); + content: " "; + } + + /* ============= CHILDREN ============= */ + + mwc-list { + --mdc-list-vertical-padding: 0; + border: 1px solid var(--divider-color); + border-radius: 4px; + } + + mwc-list li:last-child { + display: none; + } + + .children { + display: grid; + grid-template-columns: repeat( + auto-fit, + minmax(var(--media-browse-item-size, 175px), 0.33fr) + ); + grid-gap: 16px; + margin: 8px 0px; + } + + .child { + display: flex; + flex-direction: column; + cursor: pointer; + } + + .ha-card-parent { + position: relative; + width: 100%; + } + + ha-card { + width: 100%; + padding-bottom: 100%; + position: relative; + background-size: cover; + background-position: center; + } + + .child .folder, + .child .play { + position: absolute; + } + + .child .folder { + color: var(--sidebar-icon-color); + top: calc(50% - (var(--mdc-icon-size) / 2)); + left: calc(50% - (var(--mdc-icon-size) / 2)); + --mdc-icon-size: calc(var(--media-browse-item-size, 175px) * 0.4); + } + + .child .play { + bottom: 4px; + right: 4px; + transition: all 0.5s; + background-color: rgba(255, 255, 255, 0.5); + border-radius: 50%; + } + + .child .play:hover { + color: var(--primary-color); + } + + ha-card:hover { + opacity: 0.5; + } + + .child .title { + font-size: 16px; + padding-top: 8px; + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + } + + .child .type { + font-size: 12px; + color: var(--secondary-text-color); + } + + /* ============= Narrow ============= */ + + :host([narrow]) { + padding: 0; + } + + :host([narrow]) mwc-list { + border: 0; + } + + :host([narrow]) .breadcrumb .title { + font-size: 38px; + } + + :host([narrow]) .breadcrumb-overflow { + align-items: flex-end; + } + + :host([narrow]) .header-content { + flex-direction: column; + flex-wrap: nowrap; + } + + :host([narrow]) .header-content .img { + height: auto; + width: 100%; + margin-right: 0; + padding-bottom: 100%; + margin-bottom: 8px; + position: relative; + } + + :host([narrow]) .header-content .img mwc-fab { + position: absolute; + --mdc-theme-secondary: var(--primary-color); + bottom: -20px; + right: 20px; + } + + :host([narrow]) .header-info, + :host([narrow]) .media-source, + :host([narrow]) .children { + padding: 0 24px; + } + + :host([narrow]) .children { + grid-template-columns: 1fr 1fr !important; + } + `, + ]; + } +} + +declare global { + interface HTMLElementTagNameMap { + "ha-media-player-browse": HaMediaPlayerBrowse; + } +} diff --git a/src/components/media-player/show-media-browser-dialog.ts b/src/components/media-player/show-media-browser-dialog.ts new file mode 100644 index 0000000000..7574cdf81d --- /dev/null +++ b/src/components/media-player/show-media-browser-dialog.ts @@ -0,0 +1,27 @@ +import { fireEvent } from "../../common/dom/fire_event"; +import { + MediaPickedEvent, + MediaPlayerBrowseAction, +} from "../../data/media-player"; + +export interface MediaPlayerBrowseDialogParams { + action: MediaPlayerBrowseAction; + entityId: string; + mediaPickedCallback: (pickedMedia: MediaPickedEvent) => void; + mediaContentId?: string; + mediaContentType?: string; +} + +export const showMediaBrowserDialog = ( + element: HTMLElement, + dialogParams: MediaPlayerBrowseDialogParams +): void => { + fireEvent(element, "show-dialog", { + dialogTag: "dialog-media-player-browse", + dialogImport: () => + import( + /* webpackChunkName: "dialog-media-player-browse" */ "./dialog-media-player-browse" + ), + dialogParams, + }); +}; diff --git a/src/data/media-player.ts b/src/data/media-player.ts index 71a2939716..0a3d289259 100644 --- a/src/data/media-player.ts +++ b/src/data/media-player.ts @@ -1,4 +1,5 @@ -import { HassEntity } from "home-assistant-js-websocket"; +import type { HassEntity } from "home-assistant-js-websocket"; +import type { HomeAssistant } from "../types"; export const SUPPORT_PAUSE = 1; export const SUPPORT_SEEK = 2; @@ -14,8 +15,16 @@ export const SUPPORT_SELECT_SOURCE = 2048; export const SUPPORT_STOP = 4096; export const SUPPORTS_PLAY = 16384; export const SUPPORT_SELECT_SOUND_MODE = 65536; +export const SUPPORT_BROWSE_MEDIA = 131072; export const CONTRAST_RATIO = 4.5; +export type MediaPlayerBrowseAction = "pick" | "play"; + +export interface MediaPickedEvent { + media_content_id: string; + media_content_type: string; +} + export interface MediaPlayerThumbnail { content_type: string; content: string; @@ -26,6 +35,29 @@ export interface ControlButton { action: string; } +export interface MediaPlayerItem { + title: string; + media_content_type: string; + media_content_id: string; + can_play: boolean; + can_expand: boolean; + thumbnail?: string; + children?: MediaPlayerItem[]; +} + +export const browseMediaPlayer = ( + hass: HomeAssistant, + entityId: string, + mediaContentId?: string, + mediaContentType?: string +): Promise => + hass.callWS({ + type: "media_player/browse_media", + entity_id: entityId, + media_content_id: mediaContentId, + media_content_type: mediaContentType, + }); + export const getCurrentProgress = (stateObj: HassEntity): number => { let progress = stateObj.attributes.media_position; diff --git a/src/dialogs/more-info/controls/more-info-media_player.ts b/src/dialogs/more-info/controls/more-info-media_player.ts index efa96dec86..0bdcc97fd8 100644 --- a/src/dialogs/more-info/controls/more-info-media_player.ts +++ b/src/dialogs/more-info/controls/more-info-media_player.ts @@ -1,43 +1,45 @@ +import "@material/mwc-button/mwc-button"; +import "@polymer/paper-input/paper-input"; import "@polymer/paper-item/paper-item"; import "@polymer/paper-listbox/paper-listbox"; -import "@polymer/paper-input/paper-input"; - import { css, CSSResult, + customElement, html, LitElement, property, - TemplateResult, - customElement, query, + TemplateResult, } from "lit-element"; -import { computeRTLDirection } from "../../../common/util/compute_rtl"; -import { HomeAssistant, MediaEntity } from "../../../types"; +import { isComponentLoaded } from "../../../common/config/is_component_loaded"; import { supportsFeature } from "../../../common/entity/supports-feature"; -import { UNAVAILABLE_STATES, UNAVAILABLE, UNKNOWN } from "../../../data/entity"; +import { computeRTLDirection } from "../../../common/util/compute_rtl"; +import "../../../components/ha-icon"; +import "../../../components/ha-icon-button"; +import "../../../components/ha-paper-dropdown-menu"; +import "../../../components/ha-slider"; +import { showMediaBrowserDialog } from "../../../components/media-player/show-media-browser-dialog"; +import { UNAVAILABLE, UNAVAILABLE_STATES, UNKNOWN } from "../../../data/entity"; import { - SUPPORT_TURN_ON, - SUPPORT_TURN_OFF, + ControlButton, + MediaPickedEvent, SUPPORTS_PLAY, - SUPPORT_PREVIOUS_TRACK, - SUPPORT_PAUSE, - SUPPORT_STOP, + SUPPORT_BROWSE_MEDIA, SUPPORT_NEXT_TRACK, + SUPPORT_PAUSE, + SUPPORT_PLAY_MEDIA, + SUPPORT_PREVIOUS_TRACK, + SUPPORT_SELECT_SOUND_MODE, + SUPPORT_SELECT_SOURCE, + SUPPORT_STOP, + SUPPORT_TURN_OFF, + SUPPORT_TURN_ON, + SUPPORT_VOLUME_BUTTONS, SUPPORT_VOLUME_MUTE, SUPPORT_VOLUME_SET, - SUPPORT_VOLUME_BUTTONS, - SUPPORT_SELECT_SOURCE, - SUPPORT_SELECT_SOUND_MODE, - SUPPORT_PLAY_MEDIA, - ControlButton, } from "../../../data/media-player"; -import { isComponentLoaded } from "../../../common/config/is_component_loaded"; - -import "../../../components/ha-paper-dropdown-menu"; -import "../../../components/ha-icon-button"; -import "../../../components/ha-slider"; -import "../../../components/ha-icon"; +import { HomeAssistant, MediaEntity } from "../../../types"; @customElement("more-info-media_player") class MoreInfoMediaPlayer extends LitElement { @@ -60,15 +62,29 @@ class MoreInfoMediaPlayer extends LitElement { ? "" : html`
    - ${controls!.map( - (control) => html` - - ` - )} +
    + ${controls!.map( + (control) => html` + + ` + )} +
    + ${supportsFeature(stateObj, SUPPORT_BROWSE_MEDIA) + ? html` + + + ` + : ""}
    `} ${(supportsFeature(stateObj, SUPPORT_VOLUME_SET) || @@ -196,8 +212,16 @@ class MoreInfoMediaPlayer extends LitElement { flex-grow: 1; } + .controls { + display: flex; + align-items: center; + } + + .basic-controls { + flex-grow: 1; + } + .volume, - .controls, .source-input, .sound-input, .tts { @@ -372,6 +396,26 @@ class MoreInfoMediaPlayer extends LitElement { }); ttsInput.value = ""; } + + private _showBrowseMedia(): void { + showMediaBrowserDialog(this, { + action: "play", + entityId: this.stateObj!.entity_id, + mediaPickedCallback: (pickedMedia: MediaPickedEvent) => + this._playMedia( + pickedMedia.media_content_id, + pickedMedia.media_content_type + ), + }); + } + + private _playMedia(media_content_id: string, media_content_type: string) { + this.hass!.callService("media_player", "play_media", { + entity_id: this.stateObj!.entity_id, + media_content_id, + media_content_type, + }); + } } declare global { diff --git a/src/panels/lovelace/cards/hui-media-control-card.ts b/src/panels/lovelace/cards/hui-media-control-card.ts index cb6df43058..a176fc251c 100644 --- a/src/panels/lovelace/cards/hui-media-control-card.ts +++ b/src/panels/lovelace/cards/hui-media-control-card.ts @@ -1,4 +1,3 @@ -import "../../../components/ha-icon-button"; import "@polymer/paper-progress/paper-progress"; import type { PaperProgressElement } from "@polymer/paper-progress/paper-progress"; import { @@ -6,9 +5,9 @@ import { CSSResult, customElement, html, + internalProperty, LitElement, property, - internalProperty, PropertyValues, query, TemplateResult, @@ -25,12 +24,17 @@ import { supportsFeature } from "../../../common/entity/supports-feature"; import { debounce } from "../../../common/util/debounce"; import "../../../components/ha-card"; import "../../../components/ha-icon"; +import "../../../components/ha-icon-button"; +import { showMediaBrowserDialog } from "../../../components/media-player/show-media-browser-dialog"; import { UNAVAILABLE_STATES } from "../../../data/entity"; import { computeMediaDescription, CONTRAST_RATIO, + ControlButton, getCurrentProgress, + MediaPickedEvent, SUPPORTS_PLAY, + SUPPORT_BROWSE_MEDIA, SUPPORT_NEXT_TRACK, SUPPORT_PAUSE, SUPPORT_PREVIOUS_TRACK, @@ -38,17 +42,16 @@ import { SUPPORT_STOP, SUPPORT_TURN_OFF, SUPPORT_TURN_ON, - ControlButton, } from "../../../data/media-player"; import type { HomeAssistant, MediaEntity } from "../../../types"; import { contrast } from "../common/color/contrast"; import { findEntities } from "../common/find-entites"; import { hasConfigOrEntityChanged } from "../common/has-changed"; -import "../components/hui-marquee"; -import type { LovelaceCard, LovelaceCardEditor } from "../types"; -import { createEntityNotFoundWarning } from "../components/hui-warning"; -import { MediaControlCardConfig } from "./types"; import { installResizeObserver } from "../common/install-resize-observer"; +import "../components/hui-marquee"; +import { createEntityNotFoundWarning } from "../components/hui-warning"; +import type { LovelaceCard, LovelaceCardEditor } from "../types"; +import { MediaControlCardConfig } from "./types"; function getContrastRatio( rgb1: [number, number, number], @@ -185,7 +188,7 @@ export class HuiMediaControlCard extends LitElement implements LovelaceCard { return { type: "media-control", entity: foundEntities[0] || "" }; } - @property({ attribute: false }) public hass?: HomeAssistant; + @property({ attribute: false }) public hass!: HomeAssistant; @internalProperty() private _config?: MediaControlCardConfig; @@ -389,12 +392,27 @@ export class HuiMediaControlCard extends LitElement implements LovelaceCard { ${controls!.map( (control) => html` ` )} + ${supportsFeature(stateObj, SUPPORT_BROWSE_MEDIA) + ? html` + + ` + : ""}
    `} @@ -643,14 +661,31 @@ export class HuiMediaControlCard extends LitElement implements LovelaceCard { }); } + private _handleBrowseMedia(): void { + showMediaBrowserDialog(this, { + action: "play", + entityId: this._config!.entity, + mediaPickedCallback: (pickedMedia: MediaPickedEvent) => + this._playMedia( + pickedMedia.media_content_id, + pickedMedia.media_content_type + ), + }); + } + + private _playMedia(media_content_id: string, media_content_type: string) { + this.hass!.callService("media_player", "play_media", { + entity_id: this._config!.entity, + media_content_id, + media_content_type, + }); + } + private _handleClick(e: MouseEvent): void { - this.hass!.callService( - "media_player", - (e.currentTarget! as HTMLElement).getAttribute("action")!, - { - entity_id: this._config!.entity, - } - ); + const action = (e.currentTarget! as HTMLElement).getAttribute("action")!; + this.hass!.callService("media_player", action, { + entity_id: this._config!.entity, + }); } private _updateProgressBar(): void { @@ -831,6 +866,12 @@ export class HuiMediaControlCard extends LitElement implements LovelaceCard { --mdc-icon-size: 40px; } + ha-icon-button.browse-media { + position: absolute; + right: 0; + --mdc-icon-size: 24px; + } + .top-info { display: flex; justify-content: space-between; @@ -900,6 +941,10 @@ export class HuiMediaControlCard extends LitElement implements LovelaceCard { --mdc-icon-size: 36px; } + .narrow ha-icon-button.browse-media { + --mdc-icon-size: 24px; + } + .no-progress.player:not(.no-controls) { padding-bottom: 0px; } diff --git a/src/translations/en.json b/src/translations/en.json index 95e4386586..673f59ad39 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -179,6 +179,13 @@ "media_player": { "source": "Source", "sound_mode": "Sound mode", + "browse_media": "Browse media", + "turn_on": "Turn on", + "turn_off": "Turn off", + "media_play": "Play", + "media_play_pause": "Play/pause", + "media_next_track": "Next", + "media_previous_track": "Previous", "text_to_speak": "Text to speak" }, "persistent_notification": { @@ -341,6 +348,22 @@ "data-table": { "search": "Search", "no-data": "No data" + }, + "media-browser": { + "pick": "Pick", + "play": "Play", + "play-media": "Play Media", + "pick-media": "Pick Media", + "no_items": "No items", + "choose-source": "Choose Source", + "media-player-browser": "Media Player Browser", + "content-type": { + "server": "Server", + "library": "Library", + "artist": "Artist", + "album": "Album", + "playlist": "Playlist" + } } }, "dialogs": { From e8f6a79c8f8f81fbd3a4728d24bf1003795cf2fb Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Mon, 24 Aug 2020 16:34:55 +0200 Subject: [PATCH 051/300] Fix create write tag (#6679) --- src/panels/config/tags/dialog-tag-detail.ts | 17 +++++++++-------- src/panels/config/tags/ha-config-tags.ts | 4 ++-- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/panels/config/tags/dialog-tag-detail.ts b/src/panels/config/tags/dialog-tag-detail.ts index f4edecf711..d34ed4e206 100644 --- a/src/panels/config/tags/dialog-tag-detail.ts +++ b/src/panels/config/tags/dialog-tag-detail.ts @@ -3,23 +3,23 @@ import "@polymer/paper-input/paper-input"; import { css, CSSResult, + customElement, html, + internalProperty, LitElement, property, - internalProperty, TemplateResult, - customElement, } from "lit-element"; import { fireEvent } from "../../../common/dom/fire_event"; import { createCloseHeading } from "../../../components/ha-dialog"; -import "../../../components/ha-switch"; import "../../../components/ha-formfield"; +import "../../../components/ha-switch"; import "../../../components/map/ha-location-editor"; +import { Tag, UpdateTagParams } from "../../../data/tag"; +import { HassDialog } from "../../../dialogs/make-dialog-manager"; import { haStyleDialog } from "../../../resources/styles"; import { HomeAssistant } from "../../../types"; -import { HassDialog } from "../../../dialogs/make-dialog-manager"; import { TagDetailDialogParams } from "./show-dialog-tag-detail"; -import { UpdateTagParams, Tag } from "../../../data/tag"; @customElement("dialog-tag-detail") class DialogTagDetail extends LitElement implements HassDialog { @@ -162,7 +162,7 @@ class DialogTagDetail extends LitElement implements HassDialog { } else { newValue = await this._params!.createEntry(values, this._id); } - this._params = undefined; + this.closeDialog(); } catch (err) { this._error = err ? err.message : "Unknown error"; } finally { @@ -172,11 +172,12 @@ class DialogTagDetail extends LitElement implements HassDialog { } private async _updateWriteEntry() { + const openWrite = this._params?.openWrite; const tag = await this._updateEntry(); - if (!tag) { + if (!tag || !openWrite) { return; } - this._params?.openWrite!(tag); + openWrite(tag); } private async _deleteEntry() { diff --git a/src/panels/config/tags/ha-config-tags.ts b/src/panels/config/tags/ha-config-tags.ts index 8abdc49d13..e7b716b2be 100644 --- a/src/panels/config/tags/ha-config-tags.ts +++ b/src/panels/config/tags/ha-config-tags.ts @@ -12,6 +12,7 @@ import memoizeOne from "memoize-one"; import { DataTableColumnContainer } from "../../../components/data-table/ha-data-table"; import "../../../components/ha-card"; import "../../../components/ha-relative-time"; +import { showAutomationEditor, TagTrigger } from "../../../data/automation"; import { createTag, deleteTag, @@ -23,14 +24,13 @@ import { UpdateTagParams, } from "../../../data/tag"; import { showConfirmationDialog } from "../../../dialogs/generic/show-dialog-box"; +import { getExternalConfig } from "../../../external_app/external_config"; import "../../../layouts/hass-tabs-subpage-data-table"; import { SubscribeMixin } from "../../../mixins/subscribe-mixin"; import { HomeAssistant, Route } from "../../../types"; import { configSections } from "../ha-panel-config"; import { showTagDetailDialog } from "./show-dialog-tag-detail"; import "./tag-image"; -import { getExternalConfig } from "../../../external_app/external_config"; -import { showAutomationEditor, TagTrigger } from "../../../data/automation"; export interface TagRowData extends Tag { last_scanned_datetime: Date | null; From 294665fbe881f5dcc78f17ac0ebf99b364ce351d Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Mon, 24 Aug 2020 16:45:30 +0200 Subject: [PATCH 052/300] Fix time format in charts (#6671) --- src/components/entity/ha-chart-base.js | 6 +++--- src/components/state-history-chart-line.js | 4 ++++ src/components/state-history-chart-timeline.js | 1 + 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/components/entity/ha-chart-base.js b/src/components/entity/ha-chart-base.js index 350ea82c68..7df570747c 100644 --- a/src/components/entity/ha-chart-base.js +++ b/src/components/entity/ha-chart-base.js @@ -1,12 +1,12 @@ /* eslint-plugin-disable lit */ import { IronResizableBehavior } from "@polymer/iron-resizable-behavior/iron-resizable-behavior"; -import "../ha-icon-button"; import { mixinBehaviors } from "@polymer/polymer/lib/legacy/class"; import { timeOut } from "@polymer/polymer/lib/utils/async"; import { Debouncer } from "@polymer/polymer/lib/utils/debounce"; import { html } from "@polymer/polymer/lib/utils/html-tag"; import { PolymerElement } from "@polymer/polymer/polymer-element"; import { formatTime } from "../../common/datetime/format_time"; +import "../ha-icon-button"; // eslint-disable-next-line no-unused-vars /* global Chart moment Color */ @@ -355,7 +355,7 @@ class HaChartBase extends mixinBehaviors( return value; } const date = new Date(values[index].value); - return formatTime(date); + return formatTime(date, this.hass.language); } drawChart() { @@ -420,7 +420,7 @@ class HaChartBase extends mixinBehaviors( }, }; options = Chart.helpers.merge(options, this.data.options); - options.scales.xAxes[0].ticks.callback = this._formatTickValue; + options.scales.xAxes[0].ticks.callback = this._formatTickValue.bind(this); if (this.data.type === "timeline") { this.set("isTimeline", true); if (this.data.colors !== undefined) { diff --git a/src/components/state-history-chart-line.js b/src/components/state-history-chart-line.js index 3a857b8663..1b627e4206 100644 --- a/src/components/state-history-chart-line.js +++ b/src/components/state-history-chart-line.js @@ -19,6 +19,7 @@ class StateHistoryChartLine extends LocalizeMixin(PolymerElement) { Date: Mon, 24 Aug 2020 16:48:00 +0200 Subject: [PATCH 053/300] Adjust tags just scanned time display (#6663) --- src/common/datetime/relative_time.ts | 5 +++++ src/panels/config/tags/ha-config-tags.ts | 6 +++--- src/translations/en.json | 2 ++ 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/common/datetime/relative_time.ts b/src/common/datetime/relative_time.ts index cc414b1e12..c2a761394b 100644 --- a/src/common/datetime/relative_time.ts +++ b/src/common/datetime/relative_time.ts @@ -21,6 +21,11 @@ export default function relativeTime( const tense = delta >= 0 ? "past" : "future"; delta = Math.abs(delta); let roundedDelta = Math.round(delta); + + if (roundedDelta === 0) { + return localize("ui.components.relative_time.just_now"); + } + let unit = "week"; for (let i = 0; i < tests.length; i++) { diff --git a/src/panels/config/tags/ha-config-tags.ts b/src/panels/config/tags/ha-config-tags.ts index e7b716b2be..a0dd7e32b8 100644 --- a/src/panels/config/tags/ha-config-tags.ts +++ b/src/panels/config/tags/ha-config-tags.ts @@ -70,12 +70,12 @@ export class HaConfigTags extends SubscribeMixin(LitElement) { template: (name, tag: any) => html`${name} ${narrow ? html`
    - ${tag.last_scanned + ${tag.last_scanned_datetime ? html`` - : this.hass.localize("ui.components.relative_time.never")} + : this.hass.localize("ui.panel.config.tags.never_scanned")}
    ` : ""}`, }, @@ -94,7 +94,7 @@ export class HaConfigTags extends SubscribeMixin(LitElement) { .hass=${this.hass} .datetimeObj=${last_scanned_datetime} >` - : this.hass.localize("ui.components.relative_time.never")} + : this.hass.localize("ui.panel.config.tags.never_scanned")} `, }; } diff --git a/src/translations/en.json b/src/translations/en.json index 673f59ad39..7bdac00b42 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -319,6 +319,7 @@ "past": "{time} ago", "future": "In {time}", "never": "Never", + "just_now": "Just now", "duration": { "second": "{count} {count, plural,\n one {second}\n other {seconds}\n}", "minute": "{count} {count, plural,\n one {minute}\n other {minutes}\n}", @@ -631,6 +632,7 @@ "add_tag": "Add tag", "write": "Write", "edit": "Edit", + "never_scanned": "Never scanned", "create_automation": "Create automation with tag", "automation_title": "Tag {name} is scanned", "headers": { From 931068dedeaad375370b16e4dacf7ac63ad961e9 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Mon, 24 Aug 2020 16:49:32 +0200 Subject: [PATCH 054/300] Use default panel if panel in settings doesn't exist (#6667) --- src/data/panel.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/data/panel.ts b/src/data/panel.ts index 24e6e31627..eb205c65b0 100644 --- a/src/data/panel.ts +++ b/src/data/panel.ts @@ -17,7 +17,9 @@ export const setDefaultPanel = ( }; export const getDefaultPanel = (hass: HomeAssistant): PanelInfo => - hass.panels[hass.defaultPanel]; + hass.panels[hass.defaultPanel] + ? hass.panels[hass.defaultPanel] + : hass.panels[DEFAULT_PANEL]; export const getPanelTitle = (hass: HomeAssistant): string | undefined => { if (!hass.panels) { From e2fd155e1b8847a3f11ad8a5ff23c3bea90bb0bc Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Mon, 24 Aug 2020 17:03:42 +0200 Subject: [PATCH 055/300] Fix updating history card + only update when entity changed (#6647) --- .../lovelace/cards/hui-history-graph-card.ts | 53 +++++++++---------- src/panels/lovelace/common/has-changed.ts | 39 ++++++++++++-- 2 files changed, 58 insertions(+), 34 deletions(-) diff --git a/src/panels/lovelace/cards/hui-history-graph-card.ts b/src/panels/lovelace/cards/hui-history-graph-card.ts index ab74d1cf0a..e49ebc1ed2 100644 --- a/src/panels/lovelace/cards/hui-history-graph-card.ts +++ b/src/panels/lovelace/cards/hui-history-graph-card.ts @@ -19,6 +19,8 @@ import { processConfigEntities } from "../common/process-config-entities"; import { EntityConfig } from "../entity-rows/types"; import { LovelaceCard } from "../types"; import { HistoryGraphCardConfig } from "./types"; +import { HistoryResult } from "../../../data/history"; +import { hasConfigOrEntitiesChanged } from "../common/has-changed"; @customElement("hui-history-graph-card") export class HuiHistoryGraphCard extends LitElement implements LovelaceCard { @@ -49,7 +51,7 @@ export class HuiHistoryGraphCard extends LitElement implements LovelaceCard { @property({ attribute: false }) public hass?: HomeAssistant; - @internalProperty() private _stateHistory?: any; + @internalProperty() private _stateHistory?: HistoryResult; @internalProperty() private _config?: HistoryGraphCardConfig; @@ -59,10 +61,10 @@ export class HuiHistoryGraphCard extends LitElement implements LovelaceCard { private _cacheConfig?: CacheConfig; - private _interval?: number; - private _fetching = false; + private _date?: Date; + public getCardSize(): number { return 4; } @@ -97,9 +99,8 @@ export class HuiHistoryGraphCard extends LitElement implements LovelaceCard { }; } - public disconnectedCallback(): void { - super.disconnectedCallback(); - this._clearInterval(); + protected shouldUpdate(changedProps: PropertyValues): boolean { + return hasConfigOrEntitiesChanged(this, changedProps); } protected updated(changedProps: PropertyValues) { @@ -108,21 +109,19 @@ export class HuiHistoryGraphCard extends LitElement implements LovelaceCard { return; } - if (!changedProps.has("_config")) { + if (!changedProps.has("_config") && !changedProps.has("hass")) { return; } const oldConfig = changedProps.get("_config") as HistoryGraphCardConfig; - if (oldConfig !== this._config) { + if (changedProps.has("_config") && oldConfig !== this._config) { + this._getStateHistory(); + } else if ( + this._cacheConfig.refresh && + Date.now() - this._date!.getTime() >= this._cacheConfig.refresh * 100 + ) { this._getStateHistory(); - this._clearInterval(); - - if (!this._interval && this._cacheConfig.refresh) { - this._interval = window.setInterval(() => { - this._getStateHistory(); - }, this._cacheConfig.refresh * 1000); - } } } @@ -155,27 +154,23 @@ export class HuiHistoryGraphCard extends LitElement implements LovelaceCard { if (this._fetching) { return; } + this._date = new Date(); this._fetching = true; try { - this._stateHistory = await getRecentWithCache( - this.hass!, - this._cacheConfig!.cacheKey, - this._cacheConfig!, - this.hass!.localize, - this.hass!.language - ); + this._stateHistory = { + ...(await getRecentWithCache( + this.hass!, + this._cacheConfig!.cacheKey, + this._cacheConfig!, + this.hass!.localize, + this.hass!.language + )), + }; } finally { this._fetching = false; } } - private _clearInterval(): void { - if (this._interval) { - window.clearInterval(this._interval); - this._interval = undefined; - } - } - static get styles(): CSSResult { return css` .content { diff --git a/src/panels/lovelace/common/has-changed.ts b/src/panels/lovelace/common/has-changed.ts index 49eb8df4c7..44f35709a4 100644 --- a/src/panels/lovelace/common/has-changed.ts +++ b/src/panels/lovelace/common/has-changed.ts @@ -1,11 +1,8 @@ import { PropertyValues } from "lit-element"; import { HomeAssistant } from "../../../types"; +import { processConfigEntities } from "./process-config-entities"; -// Check if config or Entity changed -export function hasConfigOrEntityChanged( - element: any, - changedProps: PropertyValues -): boolean { +function hasConfigChanged(element: any, changedProps: PropertyValues): boolean { if (changedProps.has("_config")) { return true; } @@ -23,9 +20,41 @@ export function hasConfigOrEntityChanged( ) { return true; } + return false; +} + +// Check if config or Entity changed +export function hasConfigOrEntityChanged( + element: any, + changedProps: PropertyValues +): boolean { + if (hasConfigChanged(element, changedProps)) { + return true; + } + + const oldHass = changedProps.get("hass") as HomeAssistant; return ( oldHass.states[element._config!.entity] !== element.hass!.states[element._config!.entity] ); } + +// Check if config or Entities changed +export function hasConfigOrEntitiesChanged( + element: any, + changedProps: PropertyValues +): boolean { + if (hasConfigChanged(element, changedProps)) { + return true; + } + + const oldHass = changedProps.get("hass") as HomeAssistant; + + const entities = processConfigEntities(element._config!.entities); + + return entities.some( + (entity) => + oldHass.states[entity.entity] !== element.hass!.states[entity.entity] + ); +} From 67f9be2b77ca76d5b5e5137f5b699821f8dcce97 Mon Sep 17 00:00:00 2001 From: Zack Arnett Date: Mon, 24 Aug 2020 10:31:16 -0500 Subject: [PATCH 056/300] Media Browser: Fix dark mode (#6687) --- src/components/media-player/ha-media-player-browse.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/components/media-player/ha-media-player-browse.ts b/src/components/media-player/ha-media-player-browse.ts index 8c7bb34414..d892727952 100644 --- a/src/components/media-player/ha-media-player-browse.ts +++ b/src/components/media-player/ha-media-player-browse.ts @@ -188,6 +188,7 @@ export class HaMediaPlayerBrowse extends LitElement { >
    ${child.can_expand && !child.thumbnail @@ -442,6 +443,7 @@ export class HaMediaPlayerBrowse extends LitElement { mwc-list { --mdc-list-vertical-padding: 0; + --mdc-theme-text-icon-on-background: var(--secondary-text-color); border: 1px solid var(--divider-color); border-radius: 4px; } @@ -450,6 +452,10 @@ export class HaMediaPlayerBrowse extends LitElement { display: none; } + mwc-list li[divider] { + border-bottom-color: var(--divider-color); + } + .children { display: grid; grid-template-columns: repeat( @@ -485,7 +491,7 @@ export class HaMediaPlayerBrowse extends LitElement { } .child .folder { - color: var(--sidebar-icon-color); + color: var(--secondary-text-color); top: calc(50% - (var(--mdc-icon-size) / 2)); left: calc(50% - (var(--mdc-icon-size) / 2)); --mdc-icon-size: calc(var(--media-browse-item-size, 175px) * 0.4); From f4ca94f2e123b348430b899d05d795939e4ce0e3 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Mon, 24 Aug 2020 17:52:04 +0200 Subject: [PATCH 057/300] Move click listener (#6688) * Move click listener * Move label --- .../media-player/ha-media-player-browse.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/components/media-player/ha-media-player-browse.ts b/src/components/media-player/ha-media-player-browse.ts index d892727952..f6f2f08df3 100644 --- a/src/components/media-player/ha-media-player-browse.ts +++ b/src/components/media-player/ha-media-player-browse.ts @@ -202,16 +202,18 @@ export class HaMediaPlayerBrowse extends LitElement { ${child.can_play ? html` - + ` From 3ba31483f49012c4ff78957379a755f19b204ea0 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Mon, 24 Aug 2020 18:26:41 +0200 Subject: [PATCH 058/300] Convert dev tools template to Lit and store last used template (#6669) --- .../template/developer-tools-template.js | 204 ------------- .../template/developer-tools-template.ts | 280 ++++++++++++++++++ src/translations/en.json | 1 + 3 files changed, 281 insertions(+), 204 deletions(-) delete mode 100644 src/panels/developer-tools/template/developer-tools-template.js create mode 100644 src/panels/developer-tools/template/developer-tools-template.ts diff --git a/src/panels/developer-tools/template/developer-tools-template.js b/src/panels/developer-tools/template/developer-tools-template.js deleted file mode 100644 index cf6369ee2e..0000000000 --- a/src/panels/developer-tools/template/developer-tools-template.js +++ /dev/null @@ -1,204 +0,0 @@ -import "../../../components/ha-circular-progress"; -import { timeOut } from "@polymer/polymer/lib/utils/async"; -import { Debouncer } from "@polymer/polymer/lib/utils/debounce"; -import { html } from "@polymer/polymer/lib/utils/html-tag"; -/* eslint-plugin-disable lit */ -import { PolymerElement } from "@polymer/polymer/polymer-element"; -import "../../../components/ha-code-editor"; -import LocalizeMixin from "../../../mixins/localize-mixin"; -import "../../../styles/polymer-ha-style"; - -class HaPanelDevTemplate extends LocalizeMixin(PolymerElement) { - static get template() { - return html` - - - -
    -
    -

    - [[localize('ui.panel.developer-tools.tabs.templates.description')]] -

    - -

    [[localize('ui.panel.developer-tools.tabs.templates.editor')]]

    - -
    - -
    - -
    [[processed]]
    -
    -
    - `; - } - - static get properties() { - return { - hass: { - type: Object, - }, - - error: { - type: Boolean, - value: false, - }, - - rendering: { - type: Boolean, - value: false, - }, - - template: { - type: String, - /* eslint-disable max-len */ - value: `Imitate available variables: -{% set my_test_json = { - "temperature": 25, - "unit": "°C" -} %} - -The temperature is {{ my_test_json.temperature }} {{ my_test_json.unit }}. - -{% if is_state("device_tracker.paulus", "home") and - is_state("device_tracker.anne_therese", "home") -%} - You are both home, you silly -{%- else -%} - Anne Therese is at {{ states("device_tracker.anne_therese") }} - Paulus is at {{ states("device_tracker.paulus") }} -{%- endif %} - -For loop example: -{% for state in states.sensor -%} - {%- if loop.first %}The {% elif loop.last %} and the {% else %}, the {% endif -%} - {{ state.name | lower }} is {{state.state_with_unit}} -{%- endfor %}.`, - /* eslint-enable max-len */ - }, - - processed: { - type: String, - value: "", - }, - }; - } - - ready() { - super.ready(); - this.renderTemplate(); - } - - computeFormClasses(narrow) { - return narrow ? "content" : "content layout horizontal"; - } - - computeRenderedClasses(error) { - return error ? "error rendered" : "rendered"; - } - - templateChanged(ev) { - this.template = ev.detail.value; - if (this.error) { - this.error = false; - } - this._debouncer = Debouncer.debounce( - this._debouncer, - timeOut.after(500), - () => { - this.renderTemplate(); - } - ); - } - - renderTemplate() { - this.rendering = true; - - this.hass.callApi("POST", "template", { template: this.template }).then( - function (processed) { - this.processed = processed; - this.rendering = false; - }.bind(this), - function (error) { - this.processed = - (error && error.body && error.body.message) || - this.hass.localize( - "ui.panel.developer-tools.tabs.templates.unknown_error_template" - ); - this.error = true; - this.rendering = false; - }.bind(this) - ); - } -} - -customElements.define("developer-tools-template", HaPanelDevTemplate); diff --git a/src/panels/developer-tools/template/developer-tools-template.ts b/src/panels/developer-tools/template/developer-tools-template.ts new file mode 100644 index 0000000000..0bb9d0f78e --- /dev/null +++ b/src/panels/developer-tools/template/developer-tools-template.ts @@ -0,0 +1,280 @@ +import "@material/mwc-button/mwc-button"; +import { UnsubscribeFunc } from "home-assistant-js-websocket"; +import { + css, + CSSResultArray, + customElement, + html, + internalProperty, + LitElement, + property, +} from "lit-element"; +import { classMap } from "lit-html/directives/class-map"; +import { debounce } from "../../../common/util/debounce"; +import "../../../components/ha-circular-progress"; +import "../../../components/ha-code-editor"; +import { subscribeRenderTemplate } from "../../../data/ws-templates"; +import { haStyle } from "../../../resources/styles"; +import { HomeAssistant } from "../../../types"; + +const DEMO_TEMPLATE = `{## Imitate available variables: ##} +{% set my_test_json = { + "temperature": 25, + "unit": "°C" +} %} + +The temperature is {{ my_test_json.temperature }} {{ my_test_json.unit }}. + +{% if is_state("sun.sun", "above_horizon") -%} + The sun rose {{ relative_time(states.sun.sun.last_changed) }} ago. +{%- else -%} + The sun will rise at {{ as_timestamp(strptime(state_attr("sun.sun", "next_rising"), "")) | timestamp_local }}. +{%- endif %} + +For loop example getting 3 entity values: + +{% for states in states | slice(3) -%} + {% set state = states | first %} + {%- if loop.first %}The {% elif loop.last %} and the {% else %}, the {% endif -%} + {{ state.name | lower }} is {{state.state_with_unit}} +{%- endfor %}.`; + +@customElement("developer-tools-template") +class HaPanelDevTemplate extends LitElement { + @property() public hass!: HomeAssistant; + + @property() public narrow!: boolean; + + @internalProperty() private _error = false; + + @internalProperty() private _rendering = false; + + @internalProperty() private _processed = ""; + + @internalProperty() private _unsubRenderTemplate?: Promise; + + private _template = ""; + + private _inited = false; + + public connectedCallback() { + super.connectedCallback(); + if (this._template && !this._unsubRenderTemplate) { + this._subscribeTemplate(); + } + } + + public disconnectedCallback() { + this._unsubscribeTemplate(); + } + + protected firstUpdated() { + if (localStorage && localStorage["panel-dev-template-template"]) { + this._template = localStorage["panel-dev-template-template"]; + } else { + this._template = DEMO_TEMPLATE; + } + this._subscribeTemplate(); + this._inited = true; + } + + protected render() { + return html` +
    +
    +

    + ${this.hass.localize( + "ui.panel.developer-tools.tabs.templates.description" + )} +

    + +

    + ${this.hass.localize( + "ui.panel.developer-tools.tabs.templates.editor" + )} +

    + + + ${this.hass.localize( + "ui.panel.developer-tools.tabs.templates.reset" + )} + +
    + +
    + +
    +${this._processed}
    +
    +
    + `; + } + + static get styles(): CSSResultArray { + return [ + haStyle, + css` + :host { + -ms-user-select: initial; + -webkit-user-select: initial; + -moz-user-select: initial; + } + + .content { + padding: 16px; + direction: ltr; + } + + .edit-pane { + margin-right: 16px; + } + + .edit-pane a { + color: var(--primary-color); + } + + .horizontal .edit-pane { + max-width: 50%; + } + + .render-pane { + position: relative; + max-width: 50%; + } + + .render-spinner { + position: absolute; + top: 8px; + right: 8px; + } + + .rendered { + @apply --paper-font-code1; + clear: both; + white-space: pre-wrap; + } + + .rendered.error { + color: var(--error-color); + } + `, + ]; + } + + private _debounceRender = debounce( + () => { + this._subscribeTemplate(); + this._storeTemplate(); + }, + 500, + false + ); + + private _templateChanged(ev) { + this._template = ev.detail.value; + if (this._error) { + this._error = false; + } + this._debounceRender(); + } + + private async _subscribeTemplate() { + this._rendering = true; + await this._unsubscribeTemplate(); + try { + this._unsubRenderTemplate = subscribeRenderTemplate( + this.hass.connection, + (result) => { + this._processed = result; + }, + { + template: this._template, + } + ); + await this._unsubRenderTemplate; + } catch (err) { + this._error = true; + if (err.message) { + this._processed = err.message; + } + this._unsubRenderTemplate = undefined; + } finally { + this._rendering = false; + } + } + + private async _unsubscribeTemplate(): Promise { + if (!this._unsubRenderTemplate) { + return; + } + + try { + const unsub = await this._unsubRenderTemplate; + unsub(); + this._unsubRenderTemplate = undefined; + } catch (e) { + if (e.code === "not_found") { + // If we get here, the connection was probably already closed. Ignore. + } else { + throw e; + } + } + } + + private _storeTemplate() { + if (!this._inited) { + return; + } + localStorage["panel-dev-template-template"] = this._template; + } + + private _restoreDemo() { + this._template = DEMO_TEMPLATE; + this._subscribeTemplate(); + delete localStorage["panel-dev-template-template"]; + } +} + +declare global { + interface HTMLElementTagNameMap { + "developer-tools-template": HaPanelDevTemplate; + } +} diff --git a/src/translations/en.json b/src/translations/en.json index 7bdac00b42..edb42ed2fe 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -2592,6 +2592,7 @@ "title": "Template", "description": "Templates are rendered using the Jinja2 template engine with some Home Assistant specific extensions.", "editor": "Template editor", + "reset": "Reset to demo template", "jinja_documentation": "Jinja2 template documentation", "template_extensions": "Home Assistant template extensions", "unknown_error_template": "Unknown error rendering template" From 47e9531972d9feaa2642ec3e204c3ce74059745b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Mon, 24 Aug 2020 18:29:16 +0200 Subject: [PATCH 059/300] Use media query for darkmode on login and onboarding (#6625) Co-authored-by: Bram Kragten --- src/components/map/ha-location-editor.ts | 6 ++++-- src/html/authorize.html.template | 8 ++++++++ src/html/onboarding.html.template | 8 ++++++++ src/layouts/home-assistant-main.ts | 12 ++++++++++-- src/onboarding/onboarding-core-config.ts | 4 +++- src/translations/en.json | 1 + 6 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/components/map/ha-location-editor.ts b/src/components/map/ha-location-editor.ts index a1775f1a58..9bfcf5e50e 100644 --- a/src/components/map/ha-location-editor.ts +++ b/src/components/map/ha-location-editor.ts @@ -21,8 +21,8 @@ import { import { fireEvent } from "../../common/dom/fire_event"; import { LeafletModuleType, - setupLeafletMap, replaceTileLayer, + setupLeafletMap, } from "../../common/dom/setup-leaflet-map"; import { nextRender } from "../../common/util/render-status"; import { defaultRadiusColor } from "../../data/zone"; @@ -40,6 +40,8 @@ class LocationEditor extends LitElement { @property() public icon?: string; + @property({ type: Boolean }) public darkMode?: boolean; + public fitZoom = 16; private _iconEl?: DivIcon; @@ -129,7 +131,7 @@ class LocationEditor extends LitElement { private async _initMap(): Promise { [this._leafletMap, this.Leaflet, this._tileLayer] = await setupLeafletMap( this._mapEl, - this.hass.themes?.darkMode, + this.darkMode ?? this.hass.themes?.darkMode, Boolean(this.radius) ); this._leafletMap.addEventListener( diff --git a/src/html/authorize.html.template b/src/html/authorize.html.template index 62b1fdf87b..46bca88dd4 100644 --- a/src/html/authorize.html.template +++ b/src/html/authorize.html.template @@ -22,6 +22,14 @@ .header img { margin-right: 16px; } + @media (prefers-color-scheme: dark) { + body { + background-color: #111111; + color: #e1e1e1; + --primary-text-color: #e1e1e1; + --secondary-text-color: #9b9b9b; + } + } diff --git a/src/html/onboarding.html.template b/src/html/onboarding.html.template index 126f67ab71..cf95d09362 100644 --- a/src/html/onboarding.html.template +++ b/src/html/onboarding.html.template @@ -23,6 +23,14 @@ .header img { margin-right: 16px; } + @media (prefers-color-scheme: dark) { + body { + background-color: #111111; + color: #e1e1e1; + --primary-text-color: #e1e1e1; + --secondary-text-color: #9b9b9b; + } + } diff --git a/src/layouts/home-assistant-main.ts b/src/layouts/home-assistant-main.ts index 94fdef2fc0..31609dbdc5 100644 --- a/src/layouts/home-assistant-main.ts +++ b/src/layouts/home-assistant-main.ts @@ -5,15 +5,15 @@ import type { AppDrawerElement } from "@polymer/app-layout/app-drawer/app-drawer import { css, CSSResult, + customElement, html, LitElement, property, - customElement, PropertyValues, TemplateResult, } from "lit-element"; -import { listenMediaQuery } from "../common/dom/media_query"; import { fireEvent } from "../common/dom/fire_event"; +import { listenMediaQuery } from "../common/dom/media_query"; import { toggleAttribute } from "../common/dom/toggle_attribute"; import { showNotificationDrawer } from "../dialogs/notifications/show-notification-drawer"; import type { HomeAssistant, Route } from "../types"; @@ -49,7 +49,15 @@ class HomeAssistantMain extends LitElement { const disableSwipe = !sidebarNarrow || NON_SWIPABLE_PANELS.indexOf(hass.panelUrl) !== -1; + // Style block in render because of the mixin that is not supported return html` +
    diff --git a/src/translations/en.json b/src/translations/en.json index edb42ed2fe..e18f1ec129 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -2620,6 +2620,7 @@ "intro": "Hello {name}, welcome to Home Assistant. How would you like to name your home?", "intro_location": "We would like to know where you live. This information will help with displaying information and setting up sun-based automations. This data is never shared outside of your network.", "intro_location_detect": "We can help you fill in this information by making a one-time request to an external service.", + "location_name": "Name of your Home Assistant installation", "location_name_default": "Home", "button_detect": "Detect", "finish": "Next" From 6599351d45a80da9310095654d530d85e7bd1f1e Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Mon, 24 Aug 2020 18:36:47 +0200 Subject: [PATCH 060/300] Replace confirm with confirmation dialogs in snapshots (#6690) --- .../snapshot/dialog-hassio-snapshot.ts | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/hassio/src/dialogs/snapshot/dialog-hassio-snapshot.ts b/hassio/src/dialogs/snapshot/dialog-hassio-snapshot.ts index ff427aca5b..b54e18edd4 100755 --- a/hassio/src/dialogs/snapshot/dialog-hassio-snapshot.ts +++ b/hassio/src/dialogs/snapshot/dialog-hassio-snapshot.ts @@ -7,9 +7,9 @@ import { CSSResult, customElement, html, + internalProperty, LitElement, property, - internalProperty, TemplateResult, } from "lit-element"; import { createCloseHeading } from "../../../../src/components/ha-dialog"; @@ -19,6 +19,7 @@ import { fetchHassioSnapshotInfo, HassioSnapshotDetail, } from "../../../../src/data/hassio/snapshot"; +import { showConfirmationDialog } from "../../../../src/dialogs/generic/show-dialog-box"; import { PolymerChangedEvent } from "../../../../src/polymer-types"; import { haStyleDialog } from "../../../../src/resources/styles"; import { HomeAssistant } from "../../../../src/types"; @@ -266,8 +267,12 @@ class HassioSnapshotDialog extends LitElement { this._snapshotPassword = ev.detail.value; } - private _partialRestoreClicked() { - if (!confirm("Are you sure you want to restore this snapshot?")) { + private async _partialRestoreClicked() { + if ( + !(await showConfirmationDialog(this, { + title: "Are you sure you want partially to restore this snapshot?", + })) + ) { return; } @@ -312,8 +317,13 @@ class HassioSnapshotDialog extends LitElement { ); } - private _fullRestoreClicked() { - if (!confirm("Are you sure you want to restore this snapshot?")) { + private async _fullRestoreClicked() { + if ( + !(await showConfirmationDialog(this, { + title: + "Are you sure you want to wipe your system and restore this snapshot?", + })) + ) { return; } @@ -338,8 +348,12 @@ class HassioSnapshotDialog extends LitElement { ); } - private _deleteClicked() { - if (!confirm("Are you sure you want to delete this snapshot?")) { + private async _deleteClicked() { + if ( + !(await showConfirmationDialog(this, { + title: "Are you sure you want to delete this snapshot?", + })) + ) { return; } From 63fef9bd4bb1c275c642aefb2fdd8a96733c8475 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 24 Aug 2020 11:23:07 -0500 Subject: [PATCH 061/300] Adjust to handle service calls and described events --- src/data/logbook.ts | 4 ++++ src/panels/logbook/ha-logbook.ts | 18 +++++++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/data/logbook.ts b/src/data/logbook.ts index ac6f342f7b..c1ff44b6fe 100644 --- a/src/data/logbook.ts +++ b/src/data/logbook.ts @@ -7,8 +7,12 @@ export interface LogbookEntry { entity_id?: string; domain: string; context_user_id?: string; + context_event_type?: string; + context_domain?: string; + context_service?: string; context_entity_id?: string; context_entity_id_name?: string; + context_name?: string; } const DATA_CACHE: { diff --git a/src/panels/logbook/ha-logbook.ts b/src/panels/logbook/ha-logbook.ts index d95ee7e156..831a394e95 100644 --- a/src/panels/logbook/ha-logbook.ts +++ b/src/panels/logbook/ha-logbook.ts @@ -118,18 +118,26 @@ class HaLogbook extends LitElement { ? ` (${item_username})` : ``}
    - ${!item.context_entity_id + ${!item.context_event_type ? "" - : html` - by + : item.context_event_type == "service_call" + ? // Service Call + html` by service ${item.context_domain}.${item.context_service}` + : item.context_entity_id == item.entity_id + ? // HomeKit or something that self references + html` by + ${item.context_name + ? item.context_name + : item.context_event_type}` + : // Another entity such as an automation or script + html` by ${item.context_entity_id_name} - `} + >`} From d49302c03227d60c78d9a1067a05b9764fa6a70e Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 24 Aug 2020 12:20:48 -0500 Subject: [PATCH 062/300] typo --- src/panels/logbook/ha-logbook.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/panels/logbook/ha-logbook.ts b/src/panels/logbook/ha-logbook.ts index 831a394e95..635a4113a1 100644 --- a/src/panels/logbook/ha-logbook.ts +++ b/src/panels/logbook/ha-logbook.ts @@ -120,7 +120,7 @@ class HaLogbook extends LitElement { > ${!item.context_event_type ? "" - : item.context_event_type == "service_call" + : item.context_event_type == "call_service" ? // Service Call html` by service ${item.context_domain}.${item.context_service}` : item.context_entity_id == item.entity_id From dc5607f55454c56e706a0b0b9de431abc68aac35 Mon Sep 17 00:00:00 2001 From: Charles Garwood Date: Mon, 24 Aug 2020 13:21:25 -0400 Subject: [PATCH 063/300] Beginning pages for OZW Config Panel (#6670) --- src/data/ozw.ts | 67 +++++ src/panels/config/ha-panel-config.ts | 7 + .../integrations/ha-integration-card.ts | 4 + .../ozw/ozw-config-dashboard.ts | 227 ++++++++++++++++ .../ozw/ozw-config-network.ts | 253 ++++++++++++++++++ .../ozw/ozw-config-router.ts | 70 +++++ src/translations/en.json | 44 ++- 7 files changed, 671 insertions(+), 1 deletion(-) create mode 100644 src/panels/config/integrations/integration-panels/ozw/ozw-config-dashboard.ts create mode 100644 src/panels/config/integrations/integration-panels/ozw/ozw-config-network.ts create mode 100644 src/panels/config/integrations/integration-panels/ozw/ozw-config-router.ts diff --git a/src/data/ozw.ts b/src/data/ozw.ts index cbef2a8dbc..b24692c01f 100644 --- a/src/data/ozw.ts +++ b/src/data/ozw.ts @@ -39,6 +39,28 @@ export interface OZWDeviceMetaData { ProductPicBase64: string; } +export interface OZWInstance { + ozw_instance: number; + OZWDaemon_Version: string; + OpenZWave_Version: string; + QTOpenZWave_Version: string; + Status: string; + getControllerPath: string; + homeID: string; +} + +export interface OZWNetworkStatistics { + ozw_instance: number; + node_count: number; + readCnt: number; + writeCnt: number; + ACKCnt: number; + CANCnt: number; + NAKCnt: number; + dropped: number; + retries: number; +} + export const nodeQueryStages = [ "ProtocolInfo", "Probe", @@ -59,6 +81,26 @@ export const nodeQueryStages = [ "Complete", ]; +export const networkOnlineStatuses = [ + "driverAllNodesQueried", + "driverAllNodesQueriedSomeDead", + "driverAwakeNodesQueried", +]; +export const networkStartingStatuses = [ + "starting", + "started", + "Ready", + "driverReady", +]; +export const networkOfflineStatuses = [ + "Offline", + "stopped", + "driverFailed", + "driverReset", + "driverRemoved", + "driverAllNodesOnFire", +]; + export const getIdentifiersFromDevice = function ( device: DeviceRegistryEntry ): OZWNodeIdentifiers | undefined { @@ -80,6 +122,31 @@ export const getIdentifiersFromDevice = function ( }; }; +export const fetchOZWInstances = ( + hass: HomeAssistant +): Promise => + hass.callWS({ + type: "ozw/get_instances", + }); + +export const fetchOZWNetworkStatus = ( + hass: HomeAssistant, + ozw_instance: number +): Promise => + hass.callWS({ + type: "ozw/network_status", + ozw_instance: ozw_instance, + }); + +export const fetchOZWNetworkStatistics = ( + hass: HomeAssistant, + ozw_instance: number +): Promise => + hass.callWS({ + type: "ozw/network_statistics", + ozw_instance: ozw_instance, + }); + export const fetchOZWNodeStatus = ( hass: HomeAssistant, ozw_instance: number, diff --git a/src/panels/config/ha-panel-config.ts b/src/panels/config/ha-panel-config.ts index dad0e22ee4..1857338ac7 100644 --- a/src/panels/config/ha-panel-config.ts +++ b/src/panels/config/ha-panel-config.ts @@ -352,6 +352,13 @@ class HaPanelConfig extends HassRouterPage { /* webpackChunkName: "panel-config-mqtt" */ "./integrations/integration-panels/mqtt/mqtt-config-panel" ), }, + ozw: { + tag: "ozw-config-router", + load: () => + import( + /* webpackChunkName: "panel-config-ozw" */ "./integrations/integration-panels/ozw/ozw-config-router" + ), + }, }, }; diff --git a/src/panels/config/integrations/ha-integration-card.ts b/src/panels/config/integrations/ha-integration-card.ts index d88b075a10..fc03a16ddd 100644 --- a/src/panels/config/integrations/ha-integration-card.ts +++ b/src/panels/config/integrations/ha-integration-card.ts @@ -55,6 +55,10 @@ const integrationsWithPanel = { buttonLocalizeKey: "ui.panel.config.zha.button", path: "/config/zha/dashboard", }, + ozw: { + buttonLocalizeKey: "ui.panel.config.ozw.button", + path: "/config/ozw/dashboard", + }, zwave: { buttonLocalizeKey: "ui.panel.config.zwave.button", path: "/config/zwave", diff --git a/src/panels/config/integrations/integration-panels/ozw/ozw-config-dashboard.ts b/src/panels/config/integrations/integration-panels/ozw/ozw-config-dashboard.ts new file mode 100644 index 0000000000..f23d7a7114 --- /dev/null +++ b/src/panels/config/integrations/integration-panels/ozw/ozw-config-dashboard.ts @@ -0,0 +1,227 @@ +import "@polymer/paper-item/paper-icon-item"; +import "@polymer/paper-item/paper-item-body"; +import "@material/mwc-fab"; +import { + css, + CSSResultArray, + customElement, + html, + internalProperty, + LitElement, + property, + TemplateResult, +} from "lit-element"; +import { navigate } from "../../../../../common/navigate"; +import "../../../../../components/ha-card"; +import "../../../../../components/ha-icon-next"; +import { haStyle } from "../../../../../resources/styles"; +import type { HomeAssistant, Route } from "../../../../../types"; +import "../../../ha-config-section"; +import { mdiCircle, mdiCheckCircle, mdiCloseCircle, mdiZWave } from "@mdi/js"; +import "../../../../../layouts/hass-tabs-subpage"; +import type { PageNavigation } from "../../../../../layouts/hass-tabs-subpage"; +import "@material/mwc-button/mwc-button"; +import { + OZWInstance, + fetchOZWInstances, + networkOnlineStatuses, + networkOfflineStatuses, + networkStartingStatuses, +} from "../../../../../data/ozw"; + +export const ozwTabs: PageNavigation[] = []; + +@customElement("ozw-config-dashboard") +class OZWConfigDashboard extends LitElement { + @property({ type: Object }) public hass!: HomeAssistant; + + @property({ type: Object }) public route!: Route; + + @property({ type: Boolean }) public narrow!: boolean; + + @property({ type: Boolean }) public isWide!: boolean; + + @property() public configEntryId?: string; + + @internalProperty() private _instances: OZWInstance[] = []; + + public connectedCallback(): void { + super.connectedCallback(); + if (this.hass) { + this._fetchData(); + } + } + + private async _fetchData() { + this._instances = await fetchOZWInstances(this.hass!); + if (this._instances.length === 1) { + navigate( + this, + `/config/ozw/network/${this._instances[0].ozw_instance}`, + true + ); + } + } + + protected render(): TemplateResult { + return html` + + +
    + ${this.hass.localize("ui.panel.config.ozw.select_instance.header")} +
    + +
    + ${this.hass.localize( + "ui.panel.config.ozw.select_instance.introduction" + )} +
    + ${this._instances.length > 0 + ? html` + ${this._instances.map((instance) => { + let status = "unknown"; + let icon = mdiCircle; + if (networkOnlineStatuses.includes(instance.Status)) { + status = "online"; + icon = mdiCheckCircle; + } + if (networkStartingStatuses.includes(instance.Status)) { + status = "starting"; + } + if (networkOfflineStatuses.includes(instance.Status)) { + status = "offline"; + icon = mdiCloseCircle; + } + + return html` + + + + + + + ${this.hass.localize( + "ui.panel.config.ozw.common.instance" + )} + ${instance.ozw_instance} +
    + + ${this.hass.localize( + "ui.panel.config.ozw.network_status." + status + )} + - + ${this.hass.localize( + "ui.panel.config.ozw.network_status.details." + + instance.Status.toLowerCase() + )}
    + ${this.hass.localize( + "ui.panel.config.ozw.common.controller" + )} + : ${instance.getControllerPath}
    + OZWDaemon ${instance.OZWDaemon_Version} (OpenZWave + ${instance.OpenZWave_Version}) +
    +
    + +
    +
    +
    + `; + })} + ` + : ``} +
    +
    + `; + } + + static get styles(): CSSResultArray { + return [ + haStyle, + css` + ha-card:last-child { + margin-bottom: 24px; + } + ha-config-section { + margin-top: -12px; + } + :host([narrow]) ha-config-section { + margin-top: -20px; + } + ha-card { + overflow: hidden; + } + ha-card a { + text-decoration: none; + color: var(--primary-text-color); + } + paper-item-body { + margin: 16px 0; + } + a { + text-decoration: none; + color: var(--primary-text-color); + position: relative; + display: block; + outline: 0; + } + ha-svg-icon.network-status-icon { + height: 14px; + width: 14px; + } + .online { + color: green; + } + .starting { + color: orange; + } + .offline { + color: red; + } + ha-svg-icon, + ha-icon-next { + color: var(--secondary-text-color); + } + .iron-selected paper-item::before, + a:not(.iron-selected):focus::before { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + pointer-events: none; + content: ""; + transition: opacity 15ms linear; + will-change: opacity; + } + a:not(.iron-selected):focus::before { + background-color: currentColor; + opacity: var(--dark-divider-opacity); + } + .iron-selected paper-item:focus::before, + .iron-selected:focus paper-item::before { + opacity: 0.2; + } + `, + ]; + } +} + +declare global { + interface HTMLElementTagNameMap { + "ozw-config-dashboard": OZWConfigDashboard; + } +} diff --git a/src/panels/config/integrations/integration-panels/ozw/ozw-config-network.ts b/src/panels/config/integrations/integration-panels/ozw/ozw-config-network.ts new file mode 100644 index 0000000000..6d67ed779e --- /dev/null +++ b/src/panels/config/integrations/integration-panels/ozw/ozw-config-network.ts @@ -0,0 +1,253 @@ +import "@material/mwc-fab"; +import { + css, + CSSResultArray, + customElement, + html, + internalProperty, + LitElement, + property, + TemplateResult, +} from "lit-element"; +import { navigate } from "../../../../../common/navigate"; +import "../../../../../components/ha-card"; +import "../../../../../components/ha-icon-next"; +import "../../../../../components/buttons/ha-call-service-button"; +import { haStyle } from "../../../../../resources/styles"; +import type { HomeAssistant, Route } from "../../../../../types"; +import "../../../ha-config-section"; +import { mdiCircle, mdiCheckCircle, mdiCloseCircle } from "@mdi/js"; +import "../../../../../layouts/hass-tabs-subpage"; +import type { PageNavigation } from "../../../../../layouts/hass-tabs-subpage"; +import "@material/mwc-button/mwc-button"; +import { + OZWInstance, + fetchOZWNetworkStatus, + fetchOZWNetworkStatistics, + networkOnlineStatuses, + networkOfflineStatuses, + networkStartingStatuses, + OZWNetworkStatistics, +} from "../../../../../data/ozw"; + +export const ozwTabs: PageNavigation[] = []; + +@customElement("ozw-config-network") +class OZWConfigNetwork extends LitElement { + @property({ type: Object }) public hass!: HomeAssistant; + + @property({ type: Object }) public route!: Route; + + @property({ type: Boolean }) public narrow!: boolean; + + @property({ type: Boolean }) public isWide!: boolean; + + @property() public configEntryId?: string; + + @property() public ozw_instance = 0; + + @internalProperty() private _network?: OZWInstance; + + @internalProperty() private _statistics?: OZWNetworkStatistics; + + @internalProperty() private _status = "unknown"; + + @internalProperty() private _icon = mdiCircle; + + public connectedCallback(): void { + super.connectedCallback(); + if (this.ozw_instance <= 0) { + navigate(this, "/config/ozw/dashboard", true); + } + if (this.hass) { + this._fetchData(); + } + } + + private async _fetchData() { + this._network = await fetchOZWNetworkStatus(this.hass!, this.ozw_instance); + this._statistics = await fetchOZWNetworkStatistics( + this.hass!, + this.ozw_instance + ); + if (networkOnlineStatuses.includes(this._network.Status)) { + this._status = "online"; + this._icon = mdiCheckCircle; + } + if (networkStartingStatuses.includes(this._network.Status)) { + this._status = "starting"; + } + if (networkOfflineStatuses.includes(this._network.Status)) { + this._status = "offline"; + this._icon = mdiCloseCircle; + } + } + + private _generateServiceButton(service: string) { + return html` + + ${this.hass!.localize("ui.panel.config.ozw.services." + service)} + + `; + } + + protected render(): TemplateResult { + return html` + + +
    + ${this.hass.localize("ui.panel.config.ozw.network.header")} +
    + +
    + ${this.hass.localize("ui.panel.config.ozw.network.introduction")} +
    + ${this._network + ? html` + +
    +
    + + ${this.hass.localize( + "ui.panel.config.ozw.common.network" + )} + ${this.hass.localize( + "ui.panel.config.ozw.network_status." + this._status + )} +
    + + ${this.hass.localize( + "ui.panel.config.ozw.network_status.details." + + this._network.Status.toLowerCase() + )} + +
    +
    + ${this.hass.localize( + "ui.panel.config.ozw.common.ozw_instance" + )} + ${this._network.ozw_instance} + ${this._statistics + ? html` + • + ${this.hass.localize( + "ui.panel.config.ozw.network.node_count", + "count", + this._statistics.node_count + )} + ` + : ``} +
    + ${this.hass.localize( + "ui.panel.config.ozw.common.controller" + )}: + ${this._network.getControllerPath}
    + OZWDaemon ${this._network.OZWDaemon_Version} (OpenZWave + ${this._network.OpenZWave_Version}) +
    +
    +
    + ${this._generateServiceButton("add_node")} + ${this._generateServiceButton("remove_node")} +
    +
    + ` + : ``} +
    +
    + `; + } + + static get styles(): CSSResultArray { + return [ + haStyle, + css` + .secondary { + color: var(--secondary-text-color); + } + .online { + color: green; + } + .starting { + color: orange; + } + .offline { + color: red; + } + .content { + margin-top: 24px; + } + + .sectionHeader { + position: relative; + padding-right: 40px; + } + + .network-status { + text-align: center; + } + + .network-status div.details { + font-size: 1.5rem; + margin-bottom: 16px; + } + + .network-status ha-svg-icon { + display: block; + margin: 0px auto 16px; + width: 48px; + height: 48px; + } + + .network-status small { + font-size: 1rem; + } + + ha-card { + margin: 0 auto; + max-width: 600px; + } + + .card-actions.warning ha-call-service-button { + color: var(--error-color); + } + + .toggle-help-icon { + position: absolute; + top: -6px; + right: 0; + color: var(--primary-color); + } + + ha-service-description { + display: block; + color: grey; + padding: 0 8px 12px; + } + + [hidden] { + display: none; + } + `, + ]; + } +} + +declare global { + interface HTMLElementTagNameMap { + "ozw-config-network": OZWConfigNetwork; + } +} diff --git a/src/panels/config/integrations/integration-panels/ozw/ozw-config-router.ts b/src/panels/config/integrations/integration-panels/ozw/ozw-config-router.ts new file mode 100644 index 0000000000..28402cbe4c --- /dev/null +++ b/src/panels/config/integrations/integration-panels/ozw/ozw-config-router.ts @@ -0,0 +1,70 @@ +import { customElement, property } from "lit-element"; +import { + HassRouterPage, + RouterOptions, +} from "../../../../../layouts/hass-router-page"; +import { HomeAssistant } from "../../../../../types"; +import { navigate } from "../../../../../common/navigate"; + +@customElement("ozw-config-router") +class OZWConfigRouter extends HassRouterPage { + @property({ attribute: false }) public hass!: HomeAssistant; + + @property() public isWide!: boolean; + + @property() public narrow!: boolean; + + private _configEntry = new URLSearchParams(window.location.search).get( + "config_entry" + ); + + protected routerOptions: RouterOptions = { + defaultPage: "dashboard", + showLoading: true, + routes: { + dashboard: { + tag: "ozw-config-dashboard", + load: () => + import( + /* webpackChunkName: "ozw-config-dashboard" */ "./ozw-config-dashboard" + ), + }, + network: { + tag: "ozw-config-network", + load: () => + import( + /* webpackChunkName: "ozw-config-network" */ "./ozw-config-network" + ), + }, + }, + }; + + protected updatePageEl(el): void { + el.route = this.routeTail; + el.hass = this.hass; + el.isWide = this.isWide; + el.narrow = this.narrow; + el.configEntryId = this._configEntry; + if (this._currentPage === "network") { + el.ozw_instance = this.routeTail.path.substr(1); + } + + const searchParams = new URLSearchParams(window.location.search); + if (this._configEntry && !searchParams.has("config_entry")) { + searchParams.append("config_entry", this._configEntry); + navigate( + this, + `${this.routeTail.prefix}${ + this.routeTail.path + }?${searchParams.toString()}`, + true + ); + } + } +} + +declare global { + interface HTMLElementTagNameMap { + "ozw-config-router": OZWConfigRouter; + } +} diff --git a/src/translations/en.json b/src/translations/en.json index e18f1ec129..7d665900a5 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1684,10 +1684,14 @@ "message_received": "Message {id} received on {topic} at {time}:" }, "ozw": { + "button": "Configure", "common": { "zwave": "Z-Wave", "node_id": "Node ID", - "ozw_instance": "OpenZWave Instance" + "ozw_instance": "OpenZWave Instance", + "instance": "Instance", + "controller": "Controller", + "network": "Network" }, "device_info": { "zwave_info": "Z-Wave Info", @@ -1724,6 +1728,44 @@ "refreshing_description": "Refreshing node information...", "node_status": "Node Status", "step": "Step" + }, + "network_status": { + "online": "Online", + "offline": "Offline", + "starting": "Starting", + "unknown": "Unknown", + "details": { + "driverallnodesqueried": "All nodes have been queried", + "driverallnodesqueriedsomedead": "All nodes have been queried. Some nodes were found dead", + "driverawakenodesqueries": "All awake nodes have been queried", + "driverremoved": "The driver has been removed", + "driverreset": "The driver has been reset", + "driverfailed": "Failed to connect to Z-Wave controller", + "driverready": "Initializing the Z-Wave controller", + "ready": "Ready to connect", + "stopped": "OpenZWave stopped", + "started": "Connected to MQTT", + "starting": "Connecting to MQTT", + "offline": "OZWDaemon offline" + } + }, + "navigation": { + "select_instance": "Select Instance", + "network": "Network", + "nodes": "Nodes" + }, + "select_instance": { + "header": "Select an OpenZWave Instance", + "introduction": "You have more than one OpenZWave instance running. Which instance would you like to manage?" + }, + "network": { + "header": "Network Management", + "introduction": "Manage network-wide functions.", + "node_count": "{count} nodes" + }, + "services": { + "add_node": "Add Node", + "remove_node": "Remove Node" } }, "zha": { From 63c995e5daa6a3968e1c440867ff80085b8d5949 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 24 Aug 2020 12:24:24 -0500 Subject: [PATCH 064/300] cleanups --- src/panels/logbook/ha-logbook.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/panels/logbook/ha-logbook.ts b/src/panels/logbook/ha-logbook.ts index 635a4113a1..af886126d3 100644 --- a/src/panels/logbook/ha-logbook.ts +++ b/src/panels/logbook/ha-logbook.ts @@ -120,10 +120,10 @@ class HaLogbook extends LitElement { > ${!item.context_event_type ? "" - : item.context_event_type == "call_service" + : item.context_event_type === "call_service" ? // Service Call html` by service ${item.context_domain}.${item.context_service}` - : item.context_entity_id == item.entity_id + : item.context_entity_id === item.entity_id ? // HomeKit or something that self references html` by ${item.context_name From 06a25284e8ea03ffb0eb37e14ac4c5ca41728640 Mon Sep 17 00:00:00 2001 From: fabiocastagnino Date: Mon, 24 Aug 2020 19:50:47 +0200 Subject: [PATCH 065/300] Add icons for new sensor device classes (#6193) Co-authored-by: Bram Kragten --- src/common/entity/sensor_icon.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/common/entity/sensor_icon.ts b/src/common/entity/sensor_icon.ts index 1ec97ff5d9..7c8d264027 100644 --- a/src/common/entity/sensor_icon.ts +++ b/src/common/entity/sensor_icon.ts @@ -5,12 +5,16 @@ import { domainIcon } from "./domain_icon"; import { batteryIcon } from "./battery_icon"; const fixedDeviceClassIcons = { + current: "hass:current-ac", + energy: "hass:flash", humidity: "hass:water-percent", illuminance: "hass:brightness-5", temperature: "hass:thermometer", pressure: "hass:gauge", power: "hass:flash", + power_factor: "hass:angle-acute", signal_strength: "hass:wifi", + voltage: "hass:sine-wave", }; export const sensorIcon = (state: HassEntity) => { From dae42b1bd9652e66b471b328e91ab75f21e9531e Mon Sep 17 00:00:00 2001 From: Zack Arnett Date: Mon, 24 Aug 2020 12:59:50 -0500 Subject: [PATCH 066/300] Calendar Card: New Card (#5813) Co-authored-by: Bram Kragten --- package.json | 7 +- src/components/ha-button-toggle-group.ts | 42 ++-- src/panels/calendar/ha-full-calendar.ts | 209 ++++++++++++++--- src/panels/calendar/ha-panel-calendar.ts | 10 +- .../lovelace/cards/hui-calendar-card.ts | 213 ++++++++++++++++++ src/panels/lovelace/cards/types.ts | 6 + .../create-element/create-card-element.ts | 2 + .../hui-calendar-card-editor.ts | 133 +++++++++++ src/panels/lovelace/editor/lovelace-cards.ts | 4 + src/translations/en.json | 4 + src/types.ts | 14 +- yarn.lock | 52 ++++- 12 files changed, 619 insertions(+), 77 deletions(-) create mode 100644 src/panels/lovelace/cards/hui-calendar-card.ts create mode 100644 src/panels/lovelace/editor/config-elements/hui-calendar-card-editor.ts diff --git a/package.json b/package.json index 89fb7c3e93..5be452e00b 100644 --- a/package.json +++ b/package.json @@ -23,8 +23,11 @@ "license": "Apache-2.0", "dependencies": { "@formatjs/intl-pluralrules": "^1.5.8", - "@fullcalendar/core": "^5.0.0-beta.2", - "@fullcalendar/daygrid": "^5.0.0-beta.2", + "@fullcalendar/common": "5.1.0", + "@fullcalendar/core": "5.1.0", + "@fullcalendar/daygrid": "5.1.0", + "@fullcalendar/interaction": "5.1.0", + "@fullcalendar/list": "5.1.0", "@material/chips": "=8.0.0-canary.096a7a066.0", "@material/circular-progress": "=8.0.0-canary.a78ceb112.0", "@material/mwc-button": "^0.18.0", diff --git a/src/components/ha-button-toggle-group.ts b/src/components/ha-button-toggle-group.ts index a9ea972492..cc4c870d07 100644 --- a/src/components/ha-button-toggle-group.ts +++ b/src/components/ha-button-toggle-group.ts @@ -1,3 +1,4 @@ +import "@material/mwc-icon-button/mwc-icon-button"; import { customElement, html, @@ -8,14 +9,14 @@ import { css, } from "lit-element"; -import "./ha-icon-button"; - import { fireEvent } from "../common/dom/fire_event"; import type { ToggleButton } from "../types"; +import "./ha-svg-icon"; + @customElement("ha-button-toggle-group") export class HaButtonToggleGroup extends LitElement { - @property() public buttons!: ToggleButton[]; + @property({ attribute: false }) public buttons!: ToggleButton[]; @property() public active?: string; @@ -23,14 +24,16 @@ export class HaButtonToggleGroup extends LitElement { return html`
    ${this.buttons.map( - (button) => html` - ` + (button) => html` + + + + ` )}
    `; @@ -48,12 +51,13 @@ export class HaButtonToggleGroup extends LitElement { --mdc-icon-button-size: var(--button-toggle-size, 36px); --mdc-icon-size: var(--button-toggle-icon-size, 20px); } - ha-icon-button { + mwc-icon-button { border: 1px solid var(--primary-color); border-right-width: 0px; position: relative; + cursor: pointer; } - ha-icon-button::before { + mwc-icon-button::before { top: 0; left: 0; width: 100%; @@ -65,22 +69,26 @@ export class HaButtonToggleGroup extends LitElement { content: ""; transition: opacity 15ms linear, background-color 15ms linear; } - ha-icon-button[active]::before { + mwc-icon-button[active]::before { opacity: var(--mdc-icon-button-ripple-opacity, 0.12); } - ha-icon-button:first-child { + mwc-icon-button:first-child { border-radius: 4px 0 0 4px; } - ha-icon-button:last-child { + mwc-icon-button:last-child { border-radius: 0 4px 4px 0; border-right-width: 1px; } + mwc-icon-button:only-child { + border-radius: 4px; + border-right-width: 1px; + } `; } } declare global { interface HTMLElementTagNameMap { - "ha-button-toggle-button": HaButtonToggleGroup; + "ha-button-toggle-group": HaButtonToggleGroup; } } diff --git a/src/panels/calendar/ha-full-calendar.ts b/src/panels/calendar/ha-full-calendar.ts index e3b0e6af15..8b0bdfddc1 100644 --- a/src/panels/calendar/ha-full-calendar.ts +++ b/src/panels/calendar/ha-full-calendar.ts @@ -1,3 +1,4 @@ +import "@material/mwc-button"; import { property, internalProperty, @@ -9,13 +10,19 @@ import { unsafeCSS, TemplateResult, } from "lit-element"; +import { mdiViewModule, mdiViewWeek, mdiViewDay, mdiViewAgenda } from "@mdi/js"; import { Calendar } from "@fullcalendar/core"; +import type { CalendarOptions } from "@fullcalendar/core"; import dayGridPlugin from "@fullcalendar/daygrid"; +import listPlugin from "@fullcalendar/list"; +import interactionPlugin from "@fullcalendar/interaction"; // @ts-ignore -import fullcalendarStyle from "@fullcalendar/core/main.css"; +import fullcalendarStyle from "@fullcalendar/common/main.css"; // @ts-ignore import daygridStyle from "@fullcalendar/daygrid/main.css"; -import "@material/mwc-button"; +// @ts-ignore +import listStyle from "@fullcalendar/list/main.css"; +import memoize from "memoize-one"; import "../../components/ha-icon-button"; import "../../components/ha-button-toggle-group"; @@ -25,43 +32,56 @@ import type { CalendarEvent, ToggleButton, HomeAssistant, + FullCalendarView, } from "../../types"; import { fireEvent } from "../../common/dom/fire_event"; import { haStyle } from "../../resources/styles"; declare global { + interface HTMLElementTagNameMap { + "ha-full-calendar": HAFullCalendar; + } interface HASSDomEvents { "view-changed": CalendarViewChanged; } } -const fullCalendarConfig = { +const defaultFullCalendarConfig: CalendarOptions = { headerToolbar: false, - plugins: [dayGridPlugin], + plugins: [dayGridPlugin, listPlugin, interactionPlugin], initialView: "dayGridMonth", dayMaxEventRows: true, height: "parent", + eventDisplay: "list-item", }; const viewButtons: ToggleButton[] = [ - { label: "Month View", value: "dayGridMonth", icon: "hass:view-module" }, - { label: "Week View", value: "dayGridWeek", icon: "hass:view-week" }, - { label: "Day View", value: "dayGridDay", icon: "hass:view-day" }, + { label: "Month View", value: "dayGridMonth", iconPath: mdiViewModule }, + { label: "Week View", value: "dayGridWeek", iconPath: mdiViewWeek }, + { label: "Day View", value: "dayGridDay", iconPath: mdiViewDay }, + { label: "List View", value: "listWeek", iconPath: mdiViewAgenda }, ]; class HAFullCalendar extends LitElement { public hass!: HomeAssistant; - @property() public events: CalendarEvent[] = []; + @property({ type: Boolean, reflect: true }) public narrow = false; - @property({ type: Boolean, reflect: true }) - public narrow!: boolean; + @property({ attribute: false }) public events: CalendarEvent[] = []; + + @property({ attribute: false }) public views: FullCalendarView[] = [ + "dayGridMonth", + "dayGridWeek", + "dayGridDay", + ]; @internalProperty() private calendar?: Calendar; - @internalProperty() private _activeView = "dayGridMonth"; + @internalProperty() private _activeView: FullCalendarView = "dayGridMonth"; protected render(): TemplateResult { + const viewToggleButtons = this._viewToggleButtons(this.views); + return html` ${this.calendar ? html` @@ -96,27 +116,12 @@ class HAFullCalendar extends LitElement { ${this.calendar.view.title} ` : html` -
    - ${this.hass.localize( - "ui.panel.calendar.today" - )} - -

    ${this.calendar.view.title} @@ -138,6 +143,21 @@ class HAFullCalendar extends LitElement {

    +
    + ${this.hass.localize( + "ui.panel.calendar.today" + )} + +
    `} ` @@ -157,14 +177,25 @@ class HAFullCalendar extends LitElement { this.calendar.removeAllEventSources(); this.calendar.addEventSource(this.events); } + + if (changedProps.has("views") && !this.views.includes(this._activeView)) { + this._activeView = this.views[0]; + this.calendar!.changeView(this._activeView); + this._fireViewChanged(); + } } protected firstUpdated(): void { - const config = { ...fullCalendarConfig, locale: this.hass.language }; + const config: CalendarOptions = { + ...defaultFullCalendarConfig, + locale: this.hass.language, + }; + + config.dateClick = this._handleDateClick; + config.eventClick = this._handleEventClick; this.calendar = new Calendar( this.shadowRoot!.getElementById("calendar")!, - // @ts-ignore config ); @@ -172,6 +203,25 @@ class HAFullCalendar extends LitElement { this._fireViewChanged(); } + private _handleEventClick(info): void { + if (info.view.type !== "dayGridMonth") { + return; + } + + this._activeView = "dayGridDay"; + this.calendar!.changeView("dayGridDay"); + this.calendar!.gotoDate(info.event.startStr); + } + + private _handleDateClick(info): void { + if (info.view.type !== "dayGridMonth") { + return; + } + this._activeView = "dayGridDay"; + this.calendar!.changeView("dayGridDay"); + this.calendar!.gotoDate(info.dateStr); + } + private _handleNext(): void { this.calendar!.next(); this._fireViewChanged(); @@ -201,14 +251,21 @@ class HAFullCalendar extends LitElement { }); } + private _viewToggleButtons = memoize((views) => + viewButtons.filter((button) => + views.includes(button.value as FullCalendarView) + ) + ); + static get styles(): CSSResult[] { return [ haStyle, css` ${unsafeCSS(fullcalendarStyle)} ${unsafeCSS(daygridStyle)} - - :host { + ${unsafeCSS(listStyle)} + + :host { display: flex; flex-direction: column; --fc-theme-standard-border-color: var(--divider-color); @@ -262,6 +319,15 @@ class HAFullCalendar extends LitElement { #calendar { flex-grow: 1; background-color: var(--card-background-color); + min-height: 400px; + --fc-neutral-bg-color: var(--card-background-color); + --fc-list-event-hover-bg-color: var(--card-background-color); + --fc-theme-standard-border-color: var(--divider-color); + --fc-border-color: var(--divider-color); + } + + a { + color: inherit !important; } .fc-theme-standard .fc-scrollgrid { @@ -273,15 +339,20 @@ class HAFullCalendar extends LitElement { } th.fc-col-header-cell.fc-day { - color: #70757a; + color: var(--secondary-text-color); font-size: 11px; font-weight: 400; text-transform: uppercase; } + .fc-daygrid-dot-event:hover { + background-color: inherit + } + .fc-daygrid-day-top { text-align: center; - padding-top: 8px; + padding-top: 5px; + justify-content: center; } table.fc-scrollgrid-sync-table @@ -296,13 +367,21 @@ class HAFullCalendar extends LitElement { font-size: 12px; } - td.fc-day-today { + .fc .fc-daygrid-day-number { + padding: 3px !important; + } + + .fc .fc-daygrid-day.fc-day-today { background: inherit; } + td.fc-day-today .fc-daygrid-day-top { + padding-top: 4px; + } + td.fc-day-today .fc-daygrid-day-number { height: 24px; - color: var(--text-primary-color); + color: var(--text-primary-color) !important; background-color: var(--primary-color); border-radius: 50%; display: inline-block; @@ -342,6 +421,66 @@ class HAFullCalendar extends LitElement { .fc-popover-header { background-color: var(--secondary-background-color) !important; } + + .fc-theme-standard .fc-list-day-frame { + background-color: transparent; + } + + .fc-list.fc-view, + .fc-list-event.fc-event td { + border: none; + } + + .fc-list-day.fc-day th { + border-bottom: none; + border-top: 1px solid var(--fc-theme-standard-border-color, #ddd) !important; + } + + .fc-list-day-text { + font-size: 16px; + font-weight: 400; + } + + .fc-list-day-side-text { + font-weight: 400; + font-size: 16px; + color: var(--primary-color); + } + + .fc-list-table td, + .fc-list-day-frame { + padding-top: 12px; + padding-bottom: 12px; + } + + :host([narrow]) .fc-dayGridMonth-view + .fc-daygrid-dot-event + .fc-event-time, + :host([narrow]) .fc-dayGridMonth-view + .fc-daygrid-dot-event + .fc-event-title, + :host([narrow]) .fc-dayGridMonth-view .fc-daygrid-day-bottom { + display: none; + } + + :host([narrow]) .fc .fc-dayGridMonth-view .fc-daygrid-event-harness-abs { + visibility: visible !important; + position: static; + } + + :host([narrow]) .fc-dayGridMonth-view .fc-daygrid-day-events { + display: flex; + min-height: 2em !important; + justify-content: center; + flex-wrap: wrap; + max-height: 2em; + height: 2em; + overflow: hidden; + } + + :host([narrow]) .fc-dayGridMonth-view .fc-scrollgrid-sync-table { + overflow: hidden; + } `, ]; } diff --git a/src/panels/calendar/ha-panel-calendar.ts b/src/panels/calendar/ha-panel-calendar.ts index ea7d2bb69b..58aefd8146 100644 --- a/src/panels/calendar/ha-panel-calendar.ts +++ b/src/panels/calendar/ha-panel-calendar.ts @@ -53,12 +53,6 @@ class PanelCalendar extends LitElement { selected: true, calendar, })); - - if (!this._start || !this._end) { - return; - } - - this._fetchEvents(this._start, this._end, this._selectedCalendars); } protected render(): TemplateResult { @@ -88,8 +82,8 @@ class PanelCalendar extends LitElement { { + await import( + /* webpackChunkName: "hui-calendar-card-editor" */ "../editor/config-elements/hui-calendar-card-editor" + ); + return document.createElement("hui-calendar-card-editor"); + } + + public static getStubConfig( + hass: HomeAssistant, + entities: string[], + entitiesFill: string[] + ) { + const includeDomains = ["calendar"]; + const maxEntities = 2; + const foundEntities = findEntities( + hass, + maxEntities, + entities, + entitiesFill, + includeDomains + ); + + return { + entities: foundEntities, + }; + } + + @property({ attribute: false }) public hass?: HomeAssistant; + + @property({ attribute: false }) public _events: CalendarEvent[] = []; + + @internalProperty() private _config?: CalendarCardConfig; + + @internalProperty() private _calendars: Calendar[] = []; + + @internalProperty() private _narrow = false; + + @internalProperty() private _veryNarrow = false; + + private _resizeObserver?: ResizeObserver; + + public setConfig(config: CalendarCardConfig): void { + if (!config.entities) { + throw new Error("Entities must be defined"); + } + + if (config.entities && !Array.isArray(config.entities)) { + throw new Error("Entities need to be an array"); + } + + this._calendars = config!.entities.map((entity, idx) => { + return { + entity_id: entity, + backgroundColor: `#${HA_COLOR_PALETTE[idx % HA_COLOR_PALETTE.length]}`, + }; + }); + + this._config = config; + } + + public getCardSize(): number { + return 4; + } + + public connectedCallback(): void { + super.connectedCallback(); + this.updateComplete.then(() => this._attachObserver()); + } + + public disconnectedCallback(): void { + if (this._resizeObserver) { + this._resizeObserver.disconnect(); + } + } + + protected render(): TemplateResult { + if (!this._config || !this.hass || !this._calendars.length) { + return html``; + } + + const views: FullCalendarView[] = this._veryNarrow + ? ["listWeek"] + : ["listWeek", "dayGridMonth", "dayGridDay"]; + + return html` + +
    ${this._config.title}
    + +
    + `; + } + + protected updated(changedProps: PropertyValues) { + super.updated(changedProps); + if (!this._config || !this.hass) { + return; + } + + const oldHass = changedProps.get("hass") as HomeAssistant | undefined; + const oldConfig = changedProps.get("_config") as + | CalendarCardConfig + | undefined; + + if ( + !oldHass || + !oldConfig || + (changedProps.has("hass") && oldHass.themes !== this.hass.themes) || + (changedProps.has("_config") && oldConfig.theme !== this._config.theme) + ) { + applyThemesOnElement(this, this.hass.themes, this._config!.theme); + } + } + + private async _handleViewChanged( + ev: HASSDomEvent + ): Promise { + this._events = await fetchCalendarEvents( + this.hass!, + ev.detail.start, + ev.detail.end, + this._calendars + ); + } + + private _measureCard() { + const card = this.shadowRoot!.querySelector("ha-card"); + if (!card) { + return; + } + this._narrow = card.offsetWidth < 870; + this._veryNarrow = card.offsetWidth < 350; + } + + private async _attachObserver(): Promise { + if (!this._resizeObserver) { + await installResizeObserver(); + this._resizeObserver = new ResizeObserver( + debounce(() => this._measureCard(), 250, false) + ); + } + const card = this.shadowRoot!.querySelector("ha-card"); + // If we show an error or warning there is no ha-card + if (!card) { + return; + } + this._resizeObserver.observe(card); + } + + static get styles(): CSSResult { + return css` + ha-card { + position: relative; + padding: 0 8px 8px; + } + + .header { + color: var(--ha-card-header-color, --primary-text-color); + font-size: var(--ha-card-header-font-size, 24px); + line-height: 1.2; + padding-top: 16px; + padding-left: 8px; + } + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + "hui-calendar-card": HuiCalendarCard; + } +} diff --git a/src/panels/lovelace/cards/types.ts b/src/panels/lovelace/cards/types.ts index 8ea3d859b5..ac3feafc79 100644 --- a/src/panels/lovelace/cards/types.ts +++ b/src/panels/lovelace/cards/types.ts @@ -12,6 +12,12 @@ export interface AlarmPanelCardConfig extends LovelaceCardConfig { theme?: string; } +export interface CalendarCardConfig extends LovelaceCardConfig { + entities: string[]; + title?: string; + theme?: string; +} + export interface ConditionalCardConfig extends LovelaceCardConfig { card: LovelaceCardConfig; conditions: Condition[]; diff --git a/src/panels/lovelace/create-element/create-card-element.ts b/src/panels/lovelace/create-element/create-card-element.ts index e7061c1727..bf62823dbb 100644 --- a/src/panels/lovelace/create-element/create-card-element.ts +++ b/src/panels/lovelace/create-element/create-card-element.ts @@ -1,5 +1,6 @@ import { LovelaceCardConfig } from "../../../data/lovelace"; import "../cards/hui-button-card"; +import "../cards/hui-calendar-card"; import "../cards/hui-entities-card"; import "../cards/hui-entity-button-card"; import "../cards/hui-entity-card"; @@ -52,6 +53,7 @@ const LAZY_LOAD_TYPES = { map: () => import("../cards/hui-map-card"), markdown: () => import("../cards/hui-markdown-card"), picture: () => import("../cards/hui-picture-card"), + calendar: () => import("../cards/hui-calendar-card"), }; // This will not return an error card but will throw the error diff --git a/src/panels/lovelace/editor/config-elements/hui-calendar-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-calendar-card-editor.ts new file mode 100644 index 0000000000..5a7cd7049a --- /dev/null +++ b/src/panels/lovelace/editor/config-elements/hui-calendar-card-editor.ts @@ -0,0 +1,133 @@ +import { + customElement, + html, + LitElement, + property, + TemplateResult, + internalProperty, +} from "lit-element"; +import { fireEvent } from "../../../../common/dom/fire_event"; +import type { HomeAssistant } from "../../../../types"; +import type { CalendarCardConfig } from "../../cards/types"; +import "../../components/hui-entity-editor"; +import "../../../../components/entity/ha-entities-picker"; +import "../../components/hui-theme-select-editor"; +import type { LovelaceCardEditor } from "../../types"; +import type { EditorTarget, EntitiesEditorEvent } from "../types"; +import { configElementStyle } from "./config-elements-style"; +import { + string, + optional, + object, + boolean, + array, + union, + assert, +} from "superstruct"; + +const cardConfigStruct = object({ + type: string(), + title: optional(union([string(), boolean()])), + theme: optional(string()), + entities: array(string()), +}); + +@customElement("hui-calendar-card-editor") +export class HuiCalendarCardEditor extends LitElement + implements LovelaceCardEditor { + @property({ attribute: false }) public hass?: HomeAssistant; + + @property({ attribute: false }) private _config?: CalendarCardConfig; + + @internalProperty() private _configEntities?: string[]; + + public setConfig(config: CalendarCardConfig): void { + assert(config, cardConfigStruct); + this._config = config; + this._configEntities = config.entities; + } + + get _title(): string { + return this._config!.title || ""; + } + + get _theme(): string { + return this._config!.theme || ""; + } + + protected render(): TemplateResult { + if (!this.hass || !this._config) { + return html``; + } + + return html` + ${configElementStyle} +
    +
    + + +
    +
    +

    + ${"Calendar Entities" + + " (" + + this.hass!.localize("ui.panel.lovelace.editor.card.config.required") + + ")"} +

    + + + `; + } + + private _valueChanged(ev: EntitiesEditorEvent | CustomEvent): void { + if (!this._config || !this.hass) { + return; + } + + const target = ev.target! as EditorTarget; + + if (this[`_${target.configValue}`] === target.value) { + return; + } + + if (ev.detail && ev.detail.value && Array.isArray(ev.detail.value)) { + this._config = { ...this._config, entities: ev.detail.value }; + } else if (target.configValue) { + if (target.value === "") { + delete this._config[target.configValue!]; + } else { + this._config = { + ...this._config, + [target.configValue]: target.value, + }; + } + } + + fireEvent(this, "config-changed", { config: this._config }); + } +} + +declare global { + interface HTMLElementTagNameMap { + "hui-calendar-card-editor": HuiCalendarCardEditor; + } +} diff --git a/src/panels/lovelace/editor/lovelace-cards.ts b/src/panels/lovelace/editor/lovelace-cards.ts index 9d777fa942..13c099a791 100644 --- a/src/panels/lovelace/editor/lovelace-cards.ts +++ b/src/panels/lovelace/editor/lovelace-cards.ts @@ -9,6 +9,10 @@ export const coreCards: Card[] = [ type: "button", showElement: true, }, + { + type: "calendar", + showElement: true, + }, { type: "entities", showElement: true, diff --git a/src/translations/en.json b/src/translations/en.json index 7d665900a5..caa70d5a03 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -2134,6 +2134,10 @@ "available_states": "Available States", "description": "The Alarm Panel card allows you to Arm and Disarm your alarm control panel integrations." }, + "calendar": { + "name": "Calendar", + "description": "The Calendar card displays a calendar including day, week and list views" + }, "conditional": { "name": "Conditional", "description": "The Conditional card displays another card based on entity states.", diff --git a/src/types.ts b/src/types.ts index 7639f1ea43..a6f27ee768 100644 --- a/src/types.ts +++ b/src/types.ts @@ -118,8 +118,8 @@ export interface Panels { export interface Calendar { entity_id: string; - name: string; - backgroundColor: string; + name?: string; + backgroundColor?: string; } export interface SelectedCalendar { @@ -144,9 +144,15 @@ export interface CalendarViewChanged { view: string; } +export type FullCalendarView = + | "dayGridMonth" + | "dayGridWeek" + | "dayGridDay" + | "listWeek"; + export interface ToggleButton { - label?: string; - icon: string; + label: string; + iconPath: string; value: string; } diff --git a/yarn.lock b/yarn.lock index 1e7c5ffa8d..83cd0d1794 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1184,20 +1184,45 @@ resolved "https://registry.yarnpkg.com/@formatjs/intl-utils/-/intl-utils-2.2.5.tgz#eaafd94df3d102ee13e54e80f992a33868a6b1e8" integrity sha512-p7gcmazKROteL4IECCp03Qrs790fZ8tbemUAjQu0+K0AaAlK49rI1SIFFq3LzDUAqXIshV95JJhRe/yXxkal5g== -"@fullcalendar/core@^5.0.0-beta.2": - version "5.0.0-beta.2" - resolved "https://registry.yarnpkg.com/@fullcalendar/core/-/core-5.0.0-beta.2.tgz#30a9cbbbf2d6476568f53cfa1c0746d06daa9660" - integrity sha512-9U/kk8Y4ackY1XZ1PHvX8rG1olixoKveStXdDsX3FCtKATR8fA/O+4Pd5qyH7nGcih8TrgreUjZ+dB+DEaomqQ== +"@fullcalendar/common@5.1.0", "@fullcalendar/common@~5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@fullcalendar/common/-/common-5.1.0.tgz#a45e01ebdcf00654f4d45f0457926cf2f5909820" + integrity sha512-ubwf9T0BDocGLh0AK8achrmc0siQdrp3Wn6Rmg/Ht4/WnwBtjc5gumzJ0ezG/xHE0GWG+Pz6Tm0IJF/jE7NJHw== dependencies: - preact "^10.0.5" - tslib "^1.9.3" + tslib "^2.0.0" -"@fullcalendar/daygrid@^5.0.0-beta.2": - version "5.0.0-beta.2" - resolved "https://registry.yarnpkg.com/@fullcalendar/daygrid/-/daygrid-5.0.0-beta.2.tgz#fae2a7cba8a6afc23c9d6faaa88150d820e59a73" - integrity sha512-Dd2VLsMPWPH1W1HQ+K1iftHVXF1MYOM/lo33FUdFKM8jc0MHnF620TVyOgPojAC26u2hApbURKIY2eY87vFulg== +"@fullcalendar/core@5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@fullcalendar/core/-/core-5.1.0.tgz#0d9813b0564f24fe6285e31f8313d9366c6db411" + integrity sha512-C9OA9LHD1zgfcMABQ17TaxvAO/iubYFLDrgTIRCe77LatC0G36UBafthevUlMRqCR6rt5SBcw0oBt23HqSJO3A== dependencies: - tslib "^1.9.3" + "@fullcalendar/common" "~5.1.0" + preact "^10.0.5" + tslib "^2.0.0" + +"@fullcalendar/daygrid@5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@fullcalendar/daygrid/-/daygrid-5.1.0.tgz#4f8cb30e99ff00600f064645942d21e8f668c946" + integrity sha512-zdO/EFer8wWrr+kvkMfyizPi/F7yvOCpGOb6Arz6QqyOgFl1ffNUQoRf1iQf7h2PnIEvZWZdZs+3wuMwwmhb3g== + dependencies: + "@fullcalendar/common" "~5.1.0" + tslib "^2.0.0" + +"@fullcalendar/interaction@5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@fullcalendar/interaction/-/interaction-5.1.0.tgz#0e7c6fe17bf8532de2c994bde5fc6e9220c71a89" + integrity sha512-RuCtsVFXvGYk4vYz3Aq9+G8SMOG6iX+xNJmHELdmPfAatHTVyUSCD4GznxR1/fzUu74mb98X01DVkLwSB+78oA== + dependencies: + "@fullcalendar/common" "~5.1.0" + tslib "^2.0.0" + +"@fullcalendar/list@5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@fullcalendar/list/-/list-5.1.0.tgz#e08b011cce8259fdee46ef8737bf98b31e6eac1a" + integrity sha512-FDLsInaLv0H/BwpoJ4RbC69M8yoJ3xoRnkulChAzhIBrwXAKOHJth5P+iNFJVVYI7DaPgSi0BzEwiu0dJdStHQ== + dependencies: + "@fullcalendar/common" "~5.1.0" + tslib "^2.0.0" "@gfx/zopfli@^1.0.9": version "1.0.11" @@ -11747,6 +11772,11 @@ tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== +tslib@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.0.tgz#18d13fc2dce04051e20f074cc8387fd8089ce4f3" + integrity sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g== + tsutils@^3.17.1: version "3.17.1" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" From 5503cd05893f2e7247ed8567bfa48b28bce99e91 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Mon, 24 Aug 2020 20:01:54 +0200 Subject: [PATCH 067/300] Bumped version to 20200824.0 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 2c255baf5d..901c39ac1d 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name="home-assistant-frontend", - version="20200820.0", + version="20200824.0", description="The Home Assistant frontend", url="https://github.com/home-assistant/home-assistant-polymer", author="The Home Assistant Authors", From 358c5205d2ee342cba1cf4a20655aebd14a8baee Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Mon, 24 Aug 2020 20:32:55 +0200 Subject: [PATCH 068/300] Fix calendar (#6691) --- src/components/ha-button-toggle-group.ts | 12 ++--- src/panels/calendar/ha-full-calendar.ts | 58 ++++++++++++------------ 2 files changed, 33 insertions(+), 37 deletions(-) diff --git a/src/components/ha-button-toggle-group.ts b/src/components/ha-button-toggle-group.ts index cc4c870d07..cae0562cf0 100644 --- a/src/components/ha-button-toggle-group.ts +++ b/src/components/ha-button-toggle-group.ts @@ -1,17 +1,15 @@ import "@material/mwc-icon-button/mwc-icon-button"; import { + css, + CSSResult, customElement, html, - TemplateResult, - property, LitElement, - CSSResult, - css, + property, + TemplateResult, } from "lit-element"; - import { fireEvent } from "../common/dom/fire_event"; import type { ToggleButton } from "../types"; - import "./ha-svg-icon"; @customElement("ha-button-toggle-group") @@ -40,7 +38,7 @@ export class HaButtonToggleGroup extends LitElement { } private _handleClick(ev): void { - this.active = ev.target.value; + this.active = ev.currentTarget.value; fireEvent(this, "value-changed", { value: this.active }); } diff --git a/src/panels/calendar/ha-full-calendar.ts b/src/panels/calendar/ha-full-calendar.ts index 8b0bdfddc1..2607dae6e2 100644 --- a/src/panels/calendar/ha-full-calendar.ts +++ b/src/panels/calendar/ha-full-calendar.ts @@ -1,41 +1,39 @@ -import "@material/mwc-button"; -import { - property, - internalProperty, - PropertyValues, - LitElement, - CSSResult, - html, - css, - unsafeCSS, - TemplateResult, -} from "lit-element"; -import { mdiViewModule, mdiViewWeek, mdiViewDay, mdiViewAgenda } from "@mdi/js"; +// @ts-ignore +import fullcalendarStyle from "@fullcalendar/common/main.css"; import { Calendar } from "@fullcalendar/core"; import type { CalendarOptions } from "@fullcalendar/core"; import dayGridPlugin from "@fullcalendar/daygrid"; -import listPlugin from "@fullcalendar/list"; -import interactionPlugin from "@fullcalendar/interaction"; -// @ts-ignore -import fullcalendarStyle from "@fullcalendar/common/main.css"; // @ts-ignore import daygridStyle from "@fullcalendar/daygrid/main.css"; +import interactionPlugin from "@fullcalendar/interaction"; +import listPlugin from "@fullcalendar/list"; // @ts-ignore import listStyle from "@fullcalendar/list/main.css"; +import "@material/mwc-button"; +import { mdiViewAgenda, mdiViewDay, mdiViewModule, mdiViewWeek } from "@mdi/js"; +import { + css, + CSSResult, + html, + internalProperty, + LitElement, + property, + PropertyValues, + TemplateResult, + unsafeCSS, +} from "lit-element"; import memoize from "memoize-one"; - -import "../../components/ha-icon-button"; -import "../../components/ha-button-toggle-group"; - -import type { - CalendarViewChanged, - CalendarEvent, - ToggleButton, - HomeAssistant, - FullCalendarView, -} from "../../types"; import { fireEvent } from "../../common/dom/fire_event"; +import "../../components/ha-button-toggle-group"; +import "../../components/ha-icon-button"; import { haStyle } from "../../resources/styles"; +import type { + CalendarEvent, + CalendarViewChanged, + FullCalendarView, + HomeAssistant, + ToggleButton, +} from "../../types"; declare global { interface HTMLElementTagNameMap { @@ -191,8 +189,8 @@ class HAFullCalendar extends LitElement { locale: this.hass.language, }; - config.dateClick = this._handleDateClick; - config.eventClick = this._handleEventClick; + config.dateClick = (info) => this._handleDateClick(info); + config.eventClick = (info) => this._handleEventClick(info); this.calendar = new Calendar( this.shadowRoot!.getElementById("calendar")!, From c610f54977637cb853e50be81d51791f7aca758e Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 24 Aug 2020 23:02:04 +0200 Subject: [PATCH 069/300] Add methods for new trigger/condition commands (#6675) --- src/data/automation.ts | 30 +++++++++++++++++++++++++++++- src/types.ts | 2 +- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/data/automation.ts b/src/data/automation.ts index d4eaa843c7..97395806db 100644 --- a/src/data/automation.ts +++ b/src/data/automation.ts @@ -3,7 +3,7 @@ import { HassEntityBase, } from "home-assistant-js-websocket"; import { navigate } from "../common/navigate"; -import { HomeAssistant } from "../types"; +import { HomeAssistant, Context } from "../types"; import { DeviceCondition, DeviceTrigger } from "./device_automation"; import { Action } from "./script"; @@ -206,3 +206,31 @@ export const getAutomationEditorInitData = () => { inititialAutomationEditorData = undefined; return data; }; + +export const subscribeTrigger = ( + hass: HomeAssistant, + onChange: (result: { + variables: { + trigger: {}; + }; + context: Context; + }) => void, + trigger: Trigger | Trigger[], + variables?: {} +) => + hass.connection.subscribeMessage(onChange, { + type: "subscribe_trigger", + trigger, + variables, + }); + +export const testCondition = ( + hass: HomeAssistant, + condition: Condition | Condition[], + variables?: {} +) => + hass.callWS<{ result: boolean }>({ + type: "test_condition", + condition, + variables, + }); diff --git a/src/types.ts b/src/types.ts index a6f27ee768..ddd285cf93 100644 --- a/src/types.ts +++ b/src/types.ts @@ -193,7 +193,7 @@ export interface Resources { export interface Context { id: string; - parrent_id?: string; + parent_id?: string; user_id?: string; } From 64d3511fbcc76b0495dbf7ad3bb2fa3394d904eb Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Tue, 25 Aug 2020 00:32:10 +0000 Subject: [PATCH 070/300] [ci skip] Translation update --- translations/frontend/ca.json | 71 ++++++++++++++++++++++++++++++-- translations/frontend/de.json | 2 +- translations/frontend/en.json | 77 ++++++++++++++++++++++++++++++++++- translations/frontend/it.json | 73 +++++++++++++++++++++++++++++++-- translations/frontend/nb.json | 1 + 5 files changed, 215 insertions(+), 9 deletions(-) diff --git a/translations/frontend/ca.json b/translations/frontend/ca.json index 28184bc2eb..dd040e1f7d 100644 --- a/translations/frontend/ca.json +++ b/translations/frontend/ca.json @@ -554,6 +554,10 @@ "loading_history": "Carregant historial d'estats...", "no_history_found": "No s'ha trobat cap historial d'estats." }, + "picture-upload": { + "label": "Imatge", + "unsupported_format": "Format no compatible, tria una imatge JPEG, PNG o GIF." + }, "related-items": { "area": "Àrea", "automation": "Part de les següents automatitzacions", @@ -656,6 +660,9 @@ "required_error_msg": "Aquest camp és obligatori", "yaml_not_editable": "La configuració d'aquesta entitat no es pot editar des de la interfície d'usuari. Només es poden editar des de la interfície aquelles entitats que s'han configurat des d'ella." }, + "image_cropper": { + "crop": "Retalla" + }, "more_info_control": { "dismiss": "Desestimar el diàleg", "edit": "Edita entitat", @@ -892,7 +899,7 @@ "wait_template": "Plantilla d'espera" } }, - "unsupported_action": "Acció {action} no suportada." + "unsupported_action": "Acció no suportada per la UI: {action}" }, "alias": "Nom", "conditions": { @@ -958,7 +965,7 @@ "zone": "Zona" } }, - "unsupported_condition": "Condició {condition} no suportada." + "unsupported_condition": "Condició no suportada per la UI: {condition}" }, "default_name": "Nova automatització", "description": { @@ -1050,6 +1057,9 @@ "sunrise": "a l'Alba", "sunset": "al Capvespre" }, + "tag": { + "label": "Etiqueta" + }, "template": { "label": "Plantilla", "value_template": "Plantilla de valor" @@ -1077,7 +1087,7 @@ "zone": "Zona" } }, - "unsupported_platform": "Plataforma {platform} no suportada." + "unsupported_platform": "Plataforma no suportada per la UI: {platform}" }, "unsaved_confirm": "Hi ha canvis no desats. Segur que vols sortir?" }, @@ -1327,6 +1337,7 @@ "caption": "Dispositius", "confirm_delete": "Estàs segur que vols eliminar aquest dispositiu?", "confirm_rename_entity_ids": "Vols, també, canviar el nom dels ID's d'entitat de les entitats?", + "confirm_rename_entity_ids_warning": "Això no canviarà cap configuració (com automatitzacions, scripts, escenes, Lovelace) que estigui utilitzant aquestes entitats, les hauràs d'actualitzar tu mateix.", "data_table": { "area": "Àrea", "battery": "Bateria", @@ -1657,9 +1668,36 @@ "stage": "Etapa", "zwave_info": "Informació Z-Wave" }, + "node_query_stages": { + "associations": "Actualitzant de grups d'associacions i membres", + "cacheload": "Carregant informació del fitxer de memòria cau d'OpenZWave. Els nodes amb bateria romandran en aquesta fase fins que es despertin.", + "complete": "Procés de consulta completat", + "configuration": "Obtenint valors de configuració del node", + "dynamic": "Obtenint valors usualment canviants del node", + "instances": "Obtenint detalls sobre instàncies i canals compatibles amb el dispositiu", + "manufacturerspecific1": "Obtenint fabricant i codis ID de producte del node", + "manufacturerspecific2": "Obtenint fabricant i codis ID de producte addicionals del node", + "neighbors": "Obtenint llista de nodes veïns", + "nodeinfo": "Obtenint classes de comandes compatibles del node", + "nodeplusinfo": "Obtenint informació Z-Wave+ del node", + "probe": "Comprovant si el node està despert", + "protocolinfo": "Obtenint funcions Z-Wave bàsiques del controlador d'aquest node", + "session": "Obtenint valors inusualment canviants del node", + "static": "Obtenint valors estàtics del dispositiu", + "versions": "Obtenint informació de programari i versions de classes de comandes", + "wakeup": "Configurant el suport per a cues i missatges" + }, "refresh_node": { + "battery_note": "Si el node funciona amb bateria, assegura't de que estigui actiu abans de continuar", + "complete": "Actualització del node completa", + "description": "Això farà que OpenZWave torni a consultar el node i n'actualitzi les classes de comandes, funcions i valors.", "node_status": "Estat del node", - "step": "Pas" + "refreshing_description": "Actualitzant la informació del node...", + "start_refresh_button": "Inicia l'actualització", + "step": "Pas", + "title": "Informació d'actualització del node", + "wakeup_header": "Instruccions en despertar de", + "wakeup_instructions_source": "Les instruccions en despertar provenen de la base de dades de dispositius de la comunitat OpenZWave." } }, "person": { @@ -1816,6 +1854,31 @@ } } }, + "tags": { + "add_tag": "Afegeix etiqueta", + "automation_title": "S'escanegi l'etiqueta {name}", + "caption": "Etiquetes", + "create_automation": "Crea una automatització amb una etiqueta", + "description": "Gestiona les etiquetes", + "detail": { + "create": "Crea", + "create_and_write": "Crea i escriu", + "delete": "Elimina", + "description": "Descripció", + "name": "Nom", + "new_tag": "Nova etiqueta", + "tag_id": "ID de l'etiqueta", + "tag_id_placeholder": "Autogenerat si es deixa buit", + "update": "Actualitza" + }, + "edit": "Edita", + "headers": { + "last_scanned": "Últim escaneig", + "name": "Nom" + }, + "no_tags": "Sense etiquetes", + "write": "Escriu" + }, "users": { "add_user": { "caption": "Afegir usuari", diff --git a/translations/frontend/de.json b/translations/frontend/de.json index 6bd1aa079d..a1af0f920d 100644 --- a/translations/frontend/de.json +++ b/translations/frontend/de.json @@ -352,7 +352,7 @@ "arm_away": "Aktivieren - Unterwegs", "arm_custom_bypass": "Benutzerdefinierter Bypass", "arm_home": "Aktivieren - Zuhause", - "arm_night": "Nacht aktiviert", + "arm_night": "Aktivieren - Nacht", "clear_code": "Löschen", "code": "Code", "disarm": "Deaktivieren" diff --git a/translations/frontend/en.json b/translations/frontend/en.json index 24b2f221a9..74d4ca0bcf 100644 --- a/translations/frontend/en.json +++ b/translations/frontend/en.json @@ -419,9 +419,16 @@ "unlock": "Unlock" }, "media_player": { + "browse_media": "Browse media", + "media_next_track": "Next", + "media_play": "Play", + "media_play_pause": "Play/pause", + "media_previous_track": "Previous", "sound_mode": "Sound mode", "source": "Source", - "text_to_speak": "Text to speak" + "text_to_speak": "Text to speak", + "turn_off": "Turn off", + "turn_on": "Turn on" }, "persistent_notification": { "dismiss": "Dismiss" @@ -554,6 +561,22 @@ "loading_history": "Loading state history...", "no_history_found": "No state history found." }, + "media-browser": { + "choose-source": "Choose Source", + "content-type": { + "album": "Album", + "artist": "Artist", + "library": "Library", + "playlist": "Playlist", + "server": "Server" + }, + "media-player-browser": "Media Player Browser", + "no_items": "No items", + "pick": "Pick", + "pick-media": "Pick Media", + "play": "Play", + "play-media": "Play Media" + }, "picture-upload": { "label": "Picture", "unsupported_format": "Unsupported format, please choose a JPEG, PNG or GIF image." @@ -578,6 +601,7 @@ "week": "{count} {count, plural,\n one {week}\n other {weeks}\n}" }, "future": "In {time}", + "just_now": "Just now", "never": "Never", "past": "{time} ago" }, @@ -1318,6 +1342,7 @@ } }, "devices": { + "add_prompt": "No {name} have been added using this device yet. You can add one by clicking the + button above.", "automation": { "actions": { "caption": "When something is triggered..." @@ -1658,7 +1683,11 @@ "topic": "topic" }, "ozw": { + "button": "Configure", "common": { + "controller": "Controller", + "instance": "Instance", + "network": "Network", "node_id": "Node ID", "ozw_instance": "OpenZWave Instance", "zwave": "Z-Wave" @@ -1668,6 +1697,36 @@ "stage": "Stage", "zwave_info": "Z-Wave Info" }, + "navigation": { + "network": "Network", + "nodes": "Nodes", + "select_instance": "Select Instance" + }, + "network_status": { + "details": { + "driverallnodesqueried": "All nodes have been queried", + "driverallnodesqueriedsomedead": "All nodes have been queried. Some nodes were found dead", + "driverawakenodesqueries": "All awake nodes have been queried", + "driverfailed": "Failed to connect to Z-Wave controller", + "driverready": "Initializing the Z-Wave controller", + "driverremoved": "The driver has been removed", + "driverreset": "The driver has been reset", + "offline": "OZWDaemon offline", + "ready": "Ready to connect", + "started": "Connected to MQTT", + "starting": "Connecting to MQTT", + "stopped": "OpenZWave stopped" + }, + "offline": "Offline", + "online": "Online", + "starting": "Starting", + "unknown": "Unknown" + }, + "network": { + "header": "Network Management", + "introduction": "Manage network-wide functions.", + "node_count": "{count} nodes" + }, "node_query_stages": { "associations": "Refreshing association groups and memberships", "cacheload": "Loading information from the OpenZWave cache file. Battery nodes will stay at this stage until the node wakes up.", @@ -1698,6 +1757,14 @@ "title": "Refresh Node Information", "wakeup_header": "Wakeup Instructions for", "wakeup_instructions_source": "Wakeup instructions are sourced from the OpenZWave community device database." + }, + "select_instance": { + "header": "Select an OpenZWave Instance", + "introduction": "You have more than one OpenZWave instance running. Which instance would you like to manage?" + }, + "services": { + "add_node": "Add Node", + "remove_node": "Remove Node" } }, "person": { @@ -1835,6 +1902,7 @@ "person": "Reload persons", "scene": "Reload scenes", "script": "Reload scripts", + "template": "Reload template entities", "zone": "Reload zones" }, "server_management": { @@ -1876,6 +1944,7 @@ "last_scanned": "Last scanned", "name": "Name" }, + "never_scanned": "Never scanned", "no_tags": "No tags", "write": "Write" }, @@ -2200,6 +2269,7 @@ "description": "Templates are rendered using the Jinja2 template engine with some Home Assistant specific extensions.", "editor": "Template editor", "jinja_documentation": "Jinja2 template documentation", + "reset": "Reset to demo template", "template_extensions": "Home Assistant template extensions", "title": "Template", "unknown_error_template": "Unknown error rendering template" @@ -2281,6 +2351,10 @@ "description": "The Button card allows you to add buttons to perform tasks.", "name": "Button" }, + "calendar": { + "description": "The Calendar card displays a calendar including day, week and list views", + "name": "Calendar" + }, "conditional": { "card": "Card", "change_type": "Change type", @@ -2735,6 +2809,7 @@ "intro": "Hello {name}, welcome to Home Assistant. How would you like to name your home?", "intro_location": "We would like to know where you live. This information will help with displaying information and setting up sun-based automations. This data is never shared outside of your network.", "intro_location_detect": "We can help you fill in this information by making a one-time request to an external service.", + "location_name": "Name of your Home Assistant installation", "location_name_default": "Home" }, "integration": { diff --git a/translations/frontend/it.json b/translations/frontend/it.json index fc6980fc46..4989fa4123 100644 --- a/translations/frontend/it.json +++ b/translations/frontend/it.json @@ -554,6 +554,10 @@ "loading_history": "Caricamento storico...", "no_history_found": "Nessuno storico trovato." }, + "picture-upload": { + "label": "Immagine", + "unsupported_format": "Formato non supportato, scegliere un'immagine JPEG, PNG o GIF." + }, "related-items": { "area": "Area", "automation": "Parte delle seguenti automazioni", @@ -656,6 +660,9 @@ "required_error_msg": "Questo campo è obbligatorio", "yaml_not_editable": "Le impostazioni di questa entità non possono essere modificate dall'Interfaccia Utente. Solo le entità impostate dall'Interfaccia Utente sono configurabili dall'Interfaccia Utente." }, + "image_cropper": { + "crop": "Ritaglia" + }, "more_info_control": { "dismiss": "Chiudi finestra di dialogo", "edit": "Modifica entità", @@ -892,7 +899,7 @@ "wait_template": "Modello di attesa" } }, - "unsupported_action": "Azione non supportata: {action}" + "unsupported_action": "Nessun supporto dell'Interfaccia Utente per l'azione: {action}" }, "alias": "Nome", "conditions": { @@ -958,7 +965,7 @@ "zone": "Zona" } }, - "unsupported_condition": "Condizione non supportata: {condition}" + "unsupported_condition": "Nessun supporto dell'Interfaccia Utente per la condizione: {condition}" }, "default_name": "Nuova Automazione", "description": { @@ -1050,6 +1057,9 @@ "sunrise": "Alba", "sunset": "Tramonto" }, + "tag": { + "label": "Etichetta" + }, "template": { "label": "Modello", "value_template": "Valore modello" @@ -1077,7 +1087,7 @@ "zone": "Zona" } }, - "unsupported_platform": "Piattaforma non supportata: {platform}" + "unsupported_platform": "Nessun supporto dell'Interfaccia Utente per la piattaforma: {platform}" }, "unsaved_confirm": "Hai delle modifiche non salvate. Sei sicuro di voler uscire?" }, @@ -1327,6 +1337,7 @@ "caption": "Dispositivi", "confirm_delete": "Sei sicuro di voler eliminare questo dispositivo?", "confirm_rename_entity_ids": "Vuoi anche rinominare gli ID entità delle tue entità?", + "confirm_rename_entity_ids_warning": "Questo non cambierà alcuna configurazione (come automazioni, script, scene, Lovelace) che attualmente utilizza queste entità, dovrai aggiornarle tu stesso.", "data_table": { "area": "Area", "battery": "Batteria", @@ -1656,6 +1667,37 @@ "node_failed": "Nodo non riuscito", "stage": "Fase", "zwave_info": "Informazioni Z-Wave" + }, + "node_query_stages": { + "associations": "Aggiornamento dell'associazione gruppi e appartenenze", + "cacheload": "Caricamento delle informazioni dal file di cache di OpenZWave. I nodi a batteria rimarranno in questa fase fino a quando il nodo non si riattiva.", + "complete": "Il processo di interrogazione è completo", + "configuration": "Recupero dei valori di configurazione dal nodo", + "dynamic": "Recupero di valori che cambiano di frequente dal nodo", + "instances": "Recupero dei dettagli sulle istanze o sui canali supportati da un dispositivo", + "manufacturerspecific1": "Recupero dei codici ID produttore e prodotto dal nodo", + "manufacturerspecific2": "Recupero di ulteriori codici ID prodotto e produttore dal nodo", + "neighbors": "Ottenere un elenco dei vicini del nodo", + "nodeinfo": "Recupero delle classi di comando supportate dal nodo", + "nodeplusinfo": "Recupero delle informazioni Z-Wave+ dal nodo", + "probe": "Controllo se il nodo è sveglio/attivo", + "protocolinfo": "Recupero delle funzionalità di base Z-Wave di questo nodo dal controller", + "session": "Recupero di valori che cambiano di rado dal nodo", + "static": "Recupero di valori statici dal dispositivo", + "versions": "Recupero di informazioni sulle versioni del firmware e della classe di comando", + "wakeup": "Configurazione del supporto per code di riattivazione e messaggi " + }, + "refresh_node": { + "battery_note": "Se il nodo è alimentato a batteria, assicurarsi di riattivarlo prima di procedere", + "complete": "Aggiornamento del nodo completato", + "description": "In questo modo si dirà a OpenZWave di re-interrogare un nodo e aggiornare le classi di comando, le funzionalità e i valori del nodo.", + "node_status": "Stato del nodo", + "refreshing_description": "Aggiornamento delle informazioni sul nodo in corso ...", + "start_refresh_button": "Avvia aggiornamento", + "step": "Passo", + "title": "Aggiorna le informazioni sul nodo", + "wakeup_header": "Istruzioni di riattivazione per", + "wakeup_instructions_source": "Le istruzioni di riattivazione provengono dal database dei dispositivi della comunità di OpenZWave." } }, "person": { @@ -1812,6 +1854,31 @@ } } }, + "tags": { + "add_tag": "Aggiungi Etichetta", + "automation_title": "L'etichetta {name} è scansionata", + "caption": "Etichette", + "create_automation": "Creare un'automazione con l'etichetta", + "description": "Gestisci le etichette", + "detail": { + "create": "Crea", + "create_and_write": "Crea e Scrivi", + "delete": "Cancella", + "description": "Descrizione", + "name": "Nome", + "new_tag": "Nuova Etichetta", + "tag_id": "Id Etichetta", + "tag_id_placeholder": "Autogenerato quando lasciato vuoto", + "update": "Aggiorna" + }, + "edit": "Modifica", + "headers": { + "last_scanned": "Ultima scansione", + "name": "Nome" + }, + "no_tags": "Nessuna etichetta", + "write": "Scrivi" + }, "users": { "add_user": { "caption": "Aggiungi utente", diff --git a/translations/frontend/nb.json b/translations/frontend/nb.json index dacd48e75b..8b549790bf 100644 --- a/translations/frontend/nb.json +++ b/translations/frontend/nb.json @@ -1337,6 +1337,7 @@ "caption": "Enheter", "confirm_delete": "Er du sikker på at du vil slette denne enheten?", "confirm_rename_entity_ids": "Vil du også endre navn på entitets-ID-en for entitetene dine?", + "confirm_rename_entity_ids_warning": "Dette vil ikke endre noen konfigurasjon (som automatiseringer, skript, scener, Lovelace) som bruker disse enhetene, må du oppdatere dem selv.", "data_table": { "area": "Område", "battery": "Batteri", From 75406c2d018aa7991a7c44f173a1423e24610b92 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 25 Aug 2020 11:09:23 +0200 Subject: [PATCH 071/300] Add disabled text color to dark mode (#6694) --- src/resources/styles.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/resources/styles.ts b/src/resources/styles.ts index 89699a83a2..8054abe475 100644 --- a/src/resources/styles.ts +++ b/src/resources/styles.ts @@ -6,6 +6,7 @@ export const darkStyles = { "secondary-background-color": "#1e1e1e", "primary-text-color": "#e1e1e1", "secondary-text-color": "#9b9b9b", + "disabled-text-color": "#6f6f6f", "app-header-text-color": "#e1e1e1", "app-header-background-color": "#1c1c1c", "switch-unchecked-button-color": "#999999", From 1b970e5a66c05fcd36df392eb0d6c2f6f76d3d5d Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 25 Aug 2020 14:06:03 +0200 Subject: [PATCH 072/300] No background repeat media browser (#6695) --- src/components/media-player/ha-media-player-browse.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/media-player/ha-media-player-browse.ts b/src/components/media-player/ha-media-player-browse.ts index f6f2f08df3..a6056efbca 100644 --- a/src/components/media-player/ha-media-player-browse.ts +++ b/src/components/media-player/ha-media-player-browse.ts @@ -483,7 +483,9 @@ export class HaMediaPlayerBrowse extends LitElement { width: 100%; padding-bottom: 100%; position: relative; + box-sizing: border-box; background-size: cover; + background-repeat: no-repeat; background-position: center; } From 04df6c3e9ebcdf384efdc92cb7031cf9a1c6419e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Tue, 25 Aug 2020 23:34:02 +0200 Subject: [PATCH 073/300] Supervisor system (#6699) Co-authored-by: Bram Kragten --- .../dialogs/network/dialog-hassio-network.ts | 328 +++++++++++++++ .../dialogs/network/show-dialog-network.ts | 22 + hassio/src/system/hassio-host-info.ts | 333 ++++++++++------ hassio/src/system/hassio-supervisor-info.ts | 377 +++++++++--------- hassio/src/system/hassio-supervisor-log.ts | 23 +- hassio/src/system/hassio-system.ts | 2 - src/components/ha-settings-row.ts | 2 +- src/data/hassio/host.ts | 4 + src/data/hassio/network.ts | 43 ++ src/data/hassio/supervisor.ts | 8 + 10 files changed, 818 insertions(+), 324 deletions(-) create mode 100644 hassio/src/dialogs/network/dialog-hassio-network.ts create mode 100644 hassio/src/dialogs/network/show-dialog-network.ts create mode 100644 src/data/hassio/network.ts diff --git a/hassio/src/dialogs/network/dialog-hassio-network.ts b/hassio/src/dialogs/network/dialog-hassio-network.ts new file mode 100644 index 0000000000..4eea315d9c --- /dev/null +++ b/hassio/src/dialogs/network/dialog-hassio-network.ts @@ -0,0 +1,328 @@ +import "@material/mwc-button/mwc-button"; +import "@material/mwc-icon-button"; +import "@material/mwc-tab-bar"; +import "@material/mwc-tab"; +import { PaperInputElement } from "@polymer/paper-input/paper-input"; +import { mdiClose } from "@mdi/js"; +import { + css, + CSSResult, + customElement, + html, + LitElement, + property, + internalProperty, + TemplateResult, +} from "lit-element"; +import { cache } from "lit-html/directives/cache"; + +import { + updateNetworkInterface, + NetworkInterface, +} from "../../../../src/data/hassio/network"; +import { fireEvent } from "../../../../src/common/dom/fire_event"; +import { HassioNetworkDialogParams } from "./show-dialog-network"; +import { haStyleDialog } from "../../../../src/resources/styles"; +import { + showAlertDialog, + showConfirmationDialog, +} from "../../../../src/dialogs/generic/show-dialog-box"; +import type { HomeAssistant } from "../../../../src/types"; +import type { HaRadio } from "../../../../src/components/ha-radio"; +import { HassDialog } from "../../../../src/dialogs/make-dialog-manager"; + +import "../../../../src/components/ha-circular-progress"; +import "../../../../src/components/ha-dialog"; +import "../../../../src/components/ha-formfield"; +import "../../../../src/components/ha-header-bar"; +import "../../../../src/components/ha-radio"; +import "../../../../src/components/ha-related-items"; +import "../../../../src/components/ha-svg-icon"; + +@customElement("dialog-hassio-network") +export class DialogHassioNetwork extends LitElement implements HassDialog { + @property({ attribute: false }) public hass!: HomeAssistant; + + @internalProperty() private _prosessing = false; + + @internalProperty() private _params?: HassioNetworkDialogParams; + + @internalProperty() private _network!: { + interface: string; + data: NetworkInterface; + }[]; + + @internalProperty() private _curTabIndex = 0; + + @internalProperty() private _device?: { + interface: string; + data: NetworkInterface; + }; + + @internalProperty() private _dirty = false; + + public async showDialog(params: HassioNetworkDialogParams): Promise { + this._params = params; + this._dirty = false; + this._curTabIndex = 0; + this._network = Object.keys(params.network?.interfaces) + .map((device) => ({ + interface: device, + data: params.network.interfaces[device], + })) + .sort((a, b) => { + return a.data.primary > b.data.primary ? -1 : 1; + }); + this._device = this._network[this._curTabIndex]; + this._device.data.nameservers = String(this._device.data.nameservers); + await this.updateComplete; + } + + public closeDialog(): void { + this._params = undefined; + this._prosessing = false; + fireEvent(this, "dialog-closed", { dialog: this.localName }); + } + + protected render(): TemplateResult { + if (!this._params || !this._network) { + return html``; + } + + return html` + +
    + + + Network settings + + + + + + ${this._network.length > 1 + ? html` ${this._network.map( + (device) => + html` + ` + )} + ` + : ""} +
    + ${cache(this._renderTab())} +
    + `; + } + + private _renderTab() { + return html`
    + + + + + + + + + ${this._device!.data.method !== "dhcp" + ? html` + + + NB!: If you are changing IP or gateway addresses, you might lose + the connection.` + : ""} +
    +
    + + + ${this._prosessing + ? html`` + : "Update"} + +
    `; + } + + private async _updateNetwork() { + this._prosessing = true; + let options: Partial = { + method: this._device!.data.method, + }; + if (options.method !== "dhcp") { + options = { + ...options, + address: this._device!.data.ip_address, + gateway: this._device!.data.gateway, + dns: String(this._device!.data.nameservers).split(","), + }; + } + try { + await updateNetworkInterface(this.hass, this._device!.interface, options); + } catch (err) { + showAlertDialog(this, { + title: "Failed to change network settings", + text: + typeof err === "object" ? err.body.message || "Unkown error" : err, + }); + this._prosessing = false; + return; + } + this._params?.loadData(); + this.closeDialog(); + } + + private async _handleTabActivated(ev: CustomEvent): Promise { + if (this._dirty) { + const confirm = await showConfirmationDialog(this, { + text: + "You have unsaved changes, these will get lost if you change tabs, do you want to continue?", + confirmText: "yes", + dismissText: "no", + }); + if (!confirm) { + this.requestUpdate("_device"); + return; + } + } + this._curTabIndex = ev.detail.index; + this._device = this._network[ev.detail.index]; + this._device.data.nameservers = String(this._device.data.nameservers); + } + + private _handleRadioValueChanged(ev: CustomEvent): void { + const value = (ev.target as HaRadio).value as "dhcp" | "static"; + + if (!value || !this._device || this._device!.data.method === value) { + return; + } + + this._dirty = true; + + this._device!.data.method = value; + this.requestUpdate("_device"); + } + + private _handleInputValueChanged(ev: CustomEvent): void { + const value: string | null | undefined = (ev.target as PaperInputElement) + .value; + const id = (ev.target as PaperInputElement).id; + + if (!value || !this._device || this._device.data[id] === value) { + return; + } + + this._dirty = true; + + this._device.data[id] = value; + } + + static get styles(): CSSResult[] { + return [ + haStyleDialog, + css` + ha-header-bar { + --mdc-theme-on-primary: var(--primary-text-color); + --mdc-theme-primary: var(--mdc-theme-surface); + flex-shrink: 0; + } + + mwc-tab-bar { + border-bottom: 1px solid + var(--mdc-dialog-scroll-divider-color, rgba(0, 0, 0, 0.12)); + } + + ha-dialog { + --dialog-content-position: static; + --dialog-content-padding: 0; + --dialog-z-index: 6; + } + + @media all and (min-width: 451px) and (min-height: 501px) { + .container { + width: 400px; + } + } + + .content { + display: block; + padding: 20px 24px; + } + + /* overrule the ha-style-dialog max-height on small screens */ + @media all and (max-width: 450px), all and (max-height: 500px) { + ha-header-bar { + --mdc-theme-primary: var(--app-header-background-color); + --mdc-theme-on-primary: var(--app-header-text-color, white); + } + } + + mwc-button.warning { + --mdc-theme-primary: var(--error-color); + } + + :host([rtl]) app-toolbar { + direction: rtl; + text-align: right; + } + .container { + padding: 20px 24px; + } + .form { + margin-bottom: 53px; + } + .buttons { + position: absolute; + bottom: 0; + width: 100%; + box-sizing: border-box; + border-top: 1px solid + var(--mdc-dialog-scroll-divider-color, rgba(0, 0, 0, 0.12)); + display: flex; + justify-content: space-between; + padding: 8px; + padding-bottom: max(env(safe-area-inset-bottom), 8px); + background-color: var(--mdc-theme-surface, #fff); + } + `, + ]; + } +} + +declare global { + interface HTMLElementTagNameMap { + "dialog-hassio-network": DialogHassioNetwork; + } +} diff --git a/hassio/src/dialogs/network/show-dialog-network.ts b/hassio/src/dialogs/network/show-dialog-network.ts new file mode 100644 index 0000000000..0f59f8a545 --- /dev/null +++ b/hassio/src/dialogs/network/show-dialog-network.ts @@ -0,0 +1,22 @@ +import { fireEvent } from "../../../../src/common/dom/fire_event"; +import { NetworkInfo } from "../../../../src/data/hassio/network"; +import "./dialog-hassio-network"; + +export interface HassioNetworkDialogParams { + network: NetworkInfo; + loadData: () => Promise; +} + +export const showNetworkDialog = ( + element: HTMLElement, + dialogParams: HassioNetworkDialogParams +): void => { + fireEvent(element, "show-dialog", { + dialogTag: "dialog-hassio-network", + dialogImport: () => + import( + /* webpackChunkName: "dialog-hassio-network" */ "./dialog-hassio-network" + ), + dialogParams, + }); +}; diff --git a/hassio/src/system/hassio-host-info.ts b/hassio/src/system/hassio-host-info.ts index 3a53925ddb..544e896adc 100644 --- a/hassio/src/system/hassio-host-info.ts +++ b/hassio/src/system/hassio-host-info.ts @@ -1,18 +1,23 @@ import "@material/mwc-button"; +import "@material/mwc-list/mwc-list-item"; +import { ActionDetail } from "@material/mwc-list/mwc-list-foundation"; +import { mdiDotsVertical } from "@mdi/js"; +import { safeDump } from "js-yaml"; +import memoizeOne from "memoize-one"; import { css, CSSResult, customElement, html, + internalProperty, LitElement, property, - internalProperty, TemplateResult, } from "lit-element"; -import "../../../src/components/buttons/ha-call-api-button"; -import { fetchHassioHardwareInfo } from "../../../src/data/hassio/hardware"; + import { changeHostOptions, + configSyncOS, fetchHassioHostInfo, HassioHassOSInfo, HassioHostInfo as HassioHostInfoType, @@ -20,16 +25,26 @@ import { shutdownHost, updateOS, } from "../../../src/data/hassio/host"; +import { fetchHassioHardwareInfo } from "../../../src/data/hassio/hardware"; +import { + fetchNetworkInfo, + NetworkInfo, +} from "../../../src/data/hassio/network"; import { HassioInfo } from "../../../src/data/hassio/supervisor"; +import { hassioStyle } from "../resources/hassio-style"; +import { haStyle } from "../../../src/resources/styles"; +import { HomeAssistant } from "../../../src/types"; import { showAlertDialog, showConfirmationDialog, showPromptDialog, } from "../../../src/dialogs/generic/show-dialog-box"; -import { haStyle } from "../../../src/resources/styles"; -import { HomeAssistant } from "../../../src/types"; import { showHassioMarkdownDialog } from "../dialogs/markdown/show-dialog-hassio-markdown"; -import { hassioStyle } from "../resources/hassio-style"; +import { showNetworkDialog } from "../dialogs/network/show-dialog-network"; + +import "../../../src/components/ha-button-menu"; +import "../../../src/components/ha-card"; +import "../../../src/components/ha-settings-row"; @customElement("hassio-host-info") class HassioHostInfo extends LitElement { @@ -41,86 +56,125 @@ class HassioHostInfo extends LitElement { @property({ attribute: false }) public hassOsInfo!: HassioHassOSInfo; - @internalProperty() private _errors?: string; + @internalProperty() public _networkInfo?: NetworkInfo; public render(): TemplateResult | void { + const primaryIpAddress = this._primaryIpAddress(this._networkInfo!); return html` - +
    -

    Host system

    - - - - - - - - - - - ${!this.hostInfo.features.includes("hassos") - ? html` - - - ` - : ""} - ${this.hostInfo.deployment - ? html` - - - - - ` - : ""} - -
    Hostname${this.hostInfo.hostname}
    System${this.hostInfo.operating_system}
    Docker version${this.hassioInfo.docker}
    Deployment${this.hostInfo.deployment}
    - - Hardware - ${this.hostInfo.features.includes("hostname") - ? html` + ? html` + + Hostname + + + ${this.hostInfo.hostname} + - Change hostname - ` + ` : ""} - ${this._errors - ? html`
    Error: ${this._errors}
    ` + + + IP address + + + ${primaryIpAddress} + + + + + + + Operating system + + + ${this.hostInfo.operating_system} + + ${this.hostInfo.version !== this.hostInfo.version_latest && + this.hostInfo.features.includes("hassos") + ? html` + + + ` + : ""} + + ${!this.hostInfo.features.includes("hassos") + ? html` + + Docker version + + + ${this.hassioInfo.docker} + + ` + : ""} + ${this.hostInfo.deployment + ? html` + + Deployment + + + ${this.hostInfo.deployment} + + ` : ""}
    ${this.hostInfo.features.includes("reboot") ? html` - Reboot + ` : ""} ${this.hostInfo.features.includes("shutdown") ? html` - Shutdown - ` - : ""} - ${this.hostInfo.features.includes("hassos") - ? html` - Import from USB + ` : ""} - ${this.hostInfo.version !== this.hostInfo.version_latest - ? html` Update ` - : ""} + + + + + + + Hardware + + ${this.hostInfo.features.includes("hassos") + ? html` + Import from USB + ` + : ""} +
    `; @@ -133,72 +187,96 @@ class HassioHostInfo extends LitElement { css` ha-card { height: 100%; + justify-content: space-between; + flex-direction: column; + display: flex; + } + .card-actions { + height: 48px; + border-top: none; + display: flex; + justify-content: space-between; + align-items: center; + } + ha-settings-row { + padding: 0; + height: 54px; width: 100%; } - .card-content { - color: var(--primary-text-color); - box-sizing: border-box; - height: calc(100% - 47px); + ha-settings-row[three-line] { + height: 74px; } - .info { - width: 100%; - } - .info td:nth-child(2) { - text-align: right; - } - .errors { - color: var(--error-color); - margin-top: 16px; - } - mwc-button.info { - max-width: calc(50% - 12px); - } - table.info { - margin-bottom: 10px; + ha-settings-row[three-line] > div { + white-space: normal; + color: var(--secondary-text-color); } + .warning { --mdc-theme-primary: var(--error-color); } + + ha-button-menu { + color: var(--secondary-text-color); + --mdc-menu-min-width: 200px; + } + @media (min-width: 563px) { + paper-listbox { + max-height: 150px; + overflow: auto; + } + } + paper-item { + cursor: pointer; + min-height: 35px; + } + mwc-list-item ha-svg-icon { + color: var(--secondary-text-color); + } `, ]; } protected firstUpdated(): void { - this.addEventListener("hass-api-called", (ev) => this._apiCalled(ev)); + this._loadData(); } - private _apiCalled(ev): void { - if (ev.detail.success) { - this._errors = undefined; - return; + private _primaryIpAddress = memoizeOne((network_info: NetworkInfo) => { + if (!network_info) { + return ""; } + return Object.keys(network_info?.interfaces) + .map((device) => network_info.interfaces[device]) + .find((device) => device.primary)?.ip_address; + }); - const response = ev.detail.response; - - this._errors = - typeof response.body === "object" - ? response.body.message || "Unknown error" - : response.body; + private async _handleMenuAction(ev: CustomEvent) { + switch (ev.detail.index) { + case 0: + await this._showHardware(); + break; + case 1: + await this._importFromUSB(); + break; + } } private async _showHardware(): Promise { try { - const content = this._objectToMarkdown( - await fetchHassioHardwareInfo(this.hass) - ); + const content = await fetchHassioHardwareInfo(this.hass); showHassioMarkdownDialog(this, { title: "Hardware", - content, + content: `
    ${safeDump(content, { indent: 2 })}
    `, }); } catch (err) { - showHassioMarkdownDialog(this, { - title: "Hardware", - content: "Error getting hardware info", + showAlertDialog(this, { + title: "Failed to get Hardware list", + text: + typeof err === "object" ? err.body?.message || "Unkown error" : err, }); } } - private async _rebootHost(): Promise { + private async _hostReboot(): Promise { const confirmed = await showConfirmationDialog(this, { title: "Reboot", text: "Are you sure you want to reboot the host?", @@ -215,12 +293,13 @@ class HassioHostInfo extends LitElement { } catch (err) { showAlertDialog(this, { title: "Failed to reboot", - text: err.body.message, + text: + typeof err === "object" ? err.body?.message || "Unkown error" : err, }); } } - private async _shutdownHost(): Promise { + private async _hostShutdown(): Promise { const confirmed = await showConfirmationDialog(this, { title: "Shutdown", text: "Are you sure you want to shutdown the host?", @@ -237,12 +316,13 @@ class HassioHostInfo extends LitElement { } catch (err) { showAlertDialog(this, { title: "Failed to shutdown", - text: err.body.message, + text: + typeof err === "object" ? err.body?.message || "Unkown error" : err, }); } } - private async _updateOS(): Promise { + private async _osUpdate(): Promise { const confirmed = await showConfirmationDialog(this, { title: "Update", text: "Are you sure you want to update the OS?", @@ -259,30 +339,17 @@ class HassioHostInfo extends LitElement { } catch (err) { showAlertDialog(this, { title: "Failed to update", - text: err.body.message, + text: + typeof err === "object" ? err.body?.message || "Unkown error" : err, }); } } - private _objectToMarkdown(obj, indent = ""): string { - let data = ""; - Object.keys(obj).forEach((key) => { - if (typeof obj[key] !== "object") { - data += `${indent}- ${key}: ${obj[key]}\n`; - } else { - data += `${indent}- ${key}:\n`; - if (Array.isArray(obj[key])) { - if (obj[key].length) { - data += - `${indent} - ` + obj[key].join(`\n${indent} - `) + "\n"; - } - } else { - data += this._objectToMarkdown(obj[key], ` ${indent}`); - } - } + private async _changeNetworkClicked(): Promise { + showNetworkDialog(this, { + network: this._networkInfo!, + loadData: () => this._loadData(), }); - - return data; } private async _changeHostnameClicked(): Promise { @@ -301,11 +368,29 @@ class HassioHostInfo extends LitElement { } catch (err) { showAlertDialog(this, { title: "Setting hostname failed", - text: err.body.message, + text: + typeof err === "object" ? err.body?.message || "Unkown error" : err, }); } } } + + private async _importFromUSB(): Promise { + try { + await configSyncOS(this.hass); + this.hostInfo = await fetchHassioHostInfo(this.hass); + } catch (err) { + showAlertDialog(this, { + title: "Failed to import from USB", + text: + typeof err === "object" ? err.body?.message || "Unkown error" : err, + }); + } + } + + private async _loadData(): Promise { + this._networkInfo = await fetchNetworkInfo(this.hass); + } } declare global { diff --git a/hassio/src/system/hassio-supervisor-info.ts b/hassio/src/system/hassio-supervisor-info.ts index b76f791c4d..4ad09acde9 100644 --- a/hassio/src/system/hassio-supervisor-info.ts +++ b/hassio/src/system/hassio-supervisor-info.ts @@ -6,27 +6,28 @@ import { html, LitElement, property, - internalProperty, TemplateResult, } from "lit-element"; -import { fireEvent } from "../../../src/common/dom/fire_event"; -import "../../../src/components/buttons/ha-call-api-button"; -import "../../../src/components/ha-card"; + import { HassioHostInfo as HassioHostInfoType } from "../../../src/data/hassio/host"; -import { - HassioSupervisorInfo as HassioSupervisorInfoType, - setSupervisorOption, - SupervisorOptions, -} from "../../../src/data/hassio/supervisor"; -import "../../../src/components/ha-switch"; -import { - showConfirmationDialog, - showAlertDialog, -} from "../../../src/dialogs/generic/show-dialog-box"; -import "../../../src/components/ha-settings-row"; +import { hassioStyle } from "../resources/hassio-style"; import { haStyle } from "../../../src/resources/styles"; import { HomeAssistant } from "../../../src/types"; -import { hassioStyle } from "../resources/hassio-style"; +import { + HassioSupervisorInfo as HassioSupervisorInfoType, + reloadSupervisor, + setSupervisorOption, + SupervisorOptions, + updateSupervisor, +} from "../../../src/data/hassio/supervisor"; +import { + showAlertDialog, + showConfirmationDialog, +} from "../../../src/dialogs/generic/show-dialog-box"; + +import "../../../src/components/ha-card"; +import "../../../src/components/ha-settings-row"; +import "../../../src/components/ha-switch"; @customElement("hassio-supervisor-info") class HassioSupervisorInfo extends LitElement { @@ -36,104 +37,108 @@ class HassioSupervisorInfo extends LitElement { @property() public hostInfo!: HassioHostInfoType; - @internalProperty() private _errors?: string; - public render(): TemplateResult | void { return html` - +
    -

    Supervisor

    - - - - - - - - - - - ${this.supervisorInfo.channel !== "stable" - ? html` - - - - - ` - : ""} - -
    Version${this.supervisorInfo.version}
    Latest version${this.supervisorInfo.version_latest}
    Channel${this.supervisorInfo.channel}
    -
    - ${this.supervisorInfo?.supported - ? html` - - Share Diagnostics - -
    - Share crash reports and diagnostic information. - -
    - -
    ` - : html`
    - You are running an unsupported installation. - Learn More + + Version + + + ${this.supervisorInfo.version} + + + + + Newest version + + + ${this.supervisorInfo.version_latest} + + ${this.supervisorInfo.version !== this.supervisorInfo.version_latest + ? html` + -
    `} -
    - ${this._errors - ? html`
    Error: ${this._errors}
    ` - : ""} + + ` + : ""} + + + + Channel + + + ${this.supervisorInfo.channel} + + ${this.supervisorInfo.channel === "beta" + ? html` + + + ` + : this.supervisorInfo.channel === "stable" + ? html` + + + ` + : ""} + + + ${this.supervisorInfo?.supported + ? html` + + Share diagnostics + +
    + Share crash reports and diagnostic information. + +
    + +
    ` + : html`
    + You are running an unsupported installation. + + Learn More + +
    `}
    - Reload - ${this.supervisorInfo.version !== this.supervisorInfo.version_latest - ? html` - Update - ` - : ""} - ${this.supervisorInfo.channel === "beta" - ? html` - Leave beta channel - ` - : ""} - ${this.supervisorInfo.channel === "stable" - ? html` - Join beta channel - ` - : ""} +
    `; @@ -146,93 +151,103 @@ class HassioSupervisorInfo extends LitElement { css` ha-card { height: 100%; - width: 100%; + justify-content: space-between; + flex-direction: column; + display: flex; } - .card-content { - color: var(--primary-text-color); - box-sizing: border-box; - height: calc(100% - 47px); - } - .info, - .options { - width: 100%; - } - .info td:nth-child(2) { - text-align: right; - } - ha-settings-row { - padding: 0; + .card-actions { + height: 48px; + border-top: none; + display: flex; + justify-content: space-between; + align-items: center; } button.link { color: var(--primary-color); } - .diagnostics-description { - white-space: normal; + ha-settings-row { padding: 0; + height: 54px; + width: 100%; + } + ha-settings-row[three-line] { + height: 74px; + } + ha-settings-row[three-line] > div { + white-space: normal; color: var(--secondary-text-color); } `, ]; } - protected firstUpdated(): void { - this.addEventListener("hass-api-called", (ev) => this._apiCalled(ev)); - } + private async _toggleBeta(): Promise { + if (this.supervisorInfo.channel === "stable") { + const confirmed = await showConfirmationDialog(this, { + title: "WARNING", + text: html` Beta releases are for testers and early adopters and can + contain unstable code changes. +
    + + Make sure you have backups of your data before you activate this + feature. + +

    + This includes beta releases for: +
  • Home Assistant Core
  • +
  • Home Assistant Supervisor
  • +
  • Home Assistant Operating System
  • +
    + Do you want to join the beta channel?`, + confirmText: "join beta", + dismissText: "no", + }); - private _apiCalled(ev): void { - if (ev.detail.success) { - this._errors = undefined; - return; - } - - const response = ev.detail.response; - - this._errors = - typeof response.body === "object" - ? response.body.message || "Unknown error" - : response.body; - } - - private async _joinBeta() { - const confirmed = await showConfirmationDialog(this, { - title: "WARNING", - text: html` Beta releases are for testers and early adopters and can - contain unstable code changes. -
    - - Make sure you have backups of your data before you activate this - feature. - -

    - This includes beta releases for: -
  • Home Assistant Core
  • -
  • Home Assistant Supervisor
  • -
  • Home Assistant Operating System
  • -
    - Do you want to join the beta channel?`, - confirmText: "join beta", - dismissText: "no", - }); - - if (!confirmed) { - return; + if (!confirmed) { + return; + } } try { - const data: SupervisorOptions = { channel: "beta" }; - await setSupervisorOption(this.hass, data); - const eventdata = { - success: true, - response: undefined, - path: "option", + const data: Partial = { + channel: this.supervisorInfo.channel !== "stable" ? "beta" : "stable", }; - fireEvent(this, "hass-api-called", eventdata); + await setSupervisorOption(this.hass, data); + await reloadSupervisor(this.hass); } catch (err) { - this._errors = `Error joining beta channel, ${err.body?.message || err}`; + showAlertDialog(this, { + title: "Failed to set supervisor option", + text: + typeof err === "object" ? err.body?.message || "Unkown error" : err, + }); } } - private async _diagnosticsInformationDialog() { + private async _supervisorReload(): Promise { + try { + await reloadSupervisor(this.hass); + } catch (err) { + showAlertDialog(this, { + title: "Failed to reload the supervisor", + text: + typeof err === "object" ? err.body?.message || "Unkown error" : err, + }); + } + } + + private async _supervisorUpdate(): Promise { + try { + await updateSupervisor(this.hass); + } catch (err) { + showAlertDialog(this, { + title: "Failed to update the supervisor", + text: + typeof err === "object" ? err.body.message || "Unkown error" : err, + }); + } + } + + private async _diagnosticsInformationDialog(): Promise { await showAlertDialog(this, { title: "Help Improve Home Assistant", text: html`Would you want to automatically share crash reports and @@ -247,22 +262,18 @@ class HassioSupervisorInfo extends LitElement { }); } - private async _toggleDiagnostics() { + private async _toggleDiagnostics(): Promise { try { const data: SupervisorOptions = { diagnostics: !this.supervisorInfo?.diagnostics, }; await setSupervisorOption(this.hass, data); - const eventdata = { - success: true, - response: undefined, - path: "option", - }; - fireEvent(this, "hass-api-called", eventdata); } catch (err) { - this._errors = `Error changing supervisor setting, ${ - err.body?.message || err - }`; + showAlertDialog(this, { + title: "Failed to set supervisor option", + text: + typeof err === "object" ? err.body.message || "Unkown error" : err, + }); } } } diff --git a/hassio/src/system/hassio-supervisor-log.ts b/hassio/src/system/hassio-supervisor-log.ts index ec2dbe7031..de2c08cda5 100644 --- a/hassio/src/system/hassio-supervisor-log.ts +++ b/hassio/src/system/hassio-supervisor-log.ts @@ -7,18 +7,20 @@ import { CSSResult, customElement, html, + internalProperty, LitElement, property, - internalProperty, TemplateResult, } from "lit-element"; -import "../../../src/components/ha-card"; + import { fetchHassioLogs } from "../../../src/data/hassio/supervisor"; -import "../../../src/layouts/hass-loading-screen"; +import { hassioStyle } from "../resources/hassio-style"; import { haStyle } from "../../../src/resources/styles"; import { HomeAssistant } from "../../../src/types"; + +import "../../../src/components/ha-card"; +import "../../../src/layouts/hass-loading-screen"; import "../components/hassio-ansi-to-html"; -import { hassioStyle } from "../resources/hassio-style"; interface LogProvider { key: string; @@ -102,7 +104,7 @@ class HassioSupervisorLog extends LitElement { : html``}
    - Refresh + Refresh
    `; @@ -114,6 +116,7 @@ class HassioSupervisorLog extends LitElement { hassioStyle, css` ha-card { + margin-top: 8px; width: 100%; } pre { @@ -127,9 +130,6 @@ class HassioSupervisorLog extends LitElement { color: var(--error-color); margin-bottom: 16px; } - .card-content { - padding-top: 0px; - } `, ]; } @@ -142,7 +142,6 @@ class HassioSupervisorLog extends LitElement { private async _loadData(): Promise { this._error = undefined; - this._content = undefined; try { this._content = await fetchHassioLogs( @@ -151,14 +150,10 @@ class HassioSupervisorLog extends LitElement { ); } catch (err) { this._error = `Failed to get supervisor logs, ${ - err.body?.message || err + typeof err === "object" ? err.body?.message || "Unkown error" : err }`; } } - - private async _refresh(): Promise { - await this._loadData(); - } } declare global { diff --git a/hassio/src/system/hassio-system.ts b/hassio/src/system/hassio-system.ts index 3a52347a08..ad91a42825 100644 --- a/hassio/src/system/hassio-system.ts +++ b/hassio/src/system/hassio-system.ts @@ -52,7 +52,6 @@ class HassioSystem extends LitElement { > System
    -

    Information

    -

    System log

    diff --git a/src/components/ha-settings-row.ts b/src/components/ha-settings-row.ts index 43c886ab99..0d53c58d29 100644 --- a/src/components/ha-settings-row.ts +++ b/src/components/ha-settings-row.ts @@ -25,7 +25,7 @@ export class HaSettingsRow extends LitElement {
    diff --git a/src/data/hassio/host.ts b/src/data/hassio/host.ts index bdefe66dde..a8db6dbc71 100644 --- a/src/data/hassio/host.ts +++ b/src/data/hassio/host.ts @@ -40,6 +40,10 @@ export const updateOS = async (hass: HomeAssistant) => { return hass.callApi>("POST", "hassio/os/update"); }; +export const configSyncOS = async (hass: HomeAssistant) => { + return hass.callApi>("POST", "hassio/os/config/sync"); +}; + export const changeHostOptions = async (hass: HomeAssistant, options: any) => { return hass.callApi>( "POST", diff --git a/src/data/hassio/network.ts b/src/data/hassio/network.ts new file mode 100644 index 0000000000..5e2e7c20e1 --- /dev/null +++ b/src/data/hassio/network.ts @@ -0,0 +1,43 @@ +import { HomeAssistant } from "../../types"; +import { hassioApiResultExtractor, HassioResponse } from "./common"; + +export interface NetworkInterface { + gateway: string; + id: string; + ip_address: string; + address?: string; + method: "static" | "dhcp"; + nameservers: string[] | string; + dns?: string[]; + primary: boolean; + type: string; +} + +export interface NetworkInterfaces { + [key: string]: NetworkInterface; +} + +export interface NetworkInfo { + interfaces: NetworkInterfaces; +} + +export const fetchNetworkInfo = async (hass: HomeAssistant) => { + return hassioApiResultExtractor( + await hass.callApi>( + "GET", + "hassio/network/info" + ) + ); +}; + +export const updateNetworkInterface = async ( + hass: HomeAssistant, + network_interface: string, + options: Partial +) => { + await hass.callApi>( + "POST", + `hassio/network/interface/${network_interface}/update`, + options + ); +}; diff --git a/src/data/hassio/supervisor.ts b/src/data/hassio/supervisor.ts index aaf854ac81..992425b8bc 100644 --- a/src/data/hassio/supervisor.ts +++ b/src/data/hassio/supervisor.ts @@ -35,6 +35,14 @@ export interface SupervisorOptions { addons_repositories?: string[]; } +export const reloadSupervisor = async (hass: HomeAssistant) => { + await hass.callApi>("POST", `hassio/supervisor/reload`); +}; + +export const updateSupervisor = async (hass: HomeAssistant) => { + await hass.callApi>("POST", `hassio/supervisor/update`); +}; + export const fetchHassioHomeAssistantInfo = async (hass: HomeAssistant) => { return hassioApiResultExtractor( await hass.callApi>( From a40eb1ff432879a3d9817d4595ffed6f8f4401d3 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 25 Aug 2020 17:30:02 -0500 Subject: [PATCH 074/300] Add universal to the list of reloadables (#6697) * Add universal to the list of reloadables * Update src/translations/en.json Co-authored-by: Bram Kragten --- src/panels/config/server_control/ha-config-server-control.ts | 1 + src/translations/en.json | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/panels/config/server_control/ha-config-server-control.ts b/src/panels/config/server_control/ha-config-server-control.ts index fe19018906..22ef7646eb 100644 --- a/src/panels/config/server_control/ha-config-server-control.ts +++ b/src/panels/config/server_control/ha-config-server-control.ts @@ -36,6 +36,7 @@ const reloadableDomains = [ "input_datetime", "input_select", "template", + "universal", ]; @customElement("ha-config-server-control") diff --git a/src/translations/en.json b/src/translations/en.json index caa70d5a03..2544e4f57b 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -838,7 +838,8 @@ "input_number": "Reload input numbers", "input_datetime": "Reload input date times", "input_select": "Reload input selects", - "template": "Reload template entities" + "template": "Reload template entities", + "universal": "Reload universal media player entities" }, "server_management": { "heading": "Server management", From 9b7d17433c7850696e7ffe27ea8e0065e0c1a8a7 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 26 Aug 2020 00:38:02 +0200 Subject: [PATCH 075/300] Add aria roles to data table (#6702) --- src/components/data-table/ha-data-table.ts | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/components/data-table/ha-data-table.ts b/src/components/data-table/ha-data-table.ts index 69c30633b6..af549b942f 100644 --- a/src/components/data-table/ha-data-table.ts +++ b/src/components/data-table/ha-data-table.ts @@ -214,13 +214,15 @@ export class HaDataTable extends LitElement { class="mdc-data-table__table ${classMap({ "auto-height": this.autoHeight, })}" + role="table" + aria-rowcount=${this._filteredData.length} style=${styleMap({ height: this.autoHeight ? `${(this._filteredData.length || 1) * 53 + 57}px` : `calc(100% - ${this._header?.clientHeight}px)`, })} > -
    +
    ${this.selectable ? html`
    -
    -
    +
    +
    ${this.noDataText || "No data"}
    @@ -304,12 +306,14 @@ export class HaDataTable extends LitElement { items: !this.hasFab ? this._filteredData : [...this._filteredData, ...[{ empty: true }]], - renderItem: (row: DataTableRowData) => { + renderItem: (row: DataTableRowData, index) => { if (row.empty) { return html`
    `; } return html`
    Date: Tue, 25 Aug 2020 18:00:50 -0500 Subject: [PATCH 076/300] Add UI control to reload a config entry (integration) (#6656) * Add UI control to reload an integration * Refactor to move reload above delete and check supports_unload * Avoid index switch * Update src/panels/config/integrations/ha-integration-card.ts --- src/data/config_entries.ts | 6 ++ .../integrations/ha-integration-card.ts | 69 +++++++++++++++---- src/translations/en.json | 3 + 3 files changed, 64 insertions(+), 14 deletions(-) diff --git a/src/data/config_entries.ts b/src/data/config_entries.ts index 527838ff3b..925d9cc9b1 100644 --- a/src/data/config_entries.ts +++ b/src/data/config_entries.ts @@ -8,6 +8,7 @@ export interface ConfigEntry { state: string; connection_class: string; supports_options: boolean; + supports_unload: boolean; } export interface ConfigEntryMutableParams { @@ -37,6 +38,11 @@ export const deleteConfigEntry = (hass: HomeAssistant, configEntryId: string) => require_restart: boolean; }>("DELETE", `config/config_entries/entry/${configEntryId}`); +export const reloadConfigEntry = (hass: HomeAssistant, configEntryId: string) => + hass.callApi<{ + require_restart: boolean; + }>("POST", `config/config_entries/entry/${configEntryId}/reload`); + export const getConfigEntrySystemOptions = ( hass: HomeAssistant, configEntryId: string diff --git a/src/panels/config/integrations/ha-integration-card.ts b/src/panels/config/integrations/ha-integration-card.ts index fc03a16ddd..dddeaf6754 100644 --- a/src/panels/config/integrations/ha-integration-card.ts +++ b/src/panels/config/integrations/ha-integration-card.ts @@ -14,6 +14,7 @@ import { ConfigEntry, updateConfigEntry, deleteConfigEntry, + reloadConfigEntry, } from "../../../data/config_entries"; import { EntityRegistryEntry } from "../../../data/entity_registry"; import { DeviceRegistryEntry } from "../../../data/device_registry"; @@ -28,7 +29,8 @@ import { haStyle } from "../../../resources/styles"; import "../../../components/ha-icon-next"; import { fireEvent } from "../../../common/dom/fire_event"; import { mdiDotsVertical, mdiOpenInNew } from "@mdi/js"; -import { ActionDetail } from "@material/mwc-list/mwc-list-foundation"; +import type { RequestSelectedDetail } from "@material/mwc-list/mwc-list-item"; +import { shouldHandleRequestSelectedEvent } from "../../../common/mwc/handle-request-selected-event"; export interface ConfigEntryUpdatedEvent { entry: ConfigEntry; @@ -228,7 +230,7 @@ export class HaIntegrationCard extends LitElement { ` : ""}
    - + - + ${this.hass.localize( "ui.panel.config.integrations.config_entry.system_options" )} @@ -259,7 +261,17 @@ export class HaIntegrationCard extends LitElement { `} - + ${item.state === "loaded" && item.supports_unload + ? html` + ${this.hass.localize( + "ui.panel.config.integrations.config_entry.reload" + )} + ` + : ""} + ${this.hass.localize( "ui.panel.config.integrations.config_entry.delete" )} @@ -309,17 +321,31 @@ export class HaIntegrationCard extends LitElement { showOptionsFlowDialog(this, ev.target.closest("ha-card").configEntry); } - private _handleAction(ev: CustomEvent) { - const configEntry = ((ev.target as HTMLElement).closest("ha-card") as any) - .configEntry; - switch (ev.detail.index) { - case 0: - this._showSystemOptions(configEntry); - break; - case 1: - this._removeIntegration(configEntry); - break; + private _handleReload(ev: CustomEvent): void { + if (!shouldHandleRequestSelectedEvent(ev)) { + return; } + this._reloadIntegration( + ((ev.target as HTMLElement).closest("ha-card") as any).configEntry + ); + } + + private _handleDelete(ev: CustomEvent): void { + if (!shouldHandleRequestSelectedEvent(ev)) { + return; + } + this._removeIntegration( + ((ev.target as HTMLElement).closest("ha-card") as any).configEntry + ); + } + + private _handleSystemOptions(ev: CustomEvent): void { + if (!shouldHandleRequestSelectedEvent(ev)) { + return; + } + this._showSystemOptions( + ((ev.target as HTMLElement).closest("ha-card") as any).configEntry + ); } private _showSystemOptions(configEntry: ConfigEntry) { @@ -353,6 +379,21 @@ export class HaIntegrationCard extends LitElement { }); } + private async _reloadIntegration(configEntry: ConfigEntry) { + const entryId = configEntry.entry_id; + + reloadConfigEntry(this.hass, entryId).then((result) => { + const locale_key = result.require_restart + ? "reload_restart_confirm" + : "reload_confirm"; + showAlertDialog(this, { + text: this.hass.localize( + `ui.panel.config.integrations.config_entry.${locale_key}` + ), + }); + }); + } + private async _editEntryName(ev) { const configEntry = ev.target.closest("ha-card").configEntry; const newName = await showPromptDialog(this, { diff --git a/src/translations/en.json b/src/translations/en.json index 2544e4f57b..e5c4952fb1 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1606,7 +1606,10 @@ "documentation": "Documentation", "delete": "Delete", "delete_confirm": "Are you sure you want to delete this integration?", + "reload": "Reload", "restart_confirm": "Restart Home Assistant to finish removing this integration", + "reload_confirm": "The integration was reloaded", + "reload_restart_confirm": "Restart Home Assistant to finish reloading this integration", "manuf": "by {manufacturer}", "hub": "Connected via", "firmware": "Firmware: {version}", From ac66a59cec55d903eb8ae1a0b82f0c9b90fb3fda Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Wed, 26 Aug 2020 00:35:17 +0000 Subject: [PATCH 077/300] [ci skip] Translation update --- translations/frontend/ca.json | 77 +++++++++++++++++++- translations/frontend/cs.json | 85 +++++++++++++++++++++- translations/frontend/de.json | 91 +++++++++++++++++++---- translations/frontend/el.json | 103 +++++++++++++++++++++++++- translations/frontend/en.json | 4 ++ translations/frontend/es.json | 79 +++++++++++++++++++- translations/frontend/fr.json | 77 +++++++++++++++++++- translations/frontend/it.json | 77 +++++++++++++++++++- translations/frontend/lb.json | 95 +++++++++++++++++++++++- translations/frontend/nb.json | 77 +++++++++++++++++++- translations/frontend/pl.json | 106 ++++++++++++++++++++++++++- translations/frontend/ru.json | 78 +++++++++++++++++++- translations/frontend/sv.json | 87 +++++++++++++++++++++- translations/frontend/zh-Hans.json | 112 +++++++++++++++++++++++++++-- 14 files changed, 1113 insertions(+), 35 deletions(-) diff --git a/translations/frontend/ca.json b/translations/frontend/ca.json index dd040e1f7d..569a01e4d4 100644 --- a/translations/frontend/ca.json +++ b/translations/frontend/ca.json @@ -419,9 +419,16 @@ "unlock": "Desbloquejar" }, "media_player": { + "browse_media": "Navega pels mitjans", + "media_next_track": "Següent", + "media_play": "Reprodueix", + "media_play_pause": "Reprodueix/pausa", + "media_previous_track": "Anterior", "sound_mode": "Mode de so", "source": "Entrada", - "text_to_speak": "Text a veu" + "text_to_speak": "Text a veu", + "turn_off": "Apaga", + "turn_on": "Engega" }, "persistent_notification": { "dismiss": "Desestimar" @@ -554,6 +561,22 @@ "loading_history": "Carregant historial d'estats...", "no_history_found": "No s'ha trobat cap historial d'estats." }, + "media-browser": { + "choose-source": "Tria la font", + "content-type": { + "album": "Àlbum", + "artist": "Artista", + "library": "Biblioteca", + "playlist": "Llista de reproducció", + "server": "Servidor" + }, + "media-player-browser": "Navegador del reproductor multimèdia", + "no_items": "Sense elements", + "pick": "Escull", + "pick-media": "Tria mitjans", + "play": "Reprodueix", + "play-media": "Reprodueix mitjans" + }, "picture-upload": { "label": "Imatge", "unsupported_format": "Format no compatible, tria una imatge JPEG, PNG o GIF." @@ -578,6 +601,7 @@ "week": "{count} {count, plural,\n one {setmana}\n other {setmanes}\n}" }, "future": "D'aquí a {time}", + "just_now": "Ara mateix", "never": "Mai", "past": "Fa {time}" }, @@ -1318,6 +1342,7 @@ } }, "devices": { + "add_prompt": "Encara no s'han afegit {name} mitjançant aquest dispositiu. Pots afegir-ne fent clic al botó + a sobre.", "automation": { "actions": { "caption": "Quan es dispara alguna cosa..." @@ -1658,7 +1683,11 @@ "topic": "tòpic" }, "ozw": { + "button": "Configura", "common": { + "controller": "Controlador", + "instance": "Instància", + "network": "Xarxa", "node_id": "ID del node", "ozw_instance": "Instància OpenZWave", "zwave": "Z-Wave" @@ -1668,6 +1697,36 @@ "stage": "Etapa", "zwave_info": "Informació Z-Wave" }, + "navigation": { + "network": "Xarxa", + "nodes": "Nodes", + "select_instance": "Selecciona instància" + }, + "network_status": { + "details": { + "driverallnodesqueried": "S'han cosultat tots els nodes", + "driverallnodesqueriedsomedead": "S'han consultat tots els nodes. Se n'han trobat alguns morts", + "driverawakenodesqueries": "S'han cosultat tots els nodes desperts", + "driverfailed": "No s'ha pogut connectar amb el controlador Z-Wave", + "driverready": "Iniciant el controlador Z-Wave", + "driverremoved": "El controlador s'ha eliminat", + "driverreset": "El controlador s'ha restablert", + "offline": "OZWDaemon fora de línia", + "ready": "A punt per connectar-se", + "started": "Connectat a MQTT", + "starting": "Connectant a MQTT", + "stopped": "OpenZWave aturat" + }, + "offline": "Fora de línia", + "online": "En línia", + "starting": "Iniciant", + "unknown": "Desconegut" + }, + "network": { + "header": "Gestió de la xarxa", + "introduction": "Gestiona les funcions de tota la xarxa.", + "node_count": "{count} nodes" + }, "node_query_stages": { "associations": "Actualitzant de grups d'associacions i membres", "cacheload": "Carregant informació del fitxer de memòria cau d'OpenZWave. Els nodes amb bateria romandran en aquesta fase fins que es despertin.", @@ -1698,6 +1757,14 @@ "title": "Informació d'actualització del node", "wakeup_header": "Instruccions en despertar de", "wakeup_instructions_source": "Les instruccions en despertar provenen de la base de dades de dispositius de la comunitat OpenZWave." + }, + "select_instance": { + "header": "Selecciona una instància d'OpenZWave", + "introduction": "Tens més d'una instància d'OpenZWave en funcionament. Quina instància vols gestionar?" + }, + "services": { + "add_node": "Afegeix node", + "remove_node": "Elimina node" } }, "person": { @@ -1835,6 +1902,7 @@ "person": "Actualitza persones", "scene": "Actualitza escenes", "script": "Actualitza programes", + "template": "Torna a carregar entitats de plantilla", "zone": "Actualitza zones" }, "server_management": { @@ -1876,6 +1944,7 @@ "last_scanned": "Últim escaneig", "name": "Nom" }, + "never_scanned": "Mai escanejat", "no_tags": "Sense etiquetes", "write": "Escriu" }, @@ -2200,6 +2269,7 @@ "description": "Les plantilles es renderitzen mitjançant el motor Jinja2 amb algunes extensions específiques de Home Assistant.", "editor": "Editor de plantilles", "jinja_documentation": "Documentació sobre plantilles amb Jinja2", + "reset": "Restableix a la plantilla de demostració", "template_extensions": "Extensions de plantilla de Home Assistant", "title": "Plantilla", "unknown_error_template": "Error desconegut renderitzant plantilla" @@ -2281,6 +2351,10 @@ "description": "La targeta botó et permet afegir botons per realitzar diferents tasques.", "name": "Botó" }, + "calendar": { + "description": "La targeta Calendari mostra un calendari que inclou visualitzacions de dia, setmana i llista", + "name": "Calendari" + }, "conditional": { "card": "Targeta", "change_type": "Canvia el tipus", @@ -2735,6 +2809,7 @@ "intro": "Hola {name}, benvingut/uda a Home Assistant. Quin nom t'agradaria posar a la teva casa?", "intro_location": "Voldirem saber la zona on vius. Aquesta informació servirà per poder mostrar certa informació i configurar automatitzacions relatives a la posició del sol. Aquestes dades mai es compartiran fora de la teva xarxa personal.", "intro_location_detect": "Et podem ajudar a completar aquesta informació fent una única sol·licitud a un servei extern.", + "location_name": "Nom de la instal·lació de Home Assistant", "location_name_default": "Casa" }, "integration": { diff --git a/translations/frontend/cs.json b/translations/frontend/cs.json index 1d8ef955dc..f6a106206b 100644 --- a/translations/frontend/cs.json +++ b/translations/frontend/cs.json @@ -419,9 +419,16 @@ "unlock": "Odemknout" }, "media_player": { + "browse_media": "Procházet média", + "media_next_track": "Další", + "media_play": "Přehrát", + "media_play_pause": "Přehrát/pozastavit", + "media_previous_track": "Předchozí", "sound_mode": "Režim zvuku", "source": "Zdroj", - "text_to_speak": "Převod textu na řeč" + "text_to_speak": "Převod textu na řeč", + "turn_off": "Vypnout", + "turn_on": "Zapnout" }, "persistent_notification": { "dismiss": "Zavřít" @@ -554,6 +561,22 @@ "loading_history": "Historie stavu se načítá...", "no_history_found": "Historie stavu chybí." }, + "media-browser": { + "choose-source": "Zvolte zdroj", + "content-type": { + "album": "Album", + "artist": "Umělec", + "library": "Knihovna", + "playlist": "Seznam skladeb", + "server": "Server" + }, + "media-player-browser": "Prohlížeč přehrávače médií", + "no_items": "Žádné položky", + "pick": "Vybrat", + "pick-media": "Vybrat média", + "play": "Přehrát", + "play-media": "Přehrát média" + }, "picture-upload": { "label": "Obrázek", "unsupported_format": "Nepodporovaný formát, prosím vyberte obrázek typu JPEG, PNG nebo GIF." @@ -578,6 +601,7 @@ "week": "{count} {count, plural,\none {týden}\nother {týdnů}\n}" }, "future": "Za {time}", + "just_now": "Právě teď", "never": "Nikdy", "past": "Před {time}" }, @@ -1658,11 +1682,58 @@ "topic": "téma" }, "ozw": { + "button": "Konfigurovat", "common": { + "instance": "Instance", + "network": "Síť", + "node_id": "ID uzlu", + "ozw_instance": "Instance OpenZWave", "zwave": "Z-Wave" }, + "device_info": { + "node_failed": "Uzel selhal" + }, + "navigation": { + "network": "Síť", + "nodes": "Uzly", + "select_instance": "Vyberte instanci" + }, + "network_status": { + "details": { + "driverremoved": "Ovladač byl odstraněn", + "driverreset": "Ovladač byl resetován", + "offline": "OZWDaemon je offline", + "ready": "Připraveno k připojení", + "started": "Připojeno k MQTT", + "starting": "Připojování k MQTT", + "stopped": "OpenZWave zastaven" + }, + "offline": "Offline", + "online": "Online", + "unknown": "Nezjištěno" + }, + "network": { + "header": "Správa sítě", + "node_count": "{count} uzlů" + }, + "node_query_stages": { + "configuration": "Získávám konfiguraci z uzlu", + "dynamic": "Získávám často se měnící hodnoty z uzlu", + "neighbors": "Získávám seznam sousedů uzlu", + "nodeplusinfo": "Získávám informace o Z-Wave + z uzlu", + "session": "Získávám zřídka se měnící hodnoty z uzlu", + "static": "Získávám statické hodnoty ze zařízení" + }, "refresh_node": { - "step": "Krok" + "complete": "Obnova uzlu dokončena", + "node_status": "Stav uzlu", + "refreshing_description": "Aktualizuji informací o uzlu...", + "step": "Krok", + "title": "Aktualizovat informace o uzlu" + }, + "services": { + "add_node": "Přidat uzel", + "remove_node": "Odebrat uzel" } }, "person": { @@ -1800,6 +1871,7 @@ "person": "Znovu načíst osoby", "scene": "Znovu načíst scény", "script": "Znovu načíst skripty", + "template": "Znovu načíst entity šablon", "zone": "Znovu načíst zóny" }, "server_management": { @@ -1841,6 +1913,7 @@ "last_scanned": "Naposledy naskenováno", "name": "Název" }, + "never_scanned": "Nikdy naskenováno", "no_tags": "Žádné značky", "write": "Zapsat" }, @@ -2085,7 +2158,7 @@ "heal_network": "Vyléčit síť", "heal_node": "Uzdravit uzel", "node_info": "Informace o uzlu", - "print_node": "Otisk nodu", + "print_node": "Otisk uzlu", "refresh_entity": "Znovu načíst Entitu", "refresh_node": "Obnovit uzel", "remove_failed_node": "Odebrat selhaný uzel", @@ -2165,6 +2238,7 @@ "description": "Šablony jsou vykreslovány pomocí Jinja2 šablonového enginu s některými specifickými rozšířeními pro Home Assistant.", "editor": "Editor šablon", "jinja_documentation": "Dokumentace šablony Jinja2", + "reset": "Obnovit ukázkovou šablonu", "template_extensions": "Rozšíření šablony Home Assistant", "title": "Šablony", "unknown_error_template": "Šablona vykreslování neznámých chyb" @@ -2246,6 +2320,10 @@ "description": "Karta Tlačítko umožňuje přidat tlačítka k provádění úkolů.", "name": "Tlačítko" }, + "calendar": { + "description": "Karta Kalendář zobrazuje kalendář včetně zobrazení dnů, týdnů a seznamů", + "name": "Kalendář" + }, "conditional": { "card": "Karta", "change_type": "Změnit typ", @@ -2700,6 +2778,7 @@ "intro": "Dobrý den, {name} , vítejte v Home Assistant. Jak byste chtěli pojmenovat svůj domov?", "intro_location": "Rádi bychom věděli, kde žijete. Tyto informace pomohou při zobrazování informací a určování přesné polohy slunce. Tato data nejsou nikdy sdílena mimo vaši síť.", "intro_location_detect": "Můžeme vám pomoci vyplnit tyto informace jednorázovým požadavkem na externí službu.", + "location_name": "Název vaší instalace Home Assistant", "location_name_default": "Domov" }, "integration": { diff --git a/translations/frontend/de.json b/translations/frontend/de.json index a1af0f920d..4628cab1cc 100644 --- a/translations/frontend/de.json +++ b/translations/frontend/de.json @@ -419,9 +419,12 @@ "unlock": "Entriegeln" }, "media_player": { + "media_play": "Abspielen", "sound_mode": "Sound-Modus", "source": "Quelle", - "text_to_speak": "Text zum Sprechen" + "text_to_speak": "Text zum Sprechen", + "turn_off": "Ausschalten", + "turn_on": "Einschalten" }, "persistent_notification": { "dismiss": "Ausblenden" @@ -554,6 +557,17 @@ "loading_history": "Lade Zustandsverlauf...", "no_history_found": "Kein Zustandsverlauf gefunden." }, + "media-browser": { + "choose-source": "Quelle wählen", + "content-type": { + "album": "Album", + "artist": "Künstler", + "library": "Bibliothek", + "playlist": "Playlist", + "server": "Server" + }, + "play": "Abspielen" + }, "related-items": { "area": "Bereich", "automation": "Teil der folgenden Automatisierungen", @@ -574,6 +588,7 @@ "week": "{count} {count, plural,\none {Woche}\nother {Wochen}\n}" }, "future": "In {time}", + "just_now": "Gerade jetzt", "never": "Noch nie", "past": "Vor {time}" }, @@ -833,6 +848,9 @@ "name": "Aktion", "type_select": "Aktionstyp", "type": { + "choose": { + "label": "Auswählen" + }, "condition": { "label": "Bedingung" }, @@ -852,6 +870,21 @@ "label": "Ereignis auslösen", "service_data": "Dienstdaten" }, + "repeat": { + "label": "Wiederholen", + "type_select": "Wiederholungstyp", + "type": { + "count": { + "label": "Anzahl" + }, + "until": { + "label": "Bis" + }, + "while": { + "label": "Während" + } + } + }, "scene": { "label": "Szene aktivieren" }, @@ -1298,7 +1331,7 @@ }, "cant_edit": "Du kannst nur Elemente bearbeiten, die in der Benutzeroberfläche erstellt wurden.", "caption": "Geräte", - "confirm_delete": "Möchtest Du dieses Gerät wirklich löschen?", + "confirm_delete": "Möchtest du dieses Gerät wirklich löschen?", "confirm_rename_entity_ids": "Möchten Sie auch die Entitäts-IDs Ihrer Entitäten umbenennen?", "data_table": { "area": "Bereich", @@ -1370,7 +1403,7 @@ "introduction2": "Verwenden Sie die Entitätsregistrierung, um den Namen zu überschreiben, die Entität-ID zu ändern oder den Eintrag aus Home Assistant zu entfernen. Beachten Sie, dass das Entfernen des Entitätsregistrierungs-Eintrags die Entität nicht löscht. Folgen Sie dazu dem Link unten und entfernen Sie ihn in der Integrationsseite.", "remove_selected": { "button": "Ausgewählte entfernen", - "confirm_partly_text": "Du kannst nur {removable} der ausgewählten {selected} Entitäten entfernen. Entitäten können nur entfernt werden, wenn die Integration die Entitäten nicht mehr bereitstellt. Manchmal musst du Home Assistant neu starten, bevor du die Entitäten einer entfernten Integration entfernen kannst. Möchtest Du die entfernbaren Entitäten wirklich entfernen?", + "confirm_partly_text": "Du kannst nur {removable} der ausgewählten {selected} Entitäten entfernen. Entitäten können nur entfernt werden, wenn die Integration die Entitäten nicht mehr bereitstellt. Manchmal musst du Home Assistant neu starten, bevor du die Entitäten einer entfernten Integration entfernen kannst. Möchtest du die entfernbaren Entitäten wirklich entfernen?", "confirm_partly_title": "Es können nur {number} ausgewählte Objekte entfernt werden.", "confirm_text": "Du solltest sie aus deiner Lovelace-Konfiguration und deinen Automatisierungen entfernen, wenn sie diese Entitäten enthalten.", "confirm_title": "Möchtest du {number} Entitäten entfernen?" @@ -1507,9 +1540,9 @@ "no_integrations": "Du hast anscheinend noch keine Integrationen konfiguriert. Klicke auf die Schaltfläche unten, um Deine erste Integration hinzuzufügen!", "none": "Noch nichts konfiguriert", "none_found": "Keine Integrationen gefunden", - "none_found_detail": "Passe Deine Suchkriterien an.", + "none_found_detail": "Passe deine Suchkriterien an.", "note_about_integrations": "Nicht alle Integrationen können über die Benutzeroberfläche konfiguriert werden.", - "note_about_website_reference": "Weitere Informationen findest Du auf der ", + "note_about_website_reference": "Weitere Informationen findest du auf der ", "rename_dialog": "Bearbeite den Namen dieses Konfigurationseintrags", "rename_input_label": "Eintragsname", "search": "Such-Integrationen" @@ -1595,7 +1628,7 @@ }, "no_resources": "keine Ressourcen" }, - "refresh_body": "Die Seite muss aktualisiert werden, um das Entfernen abzuschließen. Möchtest Du sie jetzt aktualisieren?", + "refresh_body": "Die Seite muss aktualisiert werden, um das Entfernen abzuschließen. Möchtest du sie jetzt aktualisieren?", "refresh_header": "Möchtest du aktualisieren?", "types": { "css": "Stylesheet", @@ -1620,8 +1653,23 @@ "topic": "Topic" }, "ozw": { + "common": { + "instance": "Instanz" + }, "device_info": { "zwave_info": "Z-Wave Infos" + }, + "navigation": { + "network": "Netzwerk", + "select_instance": "Instanz auswählen" + }, + "network_status": { + "offline": "Offline", + "online": "Online", + "unknown": "Unbekannt" + }, + "network": { + "header": "Netzwerkverwaltung" } }, "person": { @@ -1778,6 +1826,15 @@ } } }, + "tags": { + "detail": { + "name": "Name" + }, + "headers": { + "name": "Name" + }, + "never_scanned": "Nie gescannt" + }, "users": { "add_user": { "caption": "Benutzer hinzufügen", @@ -1938,7 +1995,7 @@ "name": "Name", "new_zone": "Neue Zone", "passive": "Passiv", - "passive_note": "Passive Zonen sind im Frontend versteckt und werden nicht als Ort für Device Tracker verwendet. Dies ist nützlich, wenn Du sie nur für Automatisierungen verwenden möchtest.", + "passive_note": "Passive Zonen sind im Frontend versteckt und werden nicht als Ort für Device Tracker verwendet. Dies ist nützlich, wenn du sie nur für Automatisierungen verwenden möchtest.", "radius": "Radius", "required_error_msg": "Dieses Feld ist erforderlich", "update": "Aktualisieren" @@ -1948,7 +2005,7 @@ "go_to_core_config": "Zur allgemeinen Konfiguration gehen?", "home_zone_core_config": "Der Standort deiner Homezone kann auf der allgemeinen Konfigurationsseite bearbeitet werden. Der Radius der Homezone kann vom Frontend aus noch nicht bearbeitet werden. Möchtest du zur allgemeinen Konfiguration gehen?", "introduction": "Mit Zonen kannst du bestimmte Regionen auf der Erde angeben. Befindet sich eine Person in einer Zone, übernimmt der Zustand den Namen aus der Zone. Zonen können auch als Auslöser oder Bedingung in Automatisierungs-Setups verwendet werden.", - "no_zones_created_yet": "Es sieht so aus, als hättest Du noch keine Zonen erstellt." + "no_zones_created_yet": "Es sieht so aus, als hättest du noch keine Zonen erstellt." }, "zwave": { "button": "Konfigurieren", @@ -2099,6 +2156,7 @@ "description": "Vorlagen werden durch die Jinja2-Template-Engine mit einigen für Home Assistant spezifischen Erweiterungen gerendert.", "editor": "Vorlageneditor", "jinja_documentation": "Jinja2 Template Dokumentation", + "reset": "Zurücksetzen auf Demo-Vorlage", "template_extensions": "Home Assistant-Vorlagenerweiterungen", "title": "Vorlage", "unknown_error_template": "Unbekannter Fehler beim Rendern der Vorlage" @@ -2180,6 +2238,9 @@ "description": "Mit der Schaltflächen-Karte kannst du Schaltflächen hinzufügen, um Aufgaben auszuführen.", "name": "Schaltfläche" }, + "calendar": { + "name": "Kalender" + }, "conditional": { "card": "Karte", "change_type": "Typ ändern", @@ -2206,7 +2267,7 @@ "name": "Entität Filter" }, "entity": { - "description": "Mit der Entitätskarte erhältst Du einen schnellen Überblick über den Status Ihrer Entität.", + "description": "Mit der Entitätskarte erhältst du einen schnellen Überblick über den Status Ihrer Entität.", "name": "Entität" }, "gauge": { @@ -2233,7 +2294,7 @@ "icon_height": "Symbol Höhe", "image": "Bildpfad", "manual": "Manuell", - "manual_description": "Möchtest du eine benutzerdefinierte Karte hinzufügen, oder den Yaml-Code von Hand bearbeiten?", + "manual_description": "Möchtest du eine benutzerdefinierte Karte hinzufügen oder den YAML-Code von Hand bearbeiten?", "maximum": "Maximum", "minimum": "Minimum", "name": "Name", @@ -2416,8 +2477,8 @@ "para_sure": "Bist du dir sicher, dass du die Benutzeroberfläche selbst verwalten möchtest?", "save": "Kontrolle übernehmen", "yaml_config": "Um dir den Einstieg zu erleichtern, findest du hier die aktuelle Konfiguration dieses Dashboards:", - "yaml_control": "Um die Kontrolle im YAML-Modus zu übernehmen, erstelle eine YAML-Datei mit dem Namen, den Du in Deiner Konfiguration für dieses Dashboard angegeben hast, oder mit der Standardeinstellung 'ui-lovelace.yaml'.", - "yaml_mode": "Du verwendest den YAML-Modus für dieses Dashboard. Dies bedeutet, dass Du Deine Lovelace-Konfiguration nicht über die Benutzeroberfläche ändern kannst. Wenn Du dieses Dashboard über die Benutzeroberfläche verwalten möchtest, entferne \"mode: yaml\" aus Deiner Lovelace-Konfiguration in \"configuration.yaml\"." + "yaml_control": "Um die Kontrolle im YAML-Modus zu übernehmen, erstelle eine YAML-Datei mit dem Namen, den du in Deiner Konfiguration für dieses Dashboard angegeben hast, oder mit der Standardeinstellung 'ui-lovelace.yaml'.", + "yaml_mode": "Du verwendest den YAML-Modus für dieses Dashboard. Dies bedeutet, dass Du Deine Lovelace-Konfiguration nicht über die Benutzeroberfläche ändern kannst. Wenn du dieses Dashboard über die Benutzeroberfläche verwalten möchtest, entferne \"mode: yaml\" aus Deiner Lovelace-Konfiguration in \"configuration.yaml\"." }, "suggest_card": { "add": "Zu Lovelace hinzufügen", @@ -2442,8 +2503,8 @@ }, "reload_lovelace": "Benutzeroberfläche neu laden", "reload_resources": { - "refresh_body": "Du musst die Seite aktualisieren, um das Neuladen abzuschließen. Möchtest Du sie jetzt aktualisieren?", - "refresh_header": "Möchtest Du aktualisieren?" + "refresh_body": "Du musst die Seite aktualisieren, um das Neuladen abzuschließen. Möchtest du sie jetzt aktualisieren?", + "refresh_header": "Möchtest du aktualisieren?" }, "unused_entities": { "available_entities": "Dies sind die Entitäten, die du zur Verfügung hast, die aber noch nicht in deiner Lovelace-Benutzeroberfläche enthalten sind.", @@ -2627,6 +2688,7 @@ "intro": "Hallo {name}, willkommen bei Home Assistant. Wie möchten Sie Ihre Haus benennen?", "intro_location": "Wir würden gerne wissen, wo Sie wohnen. Diese Daten helfen bei der Anzeige von Informationen und der Einrichtung von Sonnenstands-basierten Automatisierungen. Diese Daten werden niemals außerhalb Ihres Netzwerks weitergegeben.", "intro_location_detect": "Wir können helfen, diese Informationen auszufüllen, indem wir eine einmalige Anfrage an einen externen Dienstleister richten.", + "location_name": "Name deiner Home Assistant Installation", "location_name_default": "Home" }, "integration": { @@ -2738,6 +2800,7 @@ "themes": { "accent_color": "Akzentfarbe", "dark_mode": { + "auto": "Automatisch", "dark": "Dunkel", "light": "Hell" }, diff --git a/translations/frontend/el.json b/translations/frontend/el.json index e2d9b9b2d6..936fc4761e 100644 --- a/translations/frontend/el.json +++ b/translations/frontend/el.json @@ -419,9 +419,16 @@ "unlock": "Ξεκλείδωμα" }, "media_player": { + "browse_media": "Αναζήτηση πολυμέσων", + "media_next_track": "Επόμενο", + "media_play": "Αναπαραγωγή", + "media_play_pause": "Αναπαραγωγή/παύση", + "media_previous_track": "Προηγούμενο", "sound_mode": "Λειτουργία ήχου", "source": "Πηγή", - "text_to_speak": "Κείμενο προς εκφώνηση" + "text_to_speak": "Κείμενο προς εκφώνηση", + "turn_off": "Απενεργοποίηση", + "turn_on": "Ενεργοποίηση" }, "persistent_notification": { "dismiss": "Απόρριψη" @@ -502,8 +509,11 @@ "error_required": "Υποχρεωτικό", "loading": "Φόρτωση", "menu": "Μενού", + "next": "Επόμενο", "no": "Όχι", "overflow_menu": "Μενού υπερχείλισης", + "previous": "Προηγούμενο", + "refresh": "Ανανέωση", "save": "Αποθήκευση", "successfully_deleted": "Η διαγραφή ολοκληρώθηκε με επιτυχία", "successfully_saved": "Αποθηκεύτηκε με επιτυχία", @@ -551,6 +561,21 @@ "loading_history": "Φόρτωση ιστορικού κατάστασης …", "no_history_found": "Δεν έχει βρεθεί ιστορικό κατάστασης." }, + "media-browser": { + "choose-source": "Επιλέξτε Πηγή", + "content-type": { + "album": "Άλμπουμ", + "artist": "Καλλιτέχνης", + "library": "Βιβλιοθήκη", + "server": "Διακομιστής" + }, + "media-player-browser": "Πρόγραμμα περιήγησης πολυμέσων", + "no_items": "Χωρίς στοιχεία", + "pick": "Επιλέξετε", + "pick-media": "Επιλογή μέσων", + "play": "Αναπαραγωγή", + "play-media": "Αναπαραγωγή πολυμέσων" + }, "relative_time": { "duration": { "day": "{count} {count, plural,\n one {μέρα}\n other {μέρες}\n}", @@ -560,6 +585,7 @@ "week": "{count} {count, plural,\n one {εβδομάδα}\n other {εβδομάδες}\n}" }, "future": "Σε {time}", + "just_now": "Μόλις τώρα", "never": "Ποτέ", "past": "{time} πριν" }, @@ -976,6 +1002,9 @@ "sunrise": "Ανατολή ηλίου", "sunset": "Δύση ηλίου" }, + "tag": { + "label": "Ετικέτα" + }, "template": { "label": "Πρότυπο", "value_template": "Τιμή πρότυπου" @@ -1252,6 +1281,7 @@ "caption": "Συσκευές", "confirm_delete": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτή τη συσκευή;", "confirm_rename_entity_ids": "Θέλετε επίσης να μετονομάσετε τα αναγνωριστικά οντότητας των οντοτήτων σας;", + "confirm_rename_entity_ids_warning": "Αυτό δεν θα αλλάξει καμία ρύθμιση παραμέτρων (όπως αυτοματισμούς, σενάρια, σκηνές, Lovelace) που χρησιμοποιεί αυτήν τη στιγμή αυτές τις οντότητες, θα πρέπει να τις ενημερώσετε μόνοι σας.", "data_table": { "area": "Περιοχή", "battery": "Μπαταρία", @@ -1370,6 +1400,7 @@ "caption": "Ενσωματώσεις", "config_entry": { "area": "Στην {area}", + "delete": "Διαγραφή", "delete_button": "Διαγραφή {integration}", "delete_confirm": "Είστε σίγουρος ότι θέλετε να διαγραφεί αυτή η ενοποίηση;", "device_unavailable": "συσκευή μη διαθέσιμη", @@ -1381,8 +1412,11 @@ "no_area": "Καμία περιοχή", "no_device": "Οντότητες χωρίς συσκευές", "no_devices": "Αυτή η ενοποίηση δεν έχει συσκευές.", + "options": "Επιλογές", + "rename": "Μετονομασία", "restart_confirm": "Επανεκκινήστε το Home Assistant για να ολοκληρώσετε την κατάργηση αυτής της ενοποίησης", "settings_button": "Επεξεργασία ρυθμίσεων για {integration}", + "system_options": "Επιλογές συστήματος", "system_options_button": "Επιλογές συστήματος για {integration}", "unnamed_entry": "Ανώνυμη καταχώριση" }, @@ -1420,8 +1454,11 @@ "integration_not_found": "Η ενσωμάτωση δε βρέθηκε.", "new": "Ρυθμίστε νέα ενοποίηση", "none": "Δεν υπάρχει διαμόρφωση ακόμα", + "none_found": "Δεν βρέθηκαν ενσωματώσεις", + "none_found_detail": "Προσαρμόστε τα κριτήρια αναζήτησης.", "note_about_integrations": "Δεν μπορούν όλες οι ενσωματώσεις να διαμορφωθούν από το UI ακόμη.", "note_about_website_reference": "Περισσότερα είναι διαθέσιμα στο", + "rename_input_label": "Όνομα καταχώρησης", "search": "Αναζήτηση ενσωματώσεων" }, "introduction": "Εδώ είναι δυνατή η διαμόρφωση του Home Assistant και των εξαρτημάτων. Δεν είναι δυνατή η διαμόρφωση όλων από την διεπαφή χρήστη (UI) αλλά εργαζόμαστε πάνω σε αυτό.", @@ -1443,8 +1480,10 @@ "cant_edit_default": "Δεν είναι δυνατή η επεξεργασία του τυπικού πίνακα ελέγχου Lovelace από τη διεπαφή χρήστη. Μπορείτε να το αποκρύψετε ορίζοντας έναν άλλο πίνακα ελέγχου ως προεπιλογή.", "cant_edit_yaml": "Δεν είναι δυνατή η επεξεργασία πινάκων εργαλείων που ορίζονται στο YAML από το περιβάλλον εργασίας χρήστη. Αλλάξτε τα στο configuration.yaml.", "caption": "Επισκόπηση", + "confirm_delete": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτόν τον πίνακα ελέγχου;", "default_dashboard": "Αυτή είναι η προεπιλεγμένη επισκόπηση", "detail": { + "dismiss": "Κλείστε", "icon": "Εικονίδιο", "title": "Τίτλος", "title_required": "Απαιτείται τίτλος.", @@ -1452,7 +1491,8 @@ }, "picker": { "headers": { - "default": "Προεπιλογή" + "default": "Προεπιλογή", + "filename": "Όνομα_αρχείου" }, "open": "Άνοιγμα" } @@ -1490,6 +1530,36 @@ "stage": "Στάδιο", "zwave_info": "Πληροφορίες Z-Wave" }, + "navigation": { + "network": "Δίκτυο", + "nodes": "Κόμβοι", + "select_instance": "Επιλέξτε στιγμιότυπο " + }, + "network_status": { + "details": { + "driverallnodesqueried": "Όλοι οι κόμβοι έχουν ερωτηθεί.", + "driverallnodesqueriedsomedead": "Όλοι οι κόμβοι έχουν ερωτηθεί. Μερικοί κόμβοι βρέθηκαν να μην αποκρίνονται.", + "driverawakenodesqueries": "Όλοι οι ενεργοποιημένοι κόμβοι έχουν ερωτηθεί. ", + "driverfailed": "Αποτυχία σύνδεσης με τον ελεγκτή Z-Wave", + "driverready": "Προετοιμασία του ελεγκτή Z-Wave", + "driverremoved": "Το πρόγραμμα οδήγησης έχει αφαιρεθεί", + "driverreset": "Έγινε επαναφορά του προγράμματος οδήγησης", + "offline": "OZWDaemon εκτός σύνδεσης", + "ready": "Έτοιμος για σύνδεση", + "started": "Συνδεδεμένος με MQTT", + "starting": "Σύνδεση με MQTT", + "stopped": "Το OpenZWave σταμάτησε" + }, + "offline": "Εκτός σύνδεσης", + "online": "Σε σύνδεση", + "starting": "Εκκίνηση", + "unknown": "Άγνωστο" + }, + "network": { + "header": "Διαχείριση δικτύου", + "introduction": "Διαχείριση λειτουργιών δικτύου.", + "node_count": "{count} κόμβοι" + }, "node_query_stages": { "complete": "Η διαδικασία της συνέντευξης ολοκληρώθηκε", "configuration": "Λήψη τιμών διαμόρφωσης από τον κόμβο", @@ -1511,6 +1581,14 @@ "step": "Βήμα", "title": "Ανανέωση πληροφοριών κόμβου", "wakeup_header": "Οδηγίες εκκίνησης απο" + }, + "select_instance": { + "header": "Επιλέξτε ένα στιγμιότυπο OpenZWave", + "introduction": "Έχετε περισσότερα από ένα στιγμιότυπα OpenZWave σε ενέργεια. Ποιό στιγμιότυπο θέλετε να διαχειριστείτε;" + }, + "services": { + "add_node": "Προσθήκη κόμβου", + "remove_node": "Κατάργηση κόμβου" } }, "person": { @@ -1586,7 +1664,7 @@ }, "script": { "caption": "Δέσμη ενεργειών", - "description": "Δημιουργήσετε και να επεξεργαστείτε δέσμες ενεργειών", + "description": "Δημιουργήσετε και επεξεργαστείτε δέσμες ενεργειών", "editor": { "alias": "Όνομα", "default_name": "Νέα δέσμη ενεργειών", @@ -1665,6 +1743,17 @@ } } }, + "tags": { + "detail": { + "create": "Δημιουργία", + "create_and_write": "Δημιουργία και εγγραφή", + "delete": "Διαγραφή", + "description": "Περιγραφή", + "name": "Όνομα", + "new_tag": "Νέα ετικέτα", + "update": "Ενημέρωση" + } + }, "users": { "add_user": { "caption": "Προσθήκη χρήστη", @@ -1840,6 +1929,7 @@ "exclude_entity": "Εξαίρεση αυτής της οντότητας από τον Home Assistant", "group": "Ομάδα", "header": "Διαχείριση κόμβων Z-Wave", + "introduction": "Εκτελέστε εντολές Z-Wave που επηρεάζουν έναν μόνο κόμβο. Επιλέξτε έναν κόμβο για να δείτε μια λίστα με τις διαθέσιμες εντολές.", "max_associations": "Μέγιστες ενώσεις:", "node_group_associations": "Κόμβοι συσχετίσεων ομάδων", "node_protection": "Προστασία κόμβου", @@ -1944,6 +2034,7 @@ "description": "Τα πρότυπα μετατρέπονται χρησιμοποιώντας τη μηχανή πρότυπου Jinja2 με ορισμένες εξειδικευμένες επεκτάσεις του Home Assistant.", "editor": "Πρόγραμμα επεξεργασίας προτύπων", "jinja_documentation": "Έγγραφα πρότυπου Jinja2", + "reset": "Επαναφορά στο πρότυπο επίδειξης", "template_extensions": "Επεκτάσεις προτύπου Home Assistant", "title": "Πρότυπα", "unknown_error_template": "Άγνωστο σφάλμα ερμηνείας προτύπου" @@ -2013,6 +2104,10 @@ "available_states": "Διαθέσιμες λειτουργίες", "name": "Πίνακας συναγερμών" }, + "calendar": { + "description": "Η κάρτα \"Ημερολόγιο\" εμφανίζει ένα ημερολόγιο που περιλαμβάνει προβολές ημέρας, εβδομάδας και λίστας", + "name": "Ημερολόγιο" + }, "conditional": { "card": "Κάρτα", "conditions": "Συνθήκες", @@ -2264,6 +2359,7 @@ "warning": { "entity_non_numeric": "Η οντότητα δεν είναι αριθμητική: {entity}", "entity_not_found": "Η οντότητα δεν είναι διαθέσιμη: {entity}", + "entity_unavailable": "{entity} δεν είναι διαθέσιμο προς το παρόν", "starting": "Το Home Assistant ξεκινά, ενδέχεται να μην είναι ακόμη διαθέσιμα όλα" } }, @@ -2424,6 +2520,7 @@ "intro": "Γεια σου {name}, καλώς ήρθες στο Home Assistant. Πώς θα ήθελες να αναφέρεσαι στο σπίτι σου;", "intro_location": "Θα θέλαμε να μάθουμε πού ζεις. Αυτές οι πληροφορίες θα βοηθήσουν στην προβολή πληροφοριών και στη ρύθμιση αυτοματισμών που βασίζονται στη θέση ηλίου. Αυτά τα δεδομένα δεν μοιράζονται ποτέ εκτός του δικτύου σας.", "intro_location_detect": "Μπορούμε να σε βοηθήσουμε να συμπληρώσεις αυτές τις πληροφορίες, κάνοντας μια εφάπαξ αίτηση σε μια εξωτερική υπηρεσία.", + "location_name": "Όνομα της εγκατάστασης σας του Home Assistant", "location_name_default": "Σπίτι" }, "integration": { diff --git a/translations/frontend/en.json b/translations/frontend/en.json index 74d4ca0bcf..5c8b76d73a 100644 --- a/translations/frontend/en.json +++ b/translations/frontend/en.json @@ -1525,6 +1525,9 @@ "no_device": "Entities without devices", "no_devices": "This integration has no devices.", "options": "Options", + "reload": "Reload", + "reload_confirm": "The integration was reloaded", + "reload_restart_confirm": "Restart Home Assistant to finish reloading this integration", "rename": "Rename", "restart_confirm": "Restart Home Assistant to finish removing this integration", "settings_button": "Edit settings for {integration}", @@ -1903,6 +1906,7 @@ "scene": "Reload scenes", "script": "Reload scripts", "template": "Reload template entities", + "universal": "Reload universal media player entities", "zone": "Reload zones" }, "server_management": { diff --git a/translations/frontend/es.json b/translations/frontend/es.json index 921ef74f4c..7292cf1cbc 100644 --- a/translations/frontend/es.json +++ b/translations/frontend/es.json @@ -419,9 +419,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 para hablar" + "text_to_speak": "Texto para hablar", + "turn_off": "Apagar", + "turn_on": "Encender" }, "persistent_notification": { "dismiss": "Descartar" @@ -554,6 +561,22 @@ "loading_history": "Cargando historial de estado...", "no_history_found": "No se encontró historial de estado." }, + "media-browser": { + "choose-source": "Elige la fuente", + "content-type": { + "album": "Álbum", + "artist": "Artista", + "library": "Biblioteca", + "playlist": "Lista de reproducción", + "server": "Servidor" + }, + "media-player-browser": "Navegador del Reproductor Multimedia", + "no_items": "No hay elementos", + "pick": "Elegir", + "pick-media": "Elegir medio", + "play": "Reproducir", + "play-media": "Reproducir medio" + }, "picture-upload": { "label": "Imagen", "unsupported_format": "Formato no soportado, por favor, selecciona una imagen JPEG, PNG o GIF." @@ -578,6 +601,7 @@ "week": "{count} {count, plural,\none {semana}\nother {semanas}\n}" }, "future": "En {time}", + "just_now": "Ahora mismo", "never": "Nunca", "past": "Hace {time}" }, @@ -1318,6 +1342,7 @@ } }, "devices": { + "add_prompt": "Todavía no se ha añadido ningún {name} usando este dispositivo. Puedes añadir uno pulsando en el botón + de arriba.", "automation": { "actions": { "caption": "Cuando algo se activa...." @@ -1337,7 +1362,7 @@ "caption": "Dispositivos", "confirm_delete": "¿Estás seguro de que quieres eliminar este dispositivo?", "confirm_rename_entity_ids": "¿También quieres cambiar el nombre de los identificadores de entidad de tus entidades?", - "confirm_rename_entity_ids_warning": "Esto no cambiará ninguna configuración (como automatizaciones, scripts, escenas, Lovelace) que estén utilizando actualmente estas entidades, tendrá que actualizarlas usted mismo.", + "confirm_rename_entity_ids_warning": "Esto no cambiará ninguna configuración (como automatizaciones, scripts, escenas, Lovelace) que estén utilizando actualmente estas entidades, tendrás que actualizarlas tú mismo.", "data_table": { "area": "Área", "battery": "Batería", @@ -1658,7 +1683,11 @@ "topic": "tema" }, "ozw": { + "button": "Configurar", "common": { + "controller": "Controlador", + "instance": "Instancia", + "network": "Red", "node_id": "ID del Nodo", "ozw_instance": "Instancia OpenZWave", "zwave": "Z-Wave" @@ -1668,6 +1697,36 @@ "stage": "Etapa", "zwave_info": "Información Z-Wave" }, + "navigation": { + "network": "Red", + "nodes": "Nodos", + "select_instance": "Seleccionar Instancia" + }, + "network_status": { + "details": { + "driverallnodesqueried": "Se han consultado todos los nodos.", + "driverallnodesqueriedsomedead": "Se han consultado todos los nodos. Se encontraron algunos nodos muertos", + "driverawakenodesqueries": "Se han consultado todos los nodos despiertos", + "driverfailed": "No se pudo conectar con el controlador Z-Wave", + "driverready": "Iniciando el controlador Z-Wave", + "driverremoved": "El controlador ha sido eliminado", + "driverreset": "El controlador se ha reiniciado", + "offline": "OZWDaemon desconectado", + "ready": "Listo para conectar", + "started": "Conectado a MQTT", + "starting": "Conectando con MQTT", + "stopped": "OpenZWave detenido" + }, + "offline": "Desconectado", + "online": "En línea", + "starting": "Iniciando", + "unknown": "Desconocido" + }, + "network": { + "header": "Administración de la Red", + "introduction": "Gestionar las funciones de toda la red.", + "node_count": "{count} nodos" + }, "node_query_stages": { "associations": "Refrescando grupos de asociaciones y miembros", "cacheload": "Cargando información del archivo de caché de OpenZWave. Los nodos con batería permanecerán en esta etapa hasta que el nodo se active.", @@ -1698,6 +1757,14 @@ "title": "Refrescar Información del Nodo", "wakeup_header": "Instrucciones para despertar a", "wakeup_instructions_source": "Las instrucciones para despertarlo se obtienen de la base de datos de dispositivos de la comunidad OpenZWave." + }, + "select_instance": { + "header": "Selecciona una instancia de OpenZWave", + "introduction": "Tienes más de una instancia de OpenZWave en ejecución. ¿Qué instancia te gustaría gestionar?" + }, + "services": { + "add_node": "Añadir Nodo", + "remove_node": "Eliminar Nodo" } }, "person": { @@ -1835,6 +1902,7 @@ "person": "Recargar personas", "scene": "Recargar escenas", "script": "Recargar scripts", + "template": "Recargar entidades de plantilla", "zone": "Recargar zonas" }, "server_management": { @@ -1876,6 +1944,7 @@ "last_scanned": "Última vez escaneada", "name": "Nombre" }, + "never_scanned": "Nunca escaneado", "no_tags": "Sin etiquetas", "write": "Escribir" }, @@ -2200,6 +2269,7 @@ "description": "Las plantillas se muestran utilizando el motor de plantillas Jinja2 con algunas extensiones específicas de Home Assistant.", "editor": "Editor de plantillas", "jinja_documentation": "Documentación de plantilla Jinja2", + "reset": "Reiniciar a la plantilla de demostración", "template_extensions": "Extensiones de plantilla de Home Assistant", "title": "Plantillas", "unknown_error_template": "Error desconocido al mostrar la plantilla" @@ -2281,6 +2351,10 @@ "description": "La tarjeta Botón te permite agregar botones para realizar tareas.", "name": "Botón" }, + "calendar": { + "description": "La tarjeta Calendario muestra un calendario que incluye vistas de día, semana y lista", + "name": "Calendario" + }, "conditional": { "card": "Tarjeta", "change_type": "Cambiar el tipo", @@ -2735,6 +2809,7 @@ "intro": "Hola {name}, bienvenido a Home Assistant. ¿Cómo te gustaría llamar a tu casa?", "intro_location": "Nos gustaría saber dónde vives. Esta información ayudará a mostrar información y a configurar automatizaciones basadas en el sol. Estos datos nunca se comparten fuera de tu red.", "intro_location_detect": "Podemos ayudarte a completar esta información haciendo una solicitud única a un servicio externo.", + "location_name": "Nombre de tu instalación de Home Assistant", "location_name_default": "Casa" }, "integration": { diff --git a/translations/frontend/fr.json b/translations/frontend/fr.json index e60b28d5d7..a4511b066c 100644 --- a/translations/frontend/fr.json +++ b/translations/frontend/fr.json @@ -419,9 +419,16 @@ "unlock": "Déverrouiller" }, "media_player": { + "browse_media": "Parcourir les médias", + "media_next_track": "Suivant", + "media_play": "Lecture", + "media_play_pause": "Lecture/pause", + "media_previous_track": "Précédent", "sound_mode": "Mode sonore", "source": "Source", - "text_to_speak": "Texte à lire" + "text_to_speak": "Texte à lire", + "turn_off": "Éteindre", + "turn_on": "Allumer" }, "persistent_notification": { "dismiss": "Ignorer" @@ -554,6 +561,22 @@ "loading_history": "Chargement de l'historique des valeurs ...", "no_history_found": "Aucun historique des valeurs trouvé." }, + "media-browser": { + "choose-source": "Choisissez la source", + "content-type": { + "album": "Album", + "artist": "Artiste", + "library": "Bibliothèque", + "playlist": "Liste de lecture", + "server": "Serveur" + }, + "media-player-browser": "Lecteur multimédia", + "no_items": "Aucun éléments", + "pick": "Choisir", + "pick-media": "Choisissez un média", + "play": "Lecture", + "play-media": "Lire le média" + }, "picture-upload": { "label": "Image", "unsupported_format": "Format non pris en charge, veuillez choisir une image JPEG, PNG ou GIF." @@ -578,6 +601,7 @@ "week": "{count} {count, plural,\nzero {semaine}\none {semaine}\nother {semaines}\n}" }, "future": "Dans {time}", + "just_now": "Juste maintenant", "never": "Jamais", "past": "Il y a {time}" }, @@ -1318,6 +1342,7 @@ } }, "devices": { + "add_prompt": "Aucun {name} n'a encore été ajouté à l'aide de cet appareil. Vous pouvez en ajouter un en cliquant sur le bouton + ci-dessus.", "automation": { "actions": { "caption": "Quand quelque chose est déclenché ..." @@ -1658,7 +1683,11 @@ "topic": "sujet" }, "ozw": { + "button": "Configurer", "common": { + "controller": "Contrôleur", + "instance": "Instance", + "network": "Réseau", "node_id": "ID du nœud", "ozw_instance": "Instance Z-Wave", "zwave": "Z-Wave" @@ -1668,6 +1697,36 @@ "stage": "Étape", "zwave_info": "Informations Z-Wave" }, + "navigation": { + "network": "Réseau", + "nodes": "Nœuds", + "select_instance": "Sélectionnez une instance" + }, + "network_status": { + "details": { + "driverallnodesqueried": "Tous les nœuds ont été interrogés", + "driverallnodesqueriedsomedead": "Tous les nœuds ont été interrogés. Certains nœuds ont été trouvés morts", + "driverawakenodesqueries": "Tous les nœuds éveillés ont été interrogés", + "driverfailed": "Échec de la connexion au contrôleur Z-Wave", + "driverready": "Initialisation du contrôleur Z-Wave", + "driverremoved": "Le pilote a été supprimé", + "driverreset": "Le pilote a été réinitialisé", + "offline": "OZWDaemon hors ligne", + "ready": "Prêt à se connecter", + "started": "Connecté à MQTT", + "starting": "Connexion à MQTT", + "stopped": "OpenZWave arrêté" + }, + "offline": "Hors ligne", + "online": "En ligne", + "starting": "Démarrage", + "unknown": "Inconnu" + }, + "network": { + "header": "Gestion du réseau", + "introduction": "Διαχείρηση λειτουργιών δικτύου", + "node_count": "{count} nœuds" + }, "node_query_stages": { "associations": "Rafraîchissement les associations et les membres", "cacheload": "Chargement des informations à partir du fichier de cache OpenZWave. Les nœuds de batterie resteront à cette étape jusqu'à ce que le nœud se réveille.", @@ -1698,6 +1757,14 @@ "title": "Actualiser les informations du nœud", "wakeup_header": "Instructions de réveil pour", "wakeup_instructions_source": "Les instructions de réveil proviennent de la base de données de la communauté OpenZWave." + }, + "select_instance": { + "header": "Sélectionnez une instance OpenZWave", + "introduction": "Vous avez plus d'une instance OpenZWave en cours d'exécution. Quelle instance souhaitez-vous gérer ?" + }, + "services": { + "add_node": "Ajouter un nœud", + "remove_node": "Supprimer le nœud" } }, "person": { @@ -1835,6 +1902,7 @@ "person": "Recharger les personnes", "scene": "Recharger les scènes", "script": "Recharger les scripts", + "template": "Recharger les entités modèles", "zone": "Recharger les zones" }, "server_management": { @@ -1876,6 +1944,7 @@ "last_scanned": "Dernière analyse", "name": "Nom" }, + "never_scanned": "Jamais scanné", "no_tags": "Aucunes balises", "write": "Écrire" }, @@ -2200,6 +2269,7 @@ "description": "Les modèles sont rendus à l'aide du moteur de modèles Jinja2 avec certaines extensions spécifiques de Home Assistant.", "editor": "Éditeur de modèles", "jinja_documentation": "Documentation de modèle Jinja2", + "reset": "Réinitialiser au modèle de démonstration", "template_extensions": "Extensions de modèles de Home Assistant", "title": "Modèle", "unknown_error_template": "Erreur inconnue lors du rendu du modèle" @@ -2281,6 +2351,10 @@ "description": "La carte Bouton vous permet d'ajouter des boutons pour effectuer des tâches.", "name": "Bouton" }, + "calendar": { + "description": "La carte Calendrier affiche un calendrier comprenant des vues par jour, par semaine et par liste", + "name": "Calendrier" + }, "conditional": { "card": "Carte", "change_type": "Changer le type", @@ -2735,6 +2809,7 @@ "intro": "Bonjour {name}, bienvenue dans Home Assistant. Comment voudriez-vous nommer votre maison?", "intro_location": "Nous aimerions savoir où vous habitez. Ces informations vous aideront à afficher des informations et à configurer des automatismes basés sur le soleil. Ces données ne sont jamais partagées en dehors de votre réseau.", "intro_location_detect": "Nous pouvons vous aider à renseigner ces informations en adressant une demande unique à un service externe.", + "location_name": "Nom de votre installation Home Assistant", "location_name_default": "Maison" }, "integration": { diff --git a/translations/frontend/it.json b/translations/frontend/it.json index 4989fa4123..36c65a3173 100644 --- a/translations/frontend/it.json +++ b/translations/frontend/it.json @@ -419,9 +419,16 @@ "unlock": "Sbloccato" }, "media_player": { + "browse_media": "Sfoglia i file multimediali", + "media_next_track": "Avanti", + "media_play": "Riproduci", + "media_play_pause": "Riproduci/pausa", + "media_previous_track": "Indietro", "sound_mode": "Modalità audio", "source": "Fonte", - "text_to_speak": "Testo da leggere" + "text_to_speak": "Testo da leggere", + "turn_off": "Spegni", + "turn_on": "Accendi" }, "persistent_notification": { "dismiss": "Rimuovi" @@ -554,6 +561,22 @@ "loading_history": "Caricamento storico...", "no_history_found": "Nessuno storico trovato." }, + "media-browser": { + "choose-source": "Scegli origine", + "content-type": { + "album": "Album", + "artist": "Artista", + "library": "Libreria", + "playlist": "Elenco di riproduzione", + "server": "Server" + }, + "media-player-browser": "Lettore multimediale", + "no_items": "Nessun elemento", + "pick": "Scegli", + "pick-media": "Seleziona file multimediali", + "play": "Riproduci", + "play-media": "Riproduci file multimediali" + }, "picture-upload": { "label": "Immagine", "unsupported_format": "Formato non supportato, scegliere un'immagine JPEG, PNG o GIF." @@ -578,6 +601,7 @@ "week": "{count} {count, plural,\none {settimana}\nother {settimane}\n}" }, "future": "tra {time}", + "just_now": "Proprio ora", "never": "Mai", "past": "{time} fa" }, @@ -1318,6 +1342,7 @@ } }, "devices": { + "add_prompt": "Nessun {name} è stato ancora aggiunto utilizzando questo dispositivo. Puoi aggiungerne uno facendo clic sul pulsante + sopra.", "automation": { "actions": { "caption": "Quando qualcosa si attiva..." @@ -1658,7 +1683,11 @@ "topic": "argomento" }, "ozw": { + "button": "Configura", "common": { + "controller": "Controllore", + "instance": "Istanza", + "network": "Rete", "node_id": "ID del nodo", "ozw_instance": "Istanza OpenZWave", "zwave": "Z-Wave" @@ -1668,6 +1697,36 @@ "stage": "Fase", "zwave_info": "Informazioni Z-Wave" }, + "navigation": { + "network": "Rete", + "nodes": "Nodi", + "select_instance": "Seleziona istanza" + }, + "network_status": { + "details": { + "driverallnodesqueried": "Tutti i nodi sono stati interrogati.", + "driverallnodesqueriedsomedead": "Tutti i nodi sono stati interrogati. Alcuni nodi sono stati trovati morti", + "driverawakenodesqueries": "Tutti i nodi svegli sono stati interrogati", + "driverfailed": "Impossibile connettersi al controller Z-Wave", + "driverready": "Inizializzazione del controller Z-Wave", + "driverremoved": "Il driver è stato rimosso", + "driverreset": "Il driver è stato reimpostato", + "offline": "OZWDaemon non in linea", + "ready": "Pronto per la connessione", + "started": "Collegato a MQTT", + "starting": "In collegamento a MQTT", + "stopped": "OpenZWave si è fermato" + }, + "offline": "Disconnesso", + "online": "In linea", + "starting": "In avvio", + "unknown": "Sconosciuto" + }, + "network": { + "header": "Gestione della rete", + "introduction": "Gestisci le funzioni a livello di rete.", + "node_count": "{count} nodi" + }, "node_query_stages": { "associations": "Aggiornamento dell'associazione gruppi e appartenenze", "cacheload": "Caricamento delle informazioni dal file di cache di OpenZWave. I nodi a batteria rimarranno in questa fase fino a quando il nodo non si riattiva.", @@ -1698,6 +1757,14 @@ "title": "Aggiorna le informazioni sul nodo", "wakeup_header": "Istruzioni di riattivazione per", "wakeup_instructions_source": "Le istruzioni di riattivazione provengono dal database dei dispositivi della comunità di OpenZWave." + }, + "select_instance": { + "header": "Seleziona un'istanza OpenZWave", + "introduction": "Hai più di un'istanza OpenZWave in esecuzione. Quale istanza vorresti gestire?" + }, + "services": { + "add_node": "Aggiungi Nodo", + "remove_node": "Rimuovi nodo" } }, "person": { @@ -1835,6 +1902,7 @@ "person": "Ricarica le persone", "scene": "Ricarica le Scene", "script": "Ricarica gli Script", + "template": "Ricaricare le entità modello", "zone": "Ricarica le zone" }, "server_management": { @@ -1876,6 +1944,7 @@ "last_scanned": "Ultima scansione", "name": "Nome" }, + "never_scanned": "Mai scansionato", "no_tags": "Nessuna etichetta", "write": "Scrivi" }, @@ -2200,6 +2269,7 @@ "description": "Il rendering dei modelli viene eseguito utilizzando il motore di modelli Jinja2 con alcune estensioni specifiche di Home Assistant.", "editor": "Editor di modelli", "jinja_documentation": "Documentazione del modello Jinja2", + "reset": "Ripristina il modello di esempio", "template_extensions": "Estensioni del modello Home Assistant", "title": "Modelli", "unknown_error_template": "Errore sconosciuto nel rendering del modello" @@ -2281,6 +2351,10 @@ "description": "La scheda Pulsante consente di aggiungere pulsanti per eseguire attività.", "name": "Pulsante" }, + "calendar": { + "description": "La scheda Calendario mostra un calendario che include le visualizzazioni per giorno, settimana ed elenco", + "name": "Calendario" + }, "conditional": { "card": "Scheda", "change_type": "Cambia tipo", @@ -2735,6 +2809,7 @@ "intro": "Salve {name}, benvenuto su Home Assistant. Come vorresti nominare la tua casa?", "intro_location": "Vorremmo sapere dove vivete. Queste informazioni aiuteranno a visualizzare informazioni e automazioni basate sul sole. Questi dati non vengono mai condivisi al di fuori della vostra rete.", "intro_location_detect": "Possiamo aiutarti a compilare queste informazioni effettuando una richiesta una volta a un servizio esterno.", + "location_name": "Nome della tua installazione di Home Assistant", "location_name_default": "Casa" }, "integration": { diff --git a/translations/frontend/lb.json b/translations/frontend/lb.json index f3bc24879d..d93a8f7674 100644 --- a/translations/frontend/lb.json +++ b/translations/frontend/lb.json @@ -419,9 +419,16 @@ "unlock": "Entspären" }, "media_player": { + "browse_media": "Medien duerchgoen", + "media_next_track": "Nächst", + "media_play": "Spill", + "media_play_pause": "Spill/Pause", + "media_previous_track": "Viregt", "sound_mode": "Toun Modus", "source": "Quell", - "text_to_speak": "Text zu Sprooch" + "text_to_speak": "Text zu Sprooch", + "turn_off": "Ausschalten", + "turn_on": "Uschalten" }, "persistent_notification": { "dismiss": "Verwerfen" @@ -554,6 +561,22 @@ "loading_history": "Lued Status Verlaaf", "no_history_found": "Keen Status Verlaaf fonnt" }, + "media-browser": { + "choose-source": "Quell auswielen", + "content-type": { + "album": "Album", + "artist": "Artist", + "library": "Bibliothéik", + "playlist": "Ofspilllëscht", + "server": "Server" + }, + "media-player-browser": "Media Player Browser", + "no_items": "Keng Elementer", + "pick": "Auswielen", + "pick-media": "Media auswielen", + "play": "Spill", + "play-media": "Media ofspillen" + }, "picture-upload": { "label": "Bild", "unsupported_format": "Net ënnerstëtzte Format, wiel e JPEG, PNG oder GIF Bild." @@ -578,6 +601,7 @@ "week": "{count} {count, plural,\none {Woch}\nother {Wochen}\n}" }, "future": "An {time}", + "just_now": "Grad eben", "never": "Nie", "past": "virun {time}" }, @@ -1057,6 +1081,9 @@ "sunrise": "Sonnenopgank", "sunset": "Sonnenënnergank" }, + "tag": { + "label": "Tag" + }, "template": { "label": "Modell", "value_template": "Wäerte Modell" @@ -1654,7 +1681,11 @@ "topic": "Sujet" }, "ozw": { + "button": "Astellen", "common": { + "controller": "Kontroller", + "instance": "Instanz", + "network": "Netzwierk", "node_id": "Node ID", "ozw_instance": "OpenZWave Instanz", "zwave": "Z-Wave" @@ -1664,6 +1695,35 @@ "stage": "Stage", "zwave_info": "Z-Wave Info" }, + "navigation": { + "network": "Netzwierk", + "nodes": "Nodes", + "select_instance": "Instanz auswielen" + }, + "network_status": { + "details": { + "driverallnodesqueried": "All Nodes goufen ofgefrot", + "driverallnodesqueriedsomedead": "All Nodes goufen ofgefrot. Verschidde Nodes sin net méi ereechbar.", + "driverawakenodesqueries": "All waakreg Nodes goufen ofgefrot", + "driverfailed": "Feeler beim verbannen mam Z-Wave Kontroller", + "driverready": "Z-Wave Kontroller initialiséieren", + "driverremoved": "Den Driver gouf geläscht", + "driverreset": "Den Driver gouf zeréckgesat", + "offline": "OZWDaemon net ereechbar", + "ready": "Prett fir sech ze verbannen", + "started": "Mam MQTT verbonnen", + "starting": "Mam MQTT verbannen", + "stopped": "OpenZWave gestoppt" + }, + "offline": "Offline", + "online": "Online", + "starting": "Start", + "unknown": "Onbekannt" + }, + "network": { + "header": "Verwaltung vum Netzwierk", + "node_count": "{count} nodes" + }, "node_query_stages": { "associations": "Associatiounsgruppen a Memberen aktualiséieren", "cacheload": "Lued Informatioune vun der OpenZWave Cache Datei. Batterie Nodes bleiwen op dëser Etapp bis de Node erwächt.", @@ -1692,6 +1752,14 @@ "title": "Node Informatiounen aktualiséieren", "wakeup_header": "Instruktioune fir d'erwäche vun", "wakeup_instructions_source": "D'Instruktioune fir d'erwäche si vun der OpenZwave Communautéit Datebank." + }, + "select_instance": { + "header": "Eng OpenZWave Instanz auswielen", + "introduction": "Du hues méi wéi eng OpenZWave Instanz laafen. Wéieng Instanz wëlls du verwalten?" + }, + "services": { + "add_node": "Node dobäisetzen", + "remove_node": "Node läschen" } }, "person": { @@ -1846,6 +1914,25 @@ } } }, + "tags": { + "add_tag": "Tag dobäisetzen", + "caption": "Tags", + "description": "Tags verwalten", + "detail": { + "create": "Erstellen", + "create_and_write": "Erstellen a schréiwen", + "delete": "Läschen", + "description": "Beschreiwung", + "name": "Numm", + "new_tag": "Neien tag", + "tag_id": "Tag id", + "update": "Aktualiséieren" + }, + "headers": { + "last_scanned": "Läscht duerchsicht" + }, + "no_tags": "Keng Tags" + }, "users": { "add_user": { "caption": "Benotzer erstellen", @@ -2167,6 +2254,7 @@ "description": "Modeller ginn mëttels Jinja2 template engine duergestallt mat e puer Home Assistant spezifesch Erweiderungen.", "editor": "Modell Editeur", "jinja_documentation": "Jinja2 Modell Dokumentatioun", + "reset": "Op Demo Modell zeréck setzen", "template_extensions": "Home Assistant Modell Erweiderungen", "title": "Modeller", "unknown_error_template": "Onbekannte Feeler beim duerstelle vum Modell" @@ -2248,6 +2336,10 @@ "description": "Knäppchen Kaart erlaabt et Knäppchen mat Aktioune unzeweisen.", "name": "Knäppchen" }, + "calendar": { + "description": "Kalenner Kaart weist ee Kalenner mat Deeg, Wochen an Lëschten un", + "name": "Kalenner" + }, "conditional": { "card": "Kaart", "change_type": "Typ änneren", @@ -2702,6 +2794,7 @@ "intro": "Hallo {name}, wëllkomm zu Home Assistant. Wéi wëllt dir äert Doheem benennen?", "intro_location": "Mir wëlle wësse wou dir wunnt. Dës Informatioun hëlleft fir Informatiounen unzeweisen an Automatiounen anzeriichten déi op d'Sonne baséieren. Dës Donnéeë ginn nimools ausserhalb vun ärem Netzwierk gedeelt.", "intro_location_detect": "Mir kënne beim Ausfëlle vun dësen Informatiounen hëllefen andeems eng eemoleg Demande bei engem externe Service ugefrot gëtt.", + "location_name": "Numm vun denger Home Assistant Installatioun", "location_name_default": "Doheem" }, "integration": { diff --git a/translations/frontend/nb.json b/translations/frontend/nb.json index 8b549790bf..603a1a17ea 100644 --- a/translations/frontend/nb.json +++ b/translations/frontend/nb.json @@ -419,9 +419,16 @@ "unlock": "Lås opp" }, "media_player": { + "browse_media": "Bla gjennom medier", + "media_next_track": "Neste", + "media_play": "Spille", + "media_play_pause": "Spill av/pause", + "media_previous_track": "Forrige", "sound_mode": "Lydmodus", "source": "Kilde", - "text_to_speak": "Tekst til tale" + "text_to_speak": "Tekst til tale", + "turn_off": "Slå av", + "turn_on": "Slå på" }, "persistent_notification": { "dismiss": "Avvis" @@ -554,6 +561,22 @@ "loading_history": "Laster statushistorikk...", "no_history_found": "Ingen statushistorikk funnet." }, + "media-browser": { + "choose-source": "Velg kilde", + "content-type": { + "album": "Album", + "artist": "Artist", + "library": "Bibliotek", + "playlist": "Spilleliste", + "server": "Server" + }, + "media-player-browser": "Nettleser for Mediespiller", + "no_items": "Ingen elementer", + "pick": "Velg", + "pick-media": "Velg Media", + "play": "Spille", + "play-media": "Spill media" + }, "picture-upload": { "label": "Bilde", "unsupported_format": "Formatet støttes ikke, vennligst velge et JPEG-, PNG- eller GIF-bilde." @@ -578,6 +601,7 @@ "week": "{count} {count, plural,\n one {uke}\n other {uker}\n}" }, "future": "om {time}", + "just_now": "Akkurat nå", "never": "Aldri", "past": "{time} siden" }, @@ -1318,6 +1342,7 @@ } }, "devices": { + "add_prompt": "Ingen {navn} er lagt til ved hjelp av denne enheten ennå. Du kan legge til en ved å klikke på + knappen ovenfor.", "automation": { "actions": { "caption": "Når noe er utløst..." @@ -1658,7 +1683,11 @@ "topic": "emne" }, "ozw": { + "button": "Konfigurer", "common": { + "controller": "Kontroller", + "instance": "Forekomst", + "network": "Nettverk", "node_id": "Node-ID", "ozw_instance": "OpenZWave Instance", "zwave": "Z-Wave" @@ -1668,6 +1697,36 @@ "stage": "Scene", "zwave_info": "Z-Wave Info" }, + "navigation": { + "network": "Nettverk", + "nodes": "Noder", + "select_instance": "Velg Forekomst" + }, + "network_status": { + "details": { + "driverallnodesqueried": "Alle noder har blitt spurt", + "driverallnodesqueriedsomedead": "Alle noder har blitt spurt. Noen noder ble funnet døde", + "driverawakenodesqueries": "Alle våkne noder har blitt spurt", + "driverfailed": "Kunne ikke koble til Z-Wave-kontrolleren", + "driverready": "Initialiserer Z-Wave-kontrolleren", + "driverremoved": "Driveren er blitt fjernet", + "driverreset": "Driveren har blitt tilbakestilt", + "offline": "OZWDaemon frakoblet", + "ready": "Klar til å koble til", + "started": "Koblet til MQTT", + "starting": "Koble til MQTT", + "stopped": "OpenZWave stoppet" + }, + "offline": "Frakoblet", + "online": "Online", + "starting": "Starter", + "unknown": "Ukjent" + }, + "network": { + "header": "Nettverksadministrasjon", + "introduction": "Administrer funksjoner for hele nettverket.", + "node_count": "{count} noder" + }, "node_query_stages": { "associations": "Oppdatere tilknytningsgrupper og medlemskap", "cacheload": "Laste inn informasjon fra Cachefilen for OpenZWave. Batterinoder vil bli på dette stadiet til noden våkner.", @@ -1698,6 +1757,14 @@ "title": "Oppdater nodeinformasjon", "wakeup_header": "Wakeup Instruksjoner for", "wakeup_instructions_source": "Wakeup-instruksjoner hentes fra OpenZWave-fellesskapets enhetsdatabase." + }, + "select_instance": { + "header": "Velg en OpenZWave-forekomst", + "introduction": "Du har mer enn én OpenZWave-forekomst som kjører. Hvilken forekomst vil du administrere?" + }, + "services": { + "add_node": "Legg til node", + "remove_node": "Fjern node" } }, "person": { @@ -1835,6 +1902,7 @@ "person": "Last inn personer på nytt", "scene": "Last inn scener på nytt", "script": "Last inn skript på nytt", + "template": "Laste inn malenheter på nytt", "zone": "Last inn soner på nytt" }, "server_management": { @@ -1876,6 +1944,7 @@ "last_scanned": "Sist skannet", "name": "Navn" }, + "never_scanned": "Aldri skannet", "no_tags": "Ingen tagger", "write": "Skrive" }, @@ -2200,6 +2269,7 @@ "description": "Maler blir rendret ved hjelp av Jinja2-malmotoren med noen spesifikke utvidelser for Home Assistant.", "editor": "Maleditor", "jinja_documentation": "Jinja2 mal dokumentasjon", + "reset": "Tilbakestill til demomal", "template_extensions": "Mal utvidelser for Home Assistant", "title": "Mal", "unknown_error_template": "Ukjent feil ved rendring av mal" @@ -2281,6 +2351,10 @@ "description": "The Button card lar deg legge til knapper for å utføre oppgaver.", "name": "Knapp" }, + "calendar": { + "description": "Kalenderkortet viser en kalender som inkluderer dag, uke og listevisninger", + "name": "Kalender" + }, "conditional": { "card": "Kort", "change_type": "Endre type", @@ -2735,6 +2809,7 @@ "intro": "Hei {name}, velkommen til Home Assistant. Hva ønsker du å kalle hjemmet ditt?", "intro_location": "Vi vil gjerne vite hvor du bor. Denne informasjonen vil bidra til å vise informasjon og sette opp automasjon basert på solen. Dette deles ikke ut av nettet ditt.", "intro_location_detect": "Vi kan hjelpe deg med å fylle ut denne informasjonen ved å gjøre en engangsforespørsel til en ekstern tjeneste.", + "location_name": "Navn på installasjonen av Home Assistant", "location_name_default": "Hjem" }, "integration": { diff --git a/translations/frontend/pl.json b/translations/frontend/pl.json index 9e8fee8fe5..6a09a5955a 100644 --- a/translations/frontend/pl.json +++ b/translations/frontend/pl.json @@ -419,9 +419,16 @@ "unlock": "Odblokuj" }, "media_player": { + "browse_media": "Przeglądaj media", + "media_next_track": "Następny", + "media_play": "Odtwarzaj", + "media_play_pause": "Odtwarzaj/pauza", + "media_previous_track": "Poprzedni", "sound_mode": "Tryb dźwięku", "source": "Źródło", - "text_to_speak": "Zamień tekst na mowę" + "text_to_speak": "Zamień tekst na mowę", + "turn_off": "Wyłącz", + "turn_on": "Włącz" }, "persistent_notification": { "dismiss": "Odrzuć" @@ -554,6 +561,22 @@ "loading_history": "Ładowanie historii...", "no_history_found": "Nie znaleziono historii." }, + "media-browser": { + "choose-source": "Wybierz źródło", + "content-type": { + "album": "Album", + "artist": "Artysta", + "library": "Biblioteka", + "playlist": "Lista odtwarzania", + "server": "Serwer" + }, + "media-player-browser": "Przeglądarka odtwarzacza mediów", + "no_items": "Brak elementów", + "pick": "Wybierz", + "pick-media": "Wybierz media", + "play": "Odtwarzaj", + "play-media": "Odtwarzaj media" + }, "picture-upload": { "label": "Obraz", "unsupported_format": "Nieobsługiwany format, wybierz obraz JPEG, PNG lub GIF." @@ -578,6 +601,7 @@ "week": "{count} {count, plural,\n one {tydzień}\n few {tygodnie}\n many {tygodni}\n other {tygodni}\n}" }, "future": "Za {time}", + "just_now": "Właśnie teraz", "never": "Nigdy", "past": "{time} temu" }, @@ -1057,6 +1081,9 @@ "sunrise": "wschód słońca", "sunset": "zachód słońca" }, + "tag": { + "label": "Tag" + }, "template": { "label": "Szablon", "value_template": "Szablon wartości" @@ -1315,6 +1342,7 @@ } }, "devices": { + "add_prompt": "Żadne {name} nie zostały jeszcze dodane przy użyciu tego urządzenia. Możesz je dodać, klikając przycisk + powyżej.", "automation": { "actions": { "caption": "Wykonaj akcje..." @@ -1334,6 +1362,7 @@ "caption": "Urządzenia", "confirm_delete": "Czy na pewno chcesz usunąć to urządzenie?", "confirm_rename_entity_ids": "Czy chcesz także zmienić identyfikatory encji?", + "confirm_rename_entity_ids_warning": "Nie zmieni to żadnej konfiguracji (jak automatyzacje, skrypty, sceny, Lovelace), która obecnie używa tych encji, będziesz musiał je zaktualizować samodzielnie.", "data_table": { "area": "Obszar", "battery": "Bateria", @@ -1654,7 +1683,11 @@ "topic": "temat" }, "ozw": { + "button": "Konfiguruj", "common": { + "controller": "Kontroler", + "instance": "Instancja", + "network": "Sieć", "node_id": "Identyfikator węzła", "ozw_instance": "Instancja OpenZWave", "zwave": "Z-Wave" @@ -1664,6 +1697,36 @@ "stage": "Etap", "zwave_info": "Informacje Z-Wave" }, + "navigation": { + "network": "Sieć", + "nodes": "Węzły", + "select_instance": "Wybierz instancję" + }, + "network_status": { + "details": { + "driverallnodesqueried": "Wszystkie węzły zostały odpytane", + "driverallnodesqueriedsomedead": "Wszystkie węzły zostały odpytane. Niektóre węzły zostały znalezione martwe.", + "driverawakenodesqueries": "Wszystkie wybudzone węzły zostały odpytane", + "driverfailed": "Nie udało się połączyć z kontrolerem Z-Wave", + "driverready": "Inicjalizacja kontrolera Z-Wave", + "driverremoved": "Sterownik został usunięty", + "driverreset": "Sterownik został zresetowany", + "offline": "OZWDaemon jest offline", + "ready": "Gotowy do połączenia", + "started": "Połączono z MQTT", + "starting": "Łączenie się z MQTT", + "stopped": "OpenZWave zatrzymany" + }, + "offline": "Offline", + "online": "Online", + "starting": "Uruchamianie", + "unknown": "Nieznany" + }, + "network": { + "header": "Zarządzanie siecią", + "introduction": "Zarządzaj funkcjami w całej sieci.", + "node_count": "{count} węzłów" + }, "node_query_stages": { "associations": "Odświeżanie grup skojarzeń i członkostwa", "cacheload": "Ładowanie informacji z pliku pamięci podręcznej OpenZWave. Węzły baterii pozostaną na tym etapie, dopóki węzeł się nie wybudzi.", @@ -1694,6 +1757,14 @@ "title": "Odświeżanie informacji o węźle", "wakeup_header": "Instrukcje budzenia dla", "wakeup_instructions_source": "Instrukcje budzenia pochodzą z bazy danych urządzeń społeczności OpenZWave." + }, + "select_instance": { + "header": "Wybierz instancję OpenZWave", + "introduction": "Masz uruchomionych więcej niż jedną instancję OpenZWave. Którą instancją chcesz zarządzać?" + }, + "services": { + "add_node": "Dodaj węzeł", + "remove_node": "Usuń węzeł" } }, "person": { @@ -1831,6 +1902,7 @@ "person": "Osoby", "scene": "Sceny", "script": "Skrypty", + "template": "Szablony encji", "zone": "Strefy" }, "server_management": { @@ -1850,6 +1922,32 @@ } } }, + "tags": { + "add_tag": "Dodaj tag", + "automation_title": "Tag {name} jest skanowany", + "caption": "Tagi", + "create_automation": "Utwórz automatyzację z tagiem", + "description": "Zarządzaj tagami", + "detail": { + "create": "Stwórz", + "create_and_write": "Stwórz i zapisz", + "delete": "Usuń", + "description": "Opis", + "name": "Nazwa", + "new_tag": "Nowy tag", + "tag_id": "Identyfikator tagu", + "tag_id_placeholder": "Generowany automatycznie, gdy pole pozostawione puste", + "update": "Aktualizuj" + }, + "edit": "Edytuj", + "headers": { + "last_scanned": "Ostatnie skanowanie", + "name": "Nazwa" + }, + "never_scanned": "Nigdy nie zeskanowany", + "no_tags": "Brak tagów", + "write": "Zapisz" + }, "users": { "add_user": { "caption": "Dodaj użytkownika", @@ -2171,6 +2269,7 @@ "description": "Szablony są renderowane przy użyciu silnika szablonów Jinja2 z kilkoma specyficznymi rozszerzeniami Home Assistanta.", "editor": "Edytor szablonów", "jinja_documentation": "Dokumentacja szablonów Jinja2", + "reset": "Zresetuj do szablonu demonstracyjnego", "template_extensions": "Rozszerzenia szablonów Home Assistanta", "title": "Szablon", "unknown_error_template": "Nieznany błąd podczas renderowania szablonu." @@ -2252,6 +2351,10 @@ "description": "Karta przycisku umożliwia dodawanie przycisków do wykonywania zadań.", "name": "Przycisk" }, + "calendar": { + "description": "Karta kalendarza wyświetla kalendarz zawierający widoki dnia, tygodnia i listy", + "name": "Kalendarz" + }, "conditional": { "card": "Karta", "change_type": "Zmień typ", @@ -2706,6 +2809,7 @@ "intro": "{name}, witamy w Home Assistant. Jak chcesz nazwać swój dom?", "intro_location": "Chcielibyśmy wiedzieć, gdzie mieszkasz. Te dane pomogą w wyświetlaniu informacji i konfigurowaniu automatyki opartej na położeniu słońca. Te dane nigdy nie będą udostępniane poza Twoją sieć lokalną.", "intro_location_detect": "Możemy pomóc Ci wprowadzić te informacje, wysyłając jednorazowe zapytanie do usługi zewnętrznej.", + "location_name": "Nazwa instalacji Home Assistanta", "location_name_default": "Dom" }, "integration": { diff --git a/translations/frontend/ru.json b/translations/frontend/ru.json index 7f25c55495..cfce9ae72d 100644 --- a/translations/frontend/ru.json +++ b/translations/frontend/ru.json @@ -419,9 +419,16 @@ "unlock": "Открыть" }, "media_player": { + "browse_media": "Просмотр медиа", + "media_next_track": "Следующий", + "media_play": "Воспроизведение", + "media_play_pause": "Воспроизведение / пауза", + "media_previous_track": "Предыдущий", "sound_mode": "Режим звука", "source": "Источник", - "text_to_speak": "Воспроизвести текст" + "text_to_speak": "Воспроизвести текст", + "turn_off": "Выключить", + "turn_on": "Включить" }, "persistent_notification": { "dismiss": "Закрыть" @@ -554,6 +561,22 @@ "loading_history": "Загрузка истории...", "no_history_found": "История не найдена." }, + "media-browser": { + "choose-source": "Выбрать источник", + "content-type": { + "album": "Альбом", + "artist": "Исполнитель", + "library": "Библиотека", + "playlist": "Плейлист", + "server": "Сервер" + }, + "media-player-browser": "Браузер медиаплеера", + "no_items": "Нет элементов", + "pick": "Выбрать", + "pick-media": "Выбрать Медиа", + "play": "Воспроизведение", + "play-media": "Воспроизведение Медиа" + }, "picture-upload": { "label": "Изображение", "unsupported_format": "Неподдерживаемый формат. Выберите изображение в формате JPEG, PNG или GIF." @@ -578,6 +601,7 @@ "week": "{count} {count, plural,\none {нед.}\nother {нед.}\n}" }, "future": "через {time}", + "just_now": "Сейчас", "never": "Никогда", "past": "{time} назад" }, @@ -1354,7 +1378,7 @@ "device_not_found": "Устройство не найдено", "entities": { "add_entities_lovelace": "Добавить объекты в Lovelace UI", - "disabled_entities": "+{count} {count, plural,\n one {скрытый объект}\n other {скрытых объектов}\n}", + "disabled_entities": "Показать {count} {count, plural,\n one {скрытый объект}\n other {скрытых объектов}\n}", "entities": "Объекты", "hide_disabled": "Не показывать скрытые", "none": "У этого устройства нет объектов" @@ -1658,7 +1682,11 @@ "topic": "Топик" }, "ozw": { + "button": "Настройки", "common": { + "controller": "Контроллер", + "instance": "Экземпляр", + "network": "Сеть", "node_id": "ID узла", "ozw_instance": "Экземпляр OpenZWave", "zwave": "Z-Wave" @@ -1668,6 +1696,36 @@ "stage": "Этап", "zwave_info": "Информация о Z-Wave" }, + "navigation": { + "network": "Сеть", + "nodes": "Узлы", + "select_instance": "Выбор экземпляра" + }, + "network_status": { + "details": { + "driverallnodesqueried": "Все узлы опрошены", + "driverallnodesqueriedsomedead": "Все узлы опрошены. В сети обнаружены мертвые узлы", + "driverawakenodesqueries": "Все активные узлы опрошены", + "driverfailed": "Не удалось подключиться к контроллеру Z-Wave", + "driverready": "Инициализация контроллера Z-Wave", + "driverremoved": "Драйвер удален", + "driverreset": "Драйвер сброшен", + "offline": "OZWDaemon не в сети", + "ready": "Готов к подключению", + "started": "Подключен к MQTT", + "starting": "Подключение к MQTT", + "stopped": "OpenZWave остановлен" + }, + "offline": "Не в сети", + "online": "В сети", + "starting": "Запускается", + "unknown": "Неизвестно" + }, + "network": { + "header": "Управление сетью", + "introduction": "Управление сетевыми функциями.", + "node_count": "{count} узлов" + }, "node_query_stages": { "associations": "Обновление ассоциативных групп и членства", "cacheload": "Загрузка информации из кеш-файла OpenZWave. Узлы батареи останутся на этом этапе, пока узел не проснется.", @@ -1698,6 +1756,14 @@ "title": "Обновить информацию об узле", "wakeup_header": "Инструкции по пробуждению для", "wakeup_instructions_source": "Инструкции по пробуждению взяты из базы данных устройств сообщества OpenZWave." + }, + "select_instance": { + "header": "Выберите экземпляр OpenZWave", + "introduction": "У Вас работает более одного экземпляра OpenZWave. Каким экземпляром Вы хотите управлять?" + }, + "services": { + "add_node": "Добавить узел", + "remove_node": "Удалить узел" } }, "person": { @@ -1835,6 +1901,7 @@ "person": "Перезагрузить персоны", "scene": "Перезагрузить сцены", "script": "Перезагрузить сценарии", + "template": "Перезагрузить шаблоны", "zone": "Перезагрузить зоны" }, "server_management": { @@ -1876,6 +1943,7 @@ "last_scanned": "Последнее считывание", "name": "Название" }, + "never_scanned": "Сканирование ещё не выполнялось", "no_tags": "Нет меток", "write": "Записать" }, @@ -2200,6 +2268,7 @@ "description": "Здесь Вы можете протестировать поведение шаблонов. В Home Assistant используется шаблонизатор Jinja2 с некоторыми специальными расширениями.", "editor": "Редактор шаблонов", "jinja_documentation": "Узнайте больше о шаблонизаторе Jinja2", + "reset": "Вернуться к демонстрационному шаблону", "template_extensions": "Узнайте больше о шаблонах Home Assistant", "title": "Шаблоны", "unknown_error_template": "Неизвестная ошибка при визуализации шаблона." @@ -2281,6 +2350,10 @@ "description": "Позволяет добавлять кнопки для выполнения каких-либо задач.", "name": "Кнопка" }, + "calendar": { + "description": "Отображает календарь, включая день, неделю и списки задач.", + "name": "Календарь" + }, "conditional": { "card": "Карточка", "change_type": "Изменить тип", @@ -2735,6 +2808,7 @@ "intro": "Добро пожаловать, {name}! Как Вы хотите назвать свой Home Assistant?", "intro_location": "Мы хотели бы знать, где Вы живете. Это поможет нам правильно отображать информацию и позволит Вам настраивать автоматизацию на основе данных о рассвете и закате. Эти данные никогда не будут переданы за пределы Вашей локальной сети.", "intro_location_detect": "Мы можем помочь Вам заполнить эту информацию, сделав однократный запрос во внешнюю службу.", + "location_name": "Название для Вашего Home Assistant", "location_name_default": "Home Assistant" }, "integration": { diff --git a/translations/frontend/sv.json b/translations/frontend/sv.json index b69e34e610..a3febec4fa 100644 --- a/translations/frontend/sv.json +++ b/translations/frontend/sv.json @@ -419,9 +419,16 @@ "unlock": "Lås upp" }, "media_player": { + "browse_media": "Bläddra bland media", + "media_next_track": "Nästa", + "media_play": "Spela", + "media_play_pause": "Spela/pausa", + "media_previous_track": "Föregående", "sound_mode": "Ljudläge", "source": "Källa", - "text_to_speak": "Text till tal" + "text_to_speak": "Text till tal", + "turn_off": "Stäng av", + "turn_on": "Sätt på" }, "persistent_notification": { "dismiss": "Avfärda" @@ -554,6 +561,26 @@ "loading_history": "Laddar historik...", "no_history_found": "Ingen historik hittad." }, + "media-browser": { + "choose-source": "Välj källa", + "content-type": { + "album": "Album", + "artist": "Artist", + "library": "Bibliotek", + "playlist": "Spellista", + "server": "Server" + }, + "media-player-browser": "Bläddrare för mediaspelare", + "no_items": "Inga objekt", + "pick": "Välj", + "pick-media": "Välj media", + "play": "Spela", + "play-media": "Spela media" + }, + "picture-upload": { + "label": "Bild", + "unsupported_format": "Formated stöds inte, vänligen välj en JPEG, PNG eller GIF-bild." + }, "related-items": { "area": "Område", "automation": "Del av följande automatiseringar", @@ -574,6 +601,7 @@ "week": "{count} {count, plural,\none {vecka}\nother {veckor}\n}" }, "future": "{time} sedan", + "just_now": "Nyss", "never": "Aldrig", "past": "{time} sedan" }, @@ -656,6 +684,9 @@ "required_error_msg": "Det här fältet krävs", "yaml_not_editable": "Inställningar för denna entitet kan inte ändras från användargränssnittet. Enbart entiteter uppsatta från användargränssnittet är konfigurerbara från användargränssnittet." }, + "image_cropper": { + "crop": "Beskär" + }, "more_info_control": { "dismiss": "Avfärda", "edit": "Redigera entitet", @@ -1050,6 +1081,9 @@ "sunrise": "Soluppgång", "sunset": "Solnedgång" }, + "tag": { + "label": "Etikett" + }, "template": { "label": "Mall", "value_template": "Värdemall" @@ -1656,6 +1690,30 @@ "node_failed": "Noden misslyckades", "stage": "Steg", "zwave_info": "Z-Wave info" + }, + "network": { + "header": "Nätverkshantering" + }, + "node_query_stages": { + "configuration": "Hämtar konfigurationsvärden från noden", + "dynamic": "Hämtar värden som ofta ändras från noden", + "neighbors": "Hämtar en lista av nodens grannar", + "nodeplusinfo": "Hämtar Z-Wave+-information från noden", + "session": "Hämtar värden som sällan ändras från noden", + "static": "Hämtar statiska värden från enheten" + }, + "refresh_node": { + "complete": "Uppdatering av noden klar", + "node_status": "Nodstatus", + "refreshing_description": "Uppdaterar information om noderna...", + "step": "Steg", + "title": "Uppdatera information om noderna", + "wakeup_header": "Väckningsinstruktioner för", + "wakeup_instructions_source": "Väckningsinstruktioner hämtas från OpenZWave community-databasen." + }, + "services": { + "add_node": "Lägg till nod", + "remove_node": "Ta bort nod" } }, "person": { @@ -1793,6 +1851,7 @@ "person": "Ladda om personer", "scene": "Ladda om scenarier", "script": "Ladda om skript", + "template": "Ladda om mallar för entiteter", "zone": "Ladda om zoner" }, "server_management": { @@ -1812,6 +1871,26 @@ } } }, + "tags": { + "add_tag": "Lägg till etikett", + "caption": "Etiketter", + "description": "Hantera etiketter", + "detail": { + "create": "Skapa", + "create_and_write": "Skapa och redigera", + "delete": "Ta bort", + "description": "Beskrivning", + "tag_id": "Etikett-ID", + "tag_id_placeholder": "Autogenereras när det lämnas tomt", + "update": "Uppdatera" + }, + "headers": { + "last_scanned": "Senast skannad" + }, + "never_scanned": "Aldrig skannad", + "no_tags": "Inga etiketter", + "write": "Redigera" + }, "users": { "add_user": { "caption": "Lägg till användare", @@ -2133,6 +2212,7 @@ "description": "Mallar tolkas med hjälp av Jinja2 template engine med vissa Home Assistant-specifika tillägg.", "editor": "Mallredigerare", "jinja_documentation": "Malldokumentation för Jinja2", + "reset": "Återställ till demomall", "template_extensions": "Mallutökningar för Home Assistant", "title": "Mallar", "unknown_error_template": "Okänt fel vid rendering av mall" @@ -2214,6 +2294,10 @@ "description": "Knappkortet låter dig lägga till knappar för att utföra uppgifter.", "name": "Knapp" }, + "calendar": { + "description": "Kalenderkortet visar en kalender med dag-, vecka- och listvyer", + "name": "Kalender" + }, "conditional": { "card": "Kort", "change_type": "Ändra typ", @@ -2668,6 +2752,7 @@ "intro": "Hej {name}, välkommen till Home Assistant. Hur skulle du vilja namnge ditt hem?", "intro_location": "Vi skulle vilja veta var du bor. Den här informationen hjälper dig att visa information och ställa in solbaserade automatiseringar. Dessa data delas aldrig utanför nätverket.", "intro_location_detect": "Vi kan hjälpa dig att fylla i denna information genom att göra en engångsförfrågan till en extern tjänst.", + "location_name": "Namn på din Home Assistant-installation", "location_name_default": "Hem" }, "integration": { diff --git a/translations/frontend/zh-Hans.json b/translations/frontend/zh-Hans.json index cccea64731..6ead2a37ff 100644 --- a/translations/frontend/zh-Hans.json +++ b/translations/frontend/zh-Hans.json @@ -419,9 +419,16 @@ "unlock": "解锁" }, "media_player": { + "browse_media": "浏览媒体", + "media_next_track": "下一曲", + "media_play": "播放", + "media_play_pause": "播放/暂停", + "media_previous_track": "上一曲", "sound_mode": "声音模式", "source": "信号源", - "text_to_speak": "要朗读的文本" + "text_to_speak": "要朗读的文本", + "turn_off": "关闭", + "turn_on": "打开" }, "persistent_notification": { "dismiss": "忽略" @@ -554,6 +561,22 @@ "loading_history": "正在加载历史状态...", "no_history_found": "没有找到历史状态。" }, + "media-browser": { + "choose-source": "选择媒体源", + "content-type": { + "album": "专辑", + "artist": "艺术家", + "library": "媒体库", + "playlist": "播放列表", + "server": "服务器" + }, + "media-player-browser": "媒体播放浏览器", + "no_items": "没有项目", + "pick": "选定", + "pick-media": "选定媒体", + "play": "播放", + "play-media": "播放媒体" + }, "picture-upload": { "label": "图片", "unsupported_format": "格式不受支持,请选择 JPEG、PNG 或 GIF 图像。" @@ -578,6 +601,7 @@ "week": "{count} {count, plural,\n one {周}\n other {周}\n}" }, "future": "{time}后", + "just_now": "刚刚", "never": "从未", "past": "{time}前" }, @@ -899,7 +923,7 @@ "wait_template": "等待模板" } }, - "unsupported_action": "不支持的操作: {action}" + "unsupported_action": "图形界面暂不支持操作:{action}" }, "alias": "名称", "conditions": { @@ -965,7 +989,7 @@ "zone": "地点" } }, - "unsupported_condition": "不支持的环境条件:{condition}" + "unsupported_condition": "图形界面暂不支持环境条件:{condition}" }, "default_name": "新建自动化", "description": { @@ -1057,6 +1081,9 @@ "sunrise": "日出", "sunset": "日落" }, + "tag": { + "label": "标签" + }, "template": { "label": "自定义模板", "value_template": "自定义值" @@ -1084,7 +1111,7 @@ "zone": "地点" } }, - "unsupported_platform": "不支持的平台:{platform}" + "unsupported_platform": "图形界面暂不支持平台:{platform}" }, "unsaved_confirm": "有更改尚未保存,确定离开页面吗?" }, @@ -1315,6 +1342,7 @@ } }, "devices": { + "add_prompt": "尚未使用此设备添加任何{name}。您可以点击上方的 + 按钮来添加。", "automation": { "actions": { "caption": "满足条件时执行:" @@ -1334,6 +1362,7 @@ "caption": "设备", "confirm_delete": "您确定要删除此设备吗?", "confirm_rename_entity_ids": "是否要重命名实体的实体 ID?", + "confirm_rename_entity_ids_warning": "此操作不会改变正在使用这些实体的配置(如自动化、脚本、场景、Lovelace),您必须手动更新它们。", "data_table": { "area": "区域", "battery": "电量", @@ -1654,7 +1683,11 @@ "topic": "主题(Topic)" }, "ozw": { + "button": "配置", "common": { + "controller": "控制器", + "instance": "实例", + "network": "网络", "node_id": "节点 ID", "ozw_instance": "OpenZWave 实例", "zwave": "Z-Wave" @@ -1664,6 +1697,36 @@ "stage": "阶段", "zwave_info": "Z-Wave 信息" }, + "navigation": { + "network": "网络", + "nodes": "节点", + "select_instance": "选择实例" + }, + "network_status": { + "details": { + "driverallnodesqueried": "已查询所有节点", + "driverallnodesqueriedsomedead": "已查询所有节点。发现部分节点断开", + "driverawakenodesqueries": "已查询所有唤醒节点", + "driverfailed": "无法连接到 Z-Wave 控制器", + "driverready": "正在初始化 Z-Wave 控制器", + "driverremoved": "驱动程序已被删除", + "driverreset": "驱动程序已重置", + "offline": "OZWDaemon 离线", + "ready": "准备就绪,可以连接", + "started": "已连接到 MQTT", + "starting": "正在连接 MQTT", + "stopped": "OpenZWave 已停止" + }, + "offline": "离线", + "online": "在线", + "starting": "正在启动", + "unknown": "未知" + }, + "network": { + "header": "网络管理", + "introduction": "管理网络功能。", + "node_count": "{count} 个节点" + }, "node_query_stages": { "associations": "正在刷新关联组和成员", "cacheload": "正在从 OpenZWave 缓存文件加载信息。电池供电的节点将停留在此阶段,直到节点唤醒。", @@ -1694,6 +1757,14 @@ "title": "刷新节点信息", "wakeup_header": "唤醒方法:", "wakeup_instructions_source": "唤醒方法来自 OpenZWave 社区设备数据库。" + }, + "select_instance": { + "header": "选择一个 OpenZWave 实例", + "introduction": "您正在运行多个 OpenZWave 实例。您要管理哪个实例?" + }, + "services": { + "add_node": "添加节点", + "remove_node": "删除节点" } }, "person": { @@ -1831,6 +1902,7 @@ "person": "重载人员", "scene": "重载场景", "script": "重载脚本", + "template": "重载模板实体", "zone": "重载地点" }, "server_management": { @@ -1850,6 +1922,32 @@ } } }, + "tags": { + "add_tag": "添加标签", + "automation_title": "扫描到标签 {name}", + "caption": "标签", + "create_automation": "通过标签创建自动化", + "description": "管理标签", + "detail": { + "create": "创建", + "create_and_write": "创建并写入", + "delete": "删除", + "description": "描述", + "name": "名称", + "new_tag": "新建标签", + "tag_id": "标签 ID", + "tag_id_placeholder": "留空则自动生成", + "update": "更新" + }, + "edit": "编辑", + "headers": { + "last_scanned": "上次扫描", + "name": "名称" + }, + "never_scanned": "从未扫描", + "no_tags": "没有标签", + "write": "写入" + }, "users": { "add_user": { "caption": "添加用户", @@ -2171,6 +2269,7 @@ "description": "模板使用 jinja2 模板引擎和一些 Home Assistant 特定的插件进行渲染。", "editor": "模板编辑器", "jinja_documentation": "Jinja2 模板文档", + "reset": "重置为演示模板", "template_extensions": "Home Assistant 模板插件", "title": "模板", "unknown_error_template": "渲染模板时发生了未知错误" @@ -2252,6 +2351,10 @@ "description": "“按钮”卡片用于添加按钮来执行任务。", "name": "按钮" }, + "calendar": { + "description": "“日历”卡片显示一个日历,其包括日视图、周视图和列表视图。", + "name": "日历" + }, "conditional": { "card": "卡片", "change_type": "更改类型", @@ -2706,6 +2809,7 @@ "intro": "{name},您好!欢迎来到 Home Assistant。您想怎样命名您的家呢?", "intro_location": "我们想知道您住在哪里。这将用于显示资讯以及设置基于太阳的自动化。此数据永远不会在您的网络以外共享。", "intro_location_detect": "我们可以通过向外部服务发出一个一次性请求来帮助您填写此信息。", + "location_name": "Home Assistant 安装的名称", "location_name_default": "我的家" }, "integration": { From 493af5fe821e221d3368a118faab75cf70729efb Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 25 Aug 2020 21:33:29 -0500 Subject: [PATCH 078/300] Add rest/command_line/filter/statistics to the list of reloadables (#6705) * Add rest and command_line to the list of reloadables * Update src/translations/en.json * Add the latest ones --- .../config/server_control/ha-config-server-control.ts | 4 ++++ src/translations/en.json | 6 +++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/panels/config/server_control/ha-config-server-control.ts b/src/panels/config/server_control/ha-config-server-control.ts index 22ef7646eb..f5e3f13ac0 100644 --- a/src/panels/config/server_control/ha-config-server-control.ts +++ b/src/panels/config/server_control/ha-config-server-control.ts @@ -37,6 +37,10 @@ const reloadableDomains = [ "input_select", "template", "universal", + "rest", + "command_line", + "filter", + "statistics", ]; @customElement("ha-config-server-control") diff --git a/src/translations/en.json b/src/translations/en.json index e5c4952fb1..e228ccb712 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -839,7 +839,11 @@ "input_datetime": "Reload input date times", "input_select": "Reload input selects", "template": "Reload template entities", - "universal": "Reload universal media player entities" + "universal": "Reload universal media player entities", + "rest": "Reload rest entities", + "command_line": "Reload command line entities", + "filter": "Reload filter entities", + "statistics": "Reload statistics entities" }, "server_management": { "heading": "Server management", From 7702a05464a252c310052257d4559300ca89cbd6 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 26 Aug 2020 11:13:29 +0200 Subject: [PATCH 079/300] Filter attributes in more info light (#6707) --- .../more-info/controls/more-info-light.ts | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/src/dialogs/more-info/controls/more-info-light.ts b/src/dialogs/more-info/controls/more-info-light.ts index 3abab21a99..6b0bba5572 100644 --- a/src/dialogs/more-info/controls/more-info-light.ts +++ b/src/dialogs/more-info/controls/more-info-light.ts @@ -5,29 +5,27 @@ import { CSSResult, customElement, html, + internalProperty, LitElement, property, - TemplateResult, - internalProperty, PropertyValues, + TemplateResult, } from "lit-element"; import { classMap } from "lit-html/directives/class-map"; - -import { - SUPPORT_BRIGHTNESS, - SUPPORT_COLOR_TEMP, - SUPPORT_WHITE_VALUE, - SUPPORT_COLOR, - SUPPORT_EFFECT, -} from "../../../data/light"; import { supportsFeature } from "../../../common/entity/supports-feature"; -import type { HomeAssistant, LightEntity } from "../../../types"; - import "../../../components/ha-attributes"; import "../../../components/ha-color-picker"; -import "../../../components/ha-labeled-slider"; import "../../../components/ha-icon-button"; +import "../../../components/ha-labeled-slider"; import "../../../components/ha-paper-dropdown-menu"; +import { + SUPPORT_BRIGHTNESS, + SUPPORT_COLOR, + SUPPORT_COLOR_TEMP, + SUPPORT_EFFECT, + SUPPORT_WHITE_VALUE, +} from "../../../data/light"; +import type { HomeAssistant, LightEntity } from "../../../types"; interface HueSatColor { h: number; @@ -149,7 +147,7 @@ class MoreInfoLight extends LitElement { : ""}
    `; From b644f7d23d6469ae80b7efd9447cd3f9e18e9031 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 26 Aug 2020 12:38:48 +0200 Subject: [PATCH 080/300] Theme tweaks (#6701) --- src/components/ha-code-editor.ts | 4 +-- src/panels/lovelace/entity-rows/types.ts | 2 +- .../lovelace/special-rows/hui-divider-row.ts | 28 +++++++++---------- .../lovelace/special-rows/hui-section-row.ts | 4 +-- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/components/ha-code-editor.ts b/src/components/ha-code-editor.ts index d4d74adef5..452e75dffd 100644 --- a/src/components/ha-code-editor.ts +++ b/src/components/ha-code-editor.ts @@ -1,8 +1,8 @@ import { Editor } from "codemirror"; import { customElement, - property, internalProperty, + property, PropertyValues, UpdatingElement, } from "lit-element"; @@ -123,7 +123,7 @@ export class HaCodeEditor extends UpdatingElement { transition: 0.2s ease border-right; } .cm-s-default.CodeMirror { - background-color: var(--card-background-color); + background-color: var(--code-editor-background-color, var(--card-background-color)); color: var(--primary-text-color); } .cm-s-default .CodeMirror-cursor { diff --git a/src/panels/lovelace/entity-rows/types.ts b/src/panels/lovelace/entity-rows/types.ts index 4b674a9d6f..03c162fb2f 100644 --- a/src/panels/lovelace/entity-rows/types.ts +++ b/src/panels/lovelace/entity-rows/types.ts @@ -17,7 +17,7 @@ export interface EntityFilterEntityConfig extends EntityConfig { } export interface DividerConfig { type: "divider"; - style: string; + style: { [key: string]: string }; } export interface SectionConfig { type: "section"; diff --git a/src/panels/lovelace/special-rows/hui-divider-row.ts b/src/panels/lovelace/special-rows/hui-divider-row.ts index 40a3d25061..9949fa53d1 100644 --- a/src/panels/lovelace/special-rows/hui-divider-row.ts +++ b/src/panels/lovelace/special-rows/hui-divider-row.ts @@ -1,10 +1,13 @@ import { + css, + CSSResult, customElement, html, - LitElement, internalProperty, + LitElement, TemplateResult, } from "lit-element"; +import { styleMap } from "lit-html/directives/style-map"; import { HomeAssistant } from "../../../types"; import { DividerConfig, LovelaceRow } from "../entity-rows/types"; @@ -19,13 +22,7 @@ class HuiDividerRow extends LitElement implements LovelaceRow { throw new Error("Error in card configuration."); } - this._config = { - style: { - height: "1px", - "background-color": "var(--divider-color)", - }, - ...config, - }; + this._config = config; } protected render(): TemplateResult { @@ -33,13 +30,16 @@ class HuiDividerRow extends LitElement implements LovelaceRow { return html``; } - const el = document.createElement("div"); + return html`
    `; + } - Object.keys(this._config.style).forEach((prop) => { - el.style.setProperty(prop, this._config!.style[prop]); - }); - - return html` ${el} `; + static get styles(): CSSResult { + return css` + div { + height: 1px; + background-color: var(--entities-divider-color, var(--divider-color)); + } + `; } } diff --git a/src/panels/lovelace/special-rows/hui-section-row.ts b/src/panels/lovelace/special-rows/hui-section-row.ts index 1f23264560..3b94b40944 100644 --- a/src/panels/lovelace/special-rows/hui-section-row.ts +++ b/src/panels/lovelace/special-rows/hui-section-row.ts @@ -3,8 +3,8 @@ import { CSSResult, customElement, html, - LitElement, internalProperty, + LitElement, TemplateResult, } from "lit-element"; import "../../../components/ha-icon"; @@ -48,7 +48,7 @@ class HuiSectionRow extends LitElement implements LovelaceRow { } .divider { height: 1px; - background-color: var(--divider-color); + background-color: var(--entities-divider-color, var(--divider-color)); margin-left: -16px; margin-right: -16px; margin-top: 8px; From 35a430e9f41b8035608c0f09d2f6942630c6d013 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Wed, 26 Aug 2020 15:27:19 +0200 Subject: [PATCH 081/300] Add watchdog toggle (#6703) --- .../src/addon-view/info/hassio-addon-info.ts | 30 +++++++++++++++++++ src/data/hassio/addon.ts | 2 ++ 2 files changed, 32 insertions(+) diff --git a/hassio/src/addon-view/info/hassio-addon-info.ts b/hassio/src/addon-view/info/hassio-addon-info.ts index 0be5862955..c14ea9d475 100644 --- a/hassio/src/addon-view/info/hassio-addon-info.ts +++ b/hassio/src/addon-view/info/hassio-addon-info.ts @@ -394,6 +394,18 @@ class HassioAddonInfo extends LitElement { haptic >
    + ${this.hass.userData?.showAdvanced + ? html` +
    +
    Watchdog
    + +
    + ` + : ""} ${this.addon.auto_update || this.hass.userData?.showAdvanced ? html`
    @@ -771,6 +783,24 @@ class HassioAddonInfo extends LitElement { } } + private async _watchdogToggled(): Promise { + this._error = undefined; + const data: HassioAddonSetOptionParams = { + watchdog: !this.addon.watchdog, + }; + try { + await setHassioAddonOption(this.hass, this.addon.slug, data); + const eventdata = { + success: true, + response: undefined, + path: "option", + }; + fireEvent(this, "hass-api-called", eventdata); + } catch (err) { + this._error = `Failed to set addon option, ${err.body?.message || err}`; + } + } + private async _autoUpdateToggled(): Promise { this._error = undefined; const data: HassioAddonSetOptionParams = { diff --git a/src/data/hassio/addon.ts b/src/data/hassio/addon.ts index a6c20faf54..baa2e95f29 100644 --- a/src/data/hassio/addon.ts +++ b/src/data/hassio/addon.ts @@ -72,6 +72,7 @@ export interface HassioAddonDetails extends HassioAddonInfo { ingress_panel: boolean; ingress_entry: null | string; ingress_url: null | string; + watchdog: null | boolean; } export interface HassioAddonsInfo { @@ -99,6 +100,7 @@ export interface HassioAddonSetOptionParams { auto_update?: boolean; ingress_panel?: boolean; network?: object | null; + watchdog?: boolean; } export const reloadHassioAddons = async (hass: HomeAssistant) => { From 3e6a759309159bdd80dd38649f62e552e12c092c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Wed, 26 Aug 2020 15:53:25 +0200 Subject: [PATCH 082/300] Changes to add-on options (#6706) --- .../src/addon-view/info/hassio-addon-info.ts | 432 +++++++++--------- hassio/src/system/hassio-host-info.ts | 2 +- hassio/src/system/hassio-supervisor-info.ts | 2 +- 3 files changed, 230 insertions(+), 206 deletions(-) diff --git a/hassio/src/addon-view/info/hassio-addon-info.ts b/hassio/src/addon-view/info/hassio-addon-info.ts index c14ea9d475..a7b3796909 100644 --- a/hassio/src/addon-view/info/hassio-addon-info.ts +++ b/hassio/src/addon-view/info/hassio-addon-info.ts @@ -9,7 +9,6 @@ import { mdiExclamationThick, mdiFlask, mdiHomeAssistant, - mdiInformation, mdiKey, mdiNetwork, mdiPound, @@ -53,6 +52,7 @@ import { HomeAssistant } from "../../../../src/types"; import "../../components/hassio-card-content"; import { showHassioMarkdownDialog } from "../../dialogs/markdown/show-dialog-hassio-markdown"; import { hassioStyle } from "../../resources/hassio-style"; +import "../../../../src/components/ha-settings-row"; const STAGE_ICON = { stable: mdiCheckCircle, @@ -386,79 +386,94 @@ class HassioAddonInfo extends LitElement { ${this.addon.version ? html` -
    -
    Start on boot
    - -
    - ${this.hass.userData?.showAdvanced - ? html` -
    -
    Watchdog
    - -
    - ` - : ""} - ${this.addon.auto_update || this.hass.userData?.showAdvanced - ? html` -
    -
    Auto update
    - -
    - ` - : ""} - ${this.addon.ingress - ? html` -
    -
    Show in sidebar
    - - ${this._computeCannotIngressSidebar - ? html` - - This option requires Home Assistant 0.92 or - later. - - ` - : ""} -
    - ` - : ""} - ${this._computeUsesProtectedOptions - ? html` -
    -
    - Protection mode - - - - Grant the add-on elevated system access. - +
    + + + Start on boot + + + Make the add-on start during a system boot + + + + + ${this.hass.userData?.showAdvanced + ? html` + + + Watchdog -
    - -
    - ` - : ""} + + This will start the add-on if it crashes + + + + ` + : ""} + ${this.addon.auto_update || this.hass.userData?.showAdvanced + ? html` + + + Auto update + + + Auto update the add-on when there is a new version + available + + + + ` + : ""} + ${this.addon.ingress + ? html` + + + Show in sidebar + + + ${this._computeCannotIngressSidebar + ? "This option requires Home Assistant 0.92 or later." + : "Add this add-on to your sidebar"} + + + + ` + : ""} + ${this._computeUsesProtectedOptions + ? html` + + + Protection mode + + + Blocks elevated system access from the add-on + + + + ` + : ""} +
    ` : ""} ${this._error ? html`
    ${this._error}
    ` : ""} @@ -564,137 +579,6 @@ class HassioAddonInfo extends LitElement { `; } - static get styles(): CSSResult[] { - return [ - haStyle, - hassioStyle, - css` - :host { - display: block; - } - ha-card { - display: block; - margin-bottom: 16px; - } - ha-card.warning { - background-color: var(--error-color); - color: white; - } - ha-card.warning .card-header { - color: white; - } - ha-card.warning .card-content { - color: white; - } - ha-card.warning mwc-button { - --mdc-theme-primary: white !important; - } - .warning { - color: var(--error-color); - --mdc-theme-primary: var(--error-color); - } - .light-color { - color: var(--secondary-text-color); - } - .addon-header { - padding-left: 8px; - font-size: 24px; - color: var(--ha-card-header-color, --primary-text-color); - } - .addon-version { - float: right; - font-size: 15px; - vertical-align: middle; - } - .errors { - color: var(--error-color); - margin-bottom: 16px; - } - .description { - margin-bottom: 16px; - } - img.logo { - max-height: 60px; - margin: 16px 0; - display: block; - } - .state { - display: flex; - margin: 33px 0; - } - .state div { - width: 180px; - display: inline-block; - } - .state ha-svg-icon { - width: 16px; - height: 16px; - color: var(--secondary-text-color); - } - ha-switch { - display: flex; - } - ha-svg-icon.running { - color: var(--paper-green-400); - } - ha-svg-icon.stopped { - color: var(--google-red-300); - } - ha-call-api-button { - font-weight: 500; - color: var(--primary-color); - } - .right { - float: right; - } - protection-enable mwc-button { - --mdc-theme-primary: white; - } - .description a { - color: var(--primary-color); - } - .red { - --ha-label-badge-color: var(--label-badge-red, #df4c1e); - } - .blue { - --ha-label-badge-color: var(--label-badge-blue, #039be5); - } - .green { - --ha-label-badge-color: var(--label-badge-green, #0da035); - } - .yellow { - --ha-label-badge-color: var(--label-badge-yellow, #f4b400); - } - .security { - margin-bottom: 16px; - } - .card-actions { - display: flow-root; - } - .security h3 { - margin-bottom: 8px; - font-weight: normal; - } - .security ha-label-badge { - cursor: pointer; - margin-right: 4px; - --ha-label-badge-padding: 8px 0 0 0; - } - .changelog { - display: contents; - } - .changelog-link { - color: var(--primary-color); - text-decoration: underline; - cursor: pointer; - } - ha-markdown { - padding: 16px; - } - `, - ]; - } - private get _computeHassioApi(): boolean { return ( this.addon.hassio_api && @@ -917,6 +801,146 @@ class HassioAddonInfo extends LitElement { this._error = `Failed to uninstall addon, ${err.body?.message || err}`; } } + + static get styles(): CSSResult[] { + return [ + haStyle, + hassioStyle, + css` + :host { + display: block; + } + ha-card { + display: block; + margin-bottom: 16px; + } + ha-card.warning { + background-color: var(--error-color); + color: white; + } + ha-card.warning .card-header { + color: white; + } + ha-card.warning .card-content { + color: white; + } + ha-card.warning mwc-button { + --mdc-theme-primary: white !important; + } + .warning { + color: var(--error-color); + --mdc-theme-primary: var(--error-color); + } + .light-color { + color: var(--secondary-text-color); + } + .addon-header { + padding-left: 8px; + font-size: 24px; + color: var(--ha-card-header-color, --primary-text-color); + } + .addon-version { + float: right; + font-size: 15px; + vertical-align: middle; + } + .errors { + color: var(--error-color); + margin-bottom: 16px; + } + .description { + margin-bottom: 16px; + } + img.logo { + max-height: 60px; + margin: 16px 0; + display: block; + } + + ha-switch { + display: flex; + } + ha-svg-icon.running { + color: var(--paper-green-400); + } + ha-svg-icon.stopped { + color: var(--google-red-300); + } + ha-call-api-button { + font-weight: 500; + color: var(--primary-color); + } + .right { + float: right; + } + protection-enable mwc-button { + --mdc-theme-primary: white; + } + .description a { + color: var(--primary-color); + } + .red { + --ha-label-badge-color: var(--label-badge-red, #df4c1e); + } + .blue { + --ha-label-badge-color: var(--label-badge-blue, #039be5); + } + .green { + --ha-label-badge-color: var(--label-badge-green, #0da035); + } + .yellow { + --ha-label-badge-color: var(--label-badge-yellow, #f4b400); + } + .security { + margin-bottom: 16px; + } + .card-actions { + display: flow-root; + } + .security h3 { + margin-bottom: 8px; + font-weight: normal; + } + .security ha-label-badge { + cursor: pointer; + margin-right: 4px; + --ha-label-badge-padding: 8px 0 0 0; + } + .changelog { + display: contents; + } + .changelog-link { + color: var(--primary-color); + text-decoration: underline; + cursor: pointer; + } + ha-markdown { + padding: 16px; + } + ha-settings-row { + padding: 0; + height: 54px; + width: 100%; + } + ha-settings-row > span[slot="description"] { + white-space: normal; + color: var(--secondary-text-color); + } + ha-settings-row[three-line] { + height: 74px; + } + + .addon-options { + max-width: 50%; + } + @media (max-width: 720px) { + .addon-options { + max-width: 100%; + } + } + `, + ]; + } } declare global { interface HTMLElementTagNameMap { diff --git a/hassio/src/system/hassio-host-info.ts b/hassio/src/system/hassio-host-info.ts index 544e896adc..b8bd35fca5 100644 --- a/hassio/src/system/hassio-host-info.ts +++ b/hassio/src/system/hassio-host-info.ts @@ -206,7 +206,7 @@ class HassioHostInfo extends LitElement { ha-settings-row[three-line] { height: 74px; } - ha-settings-row[three-line] > div { + ha-settings-row > span[slot="description"] { white-space: normal; color: var(--secondary-text-color); } diff --git a/hassio/src/system/hassio-supervisor-info.ts b/hassio/src/system/hassio-supervisor-info.ts index 4ad09acde9..6213c829ba 100644 --- a/hassio/src/system/hassio-supervisor-info.ts +++ b/hassio/src/system/hassio-supervisor-info.ts @@ -173,7 +173,7 @@ class HassioSupervisorInfo extends LitElement { ha-settings-row[three-line] { height: 74px; } - ha-settings-row[three-line] > div { + ha-settings-row > span[slot="description"] { white-space: normal; color: var(--secondary-text-color); } From 240374370125622614d9c06d52e4319f60ff4f84 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 26 Aug 2020 17:34:00 +0200 Subject: [PATCH 083/300] Fix more info media player dropdowns (#6712) --- .../more-info/controls/more-info-media_player.ts | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/dialogs/more-info/controls/more-info-media_player.ts b/src/dialogs/more-info/controls/more-info-media_player.ts index 0bdcc97fd8..0e7a445c0b 100644 --- a/src/dialogs/more-info/controls/more-info-media_player.ts +++ b/src/dialogs/more-info/controls/more-info-media_player.ts @@ -174,7 +174,7 @@ class MoreInfoMediaPlayer extends LitElement { > ${stateObj.attributes.sound_mode_list.map( (mode) => html` - ${mode} + ${mode} ` )} @@ -352,21 +352,27 @@ class MoreInfoMediaPlayer extends LitElement { } private _handleSourceChanged(e: CustomEvent) { - const newVal = e.detail.value; + const newVal = e.detail.item.itemName; - if (!newVal || this.stateObj!.attributes.source === newVal) return; + if (!newVal || this.stateObj!.attributes.source === newVal) { + return; + } this.hass.callService("media_player", "select_source", { + entity_id: this.stateObj!.entity_id, source: newVal, }); } private _handleSoundModeChanged(e: CustomEvent) { - const newVal = e.detail.value; + const newVal = e.detail.item.itemName; - if (!newVal || this.stateObj?.attributes.sound_mode === newVal) return; + if (!newVal || this.stateObj?.attributes.sound_mode === newVal) { + return; + } this.hass.callService("media_player", "select_sound_mode", { + entity_id: this.stateObj!.entity_id, sound_mode: newVal, }); } From 90f12eea5e9bd93504bc7c7e8d8a63e82535d391 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Wed, 26 Aug 2020 17:41:02 +0200 Subject: [PATCH 084/300] Limit changing network to systems that have that support (#6711) --- hassio/src/system/hassio-host-info.ts | 35 +++++++++++++++------------ 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/hassio/src/system/hassio-host-info.ts b/hassio/src/system/hassio-host-info.ts index b8bd35fca5..38ea35fa21 100644 --- a/hassio/src/system/hassio-host-info.ts +++ b/hassio/src/system/hassio-host-info.ts @@ -59,7 +59,9 @@ class HassioHostInfo extends LitElement { @internalProperty() public _networkInfo?: NetworkInfo; public render(): TemplateResult | void { - const primaryIpAddress = this._primaryIpAddress(this._networkInfo!); + const primaryIpAddress = this.hostInfo.features.includes("network") + ? this._primaryIpAddress(this._networkInfo!) + : ""; return html`
    @@ -79,20 +81,23 @@ class HassioHostInfo extends LitElement { ` : ""} - - - IP address - - - ${primaryIpAddress} - - - - + ${this.hostInfo.features.includes("network") + ? html` + + IP address + + + ${primaryIpAddress} + + + + ` + : ""} + Operating system From 51132220507381da78621fda3079e2e556ccd6ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Wed, 26 Aug 2020 18:08:21 +0200 Subject: [PATCH 085/300] Adds ha-bar component (#6708) * Adds ha-bar component * Move calculate logic to util * Add test * Prove overshot with test * Remove stuff * remove unused styles * commit correct file * remove root style * Move to CSS * html -> svg --- src/components/ha-bar.ts | 67 +++++++++++++++++++++++++++++++ src/components/ha-gauge.ts | 14 +------ src/util/calculate.ts | 23 +++++++++++ test-mocha/util/calculate.spec.ts | 25 ++++++++++++ 4 files changed, 117 insertions(+), 12 deletions(-) create mode 100644 src/components/ha-bar.ts create mode 100644 src/util/calculate.ts create mode 100644 test-mocha/util/calculate.spec.ts diff --git a/src/components/ha-bar.ts b/src/components/ha-bar.ts new file mode 100644 index 0000000000..b9d160bf13 --- /dev/null +++ b/src/components/ha-bar.ts @@ -0,0 +1,67 @@ +import { + css, + CSSResult, + customElement, + LitElement, + property, + svg, + TemplateResult, +} from "lit-element"; + +import { + getValueInPercentage, + normalize, + roundWithOneDecimal, +} from "../util/calculate"; + +@customElement("ha-bar") +export class HaBar extends LitElement { + @property({ type: Number }) public min = 0; + + @property({ type: Number }) public max = 100; + + @property({ type: Number }) public value!: number; + + protected render(): TemplateResult { + const valuePrecentage = roundWithOneDecimal( + getValueInPercentage( + normalize(this.value, this.min, this.max), + this.min, + this.max + ) + ); + + return svg` + + + + + + + `; + } + + static get styles(): CSSResult { + return css` + rect:first-child { + width: 100%; + fill: var(--ha-bar-background-color, var(--secondary-background-color)); + } + rect:last-child { + fill: var(--ha-bar-primary-color, var(--primary-color)); + rx: var(--ha-bar-border-radius, 4px); + } + svg { + border-radius: var(--ha-bar-border-radius, 4px); + height: 12px; + width: 100%; + } + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + "ha-bar": HaBar; + } +} diff --git a/src/components/ha-gauge.ts b/src/components/ha-gauge.ts index 6cb3391f2e..5e1adbf351 100644 --- a/src/components/ha-gauge.ts +++ b/src/components/ha-gauge.ts @@ -11,23 +11,13 @@ import { styleMap } from "lit-html/directives/style-map"; import { afterNextRender } from "../common/util/render-status"; import { ifDefined } from "lit-html/directives/if-defined"; +import { getValueInPercentage, normalize } from "../util/calculate"; + const getAngle = (value: number, min: number, max: number) => { const percentage = getValueInPercentage(normalize(value, min, max), min, max); return (percentage * 180) / 100; }; -const normalize = (value: number, min: number, max: number) => { - if (value > max) return max; - if (value < min) return min; - return value; -}; - -const getValueInPercentage = (value: number, min: number, max: number) => { - const newMax = max - min; - const newVal = value - min; - return (100 * newVal) / newMax; -}; - // Workaround for https://github.com/home-assistant/frontend/issues/6467 const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); diff --git a/src/util/calculate.ts b/src/util/calculate.ts new file mode 100644 index 0000000000..b6a1add005 --- /dev/null +++ b/src/util/calculate.ts @@ -0,0 +1,23 @@ +export const normalize = (value: number, min: number, max: number): number => { + if (isNaN(value) || isNaN(min) || isNaN(max)) { + // Not a number, return 0 + return 0; + } + if (value > max) return max; + if (value < min) return min; + return value; +}; + +export const getValueInPercentage = ( + value: number, + min: number, + max: number +): number => { + const newMax = max - min; + const newVal = value - min; + return (100 * newVal) / newMax; +}; + +export const roundWithOneDecimal = (value: number): number => { + return Math.round(value * 10) / 10; +}; diff --git a/test-mocha/util/calculate.spec.ts b/test-mocha/util/calculate.spec.ts new file mode 100644 index 0000000000..8470e27828 --- /dev/null +++ b/test-mocha/util/calculate.spec.ts @@ -0,0 +1,25 @@ +import * as assert from "assert"; +import { + getValueInPercentage, + normalize, + roundWithOneDecimal, +} from "../../src/util/calculate"; + +describe("Calculate tests", function () { + it("Test getValueInPercentage", function () { + assert.equal(getValueInPercentage(10, 0, 100), 10); + assert.equal(getValueInPercentage(120, 0, 100), 120); + assert.equal(getValueInPercentage(-10, 0, 100), -10); + assert.equal(getValueInPercentage(10.33333, 0, 100), 10.33333); + }); + it("Test normalize", function () { + assert.equal(normalize(10, 0, 100), 10); + assert.equal(normalize(1, 10, 100), 10); + assert.equal(normalize(100, 0, 10), 10); + }); + it("Test roundWithOneDecimal", function () { + assert.equal(roundWithOneDecimal(10), 10); + assert.equal(roundWithOneDecimal(10.3), 10.3); + assert.equal(roundWithOneDecimal(10.3333), 10.3); + }); +}); From c1a4b27bc7fc68dfb4af6b382238c010340e7912 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Wed, 26 Aug 2020 18:13:22 +0200 Subject: [PATCH 086/300] Adds confirmation dialog to updates (#6709) --- hassio/src/dashboard/hassio-update.ts | 47 +++++++++++++++++---------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/hassio/src/dashboard/hassio-update.ts b/hassio/src/dashboard/hassio-update.ts index 2fee6b61dc..d23fba6c97 100644 --- a/hassio/src/dashboard/hassio-update.ts +++ b/hassio/src/dashboard/hassio-update.ts @@ -21,6 +21,11 @@ import { import { haStyle } from "../../../src/resources/styles"; import { HomeAssistant } from "../../../src/types"; import { hassioStyle } from "../resources/hassio-style"; +import { + showConfirmationDialog, + showAlertDialog, +} from "../../../src/dialogs/generic/show-dialog-box"; +import { HassioResponse } from "../../../src/data/hassio/common"; @customElement("hassio-update") export class HassioUpdate extends LitElement { @@ -126,30 +131,38 @@ export class HassioUpdate extends LitElement { Release notes - - Update - +
    `; } - private _apiCalled(ev): void { - if (ev.detail.success) { - this._error = ""; + private async _confirmUpdate(ev): Promise { + const item = ev.target; + const confirmed = await showConfirmationDialog(this, { + title: `Update ${item.name}`, + text: `Are you sure you want to upgrade ${item.name} to version ${item.version}?`, + confirmText: "update", + dismissText: "cancel", + }); + + if (!confirmed) { return; } - - const response = ev.detail.response; - - if (typeof response.body === "object") { - this._error = response.body.message || "Unknown error"; - } else { - this._error = response.body; + try { + await this.hass.callApi>("POST", item.apiPath); + } catch (err) { + showAlertDialog(this, { + title: "Update failed", + text: + typeof err === "object" ? err.body?.message || "Unkown error" : err, + }); } } From 6cd51a318ba6a9d0254bfe724a636f8125e203b9 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Thu, 27 Aug 2020 00:32:23 +0000 Subject: [PATCH 087/300] [ci skip] Translation update --- translations/frontend/ca.json | 14 +- translations/frontend/cs.json | 31 +- translations/frontend/en.json | 4 + translations/frontend/es-419.json | 11 +- translations/frontend/es.json | 4 + translations/frontend/et.json | 4 - translations/frontend/fy.json | 2 - translations/frontend/ja.json | 592 +++++++++++++++++++++++++++-- translations/frontend/nb.json | 93 +---- translations/frontend/nl.json | 4 +- translations/frontend/pl.json | 10 +- translations/frontend/pt-BR.json | 3 - translations/frontend/pt.json | 12 +- translations/frontend/ru.json | 7 +- translations/frontend/sv.json | 39 +- translations/frontend/zh-Hans.json | 4 + translations/frontend/zh-Hant.json | 81 +++- 17 files changed, 764 insertions(+), 151 deletions(-) diff --git a/translations/frontend/ca.json b/translations/frontend/ca.json index 569a01e4d4..462c8f5c15 100644 --- a/translations/frontend/ca.json +++ b/translations/frontend/ca.json @@ -1024,7 +1024,7 @@ "delete_confirm": "Segur que vols eliminar-ho?", "duplicate": "Duplica", "header": "Disparadors", - "introduction": "Els activadors són les regles que fan que es dispari una automatització. Pots definir més d'un activador per a cada automatització. Una vegada s'iniciï un activador, el Home Assistant validarà les condicions (si n'hi ha) i finalment cridarà l'acció.", + "introduction": "Els activadors són les regles que fan que es dispari una automatització. Pots definir més d'un activador per a cada automatització. Una vegada s'iniciï un activador, Home Assistant validarà les condicions (si n'hi ha) i finalment cridarà l'acció.", "learn_more": "Més informació sobre els activadors", "name": "Disparador", "type_select": "Tipus de disparador", @@ -1124,7 +1124,7 @@ "headers": { "name": "Nom" }, - "introduction": "L'editor d'automatitzacions et permet crear i editar automatitzacions. Vés a l'enllaç de sota per veure'n les instruccions i assegurar-te que has configurat el Home Assistant correctament.", + "introduction": "L'editor d'automatitzacions et permet crear i editar automatitzacions. 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 les automatitzacions", "no_automations": "No s'ha pogut trobar cap automatització editable", "only_editable": "Només es poden editar les automatitzacions definides dins l'arxiu automations.yaml.", @@ -1525,8 +1525,11 @@ "no_device": "Entitats sense dispositius", "no_devices": "Aquesta integració no té dispositius.", "options": "Opcions", + "reload": "Torna a carregar", + "reload_confirm": "La integració s'ha tornar a carregar", + "reload_restart_confirm": "Reinicia Home Assistant per acabar de carregar aquesta integració", "rename": "Canvia el nom", - "restart_confirm": "Reinicia el Home Assistant per acabar d'eliminar aquesta integració", + "restart_confirm": "Reinicia Home Assistant per acabar d'eliminar aquesta integració", "settings_button": "Edita la configuració de {integration}", "system_options": "Opcions de sistema", "system_options_button": "Opcions de sistema de {integration}", @@ -1830,7 +1833,7 @@ "headers": { "name": "Nom" }, - "introduction": "L'editor d'escenes et permet crear i editar escenes. Vés a l'enllaç de sota per veure'n les instruccions i assegurar-te que has configurat el Home Assistant correctament.", + "introduction": "L'editor d'escenes et permet crear i editar escenes. 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 les escenes", "no_scenes": "No s'ha pogut trobar cap escena editable", "only_editable": "Només es poden editar les escenes definides dins l'arxiu scenes.yaml.", @@ -1877,7 +1880,7 @@ "headers": { "name": "Nom" }, - "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 el Home Assistant correctament.", + "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", "show_info": "Mostra informació sobre l'script", @@ -1903,6 +1906,7 @@ "scene": "Actualitza escenes", "script": "Actualitza programes", "template": "Torna a carregar entitats de plantilla", + "universal": "Torna a carregar entitats del reproductor universal", "zone": "Actualitza zones" }, "server_management": { diff --git a/translations/frontend/cs.json b/translations/frontend/cs.json index f6a106206b..797186bebd 100644 --- a/translations/frontend/cs.json +++ b/translations/frontend/cs.json @@ -1524,6 +1524,8 @@ "no_device": "Entity bez zařízení", "no_devices": "Tato integrace nemá žádná zařízení.", "options": "Možnosti", + "reload_confirm": "Integrace byla obnovena", + "reload_restart_confirm": "Restartujte Home Assistant pro obnovení této integrace", "rename": "Přejmenovat", "restart_confirm": "Restartujte Home Assistant pro odstranění této integrace", "settings_button": "Upravit nastavení pro {integration}", @@ -1684,6 +1686,7 @@ "ozw": { "button": "Konfigurovat", "common": { + "controller": "Ovladač", "instance": "Instance", "network": "Síť", "node_id": "ID uzlu", @@ -1691,7 +1694,8 @@ "zwave": "Z-Wave" }, "device_info": { - "node_failed": "Uzel selhal" + "node_failed": "Uzel selhal", + "zwave_info": "Informace o Z-Wave" }, "navigation": { "network": "Síť", @@ -1700,6 +1704,11 @@ }, "network_status": { "details": { + "driverallnodesqueried": "Všechny uzly byly zkontaktovány", + "driverallnodesqueriedsomedead": "Všechny uzly byly zkontaktovány. Některé uzly byly nalezeny mrtvé", + "driverawakenodesqueries": "Všechny probuzené uzly byly zkontaktovány", + "driverfailed": "Nepodařilo se připojit k ovladači Z-Wave", + "driverready": "Inicializuji ovladač Z-Wave", "driverremoved": "Ovladač byl odstraněn", "driverreset": "Ovladač byl resetován", "offline": "OZWDaemon je offline", @@ -1710,6 +1719,7 @@ }, "offline": "Offline", "online": "Online", + "starting": "Spouštění", "unknown": "Nezjištěno" }, "network": { @@ -1719,17 +1729,32 @@ "node_query_stages": { "configuration": "Získávám konfiguraci z uzlu", "dynamic": "Získávám často se měnící hodnoty z uzlu", + "instances": "Získávám podrobnosti o tom, jaké instance nebo kanály zařízení podporuje", + "manufacturerspecific1": "Získávám z uzlu kody výrobce a produktů", + "manufacturerspecific2": "Získávám z uzlu další kódy výrobce a produktů", "neighbors": "Získávám seznam sousedů uzlu", + "nodeinfo": "Získávám z uzlu podporované typy příkazů", "nodeplusinfo": "Získávám informace o Z-Wave + z uzlu", + "probe": "Kontroluji, zda je uzel probuzený/živý", + "protocolinfo": "Získávám z ovladače Z-Wave základní schopnosti tohoto uzlu", "session": "Získávám zřídka se měnící hodnoty z uzlu", - "static": "Získávám statické hodnoty ze zařízení" + "static": "Získávám statické hodnoty ze zařízení", + "versions": "Získávám informace o verzích firmwaru a typech příkazů", + "wakeup": "Nastavuji podporu pro probouzecí fronty a zprávy" }, "refresh_node": { + "battery_note": "Pokud je uzel napájen z baterie, nezapomeňte jej probudit, než budete pokračovat", "complete": "Obnova uzlu dokončena", "node_status": "Stav uzlu", "refreshing_description": "Aktualizuji informací o uzlu...", + "start_refresh_button": "Spustit Obnovení", "step": "Krok", - "title": "Aktualizovat informace o uzlu" + "title": "Aktualizovat informace o uzlu", + "wakeup_header": "Pokyny pro probuzení pro" + }, + "select_instance": { + "header": "Vyberte instanci OpenZWave", + "introduction": "Máte více než jednu instanci OpenZWave. Kterou instanci chcete spravovat?" }, "services": { "add_node": "Přidat uzel", diff --git a/translations/frontend/en.json b/translations/frontend/en.json index 5c8b76d73a..44aa3512db 100644 --- a/translations/frontend/en.json +++ b/translations/frontend/en.json @@ -1893,7 +1893,9 @@ "section": { "reloading": { "automation": "Reload automations", + "command_line": "Reload command line entities", "core": "Reload location & customizations", + "filter": "Reload filter entities", "group": "Reload groups", "heading": "YAML configuration reloading", "input_boolean": "Reload input booleans", @@ -1903,8 +1905,10 @@ "input_text": "Reload input texts", "introduction": "Some parts of Home Assistant can reload without requiring a restart. Hitting reload will unload their current YAML configuration and load the new one.", "person": "Reload persons", + "rest": "Reload rest entities", "scene": "Reload scenes", "script": "Reload scripts", + "statistics": "Reload statistics entities", "template": "Reload template entities", "universal": "Reload universal media player entities", "zone": "Reload zones" diff --git a/translations/frontend/es-419.json b/translations/frontend/es-419.json index ced016f2a1..62e01af2d6 100644 --- a/translations/frontend/es-419.json +++ b/translations/frontend/es-419.json @@ -13,15 +13,9 @@ }, "panel": { "calendar": "Calendario", - "config": "", "developer_tools": "Herramientas para desarrolladores", - "history": "", - "logbook": "", - "mailbox": "", - "map": "", "profile": "Perfil", - "shopping_list": "Lista de compras", - "states": "" + "shopping_list": "Lista de compras" }, "state_attributes": { "climate": { @@ -1000,7 +994,6 @@ "start": "Inicio" }, "mqtt": { - "label": "", "payload": "Payload (opcional)", "topic": "Topic" }, @@ -1616,7 +1609,6 @@ "start_listening": "Comenzar a escuchar", "stop_listening": "Deja de escuchar", "subscribe_to": "Tema para suscribirse", - "title": "", "topic": "tema" }, "person": { @@ -1947,7 +1939,6 @@ }, "zwave": { "button": "Configurar", - "caption": "", "common": { "index": "Índice", "instance": "Instancia", diff --git a/translations/frontend/es.json b/translations/frontend/es.json index 7292cf1cbc..b5b48395e2 100644 --- a/translations/frontend/es.json +++ b/translations/frontend/es.json @@ -1525,6 +1525,9 @@ "no_device": "Entidades sin dispositivos", "no_devices": "Esta integración no tiene dispositivos.", "options": "Opciones", + "reload": "Recargar", + "reload_confirm": "La integración se ha recargado", + "reload_restart_confirm": "Reinicia Home Assistant para terminar de recargar esta integración", "rename": "Renombrar", "restart_confirm": "Reinicia Home Assistant para terminar de eliminar esta integración.", "settings_button": "Editar configuración para {integration}", @@ -1903,6 +1906,7 @@ "scene": "Recargar escenas", "script": "Recargar scripts", "template": "Recargar entidades de plantilla", + "universal": "Recargar entidades de reproductor multimedia universal", "zone": "Recargar zonas" }, "server_management": { diff --git a/translations/frontend/et.json b/translations/frontend/et.json index 51e3f2f620..4b3c342d9b 100644 --- a/translations/frontend/et.json +++ b/translations/frontend/et.json @@ -923,10 +923,6 @@ "at": "Kell", "label": "Aeg" }, - "webhook": { - "label": "", - "webhook_id": "" - }, "zone": { "enter": "Sisenemine", "entity": "Asukohaga olem", diff --git a/translations/frontend/fy.json b/translations/frontend/fy.json index 918eb995c3..1f8841d202 100644 --- a/translations/frontend/fy.json +++ b/translations/frontend/fy.json @@ -195,10 +195,8 @@ }, "triggers": { "add": "Trigger tafoegje", - "header": "", "type": { "homeassistant": { - "label": "", "shutdown": "Ofslúte", "start": "Opstarte" }, diff --git a/translations/frontend/ja.json b/translations/frontend/ja.json index 0438a1bf5b..d1f17d3c64 100644 --- a/translations/frontend/ja.json +++ b/translations/frontend/ja.json @@ -26,6 +26,19 @@ "away": "外出", "home": "在宅" } + }, + "humidifier": { + "mode": { + "auto": "自動", + "away": "外出", + "baby": "赤ちゃん", + "boost": "ブースト", + "comfort": "快適さ", + "eco": "エコ", + "home": "ホーム", + "normal": "通常", + "sleep": "睡眠" + } } }, "state_badge": { @@ -219,6 +232,10 @@ "off": "オフ", "on": "オン" }, + "vacuum": { + "off": "オフ", + "on": "オン" + }, "weather": { "clear-night": "晴れた夜", "cloudy": "曇り", @@ -281,6 +298,12 @@ "fan": { "speed": "風速" }, + "humidifier": { + "humidity": "目標湿度", + "mode": "モード", + "on_entity": "{名前} オン", + "target_humidity_entity": "目標湿度" + }, "light": { "brightness": "明るさ", "color_temperature": "色温度" @@ -290,7 +313,14 @@ "unlock": "ロック解除" }, "media_player": { - "text_to_speak": "音声合成" + "browse_media": "メディアを参照する", + "media_next_track": "次", + "media_play": "再生", + "media_play_pause": "再生/一時停止", + "media_previous_track": "前", + "text_to_speak": "音声合成", + "turn_off": "終了する", + "turn_on": "オンにする" }, "persistent_notification": { "dismiss": "消去" @@ -299,6 +329,8 @@ "activate": "有効化" }, "script": { + "cancel": "キャンセル", + "cancel_multiple": "キャンセル", "execute": "実行" }, "service": { @@ -340,10 +372,18 @@ } }, "common": { + "and": "そして", + "back": "戻る", "cancel": "キャンセル", "delete": "削除", + "error_required": "必須", "loading": "読込中", + "menu": "メニュー", + "next": "次", "no": "いいえ", + "overflow_menu": "オーバーフローメニュー", + "previous": "前", + "refresh": "更新", "successfully_deleted": "正常に削除されました", "undo": "元に戻す", "yes": "はい" @@ -362,9 +402,19 @@ "clear": "消去", "show_areas": "エリアを表示" }, + "data-table": { + "no-data": "データなし", + "search": "検索" + }, + "date-range-picker": { + "end_date": "終了日", + "select": "選択", + "start_date": "開始日" + }, "device-picker": { "clear": "削除", "device": "デバイス", + "no_area": "エリアなし", "show_devices": "デバイスを表示", "toggle": "切り替え" }, @@ -379,6 +429,26 @@ "loading_history": "状態履歴を読込中...", "no_history_found": "状態履歴がありません。" }, + "media-browser": { + "choose-source": "ソースを選択", + "content-type": { + "album": "アルバム", + "artist": "アーティスト", + "library": "ライブラリ", + "playlist": "プレイリスト", + "server": "サーバー" + }, + "media-player-browser": "メディアプレーヤーブラウザ", + "no_items": "アイテムなし", + "pick": "選択", + "pick-media": "メディアを選択", + "play": "再生", + "play-media": "メディアを再生" + }, + "picture-upload": { + "label": "画像", + "unsupported_format": "サポートされていない形式です。JPEG、PNG、またはGIF画像を選択してください。" + }, "related-items": { "integration": "インテグレーション", "no_related_found": "関連するアイテムが見つかりませんでした。" @@ -388,6 +458,7 @@ "hour": "{count} {count, plural,\n one {時間}\n other {時間}\n}" }, "future": "{time}以内", + "just_now": "ちょうど今", "past": "{time}前" }, "service-picker": { @@ -413,10 +484,12 @@ "enabled_label": "エンティティを有効化", "entity_id": "エンティティ ID", "icon": "アイコンの上書き", + "icon_error": "アイコンは「prefix:iconname」の形式にする必要があります(例:「mdi:home」)。", "name": "名前の上書き", "unavailable": "このエンティティは現在利用できません。", "update": "更新" - } + }, + "no_unique_id": "このエンティティには一意のIDがないため、その設定はUIから管理できません。" }, "generic": { "cancel": "キャンセル", @@ -451,11 +524,19 @@ "options": "オプション" }, "input_text": { + "max": "最大の長さ", + "min": "最小の長さ", "mode": "表示モード", "password": "パスワード", + "pattern": "クライアント側検証の正規表現パターン", "text": "テキスト" }, - "required_error_msg": "この項目は必須です" + "platform_not_loaded": "{platform}統合がロードされていません。 'default_config:'または '' {platform} : ''を追加して、構成に追加してください。", + "required_error_msg": "この項目は必須です", + "yaml_not_editable": "このエンティティの設定は UI から編集できません。UI から設定されたエンティティのみが UI から構成できます。" + }, + "image_cropper": { + "crop": "収納" }, "more_info_control": { "dismiss": "ダイアログを閉じる", @@ -483,7 +564,14 @@ } }, "mqtt_device_debug_info": { + "deserialize": "MQTTメッセージをJSONとして解析する", + "entities": "エンティティ", + "no_entities": "エンティティなし", + "no_triggers": "トリガーなし", + "payload_display": "ペイロード表示", + "recent_messages": "{n}最近受信したメッセージ", "show_as_yaml": "YAML として表示", + "title": "{device}デバッグ情報", "triggers": "トリガー" }, "voice_command": { @@ -496,15 +584,22 @@ }, "zha_device_info": { "buttons": { + "add": "このデバイス経由でデバイスを追加", + "clusters": "クラスタの管理", "zigbee_information": "Zigbee 情報" }, "device_signature": "Zigbee デバイス署名", "services": { - "remove": "Zigbee ネットワークからデバイスを削除します。" + "remove": "Zigbee ネットワークからデバイスを削除します。", + "zigbee_information": "デバイスのZigbee情報を表示します。" + }, + "zha_device_card": { + "device_name_placeholder": "デバイス名の変更" } } }, "duration": { + "day": "{count} {count, plural,\n one {日}\n other {日間}\n}", "hour": "{count} {count, plural,\n one {時間}\n other {時間}\n}", "minute": "{count} {count, plural,\n one {分}\n other {分}\n}", "second": "{count} {count, plural,\n one {秒}\n other {秒}\n}", @@ -523,9 +618,14 @@ "notification_toast": { "connection_lost": "切断されました。再接続中...", "service_call_failed": "サービス{service}の呼び出しに失敗しました。", + "started": "ホームアシスタントが開始されました!", "triggered": "トリガーしました {name}" }, "panel": { + "calendar": { + "my_calendars": "マイカレンダー", + "today": "今日" + }, "config": { "advanced_mode": { "hint_enable": "設定オプションが見つかりませんか?アドバイスモードを有効にしてください。", @@ -538,11 +638,24 @@ "devices": "デバイス" }, "delete": { + "confirmation_text": "このエリアのすべてのデバイスは割り当て解除されます。", "confirmation_title": "このエリアを削除してもよろしいですか?" }, "description": "すべて自宅のエリアの一覧", + "editor": { + "area_id": "エリア ID", + "create": "作成", + "default_name": "新しいエリア", + "delete": "削除", + "name": "名前", + "name_required": "名前は必須です", + "unknown_error": "不明なエラー", + "update": "更新" + }, "picker": { - "header": "エリア" + "create_area": "エリアの作成", + "header": "エリア", + "no_areas": "まだエリアがないようです!" } }, "automation": { @@ -559,17 +672,47 @@ "name": "アクション", "type_select": "アクションの種類", "type": { + "choose": { + "add_option": "オプションを追加", + "conditions": "条件", + "default": "デフォルトのアクション", + "label": "選択", + "option": "オプション {番号}", + "remove_option": "オプションを削除", + "sequence": "アクション" + }, "condition": { "label": "条件" }, "delay": { "delay": "遅延" }, + "device_id": { + "action": "アクション" + }, "event": { "event": "イベント:", "label": "イベントを実行", "service_data": "サービスデータ" }, + "repeat": { + "label": "繰り返す", + "sequence": "アクション", + "type_select": "繰り返しのタイプ", + "type": { + "count": { + "label": "カウント" + }, + "until": { + "conditions": "条件まで", + "label": "まで" + }, + "while": { + "conditions": "条件", + "label": "しばらくの間" + } + } + }, "service": { "service_data": "サービスのデータ" }, @@ -586,9 +729,16 @@ "delete_confirm": "本当に削除しますか?", "duplicate": "デュプリケート", "header": "条件", + "introduction": "条件はオプションであり、すべての条件が満たされない限り、それ以上の実行を防ぎます。", "name": "条件", "type_select": "条件の種類", "type": { + "device": { + "condition": "条件" + }, + "not": { + "label": "ない" + }, "numeric_state": { "above": "超過", "below": "未満", @@ -623,6 +773,21 @@ "edit_yaml": "YAML で編集", "enable_disable": "オートメーションの有効化/無効化", "introduction": "オートメーションを使用して、あなたの家を生き生きとさせましょう。", + "max": { + "parallel": "並列実行の最大数", + "queued": "キューの長さ" + }, + "modes": { + "description": "このモードは、アクションが以前のトリガーから実行されている間に自動化がトリガーされたときに何が起こるかを制御します。詳細については{documentation_link}を確認してください。", + "documentation": "自動化ドキュメント", + "label": "モード", + "parallel": "並列", + "queued": "待機中", + "restart": "再起動", + "single": "シングル(デフォルト)" + }, + "move_down": "下に移動", + "move_up": "上に移動", "save": "保存", "triggers": { "add": "トリガーを追加", @@ -634,6 +799,9 @@ "name": "トリガー", "type_select": "トリガーの種類", "type": { + "device": { + "trigger": "トリガー" + }, "event": { "event_data": "イベントのデータ", "event_type": "イベントの種類", @@ -665,6 +833,9 @@ "sunrise": "日の出", "sunset": "日の入" }, + "tag": { + "label": "タグ" + }, "template": { "label": "テンプレート", "value_template": "バリューテンプレート" @@ -689,6 +860,7 @@ "headers": { "name": "名前" }, + "introduction": "オートメーションエディタを使用すると、オートメーションを作成および編集できます。以下のリンクをクリックして、ホーム アシスタントを正しく設定したことを確認する手順を確認してください。", "no_automations": "編集可能なオートメーションが見つかりません。", "only_editable": "automations.yaml で定義されたオートメーションのみが編集可能です。", "show_info_automation": "オートメーションに関する情報を表示" @@ -696,7 +868,11 @@ }, "cloud": { "account": { + "alexa": { + "config_documentation": "設定に関するドキュメント" + }, "google": { + "config_documentation": "設定に関するドキュメント", "devices_pin": "セキュリティデバイス PIN", "enter_pin_hint": "セキュリティデバイスを使用するには PIN を入力してください", "security_devices": "セキュリティデバイス" @@ -747,6 +923,8 @@ "section": { "core": { "core_config": { + "external_url": "外部 URL", + "internal_url": "内部 URL", "time_zone": "タイムゾーン" }, "header": "一般的な設定" @@ -761,6 +939,7 @@ "description": "エンティティのカスタマイズ", "pick_attribute": "オーバーライドする属性を選択してください", "picker": { + "entity": "エンティティ", "header": "カスタマイズ" }, "warning": { @@ -768,6 +947,7 @@ } }, "devices": { + "add_prompt": "このデバイスを使用した{name}はまだ追加されていません。上の[+]ボタンをクリックして追加できます。", "automation": { "automations": "オートメーション", "create": "デバイスからオートメーションを作成", @@ -777,6 +957,7 @@ "cant_edit": "編集できるのは、UI で作成された項目のみです。", "confirm_delete": "このデバイスを削除してもよろしいですか?", "confirm_rename_entity_ids": "エンティティの ID も変更しますか?", + "confirm_rename_entity_ids_warning": "この場合、これらのエンティティを現在使用している構成 (オートメーション、スクリプト、シーン、Lovelace など) は変更されません。", "data_table": { "area": "エリア", "battery": "バッテリー", @@ -784,11 +965,18 @@ "integration": "インテグレーション", "manufacturer": "メーカー", "model": "型番", + "no_area": "エリアなし", "no_devices": "デバイスなし" }, "delete": "削除", "description": "接続されたデバイスの管理", + "device_info": "デバイス情報", "device_not_found": "デバイスが見つかりません。", + "entities": { + "add_entities_lovelace": "Lovelaceに追加", + "disabled_entities": "{count} {count, plural,\n one {無効なエンティティ}\n other {無効なエンティティ}\n}", + "hide_disabled": "無効を非表示" + }, "name": "名前", "no_devices": "デバイスなし", "scene": { @@ -820,6 +1008,11 @@ "integration": "インテグレーション", "name": "名前" }, + "introduction2": "エンティティ レジストリを使用して、名前を上書きするか、エンティティ ID を変更するか、またはホーム アシスタントからエントリを削除します。", + "remove_selected": { + "confirm_text": "これらのエンティティが含まれている場合は、Lovelace の構成および自動化からそれらを削除する必要があります。" + }, + "search": "エンティティを検索", "status": { "readonly": "読み取り専用" } @@ -832,6 +1025,7 @@ "header": "Home Assistant の設定", "helpers": { "caption": "ヘルパー", + "description": "自動化の構築に役立つ要素を管理する", "dialog": { "add_helper": "ヘルパーを追加", "add_platform": "{platform} を追加", @@ -844,7 +1038,8 @@ "entity_id": "エンティティ ID", "name": "名前", "type": "タイプ" - } + }, + "no_helpers": "まだヘルパーがいないようです!" }, "types": { "input_boolean": "切り替え", @@ -855,20 +1050,35 @@ } }, "info": { + "caption": "情報", + "description": "ホーム アシスタントのインストールに関する情報を表示する", + "documentation": "ドキュメント", "frontend_version": "フロントエンドバージョン: {version} - {type}", + "integrations": "インテグレーション", "issues": "問題", "path_configuration": "ディスク上に configuration.yaml へのパス: {path}", "server": "サーバー", "system_health_error": "「システムの正常性」コンポーネントが有効されていません、configuration.yaml に 'system_health:' を追加してください。", "title": "情報" }, + "integration_panel_move": { + "link_integration_page": "インテグレーションページ", + "missing_zha": "ZHA設定パネルがありませんか? {integrations_page} ZHAエントリに移動されました。", + "missing_zwave": "Z-Wave設定パネルがありませんか? {integrations_page}のZ-Waveエントリに移動されました。" + }, "integrations": { "add_integration": "インテグレーションを追加", "config_entry": { "delete": "削除", "delete_button": "{integration} を削除", + "devices": "{count} {count, plural,\n one {デバイス}\n other {デバイス}\n}", + "documentation": "ドキュメント", + "entities": "{count} {count, plural,\n one {エンティティ}\n other {エントリー}\n}", "no_area": "エリアなし", "options": "オプション", + "reload": "再読込", + "reload_confirm": "インテグレーションが再読み込みされました", + "reload_restart_confirm": "ホームアシスタントを再起動してこのインテグレーションの再読み込みを完了してください。\n", "rename": "名前を変更", "settings_button": "{integration} の設定を編集", "system_options": "システムオプション", @@ -893,6 +1103,7 @@ "home_assistant_website": "Home Assistant のウェブサイト", "ignore": { "confirm_delete_ignore_title": "{name} の無視を停止しますか?", + "confirm_ignore": "この統合を設定しないでよろしいですか?右上のオーバーフローメニューで[無視された統合を表示]をクリックすると、これを元に戻すことができます。", "confirm_ignore_title": "{name} の検出を無視しますか?", "hide_ignored": "無視されたインテグレーションを非表示にする", "ignore": "無視する", @@ -902,13 +1113,18 @@ }, "integration": "インテグレーション", "integration_not_found": "インテグレーションが見つかりません。", + "no_integrations": "まだ設定されていないようです。あなたの最初の統合を追加するには、下のボタンをクリックしてください!", "none_found": "インテグレーションが見つかりません。", "none_found_detail": "別の検索基準をためしてみます。", "rename_dialog": "このコンフィグレーションエントリーの名前を変更", - "rename_input_label": "エントリー名" + "rename_input_label": "エントリー名", + "search": "インテグレーションを検索" }, + "introduction": "このビューでは、コンポーネントとHome Assistantを構成できます。まだすべてをUIから構成できるわけではありませんが、現在取り組んでいます。", "logs": { + "caption": "ログ", "clear": "消去", + "description": "Home Assistantログを表示する", "load_full_log": "完全な Home Assistant ログを読み込む", "loading_log": "エラーログを読み込んでいます…", "no_errors": "エラーは報告されていません。", @@ -919,11 +1135,14 @@ "lovelace": { "caption": "Lovelace ダッシュボード", "dashboards": { + "cant_edit_default": "標準の Lovelace ダッシュボードは UI から編集できません。別のダッシュボードをデフォルトとして設定することで、非表示にすることができます。", + "cant_edit_yaml": "YAMLで定義されたダッシュボードはUIから編集できません。それらをconfiguration.yamlで変更します。", "caption": "ダッシュボード", "conf_mode": { "storage": "UI 制御", "yaml": "YAML ファイル" }, + "confirm_delete": "このダッシュボードを削除してもよろしいですか?", "default_dashboard": "これはデフォルトのダッシュボードです", "detail": { "create": "作成", @@ -937,11 +1156,13 @@ "title": "タイトル", "title_required": "タイトルが必要です。", "update": "更新", - "url": "URL" + "url": "URL", + "url_error_msg": "URLには-を含める必要があり、スペースや特殊文字を含めることはできません(_および-を除く)" }, "picker": { "add_dashboard": "ダッシュボードを追加", "headers": { + "conf_mode": "設定方法", "default": "デフォルト", "filename": "ファイル名", "require_admin": "管理者のみ", @@ -953,6 +1174,7 @@ }, "description": "Lovelace ダッシュボードを設定する", "resources": { + "cant_edit_yaml": "LovelaceをYAMLモードで使用しているため、UIを使用してリソースを管理することはできません。それらをconfiguration.yamlで管理します。", "caption": "リソース", "confirm_delete": "このリソースを削除してもよろしいですか?", "detail": { @@ -964,7 +1186,8 @@ "update": "更新", "url": "URL", "url_error_msg": "URL は必須フィールドです", - "warning_header": "注意してください!" + "warning_header": "注意してください!", + "warning_text": "リソースを追加することは危険であり、リソースのソースを把握し、信頼してください。リソースが悪いと、システムに深刻な損害を与える可能性があります。" }, "picker": { "add_resource": "リソースを追加", @@ -974,6 +1197,7 @@ }, "no_resources": "リソースなし" }, + "refresh_body": "削除を完了するにはページを更新する必要があります。今すぐ更新しますか?", "refresh_header": "更新しますか?", "types": { "css": "Stylesheet", @@ -984,6 +1208,7 @@ } }, "mqtt": { + "button": "設定", "description_listen": "トピックをリッスン", "description_publish": "パケットをパブリッシュ", "listening_to": "リッスンします", @@ -996,14 +1221,88 @@ "topic": "トピック" }, "ozw": { + "button": "設定", "common": { + "controller": "コントローラ", + "instance": "インスタンス", + "network": "ネットワーク", "node_id": "ノードID", - "ozw_instance": "OpenZWaveインスタンス" + "ozw_instance": "OpenZWaveインスタンス", + "zwave": "Z-Wave" }, "device_info": { "node_failed": "ノードが失敗しました", "stage": "段階", "zwave_info": "Z-Wave情報" + }, + "navigation": { + "network": "ネットワーク", + "nodes": "ノード", + "select_instance": "インスタンスを選択" + }, + "network_status": { + "details": { + "driverallnodesqueried": "すべての稼働中のノードが照会されました", + "driverallnodesqueriedsomedead": "すべてのノードが照会されました。一部のノードがダウンしているのが見つかりました", + "driverawakenodesqueries": "すべての稼働中のノードが照会されました", + "driverfailed": "Z-Waveコントローラーへの接続に失敗しました", + "driverready": "Z-Waveコントローラーの初期化", + "driverremoved": "ドライバーが削除されました", + "driverreset": "ドライバーがリセットされました", + "offline": "OZWデーモンオフライン", + "ready": "接続の準備完了", + "started": "MQTTに接続されています", + "starting": "MQTTへの接続", + "stopped": "OpenZWaveが停止しました" + }, + "offline": "オフライン", + "online": "オンライン", + "starting": "開始", + "unknown": "不明" + }, + "network": { + "header": "ネットワーク管理", + "introduction": "接続されたデバイスの管理", + "node_count": "{count}ノード" + }, + "node_query_stages": { + "associations": "関連グループとメンバーシップの更新", + "cacheload": "OpenZWave キャッシュファイルから情報を読み込んでいます。バッテリー・ノードは、ノードがウェイクアップするまでこの段階にとどまります。", + "complete": "面接プロセスが完了しました", + "configuration": "ノードから構成値を取得する", + "dynamic": "ノードから頻繁に変更される値を取得する", + "instances": "デバイスがサポートするインスタンスまたはチャネルに関する詳細の取得", + "manufacturerspecific1": "ノードからの製造元および製品IDコードの取得", + "manufacturerspecific2": "ノードから頻繁に変更される値を取得する", + "neighbors": "ノードの近隣ノードのリストの取得", + "nodeinfo": "ノードから構成値を取得する", + "nodeplusinfo": "ノードからZ-Wave +情報を取得する", + "probe": "ノードが起動しているかどうかの確認", + "protocolinfo": "コントローラからこのノードの基本的なZ-Wave機能を取得する", + "session": "ノードから頻繁に変更される値を取得する", + "static": "ノードから構成値を取得する", + "versions": "ファームウェアおよびコマンドクラスのバージョンに関する情報の取得", + "wakeup": "ウェイクアップ キューとメッセージのサポートのセットアップ" + }, + "refresh_node": { + "battery_note": "ノードがバッテリ駆動の場合は、必ずスリープ解除してから続行してください。", + "complete": "ノードの更新が完了しました", + "description": "これにより、OpenZWaveはノードに再インタビューし、ノードのコマンドクラス、機能、および値を更新するように指示します。", + "node_status": "ノードの状態", + "refreshing_description": "ノード情報を更新しています。", + "start_refresh_button": "更新を開始", + "step": "ステップ", + "title": "ノード情報を更新", + "wakeup_header": "ウェイクアップの手順", + "wakeup_instructions_source": "ウェイクアップの手順は、OpenZWaveコミュニティデバイスデータベースから提供されます。" + }, + "select_instance": { + "header": "OpenZWaveインスタンスを選択", + "introduction": "複数のOpenZWaveインスタンスが実行されています。どのインスタンスを管理しますか?" + }, + "services": { + "add_node": "ノードを追加", + "remove_node": "ノードを削除" } }, "person": { @@ -1035,8 +1334,10 @@ "delete": "エンティティを削除", "device_entities": "デバイスに属するエンティティを追加するには、デバイスも追加されます。", "header": "エンティティ", + "introduction": "デバイスに属していないエンティティをここで設定できます。", "without_device": "デバイスのないエンティティ" }, + "icon": "アイコン", "introduction": "シーンを使用して、あなたの家を生き生きとさせましょう。", "load_error_not_editable": "scenes.yaml で定義されたシーンのみが編集可能です。", "load_error_unknown": "シーンの読み込みエラー ({err_no})。", @@ -1065,7 +1366,24 @@ "description": "スクリプトの作成と編集", "editor": { "delete_script": "スクリプトを削除", + "icon": "アイコン", + "id": "エンティティ ID", + "id_already_exists": "このIDはすでに存在します", + "id_already_exists_save_error": "IDが一意ではないため、このスクリプトを保存できません。別のIDを選択するか、空白のままにして自動的に生成します。", "link_available_actions": "使用可能なアクションに関する情報をもっと見る。", + "max": { + "parallel": "並列実行の最大数", + "queued": "キューの長さ" + }, + "modes": { + "description": "このモードは、アクションが以前のトリガーから実行されている間に自動化がトリガーされたときに何が起こるかを制御します。詳細については{documentation_link}を確認してください。", + "documentation": "スクリプトのドキュメント", + "label": "モード", + "parallel": "並列", + "queued": "待機中", + "restart": "再起動", + "single": "シングル(デフォルト)" + }, "sequence": "シーケンス" }, "picker": { @@ -1086,10 +1404,17 @@ "core": "ロケーションとカスタマイズの再読込", "group": "グループの再読込", "heading": "設定の再読込", + "input_boolean": "入力ブール値を再読み込み", + "input_datetime": "入力日時を再読み込み", + "input_number": "入力番号を再読み込み", + "input_select": "入力選択の再読み込み", + "input_text": "入力テキストを再読み込み", "introduction": "Home Assistant の一部は、再起動を必要とせずに再読込できます。再読込を押すと、現在の設定をアンロードし、新しい設定を読み込みます。", "person": "人の再読込", "scene": "シーンの再読込", "script": "スクリプトの再読込", + "template": "テンプレート エンティティの再読み込み", + "universal": "ユニバーサル メディア プレーヤー エンティティの再読み込み", "zone": "ゾーンの再読込" }, "server_management": { @@ -1106,6 +1431,32 @@ } } }, + "tags": { + "add_tag": "タグを追加する", + "automation_title": "タグ {名前} がスキャンされます", + "caption": "タグ", + "create_automation": "タグを使用したオートメーションの作成", + "description": "タグの管理", + "detail": { + "create": "作成", + "create_and_write": "作成と書き込み", + "delete": "削除", + "description": "説明", + "name": "名前", + "new_tag": "新しいタグ", + "tag_id": "タグID", + "tag_id_placeholder": "空のままにすると自動生成", + "update": "更新" + }, + "edit": "編集", + "headers": { + "last_scanned": "最後にスキャンされた", + "name": "名前" + }, + "never_scanned": "最後にスキャンされた", + "no_tags": "タグなし", + "write": "書き込み" + }, "users": { "caption": "ユーザー", "description": "ユーザーの管理", @@ -1130,20 +1481,33 @@ "name": "名前", "system": "システム" } - } + }, + "users_privileges_note": "ユーザーグループは作業中です。ユーザーは、UIを介してインスタンスを管理できなくなります。すべての管理APIエンドポイントを引き続き監査して、管理者へのアクセスを正しく制限していることを確認しています。" }, "zha": { "add_device_page": { + "discovered_text": "検出されると、デバイスがここに表示されます。", + "no_devices_found": "デバイスが見つかりませんでした。デバイスがペアリングモードであることを確認し、検出の実行中はデバイスをウェイクアップしてください。", + "pairing_mode": "デバイスがペアリングモードになっていることを確認します。これを行う方法については、デバイスの手順を確認してください。", "search_again": "もう一度検索" }, + "button": "構成", "common": { "add_devices": "デバイスを追加", "devices": "デバイス", "value": "バリュー" }, + "groups": { + "create_group": "Zigbeeホームオートメーション-グループの作成", + "description": "Zigbeeグループを管理する", + "header": "Zigbeeホームオートメーション-グループ管理" + }, "network_management": { "header": "ネットワーク管理" }, + "network": { + "caption": "ネットワーク" + }, "node_management": { "header": "デバイス管理" } @@ -1153,6 +1517,7 @@ "caption": "ゾーン", "confirm_delete": "このゾーンを削除してもよろしいですか?", "create_zone": "ゾーンを作成", + "description": "ユーザーを追跡するゾーンを管理する", "detail": { "create": "作成", "delete": "削除", @@ -1162,21 +1527,64 @@ "name": "名前", "new_zone": "新しいゾーン", "passive": "パッシブ", + "passive_note": "パッシブゾーンはフロントエンドで非表示になり、デバイストラッカーの場所として使用されません。これは、自動化に使用するだけの場合に役立ちます。", "radius": "半径", "required_error_msg": "この項目は必須です", "update": "更新" }, - "go_to_core_config": "一般的な構成に移動しますか?" + "edit_home_zone": "ホームゾーンの半径は、フロントエンドからはまだ編集できません。マップ上のマーカーをドラッグして、ホームゾーンを移動します。", + "edit_home_zone_narrow": "ホームゾーンの半径は、フロントエンドからはまだ編集できません。場所は、一般設定から変更できます。", + "go_to_core_config": "一般的な構成に移動しますか?", + "home_zone_core_config": "ホームゾーンの場所は、一般構成ページから編集できます。ホームゾーンの半径は、フロントエンドからはまだ編集できません。一般構成に移動しますか?" }, "zwave": { + "button": "設定", "caption": "Z-Wave", "common": { "value": "バリュー" }, "description": "Z-waveネットワークを管理します", "node_config": { + "config_parameter": "構成パラメーターの設定", "config_value": "バリューを設定", + "header": "ノード構成オプション", "set_config_parameter": "構成パラメーターの設定" + }, + "node_management": { + "add_to_group": "グループに追加", + "entities": "このノードのエンティティ", + "entity_info": "エンティティ情報", + "exclude_entity": "このエンティティをHome Assistantから除外する", + "group": "グループ", + "introduction": "単一ノードに影響するZ-Waveコマンドを実行します。ノードを選択すると、使用可能なコマンドのリストが表示されます。", + "max_associations": "最大関連付け:", + "node_group_associations": "ノードグループの関連付け", + "node_protection": "ノード保護", + "node_to_control": "制御するノード", + "nodes": "ノード", + "nodes_hint": "ノードを選択してノードごとのオプションを表示します", + "nodes_in_group": "このグループの他のノード:", + "pooling_intensity": "ポーリングの強度", + "protection": "保護", + "remove_broadcast": "ブロードキャストを削除", + "remove_from_group": "グループから削除", + "set_protection": "保護を設定する" + }, + "ozw_log": { + "last_log_lines": "最後のログ行数", + "load": "読み込み", + "tail": "最終行" + }, + "services": { + "heal_node": "ノードの修復", + "node_info": "ノード情報", + "print_node": "ノードの印刷", + "refresh_entity": "エンティティの更新", + "refresh_node": "ノードを更新", + "remove_failed_node": "失敗したノードを削除", + "replace_failed_node": "失敗したノードの置換", + "save_config": "設定を保存", + "test_node": "テストノード" } } }, @@ -1223,19 +1631,38 @@ }, "templates": { "editor": "テンプレートエディター", + "reset": "デモ テンプレートにリセット", "title": "テンプレート", "unknown_error_template": "不明なテンプレートレンダリングエラー" } } }, "history": { - "period": "期間" + "period": "期間", + "ranges": { + "last_week": "先週", + "this_week": "今週", + "today": "今日", + "yesterday": "昨日" + } }, "logbook": { "entries_not_found": "ログブックエントリが見つかりません。", - "period": "期間" + "period": "期間", + "ranges": { + "last_week": "先週", + "this_week": "今週", + "today": "今日", + "yesterday": "昨日" + }, + "showing_entries": "エントリを表示します" }, "lovelace": { + "add_entities": { + "generated_unsupported": "この機能は、Lovelace UIを制御している場合にのみ使用できます。", + "saving_failed": "Lovelace UI構成の保存に失敗しました。", + "yaml_unsupported": "YAMLモードでLovelace UIを使用している場合、この関数は使用できません。" + }, "cards": { "safe-mode": { "description": "Home Assistant は、構成の読み込み中に問題が発生し、セーフモードで実行されています。エラーログを見て、何が問題だったかを確認してください。", @@ -1244,13 +1671,24 @@ "shopping-list": { "add_item": "アイテムを追加", "clear_items": "チェックされたアイテムを削除" + }, + "starting": { + "description": "ホームアシスタントを開始しています。お待ちください...", + "header": "ホームアシスタントを開始しています..." } }, + "changed_toast": { + "message": "このダッシュボードのLovelace UI設定が更新されました。更新して変更を確認しますか?" + }, "editor": { "card": { "button": { "name": "ボタン" }, + "calendar": { + "description": "カレンダーカードには、日、週、リストビューを含むカレンダーが表示されます", + "name": "カレンダー" + }, "conditional": { "card": "カード", "change_type": "タイプの変更", @@ -1263,9 +1701,11 @@ "toggle": "エンティテを切り替え" }, "entity-filter": { + "description": "エンティティフィルタカードを使用すると、特定の状態にある場合にのみ追跡するエンティティのリストを定義できます。", "name": "エンティティフィルター" }, "entity": { + "description": "エンティティ カードは、エンティティの状態の概要を簡単に示します。", "name": "エンティティ" }, "gauge": { @@ -1275,49 +1715,85 @@ "attribute": "属性", "double_tap_action": "ダブルタップアクション", "manual": "マニュアル", + "manual_description": "カスタムカードを追加する必要があるか、手動でyamlを記述したいだけですか?", "no_theme": "テーマなし", + "search": "検索", + "secondary_info_attribute": "セカンダリ情報属性", "state": "状態", "theme": "テーマ" }, + "glance": { + "description": "Glance カードは、複数のセンサーをコンパクトな概要でグループ化するのに便利です。" + }, "history-graph": { + "description": "履歴グラフ カードを使用すると、一覧表示された各エンティティのグラフを表示できます。", "name": "履歴グラフ" }, "horizontal-stack": { + "description": "水平スタックカードを使用すると、複数のカードを一緒に積み重ねることができます。そのため、これらのカードは常に1つの列のスペースで隣り合って配置されます。", "name": "水平スタック" }, + "humidifier": { + "description": "加湿器カードは、加湿器エンティティを制御します。エンティティの湿度とモードを変更できます。", + "name": "加湿器" + }, "iframe": { - "name": "iFrame" + "description": "Web ページ カードを使用すると、お気に入りの Web ページをホーム アシスタントに埋め込むことができます。", + "name": "ウェブページ" }, "light": { + "description": "ライトカードを使用すると、ライトの明るさを変更できます。", "name": "照明" }, "map": { + "description": "マップ上にエンティティを表示できるマップカード。", + "hours_to_show": "表示する時間", "name": "地図" }, "markdown": { + "description": "マークダウン カードは、マークダウンのレンダリングに使用されます。", "name": "マークダウン" }, "media-control": { + "description": "メディアコントロールカードは、使いやすいコントロールを備えたインターフェイスにメディアプレーヤーエンティティを表示するために使用されます。", "name": "メディアコントロール" }, + "picture-elements": { + "description": "ピクチャー・エレメント・カードは、最も汎用性の高いタイプのカードの1つです。カードは、アイコンやテキスト、さらにはサービスを配置することができます!座標に基づくイメージ上。" + }, "picture-entity": { "name": "画像エンティティ" }, + "picture-glance": { + "description": "画像の一覧カードは、イメージと対応するエンティティの状態をアイコンで示します。右側のエンティティは切り替えアクションを許可し、他のエンティティは詳細ダイアログを表示します。" + }, "picture": { + "description": "ピクチャーカードを使用すると、インターフェイスのさまざまなパスへのナビゲーションに使用する画像を設定したり、サービスを呼び出したりできます。", "name": "画像" }, + "plant-status": { + "description": "植物ステータスカードは、そこにすべての素敵な植物学者のためのものです。" + }, "sensor": { + "description": "センサーカードは、時間の経過に伴う変化を視覚化するオプションのグラフを使用して、センサーの状態をすばやく提供します。", "name": "センサー" }, "shopping-list": { + "description": "ショッピングリストカードを使用すると、ショッピングリストのアイテムを追加、編集、チェックオフ、およびクリアができます。", "integration_not_loaded": "このカードを設定するには、「shopping_list」インテグレーションが必要です。", "name": "買い物リスト" }, "thermostat": { + "description": "サーモスタットカードは、気候エンティティを制御します。エンティティの温度とモードを変更できます。", "name": "サーモスタット" }, "vertical-stack": { + "description": "垂直スタックカードを使用すると、複数のカードをグループ化して、常に同じ列に配置することができます。", "name": "垂直スタック" + }, + "weather-forecast": { + "description": "天気予報カードは天気を表示します。表示するインターフェースに含めると非常に便利です。", + "show_forecast": "予測を表示" } }, "cardpicker": { @@ -1325,45 +1801,76 @@ "no_description": "説明がありません。" }, "edit_card": { + "confirm_cancel": "キャンセルしてもよいですか?", "delete": "カードを削除", "duplicate": "重複するカード", "move": "ビューに移動", "options": "その他のオプション", - "pick_card": "どのカードを追加しますか?" + "pick_card": "どのカードを追加しますか?", + "typed_header": "{type}カードの構成", + "unsaved_changes": "変更が保存されていません" }, "edit_lovelace": { - "edit_title": "タイトルを編集" + "edit_title": "タイトルを編集", + "explanation": "このタイトルは、Lovelace UIのすべてのビューの上に表示されます。", + "title": "タイトル" }, "edit_view": { "move_left": "ビューを左に移動", "move_right": "ビューを右に移動", "tab_badges": "バッジ", "tab_settings": "設定", - "tab_visibility": "可視性" + "tab_visibility": "可視性", + "visibility": { + "select_users": "ナビゲーションでこのビューを表示するユーザーを選択します。" + } }, "menu": { - "open": "Lovelace メニューを開く" + "open": "Lovelace メニューを開く", + "raw_editor": "詳細設定エディター" + }, + "migrate": { + "migrate": "構成を移行する", + "para_migrate": "Home Assistantは、「設定の移行」ボタンを押すことで、すべてのカードとビューにIDを自動的に追加できます。" }, "move_card": { "header": "カードを移動するビューを選択してください" }, "raw_editor": { + "confirm_remove_config_text": "Lovelace UI構成を削除すると、エリアとデバイスを含むLovelace UIビューが自動的に生成されます。", + "confirm_remove_config_title": "Lovelace UI構成を削除してもよろしいですか?エリアとデバイスを使用してLovelace UIビューを自動的に生成します。", "confirm_unsaved_changes": "未保存の変更があります、終了してもよろしいですか?", "confirm_unsaved_comments": "コンフィグレーションはコメントが含まれています、これらは保存されません。本当に続けますか?", "error_invalid_config": "設定が無効です: {error}", "error_parse_yaml": "YAMLを解析できません: {error}", - "error_save_yaml": "YAMLを保存できません: {error}" + "error_remove": "構成を削除できません: {error}", + "error_save_yaml": "YAMLを保存できません: {error}", + "header": "設定を編集", + "resources_moved": "リソースはLovelace構成に追加されなくなりましたが、Lovelace構成パネルで追加できます。" }, "save_config": { - "close": "閉じる" + "close": "閉じる", + "empty_config": "新しいダッシュボードから開始する", + "para": "このダッシュボードは現在、Home Assistantによって管理されています。新しいエンティティまたはLovelace UIコンポーネントが利用可能になると、自動的に更新されます。制御すると、このダッシュボードは自動的に更新されなくなります。いつでも構成で新しいダッシュボードを作成して、変更することができます。", + "yaml_mode": "このダッシュボードで YAML モードを使用している場合は、UI から Lovelace 設定を変更することはできません。UI からこのダッシュボードを管理する場合は、'configuration.yaml' の Lovelace 設定から 'mode: yaml' を削除します。" }, "select_view": { "dashboard_label": "ダッシュボード", "header": "ビューに移動" + }, + "suggest_card": { + "add": "Lovelace UIに追加", + "create_own": "別のカードを選択する" + }, + "view": { + "panel_mode": { + "warning_multiple_cards": "このビューには複数のカードが含まれていますが、パネルビューでは 1 枚のカードしか表示できません。" + } } }, "menu": { "close": "閉じる", + "configure_ui": "ダッシュボードを編集", "exit_edit_mode": "UI 編集モードを終了", "reload_resources": "リソースの再読込" }, @@ -1377,7 +1884,19 @@ "entity": "エンティティ", "entity_id": "エンティティ ID", "last_changed": "最終変更", + "no_data": "未使用のエンティティが見つかりません", + "search": "エンティティを検索", "title": "未使用のエンティティ" + }, + "views": { + "confirm_delete": "ビューを削除しますか?", + "confirm_delete_existing_cards_text": "'' {name} ''ビューを削除してもよろしいですか?ビューには、削除される{number}枚のカードが含まれています。この操作は元に戻せません。", + "confirm_delete_text": "'' {name} ''ビューを削除してもよろしいですか?" + }, + "warning": { + "attribute_not_found": "属性{attribute}は次の場所では使用できません: {entity}", + "entity_unavailable": "{entity}は現在利用できません", + "starting": "ホームアシスタントが起動していますが、まだすべてが利用可能なわけではありません" } }, "mailbox": { @@ -1389,6 +1908,8 @@ "page-authorize": { "abort_intro": "ログインが中止されました", "form": { + "error": "エラー: {error}", + "next": "次", "providers": { "command_line": { "abort": { @@ -1446,7 +1967,8 @@ "init": { "data": { "password": "API パスワード" - } + }, + "description": "HTTP設定にAPIパスワードを入力してください:" }, "mfa": { "data": { @@ -1456,6 +1978,9 @@ } }, "trusted_networks": { + "abort": { + "not_allowed": "お使いのコンピューターは許可されていません。" + }, "step": { "init": { "data": { @@ -1465,6 +1990,7 @@ } } }, + "start_over": "やり直す", "unknown_error": "エラーが発生しました", "working": "お待ちください" }, @@ -1482,6 +2008,7 @@ "page-onboarding": { "core-config": { "intro_location": "どこに住んでいるか知りたいです。 この情報は、他の情報の表示および太陽の位置に関する自動化の設定に役立ちます。 これらの情報がインターネットで外部と共有されることがありません。", + "location_name": "ホーム アシスタントの名前", "location_name_default": "自宅" }, "integration": { @@ -1490,6 +2017,7 @@ }, "profile": { "advanced_mode": { + "description": "高度な機能のロックを解除します。", "link_promo": "もっと見る", "title": "高度モード" }, @@ -1523,11 +2051,26 @@ "link_promo": "もっと見る", "push_notifications": "プッシュ通知" }, + "refresh_tokens": { + "description": "各更新トークンはログインセッションを表します。ログアウトをクリックすると、更新トークンが自動的に削除されます。現在、次の更新トークンがアカウントでアクティブになっています。" + }, + "suspend": { + "description": "5分間非表示にした後、サーバーへの接続を閉じる必要がありますか?", + "header": "接続を自動的に閉じる" + }, "themes": { + "accent_color": "アクセントの色", + "dark_mode": { + "auto": "自動", + "dark": "暗い", + "light": "明るい" + }, "dropdown_label": "テーマ", "error_no_theme": "利用可能なテーマはありません。", "header": "テーマ", - "link_promo": "テーマの情報をもっと見る。" + "link_promo": "テーマの情報をもっと見る。", + "primary_color": "プライマリーの色", + "reset": "リセット" }, "vibrate": { "header": "バイブレーション機能" @@ -1535,7 +2078,8 @@ }, "shopping-list": { "add_item": "アイテムを追加", - "clear_completed": "完了したアイテムを削除" + "clear_completed": "完了したアイテムを削除", + "microphone_tip": "右上のマイクをタップして、「買い物リストにキャンディーを追加」と言うか、入力します" } }, "sidebar": { diff --git a/translations/frontend/nb.json b/translations/frontend/nb.json index 603a1a17ea..1466f43081 100644 --- a/translations/frontend/nb.json +++ b/translations/frontend/nb.json @@ -26,7 +26,6 @@ "state_attributes": { "climate": { "fan_mode": { - "auto": "", "off": "Av", "on": "På" }, @@ -51,14 +50,11 @@ }, "humidifier": { "mode": { - "auto": "", "away": "Borte", - "baby": "", "boost": "Øke", "comfort": "Komfort", "eco": "Øko", "home": "Hjem", - "normal": "", "sleep": "Sove" } } @@ -114,7 +110,6 @@ "on": "Lavt" }, "cold": { - "off": "", "on": "Kald" }, "connectivity": { @@ -165,10 +160,6 @@ "off": "Borte", "on": "Hjemme" }, - "problem": { - "off": "", - "on": "" - }, "safety": { "off": "Sikker", "on": "Usikker" @@ -238,7 +229,6 @@ "locked": "Låst", "not_home": "Borte", "off": "Av", - "ok": "", "on": "På", "open": "Åpen", "opening": "Åpner", @@ -270,7 +260,6 @@ "home": "Hjemme" }, "plant": { - "ok": "", "problem": "Problem" }, "remote": { @@ -376,7 +365,6 @@ "low": "lav", "on_off": "På / av", "operation": "Operasjon", - "preset_mode": "", "swing_mode": "Svingmodus", "target_humidity": "Ønsket luftfuktighet", "target_temperature": "Ønsket temperatur", @@ -447,9 +435,7 @@ "timer": { "actions": { "cancel": "Avbryt", - "finish": "Ferdig", - "pause": "", - "start": "" + "finish": "Ferdig" } }, "vacuum": { @@ -481,12 +467,10 @@ "e": "Ø", "ene": "ØNØ", "ese": "ØSØ", - "n": "", "ne": "NØ", "nne": "NNØ", "nnw": "NNV", "nw": "NV", - "s": "", "se": "SØ", "sse": "SSØ", "ssw": "SSV", @@ -643,8 +627,7 @@ "generic": { "cancel": "Avbryt", "close": "Lukk", - "default_confirmation_title": "Er du sikker?", - "ok": "" + "default_confirmation_title": "Er du sikker?" }, "helper_settings": { "generic": { @@ -718,11 +701,8 @@ "commands": "Støvsugerkommandoer:", "fan_speed": "Viftehastighet", "locate": "Lokaliser", - "pause": "", "return_home": "Returner hjem", - "start": "", "start_pause": "Start / Pause", - "status": "", "stop": "Stopp" } }, @@ -769,7 +749,6 @@ "manuf": "av {manufacturer}", "no_area": "Intet område", "power_source": "Strømkilde", - "quirk": "", "services": { "reconfigure": "Rekonfigurer ZHA-enhet (heal enhet). Bruk dette hvis du har problemer med enheten. Hvis den aktuelle enheten er en batteridrevet enhet, sørg for at den er våken og aksepterer kommandoer når du bruker denne tjenesten.", "remove": "Fjern en enhet fra Zigbee-nettverket.", @@ -1053,9 +1032,7 @@ }, "homeassistant": { "event": "Hendelse:", - "label": "", - "shutdown": "Slå av", - "start": "" + "shutdown": "Slå av" }, "mqtt": { "label": "MQTT", @@ -1069,7 +1046,6 @@ "value_template": "Verdi fra mal (valgfritt)" }, "state": { - "for": "", "from": "Fra", "label": "Tilstand", "to": "Til" @@ -1098,10 +1074,6 @@ "at": "Klokken", "label": "Tid" }, - "webhook": { - "label": "", - "webhook_id": "" - }, "zone": { "enter": "Ankommer", "entity": "Entitet med posisjon", @@ -1145,8 +1117,7 @@ "manage_entities": "Håndtér entiteter", "state_reporting_error": "Kan ikke {enable_disable} rapportere status.", "sync_entities": "Synkronisér entiteter", - "sync_entities_error": "Kunne ikke synkronisere entiteter:", - "title": "" + "sync_entities_error": "Kunne ikke synkronisere entiteter:" }, "connected": "Tilkoblet", "connection_status": "Status for skytilkobling", @@ -1164,8 +1135,7 @@ "manage_entities": "Håndtér entiteter", "security_devices": "Sikkerhetsenheter", "sync_entities": "Synkronisér entiteter til Google", - "sync_entities_404_message": "Kunne ikke synkronisere enhetene dine med Google, be Google 'Hei Google, synkroniser enhetene mine' for å synkronisere enhetene dine.", - "title": "" + "sync_entities_404_message": "Kunne ikke synkronisere enhetene dine med Google, be Google 'Hei Google, synkroniser enhetene mine' for å synkronisere enhetene dine." }, "integrations": "Integrasjoner", "integrations_introduction": "Integrasjoner for Home Assistant Cloud lar deg koble til tjenester i skyen uten å måtte avsløre Home Assistant-forekomsten offentlig på internett.", @@ -1194,18 +1164,15 @@ "no_hooks_yet": "Ser ut som du ikke har noen webhooks ennå. Kom i gang ved å konfigurere en ", "no_hooks_yet_link_automation": "webhook-automasjon", "no_hooks_yet_link_integration": "webhook-basert integrasjon", - "no_hooks_yet2": " eller ved å opprette en ", - "title": "" + "no_hooks_yet2": " eller ved å opprette en " } }, "alexa": { "banner": "Redigere hvilke entiteter som vises via dette grensesnittet er deaktivert fordi du har konfigurert entitetsfiltre i configuration.yaml.", "expose": "Eksponer til Alexa", "exposed_entities": "Eksponerte entiteter", - "not_exposed_entities": "Ikke-eksponerte entiteter", - "title": "" + "not_exposed_entities": "Ikke-eksponerte entiteter" }, - "caption": "", "description_features": "Kontroller borte fra hjemmet, integrer med Alexa og Google Assistant.", "description_login": "Logget inn som {email}", "description_not_login": "Ikke pålogget", @@ -1242,8 +1209,7 @@ "expose": "Eksponer til Google Assistant", "exposed_entities": "Eksponerte entiteter", "not_exposed_entities": "Ikke-eksponerte entiteter", - "sync_to_google": "Synkroniserer endringer til Google.", - "title": "" + "sync_to_google": "Synkroniserer endringer til Google." }, "login": { "alert_email_confirm_necessary": "Du må bekrefte e-posten din før du logger inn.", @@ -1417,7 +1383,6 @@ "confirm_title": "Vil du aktivere {number} enheter?" }, "filter": { - "filter": "", "show_disabled": "Vis deaktiverte entiteter", "show_readonly": "Vis skrivebeskyttede enheter", "show_unavailable": "Vis utilgjengelige enheter" @@ -1426,8 +1391,7 @@ "headers": { "entity_id": "Entitets-ID", "integration": "Integrasjon", - "name": "Navn", - "status": "" + "name": "Navn" }, "introduction": "Home Assistant bygger opp et register over hver entitet den har sett som kan identifiseres unikt. Hver av disse entitetene vil ha en ID som er reservert kun til denne.", "introduction2": "Bruk entitetsregistret til å overstyre navnet, endre id-en eller fjerne den fra Home Assistant.", @@ -1442,7 +1406,6 @@ "selected": "{number} valgte", "status": { "disabled": "Deaktivert", - "ok": "", "readonly": "Skrivebeskyttet", "restored": "Gjennopprettet", "unavailable": "Utilgjengelig" @@ -1467,8 +1430,7 @@ "headers": { "editable": "Redigerbare", "entity_id": "Entitets-ID", - "name": "Navn", - "type": "" + "name": "Navn" }, "no_helpers": "Det ser ut som om du ikke har noen hjelpere ennå!" }, @@ -1476,7 +1438,6 @@ "input_boolean": "Veksle", "input_datetime": "Dato og/eller klokkeslett", "input_number": "Nummer", - "input_select": "", "input_text": "Tekst" } }, @@ -1489,7 +1450,6 @@ "documentation": "Dokumentasjon", "frontend": "frontend", "frontend_version": "Brukergrensesnittet-versjon: {version} - {type}", - "home_assistant_logo": "", "icons_by": "Ikoner fra", "integrations": "Integrasjoner", "issues": "Problemer", @@ -1525,6 +1485,9 @@ "no_device": "Oppføringer uten enheter", "no_devices": "Denne integrasjonen har ingen enheter.", "options": "Alternativer", + "reload": "Last inn på nytt", + "reload_confirm": "Integreringen ble lastet på nytt", + "reload_restart_confirm": "Start Home Assistant på nytt for å fullføre omlastingen av denne integreringen", "rename": "Gi nytt navn", "restart_confirm": "Start Home Assistant på nytt for å fullføre fjerningen av denne integrasjonen", "settings_button": "Rediger innstillinger for {integration}", @@ -1617,7 +1580,6 @@ "title": "Tittel", "title_required": "Tittel er påkrevd.", "update": "Oppdater", - "url": "", "url_error_msg": "URLen skal inneholde en - og kan ikke inneholde mellomrom eller spesialtegn, bortsett fra _ og -" }, "picker": { @@ -1645,17 +1607,12 @@ "new_resource": "Legg til ny ressurs", "type": "Ressurstype", "update": "Oppdater", - "url": "", "url_error_msg": "URL-adresse er et obligatorisk felt", "warning_header": "Vær forsiktig!", "warning_text": "Det kan være farlig å legge til ressurser, sørg for at du kjenner kilden til ressursen og stoler på dem. Dårlige ressurser kan skade systemet ditt alvorlig." }, "picker": { "add_resource": "Legg til ressurs", - "headers": { - "type": "", - "url": "" - }, "no_resources": "Ingen ressurser" }, "refresh_body": "Du må oppdatere siden for å fullføre fjerningen, vil du oppdatere nå?", @@ -1903,6 +1860,7 @@ "scene": "Last inn scener på nytt", "script": "Last inn skript på nytt", "template": "Laste inn malenheter på nytt", + "universal": "Laste inn universelle mediespillerenheter på nytt", "zone": "Last inn soner på nytt" }, "server_management": { @@ -1961,7 +1919,6 @@ "editor": { "activate_user": "Aktiver bruker", "active": "Aktiv", - "admin": "", "caption": "Vis bruker", "change_password": "Endre passord", "confirm_user_deletion": "Er du sikker på at du vil slette {name} ?", @@ -1980,8 +1937,7 @@ "picker": { "headers": { "group": "Gruppe", - "name": "Navn", - "system": "" + "name": "Navn" } }, "users_privileges_note": "Brukere-gruppen er et pågående arbeid. Brukeren kan ikke administrere forekomsten via brukergrensesnittet. Vi reviderer fortsatt alle API-endepunkter for å sikre at de begrenser tilgangen til administratorer på riktig måte." @@ -2001,7 +1957,6 @@ "description": "Legg til enheter i Zigbee-nettverket" }, "button": "Konfigurer", - "caption": "", "cluster_attributes": { "attributes_of_cluster": "Attributter for den valgte klyngen", "get_zigbee_attribute": "Hent ZigBee-attributt", @@ -2109,7 +2064,6 @@ "new_zone": "Ny sone", "passive": "Passiv", "passive_note": "Passive soner er skjult i grensesnittet og brukes ikke som sted for enhetssporere. Dette er nyttig hvis du bare vil bruke dem til automasjoner.", - "radius": "", "required_error_msg": "Dette feltet er påkrevd", "update": "Oppdater" }, @@ -2239,7 +2193,6 @@ "call_service": "Tilkall tjeneste", "column_description": "Beskrivelse", "column_example": "Eksempel", - "column_parameter": "", "data": "Tjenestedata (YAML, valgfritt)", "description": "Service utviklingsverktøyet lar deg tilkalle alle tilgjengelige tjenester i Home Assistant.", "fill_example_data": "Fyll ut eksempeldata", @@ -2315,7 +2268,6 @@ }, "picture-elements": { "call_service": "Tilkall tjeneste {name}", - "hold": "", "more_info": "Vis mer info: {name}", "navigate_to": "Naviger til {location}", "tap": "Trykk:", @@ -2410,7 +2362,6 @@ "manual": "Manuell", "manual_description": "Trenger du å legge til et tilpasset kort eller bare ønsker å skrive yaml manuelt?", "maximum": "Maksimalt", - "minimum": "", "name": "Navn", "no_theme": "Ingen tema", "refresh_interval": "Oppdateringsintervall", @@ -2423,8 +2374,7 @@ "tap_action": "Trykk handling", "theme": "Tema", "title": "Tittel", - "unit": "Betegnelse", - "url": "" + "unit": "Betegnelse" }, "glance": { "columns": "Kolonner", @@ -2462,8 +2412,7 @@ }, "markdown": { "content": "Innhold", - "description": "Markdown-kortet brukes til å gjengi Markdown.", - "name": "" + "description": "Markdown-kortet brukes til å gjengi Markdown." }, "media-control": { "description": "Media Control-kortet brukes til å vise mediespillerenheter på et grensesnitt med brukervennlige kontroller.", @@ -2492,8 +2441,7 @@ "sensor": { "description": "Sensorkortet gir deg en rask oversikt over sensortilstanden din med en valgfri graf for å visualisere endring over tid.", "graph_detail": "Detaljer for graf", - "graph_type": "Graf type", - "name": "" + "graph_type": "Graf type" }, "shopping-list": { "description": "På Shopping List-kortet kan du legge til, redigere, sjekke av og fjerne gjenstander fra handlelisten din.", @@ -2796,7 +2744,6 @@ "upstairs": "Oppe" }, "unit": { - "minutes_abbr": "", "watching": "Ser på" } } @@ -2850,9 +2797,7 @@ }, "current_user": "Du er logget inn som {fullName}.", "dashboard": { - "description": "Velg et standard instrumentbord for denne enheten.", - "dropdown_label": "", - "header": "" + "description": "Velg et standard instrumentbord for denne enheten." }, "force_narrow": { "description": "Dette vil skjule sidepanelet som standard, tilsvarende opplevelsen på en mobil.", diff --git a/translations/frontend/nl.json b/translations/frontend/nl.json index 65260bfdb9..c0f25bfcc0 100644 --- a/translations/frontend/nl.json +++ b/translations/frontend/nl.json @@ -992,7 +992,6 @@ "delete": "Verwijderen", "delete_confirm": "Weet je zeker dat je dit item wilt verwijderen?", "duplicate": "Dupliceren", - "header": "", "introduction": "Triggers starten de verwerking van een automatiseringsregel. Het is mogelijk om meerdere triggers voor dezelfde regel op te geven. Zodra een trigger start, valideert Home Assistant de eventuele voorwaarden en roept hij de actie aan.", "learn_more": "Meer informatie over triggers", "name": "Trigger", @@ -1022,7 +1021,6 @@ }, "homeassistant": { "event": "Gebeurtenis:", - "label": "", "shutdown": "Afsluiten", "start": "Opstarten" }, @@ -1549,7 +1547,7 @@ "details": "Logboekdetails ({level})", "load_full_log": "Laad volledige Home Assistant logboek", "loading_log": "Foutenlogboek laden ...", - "multiple_messages": "bericht kwam voor het eerst om {time} en verschijnt {counter} malen", + "multiple_messages": "bericht kwam voor het eerst om {time} en verschijnt {counter} keer", "no_errors": "Er zijn geen fouten gerapporteerd.", "no_issues": "Er zijn geen problemen!", "refresh": "Vernieuwen", diff --git a/translations/frontend/pl.json b/translations/frontend/pl.json index 6a09a5955a..2e3df7bffa 100644 --- a/translations/frontend/pl.json +++ b/translations/frontend/pl.json @@ -474,7 +474,7 @@ "humidity": "Wilgotność powietrza", "precipitation": "Opady", "temperature": "Temperatura", - "visibility": "Widoczność", + "visibility": "Widzialność", "wind_speed": "Prędkość wiatru" }, "cardinal_direction": { @@ -1342,7 +1342,7 @@ } }, "devices": { - "add_prompt": "Żadne {name} nie zostały jeszcze dodane przy użyciu tego urządzenia. Możesz je dodać, klikając przycisk + powyżej.", + "add_prompt": "{name} używające tego urządzenia nie zostały jeszcze dodane. Możesz je dodać, klikając przycisk + powyżej.", "automation": { "actions": { "caption": "Wykonaj akcje..." @@ -1525,6 +1525,9 @@ "no_device": "Encje bez urządzeń", "no_devices": "Ta integracja nie ma żadnych urządzeń.", "options": "Opcje", + "reload": "Wczytaj ponownie", + "reload_confirm": "Integracja została ponownie wczytana", + "reload_restart_confirm": "Uruchom ponownie Home Assistanta, aby dokończyć ponowne wczytywanie tej integracji", "rename": "Zmień nazwę", "restart_confirm": "Zrestartuj Home Assistanta, aby zakończyć usuwanie tej integracji", "settings_button": "Edytuj ustawienia dla {integration}", @@ -1903,6 +1906,7 @@ "scene": "Sceny", "script": "Skrypty", "template": "Szablony encji", + "universal": "Encje uniwersalnego odtwarzacza mediów", "zone": "Strefy" }, "server_management": { @@ -2551,7 +2555,7 @@ "move_right": "Przesuń widok w prawo", "tab_badges": "Odznaki", "tab_settings": "Ustawienia", - "tab_visibility": "Widoczność", + "tab_visibility": "Widzialność", "visibility": { "select_users": "Wybierz, którzy użytkownicy powinni mieć dostęp do tego widoku" } diff --git a/translations/frontend/pt-BR.json b/translations/frontend/pt-BR.json index 7656f77073..de7779ea4a 100644 --- a/translations/frontend/pt-BR.json +++ b/translations/frontend/pt-BR.json @@ -1022,7 +1022,6 @@ }, "homeassistant": { "event": "Evento:", - "label": "", "shutdown": "Desligar", "start": "Iniciar" }, @@ -1643,7 +1642,6 @@ "start_listening": "Começar a ouvir", "stop_listening": "Parar de ouvir", "subscribe_to": "Evento para se inscrever", - "title": "", "topic": "tópico" }, "ozw": { @@ -1986,7 +1984,6 @@ }, "zwave": { "button": "Configurar", - "caption": "", "common": { "index": "Índice", "instance": "Instância", diff --git a/translations/frontend/pt.json b/translations/frontend/pt.json index 06c63122e4..83cad0c467 100644 --- a/translations/frontend/pt.json +++ b/translations/frontend/pt.json @@ -1111,8 +1111,7 @@ "manage_entities": "Gerir Entidades", "state_reporting_error": "Indisponível para {enable_disable} reportar estado.", "sync_entities": "Sincronizar Entidades", - "sync_entities_error": "Falha na sincronização das entidades:", - "title": "" + "sync_entities_error": "Falha na sincronização das entidades:" }, "connected": "Ligado", "connection_status": "Estado da ligação na cloud", @@ -1130,8 +1129,7 @@ "manage_entities": "Gerir Entidades", "security_devices": "Dispositivos de segurança", "sync_entities": "Sincronizar entidades com o Google", - "sync_entities_404_message": "Falha ao sincronizar suas entidades com o Google, peça ao Google 'Ok Google, sincronize os meus dispositivos' para sincronizar suas entidades.", - "title": "" + "sync_entities_404_message": "Falha ao sincronizar suas entidades com o Google, peça ao Google 'Ok Google, sincronize os meus dispositivos' para sincronizar suas entidades." }, "integrations": "Integrações", "integrations_introduction": "As integrações para o Home Assistant Cloud permitem-lhe ligar-se aos serviços na nuvem sem ter de expor publicamente o seu Home Assistant na Internet.", @@ -1160,8 +1158,7 @@ "no_hooks_yet": "Parece que você ainda não tem webhooks. Comece, configurando um", "no_hooks_yet_link_automation": "automação de webhook", "no_hooks_yet_link_integration": "integração baseada em webhook", - "no_hooks_yet2": " ou criando um ", - "title": "" + "no_hooks_yet2": " ou criando um " } }, "alexa": { @@ -1195,7 +1192,6 @@ }, "forgot_password": { "check_your_email": "Verifique o seu e-mail para obter instruções sobre como redefinir a sua palavra-passe.", - "email": "", "email_error_msg": "E-mail inválido", "instructions": "Introduza o seu endereço de e-mail e nós lhe enviaremos um link para redefinir sua password.", "send_reset_email": "Enviar e-mail de redefinição", @@ -1215,7 +1211,6 @@ "alert_email_confirm_necessary": "É necessário confirmar o seu e-mail antes de fazer login.", "alert_password_change_required": "É necessário alterar a sua password antes de fazer login.", "dismiss": "Fechar", - "email": "", "email_error_msg": "E-mail inválido", "forgot_password": "Esqueceu-se da palavra-passe?", "introduction": "O Home Assistant Cloud fornece uma conexão remota segura à sua instância enquanto estiver fora de casa. Também permite que você se conecte com serviços que apenas utilizam a nuvem: Amazon Alexa e Google Assistant.", @@ -1451,7 +1446,6 @@ "description": "Ver informações sobre a instalação do Home Assistant", "developed_by": "Desenvolvido por um punhado de pessoas incríveis.", "documentation": "Documentação", - "frontend": "", "frontend_version": "Versão frontend: {version} - {type}", "home_assistant_logo": "Logotipo do Home Assistant", "icons_by": "Ícones por", diff --git a/translations/frontend/ru.json b/translations/frontend/ru.json index cfce9ae72d..d9bb0aeac7 100644 --- a/translations/frontend/ru.json +++ b/translations/frontend/ru.json @@ -1342,11 +1342,12 @@ } }, "devices": { + "add_prompt": "Нажмите кнопку \"+\", чтобы создать {name} с использованием этого устройства.", "automation": { "actions": { "caption": "Когда что-то происходит..." }, - "automations": "Автоматизация", + "automations": "Автоматизации", "conditions": { "caption": "Сделать что-то, только если..." }, @@ -1524,6 +1525,9 @@ "no_device": "Объекты без устройств", "no_devices": "Эта интеграция не имеет устройств", "options": "Настройки", + "reload": "Перезагрузить", + "reload_confirm": "Перезагрузка интеграции выполнена", + "reload_restart_confirm": "Перезапустите Home Assistant, чтобы завершить перезагрузку этой интеграции", "rename": "Переименовать", "restart_confirm": "Перезапустите Home Assistant, чтобы завершить удаление этой интеграции", "settings_button": "Настройки интеграции {integration}", @@ -1902,6 +1906,7 @@ "scene": "Перезагрузить сцены", "script": "Перезагрузить сценарии", "template": "Перезагрузить шаблоны", + "universal": "Перезагрузить объекты универсального медиаплеера", "zone": "Перезагрузить зоны" }, "server_management": { diff --git a/translations/frontend/sv.json b/translations/frontend/sv.json index a3febec4fa..f684b51098 100644 --- a/translations/frontend/sv.json +++ b/translations/frontend/sv.json @@ -1145,8 +1145,7 @@ "manage_entities": "Hantera Entiteter", "state_reporting_error": "Det går inte att {enable_disable} rapportera tillståndet.", "sync_entities": "Synkronisera Entiteter", - "sync_entities_error": "Det gick inte att synkronisera entiteter:", - "title": "" + "sync_entities_error": "Det gick inte att synkronisera entiteter:" }, "connected": "Ansluten", "connection_status": "Status för molnanslutning", @@ -1194,16 +1193,14 @@ "no_hooks_yet": "Det verkar som du inte har några webhooks ännu. Kom igång genom att konfigurera en ", "no_hooks_yet_link_automation": "webhook automation", "no_hooks_yet_link_integration": "webhook-baserad integration", - "no_hooks_yet2": " eller genom att skapa en ", - "title": "" + "no_hooks_yet2": " eller genom att skapa en " } }, "alexa": { "banner": "Redigering av vilka entiteter som visas via det här användargränssnittet är inaktiverat eftersom du har konfigurerat entitetsfilter i configuration.yaml.", "expose": "Exponera för Alexa", "exposed_entities": "Exponerade entiteter", - "not_exposed_entities": "Ej exponerade entiteter", - "title": "" + "not_exposed_entities": "Ej exponerade entiteter" }, "caption": "Home Assistant Cloud", "description_features": "Styra även när du inte är hemma, integrera med Alexa och Google Assistant.", @@ -1523,6 +1520,9 @@ "no_device": "Entitet utan enheter", "no_devices": "Denna integration har inga enheter.", "options": "Alternativ", + "reload": "Ladda om", + "reload_confirm": "Integrationen laddades om", + "reload_restart_confirm": "Starta om Home Assistant för att slutföra omladdningen av denna integration", "rename": "Döp om", "restart_confirm": "Starta om Home Assistant för att slutföra borttagningen av denna integration", "settings_button": "Redigera inställningar för {integration}", @@ -1691,14 +1691,33 @@ "stage": "Steg", "zwave_info": "Z-Wave info" }, + "navigation": { + "network": "Nätverk", + "nodes": "Noder", + "select_instance": "Välj instans" + }, + "network_status": { + "details": { + "driverfailed": "Det gick inte att ansluta till Z-Wave-styrenheten", + "driverready": "Initierar Z-Wave-styrenheten", + "offline": "OZWDaemon offline", + "ready": "Redo att ansluta", + "started": "Ansluten till MQTT", + "starting": "Ansluter till MQTT", + "stopped": "OpenZWave har stoppats" + } + }, "network": { - "header": "Nätverkshantering" + "header": "Nätverkshantering", + "introduction": "Hantera nätverksövergripande funktioner.", + "node_count": "{count} noder" }, "node_query_stages": { "configuration": "Hämtar konfigurationsvärden från noden", "dynamic": "Hämtar värden som ofta ändras från noden", "neighbors": "Hämtar en lista av nodens grannar", "nodeplusinfo": "Hämtar Z-Wave+-information från noden", + "probe": "Kontrollera om noden är vaken / levande", "session": "Hämtar värden som sällan ändras från noden", "static": "Hämtar statiska värden från enheten" }, @@ -1711,6 +1730,10 @@ "wakeup_header": "Väckningsinstruktioner för", "wakeup_instructions_source": "Väckningsinstruktioner hämtas från OpenZWave community-databasen." }, + "select_instance": { + "header": "Välj en OpenZWave-instans", + "introduction": "Du har mer än en OpenZWave-instans som körs. Vilken instans vill du hantera?" + }, "services": { "add_node": "Lägg till nod", "remove_node": "Ta bort nod" @@ -2352,8 +2375,6 @@ "image": "Bildsökväg", "manual": "Manuell", "manual_description": "Behöver du lägga till ett anpassat kort eller vill du bara skriva yaml manuellt?", - "maximum": "", - "minimum": "", "name": "Namn", "no_theme": "Inget tema", "refresh_interval": "Uppdateringsintervall", diff --git a/translations/frontend/zh-Hans.json b/translations/frontend/zh-Hans.json index 6ead2a37ff..c9cb033ada 100644 --- a/translations/frontend/zh-Hans.json +++ b/translations/frontend/zh-Hans.json @@ -1525,6 +1525,9 @@ "no_device": "无设备关联的实体", "no_devices": "此集成没有设备。", "options": "选项", + "reload": "重载", + "reload_confirm": "集成已重新加载", + "reload_restart_confirm": "重启 Home Assistant 以完成此集成的重载", "rename": "重命名", "restart_confirm": "重启 Home Assistant 以完成此集成的删除", "settings_button": "编辑{integration}设置", @@ -1903,6 +1906,7 @@ "scene": "重载场景", "script": "重载脚本", "template": "重载模板实体", + "universal": "重载通用媒体播放器实体", "zone": "重载地点" }, "server_management": { diff --git a/translations/frontend/zh-Hant.json b/translations/frontend/zh-Hant.json index fc07d69502..d2d4d6e399 100644 --- a/translations/frontend/zh-Hant.json +++ b/translations/frontend/zh-Hant.json @@ -419,9 +419,16 @@ "unlock": "解鎖" }, "media_player": { + "browse_media": "瀏覽媒體", + "media_next_track": "下一首", + "media_play": "播放", + "media_play_pause": "播放/暫停", + "media_previous_track": "上一首", "sound_mode": "音效模式", "source": "來源", - "text_to_speak": "所要閱讀的文字" + "text_to_speak": "所要閱讀的文字", + "turn_off": "關閉", + "turn_on": "開啟" }, "persistent_notification": { "dismiss": "關閉" @@ -554,6 +561,22 @@ "loading_history": "正在載入狀態歷史...", "no_history_found": "找不到狀態歷史。" }, + "media-browser": { + "choose-source": "選擇來源", + "content-type": { + "album": "專輯", + "artist": "演唱者", + "library": "媒體庫", + "playlist": "播放列表", + "server": "伺服器" + }, + "media-player-browser": "媒體播放器瀏覽器", + "no_items": "沒有項目", + "pick": "選擇", + "pick-media": "選擇媒體", + "play": "播放", + "play-media": "播放媒體" + }, "picture-upload": { "label": "照片", "unsupported_format": "不支援的格式,請選擇 JPEG、PNG 或 GIF 圖檔。" @@ -578,6 +601,7 @@ "week": "{count} {count, plural,\n one {週}\n other {週}\n}" }, "future": "{time}後", + "just_now": "現在", "never": "未執行", "past": "{time}前" }, @@ -1318,6 +1342,7 @@ } }, "devices": { + "add_prompt": "此設備尚未添加任何 {name}。可點選上方的 + 按鈕進行新增。", "automation": { "actions": { "caption": "當某物件被觸發時..." @@ -1500,6 +1525,9 @@ "no_device": "物件沒有設備", "no_devices": "此整合沒有任何設備。", "options": "選項", + "reload": "重新載入", + "reload_confirm": "整合已重新載入", + "reload_restart_confirm": "重啟 Home Assistant 以為重整合重新載入", "rename": "重新命名", "restart_confirm": "重啟 Home Assistant 以完成此整合移動", "settings_button": "編輯 {integration} 設定", @@ -1658,7 +1686,11 @@ "topic": "主題" }, "ozw": { + "button": "設定", "common": { + "controller": "控制器", + "instance": "設備", + "network": "網路", "node_id": "節點 ID", "ozw_instance": "OpenZWave 設備", "zwave": "Z-Wave" @@ -1668,6 +1700,36 @@ "stage": "階段", "zwave_info": "Z-Wave 資訊" }, + "navigation": { + "network": "網路", + "nodes": "節點", + "select_instance": "選擇設備" + }, + "network_status": { + "details": { + "driverallnodesqueried": "已查詢所有節點。", + "driverallnodesqueriedsomedead": "所有節點已進行查詢,部分節點已失效", + "driverawakenodesqueries": "所有喚醒節點已進行查詢。", + "driverfailed": "連線至 Z-Wave 控制器失敗", + "driverready": "初始化 Z-Wave 控制器", + "driverremoved": "驅動器已移除", + "driverreset": "驅動器已重置", + "offline": "OZWDaemon 離線", + "ready": "準備連線", + "started": "已連線至 MQTT", + "starting": "連線至 MQTT", + "stopped": "OpenZWave 已停止" + }, + "offline": "離線", + "online": "線上", + "starting": "開始", + "unknown": "未知" + }, + "network": { + "header": "網路管理", + "introduction": "管理網路方面功能。", + "node_count": "{count} 個節點" + }, "node_query_stages": { "associations": "更新相關群組與成員", "cacheload": "由 OpenZwave 暫存檔載入資訊。電池供電節點將會保持此階段直到節點喚醒。", @@ -1698,6 +1760,14 @@ "title": "更新節點資訊", "wakeup_header": "喚醒說明", "wakeup_instructions_source": "喚醒說明為來自 OpenZWave 社群的設備資料庫。" + }, + "select_instance": { + "header": "選擇 OpenZWave 設備", + "introduction": "超過一個以上的 OpenZWave 設備執行中,要管理哪個設備?" + }, + "services": { + "add_node": "新增節點", + "remove_node": "移除節點" } }, "person": { @@ -1835,6 +1905,8 @@ "person": "重新載入人員", "scene": "重新載入場景", "script": "重新載入腳本", + "template": "重新載入範例物件", + "universal": "重新載入通用媒體播放器物件", "zone": "重新載入區域" }, "server_management": { @@ -1876,6 +1948,7 @@ "last_scanned": "最後掃描時間", "name": "名稱" }, + "never_scanned": "從未掃描", "no_tags": "無標籤", "write": "編寫" }, @@ -2200,6 +2273,7 @@ "description": "模版使用 Jinja2 模板引擎及 Home Assistant 特殊擴充進行模板渲染。", "editor": "模板編輯器", "jinja_documentation": "Jinja2 模版文件", + "reset": "重置示範範模板", "template_extensions": "Home Assistant 模板擴充", "title": "模板", "unknown_error_template": "未知渲染模版錯誤" @@ -2281,6 +2355,10 @@ "description": "按鈕面板可供新增按鈕以執行任務。", "name": "按鈕面板" }, + "calendar": { + "description": "行事曆面板可顯示包含日、週及列表的行事曆", + "name": "行事曆" + }, "conditional": { "card": "面板", "change_type": "變更類別", @@ -2735,6 +2813,7 @@ "intro": "{name}你好,歡迎使用 Home Assistant。為您的家庭取個名字吧?", "intro_location": "希望能夠提供您所居住的區域,資料將協助所顯示的資訊內容、設定以日出日落為基礎的自動化。此資料將絕不會與外部網路進行分享。", "intro_location_detect": "設定可以藉由一次性請求外部服務、以協助您填寫此項資料。", + "location_name": "Home Assistant 安裝名稱", "location_name_default": "首頁" }, "integration": { From f0201de4cc42f5d435ec7eee3706abd776e85a1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Thu, 27 Aug 2020 14:52:57 +0200 Subject: [PATCH 088/300] Round with 1 decimal (#6715) --- src/data/weather.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/data/weather.ts b/src/data/weather.ts index 199a5e68e9..369a64ec34 100644 --- a/src/data/weather.ts +++ b/src/data/weather.ts @@ -2,6 +2,7 @@ import { SVGTemplateResult, svg, html, TemplateResult, css } from "lit-element"; import { styleMap } from "lit-html/directives/style-map"; import type { HomeAssistant, WeatherEntity } from "../types"; +import { roundWithOneDecimal } from "../util/calculate"; export const weatherSVGs = new Set([ "clear-night", @@ -135,7 +136,7 @@ export const getSecondaryWeatherAttribute = ( return ` ${hass!.localize( `ui.card.weather.attributes.${attribute}` - )} ${value} ${getWeatherUnit(hass!, attribute)} + )} ${roundWithOneDecimal(value)} ${getWeatherUnit(hass!, attribute)} `; }; From 5f46fdb406021c2655829e6a19ea6d551c385e63 Mon Sep 17 00:00:00 2001 From: dklemm Date: Thu, 27 Aug 2020 15:13:21 +0100 Subject: [PATCH 089/300] Restored card margin for narrow viewports (#6454) --- src/panels/lovelace/views/hui-view.ts | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/panels/lovelace/views/hui-view.ts b/src/panels/lovelace/views/hui-view.ts index cc96bae638..05f991575b 100644 --- a/src/panels/lovelace/views/hui-view.ts +++ b/src/panels/lovelace/views/hui-view.ts @@ -394,18 +394,6 @@ export class HUIView extends LitElement { left: calc(16px + env(safe-area-inset-left)); } - @media (max-width: 500px) { - :host { - padding-left: 0; - padding-right: 0; - } - - .column > * { - margin-left: 0; - margin-right: 0; - } - } - @media (max-width: 599px) { .column { max-width: 600px; From a117a19bdf7cc8e4165d357159bef4cdb01929a2 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Fri, 28 Aug 2020 00:32:05 +0000 Subject: [PATCH 090/300] [ci skip] Translation update --- translations/frontend/af.json | 6 +- translations/frontend/ca.json | 4 + translations/frontend/es.json | 4 + translations/frontend/fr.json | 9 +- translations/frontend/hi.json | 7 + translations/frontend/it.json | 8 + translations/frontend/ja.json | 1015 +++++++++++++++++++++++++--- translations/frontend/ko.json | 122 +++- translations/frontend/lv.json | 41 ++ translations/frontend/nb.json | 4 + translations/frontend/nl.json | 156 ++++- translations/frontend/pt-BR.json | 60 ++ translations/frontend/ru.json | 4 + translations/frontend/sl.json | 71 +- translations/frontend/zh-Hant.json | 4 + 15 files changed, 1420 insertions(+), 95 deletions(-) diff --git a/translations/frontend/af.json b/translations/frontend/af.json index 48daeed370..806b29fab4 100644 --- a/translations/frontend/af.json +++ b/translations/frontend/af.json @@ -46,15 +46,15 @@ "state_badge": { "alarm_control_panel": { "armed": "Gewapen", - "armed_away": "Gewapen", + "armed_away": "Aktief", "armed_custom_bypass": "Gewapen", "armed_home": "Gewapen", - "armed_night": "Gewapen", + "armed_night": "Aktief", "arming": "Bewapen Tans", "disarmed": "Ontwapen", "disarming": "Ontwapen", "pending": "Hangend", - "triggered": "Aktief" + "triggered": "Lui" }, "default": { "entity_not_found": "Entiteit nie gevind nie", diff --git a/translations/frontend/ca.json b/translations/frontend/ca.json index 462c8f5c15..5d3ed1ae94 100644 --- a/translations/frontend/ca.json +++ b/translations/frontend/ca.json @@ -1893,7 +1893,9 @@ "section": { "reloading": { "automation": "Actualitza automatitzacions", + "command_line": "Torna a carregar entitats de comandes", "core": "Actualitza ubicació i personalitzacions", + "filter": "Torna a carregar entitats de filtre", "group": "Actualitza grups", "heading": "Tornant a carregar la configuració", "input_boolean": "Actualitza entrades booleanes", @@ -1903,8 +1905,10 @@ "input_text": "Actualitza entrades de text", "introduction": "Algunes parts de Home Assistant es poden actualitzar sense necessitat reiniciar-lo. Si prems actualitza s'esborrarà la configuració YAML actual i se'n carregarà la nova.", "person": "Actualitza persones", + "rest": "Torna a carregar entitats de repòs", "scene": "Actualitza escenes", "script": "Actualitza programes", + "statistics": "Torna a carregar entitats estadístiques", "template": "Torna a carregar entitats de plantilla", "universal": "Torna a carregar entitats del reproductor universal", "zone": "Actualitza zones" diff --git a/translations/frontend/es.json b/translations/frontend/es.json index b5b48395e2..a0d686f11c 100644 --- a/translations/frontend/es.json +++ b/translations/frontend/es.json @@ -1893,7 +1893,9 @@ "section": { "reloading": { "automation": "Recargar automatizaciones", + "command_line": "Recargar entidades de línea de comandos", "core": "Recargar ubicación y personalizaciones", + "filter": "Recargar entidades de filtro", "group": "Recargar grupos", "heading": "Recargando la configuración YAML", "input_boolean": "Recargar los campos booleanos", @@ -1903,8 +1905,10 @@ "input_text": "Recargar los campos de texto", "introduction": "Algunas partes de Home Assistant pueden recargarse sin necesidad de reiniciar. Al pulsar en recargar se descartará la configuración YAML actual y se cargará la nueva.", "person": "Recargar personas", + "rest": "Recargar entidades rest", "scene": "Recargar escenas", "script": "Recargar scripts", + "statistics": "Recargar entidades de estadísticas", "template": "Recargar entidades de plantilla", "universal": "Recargar entidades de reproductor multimedia universal", "zone": "Recargar zonas" diff --git a/translations/frontend/fr.json b/translations/frontend/fr.json index a4511b066c..551a996ed0 100644 --- a/translations/frontend/fr.json +++ b/translations/frontend/fr.json @@ -1419,7 +1419,7 @@ "filter": { "filter": "Filtre", "show_disabled": "Afficher les entités désactivées", - "show_readonly": "Afficher les entités désactivées", + "show_readonly": "Afficher les entités en lecture seule", "show_unavailable": "Afficher les entités non disponibles" }, "header": "Entités", @@ -1525,6 +1525,9 @@ "no_device": "Entités sans appareils", "no_devices": "Cette intégration n'a pas d'appareils.", "options": "Options", + "reload": "Recharger", + "reload_confirm": "L'intégration a été rechargée", + "reload_restart_confirm": "Redémarrer Home Assistant pour finaliser le rechargement de cette intégration", "rename": "Renommer", "restart_confirm": "Redémarrer Home Assistant pour terminer la suppression de cette intégration", "settings_button": "Modifier les paramètres pour {integration}", @@ -1890,7 +1893,9 @@ "section": { "reloading": { "automation": "Recharger les automatisations", + "command_line": "Recharger les entités de ligne de commande", "core": "Recharger les emplacements et personnalisations", + "filter": "Recharger les entités de filtre", "group": "Recharger les groupes", "heading": "Rechargement de la configuration", "input_boolean": "Recharger les booléens d'entrée", @@ -1900,8 +1905,10 @@ "input_text": "Recharger les textes d'entrée", "introduction": "Certaines parties de Home Assistant peuvent être rechargées sans nécessiter de redémarrage. Le fait de cliquer sur recharger déchargera leur configuration actuelle et chargera la nouvelle.", "person": "Recharger les personnes", + "rest": "Recharger les entités REST", "scene": "Recharger les scènes", "script": "Recharger les scripts", + "statistics": "Recharger les entités de statistiques", "template": "Recharger les entités modèles", "zone": "Recharger les zones" }, diff --git a/translations/frontend/hi.json b/translations/frontend/hi.json index b724890401..f71427a683 100644 --- a/translations/frontend/hi.json +++ b/translations/frontend/hi.json @@ -308,6 +308,7 @@ "rename_dialog": "इस कॉन्फ़िगरेशन प्रविष्टि का नाम संपादित करें", "rename_input_label": "प्रवेश का नाम" }, + "introduction": "In questa schermata è possibile configurare Home Assistant e i suoi componenti. Non è ancora possibile configurare tutto tramite l'interfaccia, ma ci stiamo lavorando.", "logs": { "title": "लॉग्स" }, @@ -363,6 +364,9 @@ } } }, + "logbook": { + "showing_entries": "Visualizza gli inserimenti per" + }, "lovelace": { "cards": { "starting": { @@ -370,6 +374,9 @@ "header": "होम असिस्टेंट शुरू हो रहा है ..." } }, + "changed_toast": { + "message": "La configurazione della interfaccia di Lovelaceper questa dashboard è stata aggiornata, vuoi ricaricare la pagina per vedere i cambiamenti?" + }, "editor": { "card": { "entity": { diff --git a/translations/frontend/it.json b/translations/frontend/it.json index 36c65a3173..ad828074a1 100644 --- a/translations/frontend/it.json +++ b/translations/frontend/it.json @@ -1525,6 +1525,9 @@ "no_device": "Entità senza dispositivi", "no_devices": "Questa integrazione non ha dispositivi.", "options": "Opzioni", + "reload": "Ricarica", + "reload_confirm": "L'integrazione è stata ricaricata", + "reload_restart_confirm": "Riavvia Home Assistant per completare il ricaricamento di questa integrazione", "rename": "Rinomina", "restart_confirm": "Riavvia Home Assistant per completare la rimozione di questa integrazione", "settings_button": "Modificare le impostazioni per {integration}.", @@ -1890,7 +1893,9 @@ "section": { "reloading": { "automation": "Ricarica le Automazioni", + "command_line": "Ricarica le entità della riga di comando", "core": "Ricarica la Posizione e le Personalizzazioni", + "filter": "Ricaricare le entità filtro", "group": "Ricarica i Gruppi", "heading": "Ricarica Configurazione YAML", "input_boolean": "Ricarica input booleani", @@ -1900,9 +1905,12 @@ "input_text": "Ricarica input testuali", "introduction": "Alcune parti di Home Assistant possono essere ricaricate senza richiedere un riavvio. Premendo su Ricarica si rimuoverà la loro Configurazione YAML attuale e si caricherà la versione aggiornata.", "person": "Ricarica le persone", + "rest": "Ricarica le entità della piattaforma rest", "scene": "Ricarica le Scene", "script": "Ricarica gli Script", + "statistics": "Ricaricare le entità statistiche", "template": "Ricaricare le entità modello", + "universal": "Ricarica le entità del lettore multimediale universale", "zone": "Ricarica le zone" }, "server_management": { diff --git a/translations/frontend/ja.json b/translations/frontend/ja.json index d1f17d3c64..eb5c64a3ad 100644 --- a/translations/frontend/ja.json +++ b/translations/frontend/ja.json @@ -1,9 +1,16 @@ { "config_entry": { "disabled_by": { - "integration": "インテグレーション" + "config_entry": "構成エントリ", + "integration": "インテグレーション", + "user": "ユーザー" } }, + "groups": { + "system-admin": "管理者", + "system-read-only": "読み取り専用ユーザー", + "system-users": "ユーザー" + }, "panel": { "calendar": "カレンダー", "config": "設定", @@ -12,6 +19,7 @@ "logbook": "ログブック", "mailbox": "メールボックス", "map": "地図", + "profile": "プロファイル", "shopping_list": "買い物リスト", "states": "状態" }, @@ -22,9 +30,23 @@ "off": "オフ", "on": "オン" }, + "hvac_action": { + "cooling": "冷房", + "drying": "乾燥", + "fan": "ファン", + "heating": "暖房", + "idle": "アイドル", + "off": "オフ" + }, "preset_mode": { + "activity": "アクティビティ", "away": "外出", - "home": "在宅" + "boost": "ブースト", + "comfort": "快適さ", + "eco": "エコ", + "home": "在宅", + "none": "なし", + "sleep": "スリープ" } }, "humidifier": { @@ -43,9 +65,13 @@ }, "state_badge": { "alarm_control_panel": { - "armed_home": "アームしました" + "armed_home": "アームしました", + "disarming": "解除", + "triggered": "トリガー" }, "default": { + "entity_not_found": "エンティティが見つかりません", + "error": "エラー", "unknown": "不明" }, "device_tracker": { @@ -59,6 +85,7 @@ }, "state": { "alarm_control_panel": { + "pending": "保留中", "triggered": "トリガー" }, "automation": { @@ -123,7 +150,8 @@ "on": "在宅" }, "problem": { - "off": "OK" + "off": "OK", + "on": "問題" }, "safety": { "off": "安全", @@ -151,13 +179,16 @@ "on": "オン" }, "camera": { - "idle": "アイドル" + "idle": "アイドル", + "recording": "録音", + "streaming": "ストリーミング" }, "climate": { "cool": "冷房", "dry": "ドライ", "fan_only": "ファンのみ", "heat": "暖房", + "heat_cool": "暖/冷", "off": "オフ" }, "configurator": { @@ -166,7 +197,10 @@ }, "cover": { "closed": "閉鎖", - "opening": "扉" + "closing": "終了", + "open": "開く", + "opening": "扉", + "stopped": "停止" }, "default": { "off": "オフ", @@ -183,13 +217,18 @@ }, "group": { "closed": "閉鎖", + "closing": "終了", "home": "在宅", "locked": "ロックされました", "not_home": "外出", "off": "オフ", "ok": "OK", "on": "オン", - "opening": "扉" + "open": "開く", + "opening": "扉", + "problem": "問題", + "stopped": "停止", + "unlocked": "ロック 解除" }, "input_boolean": { "off": "オフ", @@ -199,23 +238,32 @@ "off": "オフ", "on": "オン" }, + "lock": { + "locked": "ロック", + "unlocked": "ロック 解除" + }, "media_player": { "idle": "アイドル", "off": "オフ", "on": "オン", "paused": "一時停止", - "playing": "再生中" + "playing": "再生中", + "standby": "スタンバイ" }, "person": { "home": "在宅" }, "plant": { - "ok": "OK" + "ok": "OK", + "problem": "問題" }, "remote": { "off": "オフ", "on": "オン" }, + "scene": { + "scening": "硬化" + }, "script": { "off": "オフ", "on": "オン" @@ -232,13 +280,25 @@ "off": "オフ", "on": "オン" }, + "timer": { + "active": "アクティブ", + "idle": "アイドル", + "paused": "一時停止" + }, "vacuum": { + "cleaning": "クリーニング", + "docked": "ドッキング", + "error": "エラー", + "idle": "アイドル", "off": "オフ", - "on": "オン" + "on": "オン", + "paused": "一時停止", + "returning": "ドックに戻る" }, "weather": { "clear-night": "晴れた夜", "cloudy": "曇り", + "exceptional": "半端じゃない", "fog": "霧", "hail": "雹", "lightning": "雷", @@ -249,16 +309,18 @@ "snowy": "雪", "snowy-rainy": "みぞれ", "sunny": "晴れ", - "windy": "強風" + "windy": "強風", + "windy-variant": "風が強い" }, "zwave": { "default": { + "dead": "死んで", "initializing": "初期化中", "ready": "準備完了", "sleeping": "スリープ" }, "query_stage": { - "dead": " ({query_stage})", + "dead": "死んで ({query_stage})", "initializing": "初期化中 ( {query_stage} )" } } @@ -271,22 +333,37 @@ }, "card": { "alarm_control_panel": { + "arm_custom_bypass": "カスタム バイパス", + "arm_night": "夜", "clear_code": "削除", - "code": "パスワード" + "code": "パスワード", + "disarm": "解除" }, "automation": { + "last_triggered": "最後にトリガーされた", "trigger": "トリガー" }, "camera": { "not_available": "画像がありません。" }, "climate": { + "aux_heat": "暖める", "away_mode": "外出モード", + "cooling": "{name} 冷房", + "current_temperature": "{name}現在の温度", "currently": "現在", + "fan_mode": "ファンモード", + "heating": "{name}暖房", + "high": "高", + "low": "低", "on_off": "オン/オフ", "operation": "運転切替", + "preset_mode": "プリセット", + "swing_mode": "スイングモード", "target_humidity": "目標湿度", - "target_temperature": "目標温度" + "target_temperature": "目標温度", + "target_temperature_entity": "{name}目標温度", + "target_temperature_mode": "{name}目標温度{mode}" }, "counter": { "actions": { @@ -295,7 +372,15 @@ "reset": "リセット" } }, + "cover": { + "position": "位置", + "tilt_position": "傾斜位置" + }, "fan": { + "direction": "方向", + "forward": "進む", + "oscillate": "振動", + "reverse": "戻す", "speed": "風速" }, "humidifier": { @@ -306,9 +391,12 @@ }, "light": { "brightness": "明るさ", - "color_temperature": "色温度" + "color_temperature": "色温度", + "effect": "効果", + "white_value": "白さの値" }, "lock": { + "code": "コード", "lock": "ロック", "unlock": "ロック解除" }, @@ -318,6 +406,8 @@ "media_play": "再生", "media_play_pause": "再生/一時停止", "media_previous_track": "前", + "sound_mode": "サウンドモード", + "source": "ソース:", "text_to_speak": "音声合成", "turn_off": "終了する", "turn_on": "オンにする" @@ -336,8 +426,28 @@ "service": { "run": "実行" }, + "timer": { + "actions": { + "cancel": "キャンセル", + "finish": "完了", + "pause": "一時停止", + "start": "開始" + } + }, + "vacuum": { + "actions": { + "resume_cleaning": "クリーニングを再開する", + "return_to_base": "ドックに戻る", + "start_cleaning": "クリーニングを開始", + "turn_off": "終了する", + "turn_on": "終了する" + } + }, "water_heater": { "away_mode": "外出モード", + "currently": "現在", + "on_off": "オン/オフ", + "operation": "操作", "target_temperature": "目標温度" }, "weather": { @@ -346,6 +456,7 @@ "humidity": "湿度", "precipitation": "降水量", "temperature": "温度", + "visibility": "可視性", "wind_speed": "風速" }, "cardinal_direction": { @@ -375,6 +486,7 @@ "and": "そして", "back": "戻る", "cancel": "キャンセル", + "close": "閉じる", "delete": "削除", "error_required": "必須", "loading": "読込中", @@ -384,7 +496,9 @@ "overflow_menu": "オーバーフローメニュー", "previous": "前", "refresh": "更新", + "save": "保存", "successfully_deleted": "正常に削除されました", + "successfully_saved": "正常に保存されました", "undo": "元に戻す", "yes": "はい" }, @@ -450,15 +564,27 @@ "unsupported_format": "サポートされていない形式です。JPEG、PNG、またはGIF画像を選択してください。" }, "related-items": { + "area": "エリア", + "automation": "次の自動化の一部", + "device": "デバイス", + "entity": "関連エンティティ", + "group": "次のグループの一部", "integration": "インテグレーション", - "no_related_found": "関連するアイテムが見つかりませんでした。" + "no_related_found": "関連するアイテムが見つかりませんでした。", + "scene": "次のシーンの一部", + "script": "次のスクリプトの一部" }, "relative_time": { "duration": { - "hour": "{count} {count, plural,\n one {時間}\n other {時間}\n}" + "day": "{count} {count, plural,\n one {日}\n other {日間}\n}", + "hour": "{count} {count, plural,\n one {時間}\n other {時間}\n}", + "minute": "{count} {count, plural,\n one {分}\n other {分}\n}", + "second": "{count} {count, plural,\n one {秒}\n other {秒}\n}", + "week": "{count} {count, plural,\n one {週間}\n other {週間}\n}" }, "future": "{time}以内", "just_now": "ちょうど今", + "never": "いつでも", "past": "{time}前" }, "service-picker": { @@ -468,6 +594,7 @@ "dialogs": { "config_entry_system_options": { "enable_new_entities_description": "無効にするには、 {integration} から検出された新しいエンティティは Home Assistant に自動的に追加されません。", + "enable_new_entities_label": "新しく追加されたエンティティを有効にします。", "title": "{integration} のシステムオプション", "update": "更新" }, @@ -475,6 +602,7 @@ "title": "ドメインを切り替え" }, "entity_registry": { + "control": "コントロール", "dismiss": "消去", "editor": { "confirm_delete": "このエントリを削除してもよろしいですか?", @@ -486,10 +614,13 @@ "icon": "アイコンの上書き", "icon_error": "アイコンは「prefix:iconname」の形式にする必要があります(例:「mdi:home」)。", "name": "名前の上書き", + "note": "注: これは、まだすべてのインテグレーションで動作しない場合があります。", "unavailable": "このエンティティは現在利用できません。", "update": "更新" }, - "no_unique_id": "このエンティティには一意のIDがないため、その設定はUIから管理できません。" + "no_unique_id": "このエンティティには一意のIDがないため、その設定はUIから管理できません。", + "related": "関連", + "settings": "設定" }, "generic": { "cancel": "キャンセル", @@ -544,12 +675,26 @@ "person": { "create_zone": "現在地からゾーンを作成" }, + "restored": { + "confirm_remove_text": "このエンティティを削除しますか?", + "confirm_remove_title": "エンティティを削除しますか?", + "not_provided": "このエンティティは現在利用できず、削除、変更、または機能不全の統合または孤立したデバイスです。", + "remove_action": "エンティティの削除", + "remove_intro": "エンティティが使用されなくなった場合は、削除することでクリーンアップできます。" + }, + "script": { + "last_action": "最後のアクション", + "last_triggered": "最後にトリガーされた" + }, "settings": "エンティティ設定", "sun": { "elevation": "高度", "rising": "日の出ます", "setting": "日の入っています" }, + "updater": { + "title": "更新手順" + }, "vacuum": { "clean_spot": "クリーンスポット", "commands": "掃除機コマンド:", @@ -574,6 +719,14 @@ "title": "{device}デバッグ情報", "triggers": "トリガー" }, + "options_flow": { + "form": { + "header": "オプション" + }, + "success": { + "description": "オプションを保存しました。" + } + }, "voice_command": { "did_not_hear": "Home Assistant は何も聞きませんでした", "error": "エラーが発生しました", @@ -586,15 +739,30 @@ "buttons": { "add": "このデバイス経由でデバイスを追加", "clusters": "クラスタの管理", + "reconfigure": "デバイスを再設定", + "remove": "デバイスを削除", "zigbee_information": "Zigbee 情報" }, + "confirmations": { + "remove": "デバイスを削除してもよろしいですか?" + }, "device_signature": "Zigbee デバイス署名", + "last_seen": "最後に見た", + "manuf": "{manufacturer}", + "no_area": "エリアなし", + "power_source": "電源", + "quirk": "癖", "services": { + "reconfigure": "ZHAデバイスを再構成します(デバイスの修復)。デバイスに問題がある場合に使用します。問題のデバイスがバッテリー駆動のデバイスである場合は、このサービスを使用するときに、デバイスが起動し、コマンドを受け入れていることを確認してください。", "remove": "Zigbee ネットワークからデバイスを削除します。", + "updateDeviceName": "デバイス レジストリでこのデバイスのカスタム名を設定します。", "zigbee_information": "デバイスのZigbee情報を表示します。" }, + "unknown": "不明", "zha_device_card": { - "device_name_placeholder": "デバイス名の変更" + "area_picker_label": "エリア", + "device_name_placeholder": "デバイス名の変更", + "update_name_button": "名前の更新" } } }, @@ -611,6 +779,7 @@ "remember": "覚えて" }, "notification_drawer": { + "click_to_configure": "ボタンをクリックして{entity}を設定します", "close": "閉じる", "empty": "通知はありません", "title": "通知" @@ -619,6 +788,7 @@ "connection_lost": "切断されました。再接続中...", "service_call_failed": "サービス{service}の呼び出しに失敗しました。", "started": "ホームアシスタントが開始されました!", + "starting": "Home Assistantが起動中です。終了するまですべてが利用できるわけではありません。", "triggered": "トリガーしました {name}" }, "panel": { @@ -655,6 +825,9 @@ "picker": { "create_area": "エリアの作成", "header": "エリア", + "integrations_page": "インテグレーションページ", + "introduction": "エリアは、デバイスの場所を整理するために使用されます。この情報は、ホームアシスタント全体で、インターフェイス、アクセス権、他のシステムとの統合を整理するために使用されます。", + "introduction2": "デバイスをエリアに配置するには、次のリンクを使用して統合ページに移動し、構成済みの統合をクリックしてデバイス カードにアクセスします。", "no_areas": "まだエリアがないようです!" } }, @@ -669,6 +842,7 @@ "duplicate": "デュプリケート", "header": "アクション", "introduction": "アクションは、オートメーションがトリガーされたときにHome Assistantが実行するものです。\n\n [アクションの詳細](https://home-assistant.io/docs/automation/action/)", + "learn_more": "アクションの詳細", "name": "アクション", "type_select": "アクションの種類", "type": { @@ -685,10 +859,15 @@ "label": "条件" }, "delay": { - "delay": "遅延" + "delay": "遅延", + "label": "遅延" }, "device_id": { - "action": "アクション" + "action": "アクション", + "extra_fields": { + "code": "コード" + }, + "label": "デバイス" }, "event": { "event": "イベント:", @@ -713,11 +892,17 @@ } } }, + "scene": { + "label": "シーンをアクティブにする" + }, "service": { + "label": "通話サービス", "service_data": "サービスのデータ" }, "wait_template": { - "timeout": "タイムアウト(オプション)" + "label": "待つ", + "timeout": "タイムアウト(オプション)", + "wait_template": "待機テンプレート" } }, "unsupported_action": "未サポートのアクション:{action}" @@ -730,11 +915,21 @@ "duplicate": "デュプリケート", "header": "条件", "introduction": "条件はオプションであり、すべての条件が満たされない限り、それ以上の実行を防ぎます。", + "learn_more": "条件の詳細", "name": "条件", "type_select": "条件の種類", "type": { + "and": { + "label": "そして" + }, "device": { - "condition": "条件" + "condition": "条件", + "extra_fields": { + "above": "上", + "below": "以下に", + "for": "期間" + }, + "label": "デバイス" }, "not": { "label": "ない" @@ -745,11 +940,18 @@ "label": "数的な状態", "value_template": "バリューテンプレート(オプショナル)" }, + "or": { + "label": "または" + }, "state": { "label": "状態", "state": "状態" }, "sun": { + "after": "後:", + "after_offset": "オフセット後(オプション)", + "before": "前:", + "before_offset": "オフセット前(オプション)", "label": "太陽", "sunrise": "日の出", "sunset": "日の入" @@ -759,9 +961,12 @@ "value_template": "バリューテンプレート" }, "time": { + "after": "後", + "before": "前", "label": "時間" }, "zone": { + "entity": "場所に対応するエンティティ", "label": "ゾーン", "zone": "ゾーン" } @@ -769,10 +974,16 @@ "unsupported_condition": "未サポートの条件:{condition}" }, "default_name": "新しいオートメーション", + "description": { + "label": "説明", + "placeholder": "オプションの説明" + }, "edit_ui": "UI で編集", "edit_yaml": "YAML で編集", "enable_disable": "オートメーションの有効化/無効化", "introduction": "オートメーションを使用して、あなたの家を生き生きとさせましょう。", + "load_error_not_editable": "編集できるのは、automations.yamlのオートメーションのみです。", + "load_error_unknown": "オートメーションの読み込み中にエラーが発生しました ({err_no})。", "max": { "parallel": "並列実行の最大数", "queued": "キューの長さ" @@ -796,10 +1007,17 @@ "duplicate": "複製", "header": "トリガー", "introduction": "トリガーはオートメーションルールの処理を開始させます。同じルールに対して複数のトリガーを指定することが可能です。トリガーが開始されると、Home Assistantは条件があれば確認し、アクションを呼び出します。\n\n[トリガーについて](https://home-assistant.io/docs/automation/trigger/)", + "learn_more": "トリガーの詳細", "name": "トリガー", "type_select": "トリガーの種類", "type": { "device": { + "extra_fields": { + "above": "上", + "below": "以下に", + "for": "期間" + }, + "label": "デバイス", "trigger": "トリガー" }, "event": { @@ -808,20 +1026,32 @@ "label": "イベント" }, "geo_location": { + "enter": "入力", + "event": "イベント:", + "label": "ジオロケーション", + "leave": "去る", + "source": "ソース:", "zone": "ゾーン" }, "homeassistant": { + "event": "イベント:", "label": "Home Assistant", "shutdown": "停止", "start": "起動" }, "mqtt": { - "label": "MQTT" + "label": "MQTT", + "payload": "ペイロード(オプション)", + "topic": "トピック" }, "numeric_state": { + "above": "上", + "below": "以下に", + "label": "数値の状態", "value_template": "バリューテンプレート(オプショナル)" }, "state": { + "for": "のために", "from": "変化前", "label": "状態", "to": "変化後" @@ -840,16 +1070,32 @@ "label": "テンプレート", "value_template": "バリューテンプレート" }, + "time_pattern": { + "hours": "時間", + "label": "タイムパターン", + "minutes": "分", + "seconds": "秒" + }, "time": { + "at": "時期", "label": "時刻" }, + "webhook": { + "label": "Webhook", + "webhook_id": "Webhook ID" + }, "zone": { + "enter": "いる", + "entity": "場所に対応するエンティティ", "event": "イベント:", + "label": "ゾーン", + "leave": "去る", "zone": "ゾーン" } }, "unsupported_platform": "サポートされていないプラットフォーム: {platform}" - } + }, + "unsaved_confirm": "未保存の変更があります。本当に出て行きますか?" }, "picker": { "add_automation": "オートメーションの追加", @@ -861,60 +1107,172 @@ "name": "名前" }, "introduction": "オートメーションエディタを使用すると、オートメーションを作成および編集できます。以下のリンクをクリックして、ホーム アシスタントを正しく設定したことを確認する手順を確認してください。", + "learn_more": "自動化の詳細", "no_automations": "編集可能なオートメーションが見つかりません。", "only_editable": "automations.yaml で定義されたオートメーションのみが編集可能です。", + "pick_automation": "編集するオートメーションを選択", "show_info_automation": "オートメーションに関する情報を表示" } }, "cloud": { "account": { "alexa": { - "config_documentation": "設定に関するドキュメント" + "config_documentation": "設定に関するドキュメント", + "disable": "無効", + "enable": "有効", + "enable_ha_skill": "AlexaのHome Assistantスキルを有効にする", + "enable_state_reporting": "状態レポートを有効にする", + "info": "AlexaとHome Assistant Cloudの統合により、すべてのAlexa対応デバイスを介してすべてのHome Assistantデバイスを制御できます。", + "info_state_reporting": "状態レポートを有効にすると、ホームアシスタントは公開されたエンティティのすべての状態変更を Amazon に送信します。これにより、常にAlexaアプリで最新の状態を表示し、状態の変更を使用してルーチンを作成できます。", + "manage_entities": "エンティティの管理", + "state_reporting_error": "状態を{enable_disable}報告できません。", + "sync_entities": "エンティティの同期", + "sync_entities_error": "エンティティの同期に失敗しました:", + "title": "Alexa" }, + "connected": "接続", + "connection_status": "クラウド接続の状態", + "fetching_subscription": "サブスクリプションを取得しています。", "google": { "config_documentation": "設定に関するドキュメント", "devices_pin": "セキュリティデバイス PIN", + "enable_ha_skill": "GoogleアシスタントのHome Assistantスキルを有効にする", + "enable_state_reporting": "状態レポートを有効にする", + "enter_pin_error": "ピンを保存できません:", "enter_pin_hint": "セキュリティデバイスを使用するには PIN を入力してください", - "security_devices": "セキュリティデバイス" + "enter_pin_info": "セキュリティ デバイスと通信するには、ピンを入力してください。セキュリティデバイスは、ドア、ガレージドア、ロックです。Google アシスタント経由でこのようなデバイスとやり取りする際に、このピンを入力する必要があります。", + "info": "ホーム アシスタント クラウド向けの Google アシスタント統合機能を使用すると、Google アシスタント対応のデバイスを介してすべてのホーム アシスタント デバイスを制御できます。", + "info_state_reporting": "状態レポートを有効にすると、ホーム アシスタントは公開されたエンティティのすべての状態変更を Google に送信します。これにより、Google アプリで最新の状態を常に確認できます。", + "manage_entities": "エンティティの管理", + "security_devices": "セキュリティデバイス", + "sync_entities": "エンティティをGoogleに同期", + "sync_entities_404_message": "エンティティをGoogleに同期できませんでした。Googleに「OK Google、デバイスを同期して」と尋ねてエンティティを同期してください。", + "title": "Googleアシスタント" }, "integrations": "インテグレーション", + "integrations_introduction": "ホームアシスタントクラウドの統合により、ホームアシスタントインスタンスをインターネット上で公開することなく、クラウド内のサービスに接続できます。", + "integrations_introduction2": "ウェブサイトを確認してください", + "integrations_link_all_features": "利用可能なすべての機能", + "manage_account": "アカウントの管理", + "nabu_casa_account": "Nabu Casa アカウント", + "not_connected": "接続されていません", "remote": { - "info": "Home Assistant Cloud は、自宅の外からインスタンスへの安全なリモート接続を提供します。" + "access_is_being_prepared": "リモート アクセスの準備中です。準備ができたらお知らせします。", + "certificate_info": "証明書情報", + "info": "Home Assistant Cloud は、自宅の外からインスタンスへの安全なリモート接続を提供します。", + "instance_is_available": "インスタンスは次の場所にあります", + "instance_will_be_available": "インスタンスは次の時点で利用可能になります。", + "link_learn_how_it_works": "仕組みを学ぶ", + "title": "リモートコントロール" }, + "sign_out": "サインアウト", + "thank_you_note": "Home Assistant Cloudにご参加いただきありがとうございます。私たちは皆のために優れたホームオートメーション体験を作ることができるのはあなたのような人々のおかげです。ありがとうございました!", "webhooks": { "disable_hook_error_msg": "ウェブホックを無効にできませんでした:", + "info": "webhook によってトリガーされるように構成された URL を公開可能な URL を与えることができ、インスタンスをインターネットに公開することなく、どこからでもホームアシスタントにデータを送信できます。", + "link_learn_more": "Webhookを利用した自動化の作成について詳しく学んでください。", + "loading": "読み込み中...", "manage": "管理", - "no_hooks_yet_link_integration": "Webhook ベースのインテグレーション" + "no_hooks_yet": "まだwebhookがないようです。はじめに", + "no_hooks_yet_link_automation": "Webhookオートメーション", + "no_hooks_yet_link_integration": "Webhook ベースのインテグレーション", + "no_hooks_yet2": "または作成することによって", + "title": "ウェブフック" } }, "alexa": { + "banner": "この UI を介して公開されるエンティティの編集は、configuration.yaml でエンティティ フィルターを構成しているため無効になります。", "expose": "Alexa に公開", + "exposed_entities": "公開されたエンティティ", + "not_exposed_entities": "公開されていないエンティティ", "title": "Alexa" }, "caption": "Home Assistant Cloud", "description_features": "自宅の外からコントロールするために、AlexaとGoogleアシスタントに統合します。", + "description_login": "{email}としてログインしました", + "description_not_login": "ログインしていない", "dialog_certificate": { - "close": "閉じる" + "certificate_expiration_date": "証明書の有効期限", + "certificate_information": "証明書情報", + "close": "閉じる", + "fingerprint": "証明書のフィンガープリント:", + "will_be_auto_renewed": "自動的に更新されます" }, "dialog_cloudhook": { + "available_at": "Webhookは次のURLで入手できます。", "close": "閉じる", "confirm_disable": "このウェブホックを無効化してもよろしいですか?", "copied_to_clipboard": "クリップボードにコピーしました", + "info_disable_webhook": "このウェブフックを使用したくない場合は、次の手順を実行します。", "link_disable_webhook": "無効にする", - "view_documentation": "ドキュメントを見る" + "managed_by_integration": "この webhook は統合によって管理され、無効にすることはできません。", + "view_documentation": "ドキュメントを見る", + "webhook_for": "{name} Webhook" + }, + "forgot_password": { + "check_your_email": "パスワードをリセットする方法については、メールを確認してください。", + "email": "Eメール", + "email_error_msg": "無効な電子メール", + "instructions": "メールアドレスを入力してください。パスワードをリセットするためのリンクが送信されます。", + "send_reset_email": "リセットメールを送信", + "subtitle": "パスワードをお忘れですか", + "title": "パスワードを忘れた場合" }, "google": { + "banner": "この UI を介して公開されるエンティティの編集は、configuration.yaml でエンティティ フィルターを構成しているため無効になります。", "disable_2FA": "多要素認証を無効にする", "expose": "Google Assistant に公開", + "exposed_entities": "公開されたエンティティ", + "not_exposed_entities": "公開されていないエンティティ", + "sync_to_google": "変更をGoogleに同期しています。", "title": "Google Assistant" }, "login": { - "learn_more_link": "Home Assistant Cloud の情報をもっと見る。" + "alert_email_confirm_necessary": "ログインする前にメールアドレスを確認する必要があります。", + "alert_password_change_required": "ログインする前にパスワードを変更する必要があります。", + "dismiss": "退出させる", + "email": "Eメール", + "email_error_msg": "無効な電子メール", + "forgot_password": "パスワードをお忘れですか?", + "introduction": "Home Assistant Cloudは、外出中のインスタンスへの安全なリモート接続を提供します。また、AmazonのAlexaやGoogleアシスタントなどのクラウド専用サービスに接続することもできます。", + "introduction2": "このサービスはパートナーによって運営されています", + "introduction2a": "、Home AssistantとHass.ioの創設者によって設立された会社。", + "introduction3": "Home Assistant Cloudは、1か月間の無料トライアル付きのサブスクリプションサービスです。支払い情報は必要ありません。", + "learn_more_link": "Home Assistant Cloud の情報をもっと見る。", + "password": "パスワード", + "password_error_msg": "パスワードは8文字以上です", + "sign_in": "サインイン", + "start_trial": "1か月無料トライアルを開始", + "title": "クラウドログイン", + "trial_info": "支払い情報は必要ありません" }, "register": { + "account_created": "アカウントが作成されました!アカウントを有効にする方法については、メールを確認してください。", + "create_account": "アカウントの作成", + "email_address": "メールアドレス", + "email_error_msg": "無効な電子メール", "feature_amazon_alexa": "Amazon Alexa との統合", "feature_google_home": "Google Assistant との統合", - "information2": "試用版では、Home Assistant Cloud すべての特典にアクセスできます、例えば:" + "feature_remote_control": "家の外でのHome Assistantの制御", + "feature_webhook_apps": "OwnTracksなどのWebhookベースのアプリとの簡単な統合", + "headline": "無料試用を開始", + "information": "アカウントを作成して、Home Assistant Cloudで1か月間の無料トライアルを開始してください。支払い情報は必要ありません。", + "information2": "試用版では、Home Assistant Cloud すべての特典にアクセスできます、例えば:", + "information3": "このサービスはパートナーが運営しています。", + "information3a": "ホームアシスタントとHass.ioの創業者によって設立された会社。", + "information4": "アカウントを登録することにより、以下の条件に同意するものとします。", + "link_privacy_policy": "プライバシーポリシー", + "link_terms_conditions": "利用規約", + "password": "パスワード", + "password_error_msg": "パスワードは 8 文字以上です", + "resend_confirm_email": "確認メールを再送信", + "start_trial": "試用を開始", + "title": "アカウントの登録" + } + }, + "common": { + "editor": { + "confirm_unsaved": "未保存の変更があります。本当に出て行きますか?" } }, "core": { @@ -923,38 +1281,67 @@ "section": { "core": { "core_config": { + "edit_requires_storage": "設定がconfiguration.yamlに保存されているため、エディターが無効になっています。", + "elevation": "高度", + "elevation_meters": "メートル", "external_url": "外部 URL", + "imperial_example": "華氏、ポンド", "internal_url": "内部 URL", - "time_zone": "タイムゾーン" + "latitude": "緯度", + "location_name": "Home Assistantインストールの名前", + "longitude": "経度", + "metric_example": "摂氏、キログラム", + "save_button": "保存", + "time_zone": "タイムゾーン", + "unit_system": "単位システム", + "unit_system_imperial": "インペリアル", + "unit_system_metric": "メトリック" }, - "header": "一般的な設定" + "header": "一般的な設定", + "introduction": "構成の変更は、面倒なプロセスになる可能性があります。私たちは知っています。このセクションでは、あなたの人生を少しでも楽にしようとしています。" } } }, "customize": { + "attributes_customize": "次の属性は既にcustomize.yamlに設定されています。", "attributes_not_set": "次の属性は設定されていません。必要に応じて設定してください。", + "attributes_outside": "次の属性は、customize.yamlの外部からカスタマイズされます。", "attributes_override": "必要に応じてオーバーライドできます。", "attributes_set": "次の属性はプログラム的に設定されています。", "caption": "カスタマイズ", "description": "エンティティのカスタマイズ", + "different_include": "おそらくドメインを介して、globまたは別のものを含む。", "pick_attribute": "オーバーライドする属性を選択してください", "picker": { "entity": "エンティティ", - "header": "カスタマイズ" + "header": "カスタマイズ", + "introduction": "エンティティごとの属性を微調整します。追加/編集されたカスタマイズは、すぐに有効になります。削除されたカスタマイズは、エンティティが更新されたときに有効になります。" }, "warning": { - "include_link": "customize.yaml を含めます" + "include_link": "customize.yaml を含めます", + "include_sentence": "あなたのconfiguration.yamlが正しくないようです", + "not_applied": "ここで行った変更は、その中に書き込まれますが、インクルードが適切に行われなければ、コンフィギュレーションの再読み込み後には適用されません。" } }, "devices": { "add_prompt": "このデバイスを使用した{name}はまだ追加されていません。上の[+]ボタンをクリックして追加できます。", "automation": { + "actions": { + "caption": "何かがトリガーされたとき..." + }, "automations": "オートメーション", + "conditions": { + "caption": "次の場合にのみ何かしてください..." + }, "create": "デバイスからオートメーションを作成", "no_automations": "オートメーションなし", - "no_device_automations": "このデバイスで利用可能なオートメーションはありません。" + "no_device_automations": "このデバイスで利用可能なオートメーションはありません。", + "triggers": { + "caption": "いつ何かをする." + } }, "cant_edit": "編集できるのは、UI で作成された項目のみです。", + "caption": "デバイス", "confirm_delete": "このデバイスを削除してもよろしいですか?", "confirm_rename_entity_ids": "エンティティの ID も変更しますか?", "confirm_rename_entity_ids_warning": "この場合、これらのエンティティを現在使用している構成 (オートメーション、スクリプト、シーン、Lovelace など) は変更されません。", @@ -975,7 +1362,9 @@ "entities": { "add_entities_lovelace": "Lovelaceに追加", "disabled_entities": "{count} {count, plural,\n one {無効なエンティティ}\n other {無効なエンティティ}\n}", - "hide_disabled": "無効を非表示" + "entities": "エンティティ", + "hide_disabled": "無効を非表示", + "none": "このデバイスにはエンティティがありません" }, "name": "名前", "no_devices": "デバイスなし", @@ -999,22 +1388,46 @@ "caption": "エンティティ", "description": "すべて既知のエンティティの一覧", "picker": { + "disable_selected": { + "button": "選択を無効にする", + "confirm_text": "無効化されたエンティティはHome Assistantに追加されません。", + "confirm_title": "{number}エンティティを無効にしますか?" + }, + "enable_selected": { + "button": "選択を有効にする", + "confirm_text": "これにより、ホーム アシスタントが無効になった場合に、再びホーム アシスタントで使用できるようになります。", + "confirm_title": "{number}エンティティを有効にしますか?" + }, "filter": { - "show_readonly": "読み取り専用のエンティティを表示" + "filter": "フィルター", + "show_disabled": "無効なエンティティを表示", + "show_readonly": "読み取り専用のエンティティを表示", + "show_unavailable": "利用できないエンティティの表示" }, "header": "エンティティ", "headers": { "entity_id": "エンティティ ID", "integration": "インテグレーション", - "name": "名前" + "name": "名前", + "status": "ステータス" }, + "introduction": "Home Assistantは、一意に識別できる、これまでに見たすべてのエンティティのレジストリを保持します。これらの各エンティティには、エンティティIDが割り当てられ、このエンティティだけに予約されます。", "introduction2": "エンティティ レジストリを使用して、名前を上書きするか、エンティティ ID を変更するか、またはホーム アシスタントからエントリを削除します。", "remove_selected": { - "confirm_text": "これらのエンティティが含まれている場合は、Lovelace の構成および自動化からそれらを削除する必要があります。" + "button": "選択したものを削除", + "confirm_partly_text": "選択した{selected}エンティティの{selected}削除{removable}のみを削除できます。エンティティが削除できるのは、統合によってエンティティが提供されなくなった場合のみです。削除された統合のエンティティを削除する前に、Home Assistantを再起動する必要がある場合があります。削除可能なエンティティを削除してもよろしいですか?", + "confirm_partly_title": "削除できるのは、選択された{number}エンティティのみです。", + "confirm_text": "これらのエンティティが含まれている場合は、Lovelace の構成および自動化からそれらを削除する必要があります。", + "confirm_title": "{number}エンティティを削除しますか?" }, "search": "エンティティを検索", + "selected": "{number}選択されました", "status": { - "readonly": "読み取り専用" + "disabled": "無効", + "ok": "OK", + "readonly": "読み取り専用", + "restored": "復元", + "unavailable": "利用できません" } } }, @@ -1050,14 +1463,22 @@ } }, "info": { + "built_using": "を使用して構築", "caption": "情報", + "custom_uis": "カスタムの UIs:", "description": "ホーム アシスタントのインストールに関する情報を表示する", + "developed_by": "素晴らしい人々の集まりによって開発されました。", "documentation": "ドキュメント", + "frontend": "フロントエンド ui", "frontend_version": "フロントエンドバージョン: {version} - {type}", + "home_assistant_logo": "ホームアシスタントのロゴ", + "icons_by": "アイコン", "integrations": "インテグレーション", "issues": "問題", + "license": "Apache 2.0ライセンスの下で公開", "path_configuration": "ディスク上に configuration.yaml へのパス: {path}", "server": "サーバー", + "source": "ソース:", "system_health_error": "「システムの正常性」コンポーネントが有効されていません、configuration.yaml に 'system_health:' を追加してください。", "title": "情報" }, @@ -1068,18 +1489,29 @@ }, "integrations": { "add_integration": "インテグレーションを追加", + "caption": "インテグレーション", "config_entry": { + "area": "{area}", "delete": "削除", "delete_button": "{integration} を削除", + "delete_confirm": "この統合を削除しますか?", + "device_unavailable": "デバイスを利用できません", "devices": "{count} {count, plural,\n one {デバイス}\n other {デバイス}\n}", "documentation": "ドキュメント", "entities": "{count} {count, plural,\n one {エンティティ}\n other {エントリー}\n}", + "entity_unavailable": "エンティティは利用できません", + "firmware": "ファームウェア: {version}", + "hub": "経由で接続", + "manuf": "{manufacturer}", "no_area": "エリアなし", + "no_device": "デバイスのないエンティティ", + "no_devices": "この統合にはデバイスがありません。", "options": "オプション", "reload": "再読込", "reload_confirm": "インテグレーションが再読み込みされました", "reload_restart_confirm": "ホームアシスタントを再起動してこのインテグレーションの再読み込みを完了してください。\n", "rename": "名前を変更", + "restart_confirm": "ホーム アシスタントを再起動して、この統合の削除を完了します。", "settings_button": "{integration} の設定を編集", "system_options": "システムオプション", "system_options_button": "{integration} のシステムオプション", @@ -1092,16 +1524,22 @@ "dismiss": "ダイアログを閉じる", "error_saving_area": "エリアを保存できません: {error}", "external_step": { - "description": "この手順を完了するには、外部のウエブサイトにアクセスする必要があります。" + "description": "この手順を完了するには、外部のウエブサイトにアクセスする必要があります。", + "open_site": "ウェブサイトを開く" }, "finish": "完了", "loading_first_time": "インテグレーションのインストールを完了するまでお待ちください", + "not_all_required_fields": "必須フィールドの一覧に入力するわけではありません。", "submit": "送信" }, + "configure": "構成", + "configured": "設定済み", "description": "インテグレーションの管理とセットアップ", "details": "インテグレーションの詳細", + "discovered": "発見", "home_assistant_website": "Home Assistant のウェブサイト", "ignore": { + "confirm_delete_ignore": "これにより、検出された統合が検出されると、統合が再び表示されます。再起動が必要な場合や、しばらく時間がかかる場合があります。", "confirm_delete_ignore_title": "{name} の無視を停止しますか?", "confirm_ignore": "この統合を設定しないでよろしいですか?右上のオーバーフローメニューで[無視された統合を表示]をクリックすると、これを元に戻すことができます。", "confirm_ignore_title": "{name} の検出を無視しますか?", @@ -1113,9 +1551,13 @@ }, "integration": "インテグレーション", "integration_not_found": "インテグレーションが見つかりません。", + "new": "新しい統合の設定", "no_integrations": "まだ設定されていないようです。あなたの最初の統合を追加するには、下のボタンをクリックしてください!", + "none": "まだ設定されていません", "none_found": "インテグレーションが見つかりません。", "none_found_detail": "別の検索基準をためしてみます。", + "note_about_integrations": "まだすべての統合をUI経由で設定できるわけではありません。", + "note_about_website_reference": "より多くが利用可能です", "rename_dialog": "このコンフィグレーションエントリーの名前を変更", "rename_input_label": "エントリー名", "search": "インテグレーションを検索" @@ -1125,8 +1567,10 @@ "caption": "ログ", "clear": "消去", "description": "Home Assistantログを表示する", + "details": "ログの詳細( {level} )", "load_full_log": "完全な Home Assistant ログを読み込む", "loading_log": "エラーログを読み込んでいます…", + "multiple_messages": "メッセージは最初に{time}発生し、 {counter}回表示されます", "no_errors": "エラーは報告されていません。", "no_issues": "新しい問題はありません!", "refresh": "更新", @@ -1151,7 +1595,9 @@ "edit_dashboard": "ダッシュボードを編集", "icon": "アイコン", "new_dashboard": "新しいダッシュボードを追加", + "remove_default": "このデバイスのデフォルトとして削除", "require_admin": "管理者のみ", + "set_default": "このデバイスでデフォルトとして設定", "show_sidebar": "サイドバーに表示", "title": "タイトル", "title_required": "タイトルが必要です。", @@ -1212,6 +1658,7 @@ "description_listen": "トピックをリッスン", "description_publish": "パケットをパブリッシュ", "listening_to": "リッスンします", + "message_received": "{time}に{topic}で受信したメッセージ{id} {time} :", "payload": "ペイロード (テンプレート可)", "publish": "パブリッシュ", "start_listening": "リッスンを開始", @@ -1306,15 +1753,28 @@ } }, "person": { + "add_person": "人を追加", "caption": "人", + "confirm_delete": "このユーザーを削除しますか?", + "confirm_delete2": "このユーザーに属するすべてのデバイスは割り当て解除されます。", + "create_person": "人を作成", "description": "Home Assistant を追跡している人の管理。", "detail": { "create": "作成", "delete": "削除", + "device_tracker_intro": "このユーザーに属するデバイスを選択します。", + "device_tracker_pick": "追跡するデバイスを選択", + "device_tracker_picked": "デバイスの追跡", "link_integrations_page": "インテグレーションページ", "link_presence_detection_integrations": "プレゼンス検出のインテグレーション", + "linked_user": "リンクされたユーザー", + "name": "名前", + "name_error_msg": "名前は必須です", + "new_person": "新しい人", + "no_device_tracker_available_intro": "人の存在を示すデバイスがある場合は、ここでその人をその人に割り当てることができます。統合ページからプレゼンス検出統合を追加することで、最初のデバイスを追加できます。", "update": "更新" }, + "introduction": "ここでは、Home Assistantで関心のある各人を定義できます。", "no_persons_created_yet": "まだ人を作成していませんですね。", "note_about_persons_configured_in_yaml": "注:configuration.yaml で設定された人は、UI で編集できません。" }, @@ -1327,7 +1787,8 @@ "devices": { "add": "デバイスを追加", "delete": "デバイスを削除", - "header": "デバイス" + "header": "デバイス", + "introduction": "シーンに含めるデバイスを追加します。すべてのデバイスをこのシーンに対して必要な状態に設定します。" }, "entities": { "add": "エンティティを追加", @@ -1354,6 +1815,7 @@ "headers": { "name": "名前" }, + "introduction": "シーン エディタを使用すると、シーンを作成および編集できます。以下のリンクをクリックして、ホーム アシスタントを正しく設定したことを確認する手順を確認してください。", "learn_more": "シーンの情報をもっと見る。", "no_scenes": "編集可能なシーンが見つかりません。", "only_editable": "scenes.yaml で定義されたシーンのみが編集可能です。", @@ -1365,12 +1827,18 @@ "caption": "スクリプト", "description": "スクリプトの作成と編集", "editor": { + "alias": "名前", + "default_name": "新しいスクリプト", + "delete_confirm": "このスクリプトを削除しますか?", "delete_script": "スクリプトを削除", + "header": "スクリプト: {name}", "icon": "アイコン", "id": "エンティティ ID", "id_already_exists": "このIDはすでに存在します", "id_already_exists_save_error": "IDが一意ではないため、このスクリプトを保存できません。別のIDを選択するか、空白のままにして自動的に生成します。", + "introduction": "スクリプトを使用して一連のアクションを実行する。", "link_available_actions": "使用可能なアクションに関する情報をもっと見る。", + "load_error_not_editable": "scripts.yaml内のスクリプトのみが編集可能です。", "max": { "parallel": "並列実行の最大数", "queued": "キューの長さ" @@ -1384,13 +1852,19 @@ "restart": "再起動", "single": "シングル(デフォルト)" }, - "sequence": "シーケンス" + "sequence": "シーケンス", + "sequence_sentence": "このスクリプトのアクションのシーケンス。" }, "picker": { + "add_script": "スクリプトを追加", "edit_script": "スクリプトを編集", + "header": "スクリプト エディタ", "headers": { "name": "名前" }, + "introduction": "スクリプトエディタを使用すると、スクリプトを作成および編集できます。以下のリンクに従って手順を読み、Home Assistantが正しく設定されていることを確認してください。", + "learn_more": "スクリプトの詳細", + "no_scripts": "編集可能なスクリプトが見つかりませんでした", "show_info": "スクリプトに関する情報を表示", "trigger_script": "トリガースクリプト" } @@ -1401,7 +1875,9 @@ "section": { "reloading": { "automation": "オートメーションの再読込", + "command_line": "コマンド ライン エンティティの再読み込み", "core": "ロケーションとカスタマイズの再読込", + "filter": "フィルターエンティティの再読み込み", "group": "グループの再読込", "heading": "設定の再読込", "input_boolean": "入力ブール値を再読み込み", @@ -1411,14 +1887,17 @@ "input_text": "入力テキストを再読み込み", "introduction": "Home Assistant の一部は、再起動を必要とせずに再読込できます。再読込を押すと、現在の設定をアンロードし、新しい設定を読み込みます。", "person": "人の再読込", + "rest": "残りのエンティティの再読み込み", "scene": "シーンの再読込", "script": "スクリプトの再読込", + "statistics": "静的エンティティの再読み込み", "template": "テンプレート エンティティの再読み込み", "universal": "ユニバーサル メディア プレーヤー エンティティの再読み込み", "zone": "ゾーンの再読込" }, "server_management": { "confirm_restart": "Home Assistant を再起動してもよろしいですか?", + "confirm_stop": "Home Assistantを停止してもよろしいですか?", "heading": "サーバー管理", "introduction": "Home Assistant から Home Assistant サーバーを操作します。", "restart": "再起動", @@ -1427,6 +1906,8 @@ "validation": { "check_config": "設定を確認", "heading": "設定の検証", + "introduction": "構成に変更を加えた後、すべてが有効であることを確認する場合は、構成を検証します。", + "invalid": "設定は無効です", "valid": "設定は有効です!" } } @@ -1458,13 +1939,22 @@ "write": "書き込み" }, "users": { + "add_user": { + "caption": "ユーザーの追加", + "create": "作成する", + "name": "名前", + "password": "パスワード", + "username": "ユーザー名" + }, "caption": "ユーザー", "description": "ユーザーの管理", "editor": { "activate_user": "ユーザーを有効化", "active": "アクティブ", "admin": "管理者", + "caption": "ユーザーを表示", "change_password": "パスワードの変更", + "confirm_user_deletion": "{name}を削除してもよろしいですか?", "deactivate_user": "ユーザーを無効化", "delete_user": "ユーザーを削除", "group": "グループ", @@ -1473,6 +1963,8 @@ "owner": "所有者", "system_generated": "システムジェネレート", "system_generated_users_not_editable": "システムが生成されたユーザーを変更できません。", + "system_generated_users_not_removable": "システムで生成されたユーザーを削除できません。", + "unnamed_user": "名前のないユーザー", "update_user": "更新" }, "picker": { @@ -1487,34 +1979,112 @@ "zha": { "add_device_page": { "discovered_text": "検出されると、デバイスがここに表示されます。", + "discovery_text": "検出されたデバイスがここに表示されます。デバイスの指示に従い、ペアリングモードにします。", + "header": "Zigbeeホームオートメーション-デバイスの追加", "no_devices_found": "デバイスが見つかりませんでした。デバイスがペアリングモードであることを確認し、検出の実行中はデバイスをウェイクアップしてください。", "pairing_mode": "デバイスがペアリングモードになっていることを確認します。これを行う方法については、デバイスの手順を確認してください。", - "search_again": "もう一度検索" + "search_again": "もう一度検索", + "spinner": "ZHA Zigbeeデバイスを検索しています..." + }, + "add": { + "caption": "デバイスを追加", + "description": "Zigbeeネットワークにデバイスを追加する" }, "button": "構成", + "caption": "ZHA", + "cluster_attributes": { + "attributes_of_cluster": "選択したクラスターの属性", + "get_zigbee_attribute": "Zigbee属性を取得", + "header": "クラスター属性", + "help_attribute_dropdown": "属性を選択して、その値を表示または設定します。", + "help_get_zigbee_attribute": "選択した属性の値を取得します。", + "help_set_zigbee_attribute": "指定したエンティティ上の指定したクラスターの属性値を設定します。", + "introduction": "クラスター属性の表示と編集", + "set_zigbee_attribute": "Zigbee属性を設定" + }, + "cluster_commands": { + "commands_of_cluster": "選択したクラスタのコマンド", + "header": "クラスタコマンド", + "help_command_dropdown": "対話するコマンドを選択します。", + "introduction": "クラスターコマンドを表示して発行します。", + "issue_zigbee_command": "Zigbeeコマンドを発行する" + }, + "clusters": { + "header": "クラスター", + "help_cluster_dropdown": "クラスターを選択して、属性とコマンドを表示します。", + "introduction": "クラスタは Zigbee 機能の構成要素です。機能を論理単位に分割します。クライアントとサーバーの種類があり、属性とコマンドで構成されています。" + }, "common": { "add_devices": "デバイスを追加", + "clusters": "クラスター", "devices": "デバイス", + "manufacturer_code_override": "製造元コードの上書き", "value": "バリュー" }, - "groups": { - "create_group": "Zigbeeホームオートメーション-グループの作成", - "description": "Zigbeeグループを管理する", - "header": "Zigbeeホームオートメーション-グループ管理" + "description": "Zigbee Home Automationネットワーク管理", + "devices": { + "header": "Zigbeeホームオートメーション-デバイス" }, + "group_binding": { + "bind_button_help": "選択したグループを選択したデバイス クラスタにバインドします。", + "bind_button_label": "バインド グループ", + "cluster_selection_help": "選択したグループにバインドするクラスターを選択します。", + "group_picker_help": "bindコマンドを発行するグループを選択します。", + "group_picker_label": "バインド可能なグループ", + "header": "グループバインディング", + "introduction": "グループのバインドとバインド解除。", + "unbind_button_help": "選択したデバイス クラスタから選択したグループのバインドを解除します。", + "unbind_button_label": "グループのバインド解除" + }, + "groups": { + "add_members": "メンバーの追加", + "adding_members": "メンバーの追加", + "caption": "グループ", + "create": "グループの作成", + "create_group": "Zigbeeホームオートメーション-グループの作成", + "create_group_details": "必要な詳細を入力して、新しいzigbeeグループを作成します", + "creating_group": "グループを作成しています", + "description": "Zigbeeグループを管理する", + "group_details": "選択した Zigbee グループの詳細をすべて次に示します。", + "group_id": "グループ ID", + "group_info": "グループ情報", + "group_name_placeholder": "グループ名", + "group_not_found": "グループが見つかりません!", + "group-header": "Zigbeeホームオートメーション-グループの詳細", + "groups": "グループ", + "groups-header": "Zigbeeホームオートメーション-グループ管理", + "header": "Zigbeeホームオートメーション-グループ管理", + "introduction": "zigbeeグループを作成および変更する", + "manage_groups": "Zigbeeグループの管理", + "members": "メンバー", + "remove_groups": "グループの削除", + "remove_members": "メンバーを削除", + "removing_groups": "グループの削除", + "removing_members": "メンバーの削除", + "zha_zigbee_groups": "ZHA Zigbeeグループ" + }, + "header": "Zigbee ホーム オートメーションの設定", + "introduction": "ここでは、ZHAコンポーネントを構成できます。まだすべてをUIから構成できるわけではありませんが、現在取り組んでいます。", "network_management": { - "header": "ネットワーク管理" + "header": "ネットワーク管理", + "introduction": "ネットワーク全体に影響を与えるコマンド" }, "network": { "caption": "ネットワーク" }, "node_management": { - "header": "デバイス管理" - } + "header": "デバイス管理", + "help_node_dropdown": "デバイスを選択して、デバイスごとのオプションを表示します。", + "hint_battery_devices": "注:スリープ状態の(バッテリー駆動の)デバイスに対してコマンドを実行するときは、スリープ状態から復帰する必要があります。通常、スリープ状態のデバイスは、トリガーすることでスリープ解除できます。", + "hint_wakeup": "Xiaomiセンサーなどの一部のデバイスには、約5秒間隔で押すことができるウェイクアップボタンがあり、デバイスを操作している間、デバイスをウェイクアップしたままにできます。", + "introduction": "単一のデバイスに影響する ZHA コマンドを実行します。デバイスを選択して、使用可能なコマンドの一覧を表示します。" + }, + "title": "Zigbeeホームオートメーション" }, "zone": { "add_zone": "ゾーンを追加", "caption": "ゾーン", + "configured_in_yaml": "configuration.yamlで構成されたゾーンは、UIで編集できません。", "confirm_delete": "このゾーンを削除してもよろしいですか?", "create_zone": "ゾーンを作成", "description": "ユーザーを追跡するゾーンを管理する", @@ -1522,6 +2092,7 @@ "create": "作成", "delete": "削除", "icon": "アイコン", + "icon_error_msg": "アイコンは、prefix:iconnameの形式にする必要があります。例:mdi:home", "latitude": "緯度", "longitude": "経度", "name": "名前", @@ -1535,20 +2106,43 @@ "edit_home_zone": "ホームゾーンの半径は、フロントエンドからはまだ編集できません。マップ上のマーカーをドラッグして、ホームゾーンを移動します。", "edit_home_zone_narrow": "ホームゾーンの半径は、フロントエンドからはまだ編集できません。場所は、一般設定から変更できます。", "go_to_core_config": "一般的な構成に移動しますか?", - "home_zone_core_config": "ホームゾーンの場所は、一般構成ページから編集できます。ホームゾーンの半径は、フロントエンドからはまだ編集できません。一般構成に移動しますか?" + "home_zone_core_config": "ホームゾーンの場所は、一般構成ページから編集できます。ホームゾーンの半径は、フロントエンドからはまだ編集できません。一般構成に移動しますか?", + "introduction": "ゾーンを使用すると、地球上の特定の地域を指定できます。人がゾーン内にいるとき、州はゾーンから名前を取ります。ゾーンは、オートメーション設定内のトリガーまたは条件として使用することもできます。", + "no_zones_created_yet": "まだゾーンを作成していないようです。" }, "zwave": { "button": "設定", "caption": "Z-Wave", "common": { - "value": "バリュー" + "index": "インデックス", + "instance": "インスタンス", + "unknown": "不明", + "value": "バリュー", + "wakeup_interval": "ウェイクアップ間隔" }, "description": "Z-waveネットワークを管理します", + "learn_more": "Z-Wave の詳細", + "network_management": { + "header": "Z-Waveネットワーク管理", + "introduction": "Z-Wave ネットワークに影響するコマンドを実行します。ほとんどのコマンドが成功したかどうかについてのフィードバックは得られませんが、OZWログをチェックして調べることもできます。" + }, + "network_status": { + "network_started": "Z-Waveネットワークが開始されました", + "network_started_note_all_queried": "すべてのノードが照会されました。", + "network_started_note_some_queried": "ウェイク ノードが照会されました。スリープノードは、スリープ解除時に照会されます。", + "network_starting": "Z-Waveネットワークを開始しています...", + "network_starting_note": "ネットワークのサイズによっては、この処理に時間がかかる場合があります。", + "network_stopped": "Z-Waveネットワークが停止しました" + }, "node_config": { "config_parameter": "構成パラメーターの設定", "config_value": "バリューを設定", + "false": "偽", "header": "ノード構成オプション", - "set_config_parameter": "構成パラメーターの設定" + "seconds": "秒", + "set_config_parameter": "構成パラメーターの設定", + "set_wakeup": "ウェイクアップ間隔を設定", + "true": "真" }, "node_management": { "add_to_group": "グループに追加", @@ -1556,6 +2150,7 @@ "entity_info": "エンティティ情報", "exclude_entity": "このエンティティをHome Assistantから除外する", "group": "グループ", + "header": "Z-Waveノード管理", "introduction": "単一ノードに影響するZ-Waveコマンドを実行します。ノードを選択すると、使用可能なコマンドのリストが表示されます。", "max_associations": "最大関連付け:", "node_group_associations": "ノードグループの関連付け", @@ -1571,20 +2166,34 @@ "set_protection": "保護を設定する" }, "ozw_log": { + "header": "OZWログ", + "introduction": "ログを表示します。0 は最小 (ログ全体をロード) 、最大 1000 が指定されます。ロードは静的なログを表示し、末尾はログの最後に指定された行数で自動更新されます。", "last_log_lines": "最後のログ行数", "load": "読み込み", "tail": "最終行" }, "services": { + "add_node": "ノードを追加", + "add_node_secure": "ノードのセキュアな追加", + "cancel_command": "コマンドのキャンセル", + "heal_network": "ネットワークの修復", "heal_node": "ノードの修復", "node_info": "ノード情報", "print_node": "ノードの印刷", "refresh_entity": "エンティティの更新", "refresh_node": "ノードを更新", "remove_failed_node": "失敗したノードを削除", + "remove_node": "ノードを削除", "replace_failed_node": "失敗したノードの置換", "save_config": "設定を保存", + "soft_reset": "ソフトリセット", + "start_network": "ネットワークの開始", + "stop_network": "ネットワークの停止", + "test_network": "テストネットワーク", "test_node": "テストノード" + }, + "values": { + "header": "ノード値" } } }, @@ -1598,7 +2207,15 @@ "developer-tools": { "tabs": { "events": { + "alert_event_type": "イベントタイプは必須フィールドです", + "available_events": "利用可能なイベント", + "count_listeners": "( {count}人のリスナー)", + "data": "イベントデータ(YAML、オプション)", + "description": "イベントバスでイベントを起動します。", + "documentation": "イベントのドキュメント。", + "event_fired": "イベント{name}が発生しました", "fire_event": "イベントを実行", + "listen_to_events": "イベントを聞く", "listening_to": "リッスンします", "notification_event_fired": "{type} のイベント が正常に実行されました!", "start_listening": "リッスンを開始", @@ -1613,25 +2230,37 @@ "column_description": "説明", "column_example": "例", "column_parameter": "パラメータ", + "data": "サービスデータ(YAML、オプション)", + "description": "サービス開発ツールを使用すると、ホームアシスタントで利用可能なサービスを呼び出すことができます。", + "fill_example_data": "データ記入例", + "no_description": "説明はありません", + "no_parameters": "このサービスはパラメータを受け取りません", + "select_service": "説明を表示するサービスを選択してください", "title": "サービス" }, "states": { "alert_entity_field": "エンティティは必須フィールドです", "attributes": "属性", "current_entities": "現在のエンティティ", + "description1": "Home Assistant内でデバイスの表現を設定します。", "description2": "実際のデバイスと通信しません。", "entity": "エンティティ", + "filter_attributes": "フィルター属性", "filter_entities": "エンティティのフィルター処理", "filter_states": "状態のフィルター処理", "more_info": "もっと見る", "no_entities": "エンティティなし", "set_state": "状態を設定", "state": "状態", + "state_attributes": "状態属性(YAML、オプション)", "title": "状態" }, "templates": { + "description": "テンプレートは、いくつかのホームアシスタント固有の拡張機能を持つJinja2テンプレートエンジンを使用してレンダリングされます。", "editor": "テンプレートエディター", + "jinja_documentation": "Jinja2テンプレートのドキュメント", "reset": "デモ テンプレートにリセット", + "template_extensions": "ホーム アシスタント テンプレートの拡張機能", "title": "テンプレート", "unknown_error_template": "不明なテンプレートレンダリングエラー" } @@ -1644,7 +2273,8 @@ "this_week": "今週", "today": "今日", "yesterday": "昨日" - } + }, + "showing_entries": "のエントリを表示する" }, "logbook": { "entries_not_found": "ログブックエントリが見つかりません。", @@ -1664,12 +2294,31 @@ "yaml_unsupported": "YAMLモードでLovelace UIを使用している場合、この関数は使用できません。" }, "cards": { + "confirm_delete": "このカードを削除しますか?", + "empty_state": { + "go_to_integrations_page": "インテグレーションページに移動します。", + "no_devices": "このページではデバイスを制御できますが、デバイスがまだ設定されていないように見えます。開始するには、インテグレーションページに移動します。", + "title": "お帰りなさい" + }, + "entities": { + "never_triggered": "トリガーされたことがない" + }, + "picture-elements": { + "call_service": "サービス{name}電話", + "hold": "保持:", + "more_info": "詳細を表示: {name}", + "navigate_to": "{location}に移動", + "tap": "タップ:", + "toggle": "{name}切り替え", + "url": "{url_path}へのウィンドウを開く" + }, "safe-mode": { "description": "Home Assistant は、構成の読み込み中に問題が発生し、セーフモードで実行されています。エラーログを見て、何が問題だったかを確認してください。", "header": "セーフモードがアクティブになりました" }, "shopping-list": { "add_item": "アイテムを追加", + "checked_items": "チェックアイテム", "clear_items": "チェックされたアイテムを削除" }, "starting": { @@ -1678,11 +2327,18 @@ } }, "changed_toast": { - "message": "このダッシュボードのLovelace UI設定が更新されました。更新して変更を確認しますか?" + "message": "このダッシュボードのLovelace UI設定が更新されました。更新して変更を確認しますか?", + "refresh": "更新" }, "editor": { "card": { + "alarm-panel": { + "available_states": "利用可能な状態", + "description": "アラームパネルカードを使用すると、アラームコントロールパネルの統合を強制解除することができます。", + "name": "アラームパネル" + }, "button": { + "description": "ボタン カードを使用すると、タスクを実行するためのボタンを追加できます。", "name": "ボタン" }, "calendar": { @@ -1692,12 +2348,22 @@ "conditional": { "card": "カード", "change_type": "タイプの変更", + "condition_explanation": "カードは、以下の条件がすべて満たされたときに表示されます。", "conditions": "条件", "current_state": "現在", - "name": "条件付き" + "description": "条件付きカードには、エンティティの状態に基づいて別のカードが表示されます。", + "name": "条件付き", + "state_equal": "状態は等しい", + "state_not_equal": "状態が等しくない" + }, + "config": { + "optional": "オプション", + "required": "必須" }, "entities": { + "description": "エンティティ カードは、最も一般的な種類のカードです。アイテムをリストにまとめます。", "name": "エンティティ", + "show_header_toggle": "ヘッダー切り替えを表示しますか?", "toggle": "エンティテを切り替え" }, "entity-filter": { @@ -1709,21 +2375,51 @@ "name": "エンティティ" }, "gauge": { - "name": "ゲージ" + "description": "ゲージカードは、センサーデータを視覚的に見ることができる基本カードです。", + "name": "ゲージ", + "severity": { + "define": "重大度を定義しますか?", + "green": "緑", + "red": "赤", + "yellow": "黄色" + } }, "generic": { + "aspect_ratio": "アスペクト比", "attribute": "属性", + "camera_image": "カメラエンティティ", + "camera_view": "カメラビュー", "double_tap_action": "ダブルタップアクション", + "entities": "エンティティ", + "entity": "エンティティ", + "hold_action": "ホールドアクション", + "hours_to_show": "表示する時間", + "icon": "アイコン", + "icon_height": "アイコンの高さ", + "image": "画像パス", "manual": "マニュアル", "manual_description": "カスタムカードを追加する必要があるか、手動でyamlを記述したいだけですか?", + "maximum": "最大", + "minimum": "最小", + "name": "名前", "no_theme": "テーマなし", + "refresh_interval": "更新間隔", "search": "検索", "secondary_info_attribute": "セカンダリ情報属性", + "show_icon": "アイコンを表示しますか?", + "show_name": "名前を表示しますか?", + "show_state": "状態を表示しますか?", "state": "状態", - "theme": "テーマ" + "tap_action": "アクションをタップ", + "theme": "テーマ", + "title": "タイトル", + "unit": "ユニット", + "url": "Url" }, "glance": { - "description": "Glance カードは、複数のセンサーをコンパクトな概要でグループ化するのに便利です。" + "columns": "カラム", + "description": "Glance カードは、複数のセンサーをコンパクトな概要でグループ化するのに便利です。", + "name": "一覧" }, "history-graph": { "description": "履歴グラフ カードを使用すると、一覧表示された各エンティティのグラフを表示できます。", @@ -1746,11 +2442,16 @@ "name": "照明" }, "map": { + "dark_mode": "ダークモード?", + "default_zoom": "デフォルトのズーム", "description": "マップ上にエンティティを表示できるマップカード。", + "geo_location_sources": "位置情報ソース", "hours_to_show": "表示する時間", - "name": "地図" + "name": "地図", + "source": "ソース:" }, "markdown": { + "content": "コンテンツ", "description": "マークダウン カードは、マークダウンのレンダリングに使用されます。", "name": "マークダウン" }, @@ -1759,23 +2460,29 @@ "name": "メディアコントロール" }, "picture-elements": { - "description": "ピクチャー・エレメント・カードは、最も汎用性の高いタイプのカードの1つです。カードは、アイコンやテキスト、さらにはサービスを配置することができます!座標に基づくイメージ上。" + "description": "ピクチャー・エレメント・カードは、最も汎用性の高いタイプのカードの1つです。カードは、アイコンやテキスト、さらにはサービスを配置することができます!座標に基づくイメージ上。", + "name": "ピクチャーエレメント" }, "picture-entity": { + "description": "ピクチャー エンティティ カードには、イメージの形式でエンティティが表示されます。URL からの画像の代わりに、カメラエンティティの画像を表示することもできます。", "name": "画像エンティティ" }, "picture-glance": { - "description": "画像の一覧カードは、イメージと対応するエンティティの状態をアイコンで示します。右側のエンティティは切り替えアクションを許可し、他のエンティティは詳細ダイアログを表示します。" + "description": "画像の一覧カードは、イメージと対応するエンティティの状態をアイコンで示します。右側のエンティティは切り替えアクションを許可し、他のエンティティは詳細ダイアログを表示します。", + "name": "画像一覧" }, "picture": { "description": "ピクチャーカードを使用すると、インターフェイスのさまざまなパスへのナビゲーションに使用する画像を設定したり、サービスを呼び出したりできます。", "name": "画像" }, "plant-status": { - "description": "植物ステータスカードは、そこにすべての素敵な植物学者のためのものです。" + "description": "植物ステータスカードは、そこにすべての素敵な植物学者のためのものです。", + "name": "プラントステータス" }, "sensor": { "description": "センサーカードは、時間の経過に伴う変化を視覚化するオプションのグラフを使用して、センサーの状態をすばやく提供します。", + "graph_detail": "グラフの詳細", + "graph_type": "グラフの種類", "name": "センサー" }, "shopping-list": { @@ -1793,6 +2500,7 @@ }, "weather-forecast": { "description": "天気予報カードは天気を表示します。表示するインターフェースに含めると非常に便利です。", + "name": "天気予報", "show_forecast": "予測を表示" } }, @@ -1801,21 +2509,34 @@ "no_description": "説明がありません。" }, "edit_card": { + "add": "カードを追加", "confirm_cancel": "キャンセルしてもよいですか?", "delete": "カードを削除", "duplicate": "重複するカード", + "edit": "編集", + "header": "カード設定", "move": "ビューに移動", "options": "その他のオプション", "pick_card": "どのカードを追加しますか?", + "pick_card_view_title": "{name}ビューにどのカードを追加しますか?", + "show_code_editor": "コードエディタを表示", + "show_visual_editor": "ビジュアルエディターを表示", + "toggle_editor": "エディターの切り替え", "typed_header": "{type}カードの構成", "unsaved_changes": "変更が保存されていません" }, "edit_lovelace": { "edit_title": "タイトルを編集", "explanation": "このタイトルは、Lovelace UIのすべてのビューの上に表示されます。", + "header": "Lovelace UIのタイトル", "title": "タイトル" }, "edit_view": { + "add": "ビューの追加", + "delete": "ビューの削除", + "edit": "ビューの編集", + "header": "構成を表示", + "header_name": "{name}構成の表示", "move_left": "ビューを左に移動", "move_right": "ビューを右に移動", "tab_badges": "バッジ", @@ -1825,13 +2546,16 @@ "select_users": "ナビゲーションでこのビューを表示するユーザーを選択します。" } }, + "header": "UIを編集", "menu": { "open": "Lovelace メニューを開く", "raw_editor": "詳細設定エディター" }, "migrate": { + "header": "設定に互換性がありません", "migrate": "構成を移行する", - "para_migrate": "Home Assistantは、「設定の移行」ボタンを押すことで、すべてのカードとビューにIDを自動的に追加できます。" + "para_migrate": "Home Assistantは、「設定の移行」ボタンを押すことで、すべてのカードとビューにIDを自動的に追加できます。", + "para_no_id": "この要素には ID がありません。'ui-lovelace.yaml' のこの要素に ID を追加してください。" }, "move_card": { "header": "カードを移動するビューを選択してください" @@ -1846,12 +2570,21 @@ "error_remove": "構成を削除できません: {error}", "error_save_yaml": "YAMLを保存できません: {error}", "header": "設定を編集", - "resources_moved": "リソースはLovelace構成に追加されなくなりましたが、Lovelace構成パネルで追加できます。" + "resources_moved": "リソースはLovelace構成に追加されなくなりましたが、Lovelace構成パネルで追加できます。", + "save": "保存", + "saved": "保存しました", + "unsaved_changes": "保存されていない変更" }, "save_config": { + "cancel": "気にしないで", "close": "閉じる", "empty_config": "新しいダッシュボードから開始する", + "header": "Lovelace UIを制御する", "para": "このダッシュボードは現在、Home Assistantによって管理されています。新しいエンティティまたはLovelace UIコンポーネントが利用可能になると、自動的に更新されます。制御すると、このダッシュボードは自動的に更新されなくなります。いつでも構成で新しいダッシュボードを作成して、変更することができます。", + "para_sure": "ユーザー インターフェイスを制御しますか?", + "save": "制御する", + "yaml_config": "ここで開始するには、このダッシュボードの現在の構成です。", + "yaml_control": "YAML モードで制御するには、このダッシュボードの構成で指定した名前、またはデフォルトの 'ui-lovelace.yaml' を使用して YAML ファイルを作成します。", "yaml_mode": "このダッシュボードで YAML モードを使用している場合は、UI から Lovelace 設定を変更することはできません。UI からこのダッシュボードを管理する場合は、'configuration.yaml' の Lovelace 設定から 'mode: yaml' を削除します。" }, "select_view": { @@ -1860,10 +2593,13 @@ }, "suggest_card": { "add": "Lovelace UIに追加", - "create_own": "別のカードを選択する" + "create_own": "別のカードを選択する", + "header": "私たちはあなたのために提案を作成しました" }, "view": { "panel_mode": { + "description": "これにより、最初のカードが全幅でレンダリングされます。このビューの他のカードはレンダリングされません。", + "title": "パネルモード?", "warning_multiple_cards": "このビューには複数のカードが含まれていますが、パネルビューでは 1 枚のカードしか表示できません。" } } @@ -1872,10 +2608,13 @@ "close": "閉じる", "configure_ui": "ダッシュボードを編集", "exit_edit_mode": "UI 編集モードを終了", + "help": "ヘルプ", + "refresh": "更新", "reload_resources": "リソースの再読込" }, "reload_lovelace": "Lovelace の再読込", "reload_resources": { + "refresh_body": "再読み込みを完了するには、ページを更新する必要があります。", "refresh_header": "更新しますか?" }, "unused_entities": { @@ -1886,15 +2625,19 @@ "last_changed": "最終変更", "no_data": "未使用のエンティティが見つかりません", "search": "エンティティを検索", + "select_to_add": "カードに追加するエンティティを選択し、[カードの追加] ボタンをクリックします。", "title": "未使用のエンティティ" }, "views": { "confirm_delete": "ビューを削除しますか?", + "confirm_delete_existing_cards": "このビューを削除すると、カードも削除されます", "confirm_delete_existing_cards_text": "'' {name} ''ビューを削除してもよろしいですか?ビューには、削除される{number}枚のカードが含まれています。この操作は元に戻せません。", "confirm_delete_text": "'' {name} ''ビューを削除してもよろしいですか?" }, "warning": { "attribute_not_found": "属性{attribute}は次の場所では使用できません: {entity}", + "entity_non_numeric": "エンティティが数値ではありません: {entity}", + "entity_not_found": "エンティティが使用できません: {entity}", "entity_unavailable": "{entity}は現在利用できません", "starting": "ホームアシスタントが起動していますが、まだすべてが利用可能なわけではありません" } @@ -1907,6 +2650,7 @@ }, "page-authorize": { "abort_intro": "ログインが中止されました", + "authorizing_client": "{clientId} Home Assistantインスタンスへのアクセスを許可しようとしています。", "form": { "error": "エラー: {error}", "next": "次", @@ -1929,7 +2673,8 @@ "mfa": { "data": { "code": "多要素認証コード" - } + }, + "description": "デバイスで** {mfa_module_name} **を開き、2段階認証コードを表示して、本人確認を行います。" } } }, @@ -1951,13 +2696,15 @@ "mfa": { "data": { "code": "多要素認証コード" - } + }, + "description": "デバイスで** {mfa_module_name} **を開き、2段階認証コードを表示して、本人確認を行います。" } } }, "legacy_api_password": { "abort": { - "login_expired": "セッションがタイムアウトしました、再度ログインしてください。" + "login_expired": "セッションがタイムアウトしました、再度ログインしてください。", + "no_api_password_set": "API パスワードが設定されていません。" }, "error": { "invalid_auth": "無効な API パスワード", @@ -1973,19 +2720,22 @@ "mfa": { "data": { "code": "多要素認証コード" - } + }, + "description": "デバイスで** {mfa_module_name} **を開き、2段階認証コードを表示して、本人確認を行います。" } } }, "trusted_networks": { "abort": { - "not_allowed": "お使いのコンピューターは許可されていません。" + "not_allowed": "お使いのコンピューターは許可されていません。", + "not_whitelisted": "コンピュータがホワイトリストに登録されていません。" }, "step": { "init": { "data": { "user": "ユーザー" - } + }, + "description": "ログインするユーザーを選択してください:" } } } @@ -1994,25 +2744,84 @@ "unknown_error": "エラーが発生しました", "working": "お待ちください" }, - "initializing": "初期化中" + "initializing": "初期化中", + "logging_in_with": "** {authProviderName} **でログインしています。", + "pick_auth_provider": "またはログイン" }, "page-demo": { + "cards": { + "demo": { + "demo_by": "{name}", + "introduction": "おかえりなさい!ホームアシスタントのデモに到達しました。デモでは、コミュニティによって作成された最高のUIを紹介します。", + "learn_more": "Home Assistantの詳細", + "next_demo": "次のデモ" + } + }, "config": { "arsaboo": { "labels": { - "hdmi_switcher": "HDMIスイッチ" + "activity": "アクティビティ", + "air": "空気", + "commute_home": "自宅までの通勤", + "entertainment": "エンターテイメント", + "hdmi_input": "HDMI入力", + "hdmi_switcher": "HDMIスイッチ", + "information": "情報", + "lights": "ライト", + "morning_commute": "朝の通勤", + "total_tv_time": "総テレビ時間", + "turn_tv_off": "テレビをオフにする", + "volume": "ボリューム" + }, + "names": { + "family_room": "ファミリールーム", + "hallway": "廊下", + "kitchen": "キッチン", + "left": "左", + "master_bedroom": "マスターベッドルーム", + "mirror": "ミラー", + "patio": "パティオ", + "right": "右", + "temperature_study": "温度調査", + "upstairs": "2階" + }, + "unit": { + "minutes_abbr": "分", + "watching": "見て" } } } }, "page-onboarding": { "core-config": { + "button_detect": "検出", + "finish": "次", + "intro": "こんにちは {名前}, ホーム アシスタントへようこそ.あなたの家に名前を付けますか?", "intro_location": "どこに住んでいるか知りたいです。 この情報は、他の情報の表示および太陽の位置に関する自動化の設定に役立ちます。 これらの情報がインターネットで外部と共有されることがありません。", + "intro_location_detect": "外部サービスに対してワンタイムリクエストを行うことで、この情報を入力することができます。", "location_name": "ホーム アシスタントの名前", "location_name_default": "自宅" }, "integration": { - "finish": "完了" + "finish": "完了", + "intro": "デバイスとサービスは、統合としてHome Assistantに表示されます。今すぐ設定することも、後で設定画面から設定することもできます。", + "more_integrations": "もっと見る" + }, + "intro": "あなたはあなたの家を目覚めさせ、あなたのプライバシーを取り戻し、ティンカーの世界的なコミュニティに参加する準備ができていますか?", + "user": { + "create_account": "アカウントの作成", + "data": { + "name": "名前", + "password": "パスワード", + "password_confirm": "パスワードの確認", + "username": "ユーザー名" + }, + "error": { + "password_not_match": "パスワードが一致しません", + "required_fields": "すべての必須フィールドに入力してください" + }, + "intro": "ユーザー アカウントを作成します。", + "required_field": "必須" } }, "profile": { @@ -2022,37 +2831,78 @@ "title": "高度モード" }, "change_password": { + "confirm_new_password": "新しいパスワードの確認", "current_password": "現在のパスワード", - "header": "パスワードの変更" + "error_required": "必須", + "header": "パスワードの変更", + "new_password": "新しいパスワード", + "submit": "送信" }, + "current_user": "現在、 {fullName}としてログインしています。", "dashboard": { "description": "このデバイスのデフォルトのダッシュボードを選択してください。", "dropdown_label": "ダッシュボード", "header": "ダッシュボード" }, "force_narrow": { + "description": "これにより、モバイルエクスペリエンスと同様に、サイドバーがデフォルトで非表示になります。", "header": "サイドバーを常に非表示にする" }, + "is_owner": "あなたは所有者です。", "language": { "dropdown_label": "言語", "header": "言語", "link_promo": "翻訳を助ける" }, + "logout": "ログアウト", + "logout_text": "ログアウトしてもよろしいですか?", + "logout_title": "ログアウトしますか?", + "long_lived_access_tokens": { + "confirm_delete": "{name} のアクセス トークンを削除しますか?", + "create": "トークンの作成", + "create_failed": "アクセス トークンを作成できませんでした。", + "created_at": "{日付} に作成されました", + "delete_failed": "アクセス トークンを削除できませんでした。", + "description": "スクリプトがホーム アシスタント インスタンスと対話できるように、長期間使用できるアクセス トークンを作成します。各トークンは作成から10年間有効です。次の長期アクセス トークンは現在アクティブです。", + "empty_state": "長期間使用されるアクセス トークンはまだありません。", + "header": "長期間有効なアクセストークン", + "last_used": "{location} から {date} で最後に使用されました", + "learn_auth_requests": "認証された要求を作成する方法について説明します。", + "not_used": "一度も使用されていない", + "prompt_copy_token": "アクセス トークンをコピーします。再び表示されません。", + "prompt_name": "名前?" + }, "mfa_setup": { - "close": "閉じる" + "close": "閉じる", + "step_done": "{step}セットアップが完了しました", + "submit": "送信", + "title_aborted": "中止されました", + "title_success": "成功!" }, "mfa": { + "confirm_disable": "{name}を無効にしてもよろしいですか?", + "disable": "無効", + "enable": "有効", "header": "多要素認証モジュール" }, "push_notifications": { "description": "このデバイスに通知を送信します。", + "error_load_platform": "notify.html5を設定", "error_use_https": "Frontend で SSL を有効になっている必要があります。", "header": "プッシュ通知", "link_promo": "もっと見る", "push_notifications": "プッシュ通知" }, "refresh_tokens": { - "description": "各更新トークンはログインセッションを表します。ログアウトをクリックすると、更新トークンが自動的に削除されます。現在、次の更新トークンがアカウントでアクティブになっています。" + "confirm_delete": "{name} の更新トークンを削除しますか?", + "created_at": "{日付} に作成されました", + "current_token_tooltip": "現在の更新トークンを削除できません", + "delete_failed": "更新トークンを削除できませんでした。", + "description": "各更新トークンはログインセッションを表します。ログアウトをクリックすると、更新トークンが自動的に削除されます。現在、次の更新トークンがアカウントでアクティブになっています。", + "header": "トークンを更新", + "last_used": "最後に{location}から{date}使用", + "not_used": "一度も使用されていない", + "token_title": "{clientId}トークンを更新" }, "suspend": { "description": "5分間非表示にした後、サーバーへの接続を閉じる必要がありますか?", @@ -2073,6 +2923,7 @@ "reset": "リセット" }, "vibrate": { + "description": "デバイスを制御するときに、このデバイスのバイブレーションを有効または無効にします。", "header": "バイブレーション機能" } }, diff --git a/translations/frontend/ko.json b/translations/frontend/ko.json index 0198e803e4..3af6189b0c 100644 --- a/translations/frontend/ko.json +++ b/translations/frontend/ko.json @@ -419,9 +419,16 @@ "unlock": "잠금 해제" }, "media_player": { + "browse_media": "미디어 찾아보기", + "media_next_track": "다음", + "media_play": "재생", + "media_play_pause": "재생 / 일시정지", + "media_previous_track": "이전", "sound_mode": "사운드 모드", "source": "입력 소스", - "text_to_speak": "음성합성 내용 입력 (TTS)" + "text_to_speak": "음성합성 내용 입력 (TTS)", + "turn_off": "끄기", + "turn_on": "켜기" }, "persistent_notification": { "dismiss": "해제" @@ -554,6 +561,22 @@ "loading_history": "상태 기록 내용 읽는 중...", "no_history_found": "상태 기록 내용이 없습니다." }, + "media-browser": { + "choose-source": "소스 선택", + "content-type": { + "album": "앨범", + "artist": "아티스트", + "library": "라이브러리", + "playlist": "재생 목록", + "server": "서버" + }, + "media-player-browser": "미디어 플레이어 브라우저", + "no_items": "항목 없음", + "pick": "선택", + "pick-media": "미디어 선택", + "play": "재생", + "play-media": "미디어 재생" + }, "picture-upload": { "label": "그림", "unsupported_format": "지원되지 않는 형식입니다. JPEG, PNG 또는 GIF 이미지를 선택해주세요." @@ -578,6 +601,7 @@ "week": "{count} {count, plural,\none {주}\nother {주}\n}" }, "future": "{time} 후", + "just_now": "방금", "never": "해당없음", "past": "{time} 전" }, @@ -899,7 +923,7 @@ "wait_template": "대기 템플릿" } }, - "unsupported_action": "미지원 동작: {action}" + "unsupported_action": "UI 미지원 동작: {action}" }, "alias": "이름", "conditions": { @@ -965,7 +989,7 @@ "zone": "지역" } }, - "unsupported_condition": "미지원 조건: {condition}" + "unsupported_condition": "UI 미지원 조건: {condition}" }, "default_name": "새로운 자동화", "description": { @@ -1057,6 +1081,9 @@ "sunrise": "해돋이", "sunset": "해넘이" }, + "tag": { + "label": "태그" + }, "template": { "label": "템플릿", "value_template": "값 템플릿" @@ -1084,7 +1111,7 @@ "zone": "지역" } }, - "unsupported_platform": "미지원 플랫폼: {platform}" + "unsupported_platform": "UI 미지원 플랫폼: {platform}" }, "unsaved_confirm": "변경된 내용을 저장하지 않았습니다. 정말 이 페이지를 떠나시겠습니까?" }, @@ -1279,7 +1306,7 @@ "imperial_example": "화씨, 파운드", "internal_url": "내부 URL", "latitude": "위도", - "location_name": "Home Assistant 이름", + "location_name": "설치된 Home Assistant 이름", "longitude": "경도", "metric_example": "섭씨, 킬로그램", "save_button": "저장", @@ -1315,6 +1342,7 @@ } }, "devices": { + "add_prompt": "아직 이 기기로 추가 된 {name} 이(가) 없습니다. 위의 + 단추를 클릭하여 추가할 수 있습니다.", "automation": { "actions": { "caption": "뭔가 트리거 되었을 때...." @@ -1334,6 +1362,7 @@ "caption": "기기", "confirm_delete": "이 기기를 삭제하시겠습니까?", "confirm_rename_entity_ids": "구성요소의 ID 이름 또한 바꾸시겠습니까?", + "confirm_rename_entity_ids_warning": "현재 이러한 구성요소를 사용하고 있는 구성 (자동화, 스크립트, 씬, Lovelace 등)은 변경되지 않으므로 직접 업데이트해야 합니다.", "data_table": { "area": "영역", "battery": "배터리", @@ -1496,6 +1525,9 @@ "no_device": "기기가 없는 구성요소", "no_devices": "이 통합 구성요소는 설정해야 할 기기가 없습니다.", "options": "옵션", + "reload": "새로고침", + "reload_confirm": "통합 구성요소를 다시 읽어 들였습니다", + "reload_restart_confirm": "이 통합 구성요소를 다시 읽어 들일려면 Home Assistant 를 다시 시작해주세요", "rename": "이름 변경", "restart_confirm": "통합 구성요소 제거 완료를 위해 Home Assistant 웹 페이지를 다시 불러옵니다", "settings_button": "{integration} 설정 편집", @@ -1654,7 +1686,11 @@ "topic": "토픽" }, "ozw": { + "button": "설정", "common": { + "controller": "컨트롤러", + "instance": "인스턴스", + "network": "네트워크", "node_id": "노드 ID", "ozw_instance": "OpenZWave 인스턴스", "zwave": "Z-Wave" @@ -1664,6 +1700,36 @@ "stage": "단계", "zwave_info": "Z-Wave 정보" }, + "navigation": { + "network": "네트워크", + "nodes": "노드", + "select_instance": "인스턴스 선택" + }, + "network_status": { + "details": { + "driverallnodesqueried": "모든 노드가 쿼리되었습니다", + "driverallnodesqueriedsomedead": "모든 노드가 쿼리되었습니다. 일부 노드는 죽은 것으로 발견되었습니다.", + "driverawakenodesqueries": "모든 절전모드 해제 노드가 쿼리되었습니다.", + "driverfailed": "Z-Wave 컨트롤러에 연결하지 못했습니다", + "driverready": "Z-Wave 컨트롤러 초기화 중", + "driverremoved": "드라이버가 제거되었습니다", + "driverreset": "드라이버가 재설정되었습니다", + "offline": "OZWDaemon 오프라인", + "ready": "연결할 준비가 되었습니다", + "started": "MQTT 에 연결됨", + "starting": "MQTT 에 연결 중", + "stopped": "OpenZWave 가 중지되었습니다" + }, + "offline": "오프라인", + "online": "온라인", + "starting": "시작 중", + "unknown": "알 수 없음" + }, + "network": { + "header": "네트워크 관리", + "introduction": "네트워크 전체 기능을 관리합니다.", + "node_count": "{count} 개 노드" + }, "node_query_stages": { "associations": "연결 그룹 및 구성원 자격 새로고침", "cacheload": "OpenZWave 캐시 파일에서 정보를 읽어오기. 배터리 노드는 노드가 절전 해제 상태가 될 때까지 이 단계를 유지합니다.", @@ -1694,6 +1760,14 @@ "title": "노드 정보 새로고침", "wakeup_header": "절전 해제 지침", "wakeup_instructions_source": "절전 해제 지침은 OpenZWave 커뮤니티 기기 데이터베이스에서 제공됩니다." + }, + "select_instance": { + "header": "OpenZWave 인스턴스 선택", + "introduction": "둘 이상의 OpenZWave 인스턴스가 실행 중입니다. 어떤 인스턴스를 관리하시겠습니까?" + }, + "services": { + "add_node": "노드 추가", + "remove_node": "노드 제거" } }, "person": { @@ -1819,7 +1893,9 @@ "section": { "reloading": { "automation": "자동화 다시 읽어오기", + "command_line": "명령줄 구성요소 다시 읽어오기", "core": "위치 및 사용자화 다시 읽어오기", + "filter": "필터 구성요소 다시로드", "group": "그룹 다시 읽어오기", "heading": "YAML 구성 다시 읽어오기", "input_boolean": "논리입력 다시 읽어오기", @@ -1829,8 +1905,12 @@ "input_text": "문자입력 다시 읽어오기", "introduction": "Home Assistant 의 일부 구성 내용은 재시작 없이 다시 읽어 들일 수 있습니다. 다시 읽어오기를 누르면 현재 사용 중인 YAML 구성 내용을 내리고 새로운 구성 내용을 읽어 들입니다.", "person": "구성원 다시 읽어오기", + "rest": "REST 구성요소 다시 읽어오기", "scene": "씬 다시 읽어오기", "script": "스크립트 다시 읽어오기", + "statistics": "통계 구성요소 다시 읽어오기", + "template": "템플릿 구성요소 다시 읽어오기", + "universal": "범용 미디어 플레이어 구성요소 다시 읽어오기", "zone": "지역 다시 읽어오기" }, "server_management": { @@ -1850,6 +1930,32 @@ } } }, + "tags": { + "add_tag": "태그 추가", + "automation_title": "{name} 태그가 검색되었습니다", + "caption": "태그", + "create_automation": "태그로 자동화 구성하기", + "description": "태그 관리", + "detail": { + "create": "만들기", + "create_and_write": "만들고 쓰기", + "delete": "삭제", + "description": "상세정보", + "name": "이름", + "new_tag": "새로운 태그", + "tag_id": "태그 ID", + "tag_id_placeholder": "비워두면 자동으로 생성됩니다", + "update": "업데이트" + }, + "edit": "편집", + "headers": { + "last_scanned": "최근 검색 됨", + "name": "이름" + }, + "never_scanned": "검색 된 적 없음", + "no_tags": "태그 없음", + "write": "쓰기" + }, "users": { "add_user": { "caption": "사용자 계정 만들기", @@ -2171,6 +2277,7 @@ "description": "템플릿은 Home Assistant 의 특정 확장기능의 일부로써, Jinja2 템플릿 엔진을 사용하여 구성됩니다.", "editor": "템플릿 편집기", "jinja_documentation": "Jinja2 템플릿 문서 보기", + "reset": "데모 템플릿으로 재설정", "template_extensions": "Home Assistant 템플릿 확장기능 문서 보기", "title": "템플릿", "unknown_error_template": "템플릿 구성 중 알 수 없는 오류가 발생했습니다" @@ -2252,6 +2359,10 @@ "description": "버튼 카드를 사용하면 작업을 수행할 수 있는 버튼을 추가할 수 있습니다.", "name": "버튼" }, + "calendar": { + "description": "캘린더 카드는 일, 주 및 목록 보기를 포함한 캘린더가 표시됩니다", + "name": "캘린더" + }, "conditional": { "card": "카드", "change_type": "변경 유형", @@ -2706,6 +2817,7 @@ "intro": "{name} 님, 안녕하세요! Home Assistant 에 오신 것을 환영합니다. 집에 어떤 이름을 지어주시겠어요?", "intro_location": "현재 살고 계시는 위치를 알려주세요. 이는 태양 위치를 기반으로 하는 자동화를 설정하는데 도움이 됩니다. 위치 정보는 외부 네트워크와 절대 공유되지 않습니다.", "intro_location_detect": "외부 서비스에 일회성 요청을 해서 위치 정보를 넣는데 도움을 드릴 수 있습니다.", + "location_name": "설치된 Home Assistant 이름", "location_name_default": "집" }, "integration": { diff --git a/translations/frontend/lv.json b/translations/frontend/lv.json index 649bb7cbb0..c91298e5a2 100644 --- a/translations/frontend/lv.json +++ b/translations/frontend/lv.json @@ -1616,13 +1616,33 @@ "button": { "name": "Poga" }, + "calendar": { + "description": "Kalendāra kartītē tiek attēlots kalendārs ar dienas, nedēļas un saraksta skatiem", + "name": "Kalendārs" + }, + "config": { + "optional": "Neobligāti", + "required": "Nepieciešams" + }, "entities": { "toggle": "Pārslēgt vienības." }, + "entity": { + "description": "Vienības kartīte sniedz īsu pārskatu par jūsu vienības stāvokli.", + "name": "Vienība" + }, "generic": { + "attribute": "Atribūts", + "double_tap_action": "Dubultpieskāriena darbība", "icon": "Ikona", + "search": "Meklēt", + "tap_action": "Pieskariena darbība", "url": "URL" }, + "humidifier": { + "description": "Mitrinātāja kartīte ļauj kontrolēt jūsu mitrinātāja vienību, sniedzot iespēju pielāgot vienības mitrumu un režīmu.", + "name": "Mitrinātājs" + }, "iframe": { "name": "iFrame" }, @@ -1630,7 +1650,11 @@ "name": "Gaisma" }, "map": { + "dark_mode": "Tumšais izskats?", "default_zoom": "Noklusējuma mērogs", + "description": "Kartes kartīte ļauj attēlot vienības kartē.", + "geo_location_sources": "Ģeogrāfiskās atrašanās vietas avoti", + "hours_to_show": "Parādāmās stundas", "name": "Karte", "source": "Avots" }, @@ -1641,10 +1665,27 @@ "picture": { "name": "Attēls" }, + "plant-status": { + "name": "Auga statuss" + }, "sensor": { "name": "Sensors" + }, + "shopping-list": { + "name": "Iepirkumu saraksts" + }, + "thermostat": { + "name": "Termostats" + }, + "weather-forecast": { + "name": "Laikapstākļu prognoze", + "show_forecast": "Rādīt laikapstākļu prognozi" } }, + "cardpicker": { + "custom_card": "Pielāgota", + "no_description": "Apraksts nav pieejams." + }, "edit_card": { "add": "Pievienot kartīti", "delete": "Dzēst kartīti", diff --git a/translations/frontend/nb.json b/translations/frontend/nb.json index 1466f43081..dbc46b6ae2 100644 --- a/translations/frontend/nb.json +++ b/translations/frontend/nb.json @@ -1847,7 +1847,9 @@ "section": { "reloading": { "automation": "Last inn automasjoner på nytt", + "command_line": "Last inn kommandolinjeenheter på nytt", "core": "Last inn lokasjon og spesialtilpassinger på nytt", + "filter": "Last inn filterenheter på nytt", "group": "Last inn grupper på nytt", "heading": "YAML -Konfigurasjon lastes på nytt", "input_boolean": "Last inn bolsk inndata på nytt", @@ -1857,8 +1859,10 @@ "input_text": "Last inn tekst inndata på nytt", "introduction": "Noen deler av Home Assistant kan laste inn uten å kreve omstart. Hvis du trykker last på nytt, vil du bytte den nåværende konfigurasjonen med den nye.", "person": "Last inn personer på nytt", + "rest": "Last hvileenhetene på nytt", "scene": "Last inn scener på nytt", "script": "Last inn skript på nytt", + "statistics": "Last inn statistiske enheter på nytt", "template": "Laste inn malenheter på nytt", "universal": "Laste inn universelle mediespillerenheter på nytt", "zone": "Last inn soner på nytt" diff --git a/translations/frontend/nl.json b/translations/frontend/nl.json index c0f25bfcc0..5b982da212 100644 --- a/translations/frontend/nl.json +++ b/translations/frontend/nl.json @@ -419,9 +419,16 @@ "unlock": "Ontgrendelen" }, "media_player": { + "browse_media": "Door media bladeren", + "media_next_track": "Volgende", + "media_play": "Speel", + "media_play_pause": "Afspelen/pauzeren", + "media_previous_track": "Vorige", "sound_mode": "Geluidsmodus", "source": "Bron", - "text_to_speak": "Tekst naar spraak" + "text_to_speak": "Tekst naar spraak", + "turn_off": "Uitschakelen", + "turn_on": "Inschakelen" }, "persistent_notification": { "dismiss": "Sluiten" @@ -554,6 +561,26 @@ "loading_history": "Geschiedenis laden ...", "no_history_found": "Geen geschiedenis gevonden" }, + "media-browser": { + "choose-source": "Kies bron", + "content-type": { + "album": "Album", + "artist": "Artiest", + "library": "Bibliotheek", + "playlist": "Afspeellijst", + "server": "Server" + }, + "media-player-browser": "Mediaspeler-browser", + "no_items": "Niets gevonden", + "pick": "Kies", + "pick-media": "Kies Media", + "play": "Speel", + "play-media": "Media afspelen" + }, + "picture-upload": { + "label": "Afbeelding", + "unsupported_format": "Niet-ondersteund formaat. Kies een JPEG-, PNG- of GIF-afbeelding." + }, "related-items": { "area": "Gebied", "automation": "Onderdeel van de volgende automatiseringen", @@ -574,6 +601,7 @@ "week": "{count} {count, plural,\none {week}\nother {weken}\n}" }, "future": "Over {time}", + "just_now": "Zojuist", "never": "Nooit", "past": "{time} geleden" }, @@ -656,6 +684,9 @@ "required_error_msg": "Dit veld is verplicht", "yaml_not_editable": "De instellingen van deze entiteit kunnen niet worden bewerkt vanuit de gebruikersinterface. Alleen entiteiten die zijn ingesteld vanuit de gebruikersinterface, kunnen worden geconfigureerd vanuit de gebruikersinterface." }, + "image_cropper": { + "crop": "Snijd bij" + }, "more_info_control": { "dismiss": "Dialoogvenster sluiten", "edit": "Entiteit bewerken", @@ -958,7 +989,7 @@ "zone": "Zone" } }, - "unsupported_condition": "Niet ondersteunde voorwaarde: {condition}" + "unsupported_condition": "Geen UI-ondersteuning voor voorwaarde: {condition}" }, "default_name": "Nieuwe automatisering", "description": { @@ -1048,6 +1079,9 @@ "sunrise": "Zonsopkomst", "sunset": "Zonsondergang" }, + "tag": { + "label": "Label" + }, "template": { "label": "Sjabloon", "value_template": "Waardesjabloon" @@ -1075,7 +1109,7 @@ "zone": "Zone" } }, - "unsupported_platform": "Niet ondersteund platform: {platform}" + "unsupported_platform": "Geen UI-ondersteuning voor platform: {platform}" }, "unsaved_confirm": "Je hebt niet-opgeslagen wijzigingen. Weet je zeker dat je wilt afsluiten?" }, @@ -1306,6 +1340,7 @@ } }, "devices": { + "add_prompt": "Er is nog geen {name} toegevoegd met dit apparaat. U kunt er één toevoegen door op de + knop hierboven te klikken.", "automation": { "actions": { "caption": "Wanneer iets wordt getriggerd..." @@ -1325,6 +1360,7 @@ "caption": "Apparaten", "confirm_delete": "Weet je zeker dat je dit apparaat wilt verwijderen?", "confirm_rename_entity_ids": "Wil je ook de entiteits-ID's van je entiteiten hernoemen?", + "confirm_rename_entity_ids_warning": "Dit zal geen enkele configuratie veranderen (zoals automatiseringen, scripts, scènes, Lovelace) die momenteel deze entiteiten gebruikt, je zult ze zelf moeten updaten.", "data_table": { "area": "Gebied", "battery": "Batterij", @@ -1487,6 +1523,9 @@ "no_device": "Entiteiten zonder apparaten", "no_devices": "Deze integratie heeft geen apparaten.", "options": "Opties", + "reload": "Herlaad", + "reload_confirm": "De integratie is opnieuw geladen", + "reload_restart_confirm": "Start Home Assistant opnieuw om het opnieuw laden van deze integratie te voltooien", "rename": "Naam wijzigen", "restart_confirm": "Herstart Home Assistant om het verwijderen van deze integratie te voltooien", "settings_button": "Instellingen bewerken voor {integration}", @@ -1645,7 +1684,11 @@ "topic": "onderwerp" }, "ozw": { + "button": "Configureer", "common": { + "controller": "Controller", + "instance": "Instantie", + "network": "Netwerk", "node_id": "Knooppunt-ID", "ozw_instance": "Instantie van OpenZWave", "zwave": "Z-Wave" @@ -1654,6 +1697,75 @@ "node_failed": "Knoop gefaald", "stage": "Stadium", "zwave_info": "Z-Wave informatie" + }, + "navigation": { + "network": "Netwerk", + "nodes": "Knooppunten", + "select_instance": "Instantie selecteren" + }, + "network_status": { + "details": { + "driverallnodesqueried": "Alle knooppunten zijn opgevraagd", + "driverallnodesqueriedsomedead": "Alle knooppunten zijn opgevraagd. Sommige knooppunten werden dood aangetroffen", + "driverawakenodesqueries": "Alle knooppunten die wakker zijn, zijn opgevraagd", + "driverfailed": "Kan geen verbinding maken met de Z-Wave-controller", + "driverready": "Initialiseren van de Z-Wave-controller", + "driverremoved": "De driver is verwijderd", + "driverreset": "De driver is gereset", + "offline": "OZWDaemon offline", + "ready": "Klaar om te verbinden", + "started": "Verbonden met MQTT", + "starting": "Verbinding maken met MQTT", + "stopped": "OpenZWave is gestopt" + }, + "offline": "Offline", + "online": "Online", + "starting": "Aan het starten", + "unknown": "Onbekend" + }, + "network": { + "header": "Netwerkbeheer", + "introduction": "Beheer netwerkbrede functies.", + "node_count": "{count} nodes" + }, + "node_query_stages": { + "associations": "Associatiegroepen en lidmaatschappen verversen", + "cacheload": "Informatie laden uit het OpenZWave-cachebestand. Knooppunten met batterij blijven in dit stadium totdat het knooppunt ontwaakt.", + "complete": "Het ondervragingsproces is voltooid", + "configuration": "Configuratiewaarden ophalen van het knooppunt", + "dynamic": "Het verkrijgen van frequent veranderende waarden uit het knooppunt", + "instances": "Details verkrijgen over welke instanties of kanalen een apparaat ondersteunt", + "manufacturerspecific1": "Verkrijgen van fabrikant- en productidentificatiecodes van het knooppunt", + "manufacturerspecific2": "Extra fabrikant- en product-ID-codes verkrijgen van het knooppunt", + "neighbors": "Een lijst ophalen met de buren van het knooppunt", + "nodeinfo": "Verkrijgen van ondersteunde commandoklassen van het knooppunt", + "nodeplusinfo": "Z-Wave+ informatie verkrijgen van het knooppunt", + "probe": "Controleren of het knooppunt wakker/levend is", + "protocolinfo": "Het verkrijgen van basis Z-Wave-mogelijkheden van dit knooppunt uit de controller", + "session": "Het verkrijgen van zelden veranderende waarden uit het knooppunt", + "static": "Statische waarden ophalen van het apparaat", + "versions": "Het verkrijgen van informatie over firmware en commandoklasseversies", + "wakeup": "Ondersteuning instellen voor waakwachtrijen en berichten" + }, + "refresh_node": { + "battery_note": "Als het knooppunt op batterijen werkt, moet u het uit de sluimerstand halen voordat u verder gaat", + "complete": "Knooppunt vernieuwen voltooid", + "description": "Dit zal OpenZWave vertellen om een knooppunt opnieuw te ondervragen en de opdrachtklassen, mogelijkheden en waarden van het knooppunt bij te werken.", + "node_status": "Knooppuntstatus", + "refreshing_description": "Knooppuntinformatie vernieuwen...", + "start_refresh_button": "Start Vernieuwen", + "step": "Stap", + "title": "Vernieuw knooppuntinformatie", + "wakeup_header": "Wekinstructies voor", + "wakeup_instructions_source": "Wekinstructies zijn afkomstig uit de OpenZWave-gemeenschapsapparaatdatabase." + }, + "select_instance": { + "header": "Selecteer een OpenZWave-instantie", + "introduction": "Je hebt meer dan één OpenZWave instantie lopen. Welke instantie wilt u beheren?" + }, + "services": { + "add_node": "Node toevoegen", + "remove_node": "Node verwijderen" } }, "person": { @@ -1779,7 +1891,9 @@ "section": { "reloading": { "automation": "Herlaad automatiseringen", + "command_line": "Laad opdrachtregelentiteiten opnieuw", "core": "Herlaad locatie en aanpassingen", + "filter": "Laad filterentiteiten opnieuw", "group": "Herlaad groepen", "heading": "Configuratie herladen", "input_boolean": "Herlaad input booleans", @@ -1789,8 +1903,12 @@ "input_text": "Herlaad input texts", "introduction": "Sommige delen van Home Assistant kunnen opnieuw worden geladen zonder dat een herstart vereist is. Als je herladen gebruikt, wordt de huidige configuratie leeggemaakt en wordt de nieuwe geladen.", "person": "Herlaad personen", + "rest": "Laad rustentiteiten opnieuw", "scene": "Herlaad scenes", "script": "Herlaad scripts", + "statistics": "Laad statistische entiteiten opnieuw", + "template": "Laad sjabloonentiteiten opnieuw", + "universal": "Laad de entiteiten van de universele mediaspeler opnieuw", "zone": "Herlaad zones" }, "server_management": { @@ -1810,6 +1928,32 @@ } } }, + "tags": { + "add_tag": "Tag toevoegen", + "automation_title": "Tag {name} is gescand", + "caption": "Tags", + "create_automation": "Creëer automatisering met tag", + "description": "Beheer tags", + "detail": { + "create": "Creëer", + "create_and_write": "Creëer en schrijf", + "delete": "Verwijder", + "description": "Beschrijving", + "name": "Naam", + "new_tag": "Nieuwe tag", + "tag_id": "Tag-ID", + "tag_id_placeholder": "Automatisch gegenereerd wanneer leeg gelaten", + "update": "Werk bij" + }, + "edit": "Bewerk", + "headers": { + "last_scanned": "Laatst gescand", + "name": "Naam" + }, + "never_scanned": "Nooit gescand", + "no_tags": "Geen tags", + "write": "Schrijf" + }, "users": { "add_user": { "caption": "Gebruiker toevoegen", @@ -2131,6 +2275,7 @@ "description": "Sjablonen worden weergegeven met de Jinja2-sjabloonediter samen met enkele extensies van Home Assistant.", "editor": "Sjabloonediter", "jinja_documentation": "Jinja2-sjabloondocumentatie", + "reset": "Resetten naar demosjabloon", "template_extensions": "Home Assistant sjabloon extensiesHome Assistant", "title": "Sjablonen", "unknown_error_template": "Onbekende fout bij weergave sjabloon" @@ -2212,6 +2357,10 @@ "description": "Met de Button-kaart kun je knoppen toevoegen om taken uit te voeren.", "name": "Knop" }, + "calendar": { + "description": "De kalenderkaart toont een kalender met dag-, week- en lijstweergaven", + "name": "Kalender" + }, "conditional": { "card": "Kaart", "change_type": "Wijzig type", @@ -2666,6 +2815,7 @@ "intro": "Hallo {name}, welkom bij Home Assistant. Welke naam wil je je huis geven?", "intro_location": "We willen graag weten waar je woont. Deze informatie zal helpen bij het weergeven van informatie en het instellen van op de zon gebaseerde automatiseringen. Deze gegevens worden nooit gedeeld buiten je netwerk.", "intro_location_detect": "Wij kunnen u helpen deze informatie in te vullen door eenmalig een verbinding te maken met een externe service.", + "location_name": "Naam van de Home Assistant installatie", "location_name_default": "Huis" }, "integration": { diff --git a/translations/frontend/pt-BR.json b/translations/frontend/pt-BR.json index de7779ea4a..078f61a7fc 100644 --- a/translations/frontend/pt-BR.json +++ b/translations/frontend/pt-BR.json @@ -419,6 +419,10 @@ "unlock": "Destrancar" }, "media_player": { + "media_next_track": "Próximo", + "media_play": "Tocar", + "media_play_pause": "Tocar/pausar", + "media_previous_track": "Anterior", "sound_mode": "Modo de som", "source": "Fonte", "text_to_speak": "Texto para falar" @@ -554,6 +558,19 @@ "loading_history": "Carregando histórico do estado ...", "no_history_found": "Histórico de estado não encontrado." }, + "media-browser": { + "content-type": { + "album": "Álbum", + "artist": "Artista", + "library": "Biblioteca", + "playlist": "Lista de reprodução", + "server": "Servidor" + }, + "play": "Tocar" + }, + "picture-upload": { + "label": "Imagem" + }, "related-items": { "area": "Área", "automation": "Parte das seguintes automações", @@ -1049,6 +1066,9 @@ "sunrise": "Nascer do sol", "sunset": "Pôr do Sol" }, + "tag": { + "label": "Etiqueta" + }, "template": { "label": "Modelo", "value_template": "Valor modelo" @@ -1488,6 +1508,8 @@ "no_device": "Entidades sem dispositivos", "no_devices": "Esta integração não possui dispositivos.", "options": "Opções", + "reload": "Recarregar", + "reload_confirm": "A integração foi recarregada", "rename": "Renomear", "restart_confirm": "Reinicie o Home Assistant para concluir a remoção dessa integração", "settings_button": "Editar configurações para {integration}", @@ -1646,6 +1668,8 @@ }, "ozw": { "common": { + "instance": "Instância", + "network": "Rede", "node_id": "ID do Nó", "ozw_instance": "Instância OpenZWave", "zwave": "Z-Wave" @@ -1654,6 +1678,25 @@ "node_failed": "Falha no nó", "stage": "Estágio", "zwave_info": "Informações de Z-Wave" + }, + "navigation": { + "network": "Rede", + "nodes": "Nós", + "select_instance": "Selecione a instância" + }, + "network_status": { + "details": { + "driverreset": "O driver foi reiniciado", + "ready": "Pronto para conectar", + "started": "Conectado ao MQTT", + "starting": "Conectando-se ao MQTT", + "stopped": "OpenZWave parado" + }, + "starting": "Iniciando", + "unknown": "Desconhecido" + }, + "network": { + "header": "Gerenciamento de Rede" } }, "person": { @@ -1780,6 +1823,7 @@ "reloading": { "automation": "Recarregar as automações", "core": "Recarregar localização & customizações", + "filter": "Recarregar entidades de filtro", "group": "Recarregar os grupos", "heading": "Recarregando a configuração YAML", "input_boolean": "Recarregar entradas de booleano", @@ -1791,6 +1835,7 @@ "person": "Recarregar pessoas", "scene": "Recarregar cenas", "script": "Recarregar os scripts", + "template": "Recarregar entidades de modelo", "zone": "Recarregar zonas" }, "server_management": { @@ -1810,6 +1855,17 @@ } } }, + "tags": { + "caption": "Etiquetas", + "detail": { + "create": "Criar", + "name": "Nome" + }, + "edit": "Editar", + "headers": { + "name": "Nome" + } + }, "users": { "add_user": { "caption": "Adicionar Usuário", @@ -2211,6 +2267,9 @@ "description": "O cartão Botão permite adicionar botões para executar tarefas.", "name": "Botão" }, + "calendar": { + "name": "Calendário" + }, "conditional": { "card": "Cartão", "change_type": "Alterar tipo", @@ -2665,6 +2724,7 @@ "intro": "Olá {name}, seja bem-vindo ao Home Assistant. Como você gostaria de nomear sua casa?", "intro_location": "Nós gostaríamos de saber onde você mora. Essa informação ajudará na exibição de informações e na configuração de automações baseadas no sol. Esses dados nunca são compartilhados fora da sua rede.", "intro_location_detect": "Podemos ajudá-lo a preencher essas informações fazendo uma solicitação única para um serviço externo.", + "location_name": "Nome da instalação do Home Assistant", "location_name_default": "Casa" }, "integration": { diff --git a/translations/frontend/ru.json b/translations/frontend/ru.json index d9bb0aeac7..5d24f67304 100644 --- a/translations/frontend/ru.json +++ b/translations/frontend/ru.json @@ -1893,7 +1893,9 @@ "section": { "reloading": { "automation": "Перезагрузить автоматизации", + "command_line": "Перезагрузить объекты командной строки", "core": "Обновить местоположение и кастомизацию", + "filter": "Перезагрузить объекты фильтров", "group": "Перезагрузить группы", "heading": "Перезагрузка конфигурации YAML", "input_boolean": "Перезагрузить вспомогательные переключатели", @@ -1903,8 +1905,10 @@ "input_text": "Перезагрузить вспомогательные элементы ввода текста", "introduction": "Некоторые компоненты Home Assistant можно перезагрузить без необходимости перезапуска всей системы. Перезагрузка выгружает текущую конфигурацию YAML и загружает новую.", "person": "Перезагрузить персоны", + "rest": "Перезагрузить остальные объекты", "scene": "Перезагрузить сцены", "script": "Перезагрузить сценарии", + "statistics": "Перезагрузить объекты статистики", "template": "Перезагрузить шаблоны", "universal": "Перезагрузить объекты универсального медиаплеера", "zone": "Перезагрузить зоны" diff --git a/translations/frontend/sl.json b/translations/frontend/sl.json index ea748126a7..acac1d917f 100644 --- a/translations/frontend/sl.json +++ b/translations/frontend/sl.json @@ -833,6 +833,15 @@ "name": "Akcija", "type_select": "Vrsta ukrepa", "type": { + "choose": { + "add_option": "Dodaj možnost", + "conditions": "Pogoji", + "default": "Privzeta dejanja", + "label": "Izberite", + "option": "Možnost {number}", + "remove_option": "Odstranite možnost", + "sequence": "Akcije" + }, "condition": { "label": "Stanje" }, @@ -852,6 +861,24 @@ "label": "Požarni dogodek", "service_data": "Podatki storitve" }, + "repeat": { + "label": "Ponovite", + "sequence": "Akcije", + "type_select": "Vrsta ponovite", + "type": { + "count": { + "label": "Števec" + }, + "until": { + "conditions": "Dokler pogoji", + "label": "Dokler" + }, + "while": { + "conditions": "Medtem pogoji", + "label": "Medtem" + } + } + }, "scene": { "label": "Aktivirajte sceno" }, @@ -1619,6 +1646,33 @@ "title": "MQTT", "topic": "tema" }, + "ozw": { + "common": { + "node_id": "ID vozlišča", + "ozw_instance": "OpenZWave primerek", + "zwave": "Z-Wave" + }, + "device_info": { + "node_failed": "Vozlišče ni uspelo", + "stage": "Stopnja", + "zwave_info": "Z-Wave Informacije" + }, + "node_query_stages": { + "complete": "Postopek intervjuja je končan", + "configuration": "Pridobitev konfiguracijskih vrednosti iz vozlišča", + "dynamic": "Pridobivanje pogosto spreminjajočih se vrednosti iz vozlišča", + "session": "Pridobitev redko spreminjajočih se vrednosti iz vozlišča" + }, + "refresh_node": { + "battery_note": "Če vozlišče napaja baterijo, se pred nadaljevanjem prepričajte, da ga zbudite", + "complete": "Osveževanje vozlišča je končano", + "refreshing_description": "Osveževanje informacij o vozlišču ...", + "start_refresh_button": "Začni osveževanje", + "title": "Osveži podatke o vozlišču", + "wakeup_header": "Navodila za bujenje za", + "wakeup_instructions_source": "Navodila za prebujanje so pridobljena iz podatkovne zbirke naprav OpenZWave." + } + }, "person": { "add_person": "Dodaj osebo", "caption": "Osebe", @@ -2387,6 +2441,9 @@ "para_migrate": "Home Assistant lahko za vas samodejno doda ID na vse vaše kartice in poglede s pritiskom na gumb »Preseli konfiguracijo«.", "para_no_id": "Ta element nima ID-ja. Prosimo, dodajte ID tega elementa v 'ui-lovelace.yaml'." }, + "move_card": { + "header": "Izberite pogled, na katerega želite premakniti kartico" + }, "raw_editor": { "confirm_remove_config_text": "Samodejno bomo ustvarili vaše poglede uporabniškega vmesnika Lovelace z vašimi območji in napravami, če odstranite konfiguracijo uporabniškega vmesnika Lovelace.", "confirm_remove_config_title": "Ali ste prepričani, da želite odstraniti konfiguracijo uporabniškega vmesnika Lovelace? Samodejno bomo ustvarili vaše poglede uporabniškega vmesnika Lovelace z vašimi območji in napravami.", @@ -2414,6 +2471,10 @@ "yaml_control": "Če želite prevzeti nadzor v načinu YAML, ustvarite datoteko YAML z imenom, ki ste ga določili v konfiguraciji za to nadzorno ploščo, ali privzeto 'ui-lovelace.yaml'.", "yaml_mode": "Za to nadzorno ploščo uporabljate način YAML, kar pomeni, da ne morete spremeniti konfiguracije Lovelace iz uporabniškega vmesnika. Če želite upravljati to nadzorno ploščo iz uporabniškega vmesnika, iz konfiguracije Lovelace v 'config.yaml.' Odstranite 'mode: yaml'." }, + "select_view": { + "dashboard_label": "Nadzorna plošča", + "header": "Izberite pogled" + }, "suggest_card": { "add": "Dodaj v uporabniški vmesnik Lovelace", "create_own": "Izberite drugačno karto", @@ -2731,10 +2792,18 @@ "header": "Samodejno zapri povezavo" }, "themes": { + "accent_color": "Barva poudarkov", + "dark_mode": { + "auto": "Samodejno", + "dark": "Temni način", + "light": "Svetli način" + }, "dropdown_label": "Tema", "error_no_theme": "Teme niso na voljo.", "header": "Tema", - "link_promo": "Preberite več o temah" + "link_promo": "Preberite več o temah", + "primary_color": "Primarna barva", + "reset": "Ponastavi" }, "vibrate": { "description": "V tej napravi omogočite ali onemogočite vibracije pri krmiljenju naprav.", diff --git a/translations/frontend/zh-Hant.json b/translations/frontend/zh-Hant.json index d2d4d6e399..15e8f547c3 100644 --- a/translations/frontend/zh-Hant.json +++ b/translations/frontend/zh-Hant.json @@ -1893,7 +1893,9 @@ "section": { "reloading": { "automation": "重新載入自動化", + "command_line": "重新載入命令列物件", "core": "重新載入座標與自訂化", + "filter": "重新載入過濾器物件", "group": "重新載入群組", "heading": "YAML 設定新載入中", "input_boolean": "重新載入輸入 boolean", @@ -1903,8 +1905,10 @@ "input_text": "重新載入輸入文字", "introduction": "Home Assistant 中部分設定無須重啟即可重新載入生效。點選重新載入按鈕,即可解除目前 YAML 設定,並重新載入最新設定。", "person": "重新載入人員", + "rest": "重新載入剩餘物件", "scene": "重新載入場景", "script": "重新載入腳本", + "statistics": "重新載入統計資訊物件", "template": "重新載入範例物件", "universal": "重新載入通用媒體播放器物件", "zone": "重新載入區域" From db0a010d7c98c0a37089169ad2c7d2aedf146a57 Mon Sep 17 00:00:00 2001 From: Zack Arnett Date: Fri, 28 Aug 2020 06:20:23 -0500 Subject: [PATCH 091/300] Graph Footer: Fix Editor Warning (#6724) --- src/panels/lovelace/header-footer/types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/panels/lovelace/header-footer/types.ts b/src/panels/lovelace/header-footer/types.ts index b0d3e28bea..52c1a83f39 100644 --- a/src/panels/lovelace/header-footer/types.ts +++ b/src/panels/lovelace/header-footer/types.ts @@ -40,7 +40,7 @@ export const buttonsHeaderFooterConfigStruct = object({ export const graphHeaderFooterConfigStruct = object({ type: string(), entity: string(), - detail: optional(string()), + detail: optional(number()), hours_to_show: optional(number()), }); From dc5b92030f2182221a25e591df0dc8760a836bb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Fri, 28 Aug 2020 14:16:55 +0200 Subject: [PATCH 092/300] Use ha-progress-button for update cards (#6725) --- hassio/src/dashboard/hassio-update.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/hassio/src/dashboard/hassio-update.ts b/hassio/src/dashboard/hassio-update.ts index d23fba6c97..2a10b8318d 100644 --- a/hassio/src/dashboard/hassio-update.ts +++ b/hassio/src/dashboard/hassio-update.ts @@ -10,7 +10,7 @@ import { internalProperty, TemplateResult, } from "lit-element"; -import "../../../src/components/buttons/ha-call-api-button"; +import "../../../src/components/buttons/ha-progress-button"; import "../../../src/components/ha-card"; import "../../../src/components/ha-svg-icon"; import { HassioHassOSInfo } from "../../../src/data/hassio/host"; @@ -131,13 +131,14 @@ export class HassioUpdate extends LitElement { Release notes - + > + Update +
    `; @@ -145,6 +146,7 @@ export class HassioUpdate extends LitElement { private async _confirmUpdate(ev): Promise { const item = ev.target; + 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}?`, @@ -153,6 +155,7 @@ export class HassioUpdate extends LitElement { }); if (!confirmed) { + item.progress = false; return; } try { @@ -164,6 +167,7 @@ export class HassioUpdate extends LitElement { typeof err === "object" ? err.body?.message || "Unkown error" : err, }); } + item.progress = false; } static get styles(): CSSResult[] { From 7a4c9b128cbe8c53933efdd4b2d6985145874ff9 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Fri, 28 Aug 2020 14:30:42 +0200 Subject: [PATCH 093/300] Allow owner users to change password of any user (#6698) Co-authored-by: Paulus Schoutsen --- src/data/auth.ts | 11 ++++ src/panels/config/users/dialog-add-user.ts | 60 +++++++++++------ src/panels/config/users/dialog-user-detail.ts | 65 ++++++++++++++++++- src/translations/en.json | 4 ++ 4 files changed, 117 insertions(+), 23 deletions(-) diff --git a/src/data/auth.ts b/src/data/auth.ts index 162ade2fbd..aea90dd335 100644 --- a/src/data/auth.ts +++ b/src/data/auth.ts @@ -44,3 +44,14 @@ export const createAuthForUser = async ( username, password, }); + +export const adminChangePassword = async ( + hass: HomeAssistant, + userId: string, + password: string +) => + hass.callWS({ + type: "config/auth_provider/homeassistant/admin_change_password", + user_id: userId, + password, + }); diff --git a/src/panels/config/users/dialog-add-user.ts b/src/panels/config/users/dialog-add-user.ts index f9f83566fb..6d6fd0ce76 100644 --- a/src/panels/config/users/dialog-add-user.ts +++ b/src/panels/config/users/dialog-add-user.ts @@ -1,20 +1,21 @@ import "@material/mwc-button"; import "@polymer/paper-input/paper-input"; -import "../../../components/ha-circular-progress"; import { css, CSSResult, customElement, html, + internalProperty, LitElement, property, - internalProperty, PropertyValues, TemplateResult, } from "lit-element"; +import { computeRTLDirection } from "../../../common/util/compute_rtl"; +import "../../../components/ha-circular-progress"; import "../../../components/ha-dialog"; -import "../../../components/ha-switch"; import "../../../components/ha-formfield"; +import "../../../components/ha-switch"; import { createAuthForUser } from "../../../data/auth"; import { createUser, @@ -27,7 +28,6 @@ import { PolymerChangedEvent } from "../../../polymer-types"; import { haStyleDialog } from "../../../resources/styles"; import { HomeAssistant } from "../../../types"; import { AddUserDialogParams } from "./show-dialog-add-user"; -import { computeRTLDirection } from "../../../common/util/compute_rtl"; @customElement("dialog-add-user") export class DialogAddUser extends LitElement { @@ -46,6 +46,8 @@ export class DialogAddUser extends LitElement { @internalProperty() private _password?: string; + @internalProperty() private _passwordConfirm?: string; + @internalProperty() private _isAdmin?: boolean; public showDialog(params: AddUserDialogParams) { @@ -53,6 +55,7 @@ export class DialogAddUser extends LitElement { this._name = ""; this._username = ""; this._password = ""; + this._passwordConfirm = ""; this._isAdmin = false; this._error = undefined; this._loading = false; @@ -83,17 +86,20 @@ export class DialogAddUser extends LitElement { ${this._error ? html`
    ${this._error}
    ` : ""} + + + + + ${this.hass.localize("ui.panel.config.users.add_user.create")} @@ -173,19 +202,10 @@ export class DialogAddUser extends LitElement { } } - private _nameChanged(ev: PolymerChangedEvent) { + private _handleValueChanged(ev: PolymerChangedEvent): void { this._error = undefined; - this._name = ev.detail.value; - } - - private _usernameChanged(ev: PolymerChangedEvent) { - this._error = undefined; - this._username = ev.detail.value; - } - - private _passwordChanged(ev: PolymerChangedEvent) { - this._error = undefined; - this._password = ev.detail.value; + const name = (ev.target as any).name; + this[`_${name}`] = ev.detail.value; } private async _adminChanged(ev): Promise { diff --git a/src/panels/config/users/dialog-user-detail.ts b/src/panels/config/users/dialog-user-detail.ts index 504ef0a4b5..fb5e29ce27 100644 --- a/src/panels/config/users/dialog-user-detail.ts +++ b/src/panels/config/users/dialog-user-detail.ts @@ -6,23 +6,28 @@ import { CSSResult, customElement, html, + internalProperty, LitElement, property, - internalProperty, TemplateResult, } from "lit-element"; +import { computeRTLDirection } from "../../../common/util/compute_rtl"; import { createCloseHeading } from "../../../components/ha-dialog"; -import "../../../components/ha-switch"; import "../../../components/ha-formfield"; +import "../../../components/ha-switch"; +import { adminChangePassword } from "../../../data/auth"; import { SYSTEM_GROUP_ID_ADMIN, SYSTEM_GROUP_ID_USER, } from "../../../data/user"; +import { + showAlertDialog, + showPromptDialog, +} from "../../../dialogs/generic/show-dialog-box"; import { PolymerChangedEvent } from "../../../polymer-types"; import { haStyleDialog } from "../../../resources/styles"; import { HomeAssistant } from "../../../types"; import { UserDetailDialogParams } from "./show-dialog-user-detail"; -import { computeRTLDirection } from "../../../common/util/compute_rtl"; @customElement("dialog-user-detail") class DialogUserDetail extends LitElement { @@ -141,7 +146,15 @@ class DialogUserDetail extends LitElement { ` : ""} + ${!user.system_generated && this.hass.user?.is_owner + ? html` + ${this.hass.localize( + "ui.panel.config.users.editor.change_password" + )} + ` + : ""}
    +
    cred.type === "homeassistant" + ); + if (!credential) { + showAlertDialog(this, { + title: "No Home Assistant credentials found.", + }); + return; + } + const newPassword = await showPromptDialog(this, { + title: this.hass.localize("ui.panel.config.users.editor.change_password"), + inputType: "password", + inputLabel: this.hass.localize( + "ui.panel.config.users.editor.new_password" + ), + }); + if (!newPassword) { + return; + } + const confirmPassword = await showPromptDialog(this, { + title: this.hass.localize("ui.panel.config.users.editor.change_password"), + inputType: "password", + inputLabel: this.hass.localize( + "ui.panel.config.users.add_user.password_confirm" + ), + }); + if (!confirmPassword) { + return; + } + if (newPassword !== confirmPassword) { + showAlertDialog(this, { + title: this.hass.localize( + "ui.panel.config.users.add_user.password_not_match" + ), + }); + return; + } + await adminChangePassword(this.hass, this._params!.entry.id, newPassword); + showAlertDialog(this, { + title: this.hass.localize( + "ui.panel.config.users.add_user.password_changed" + ), + }); + } + private _close(): void { this._params = undefined; } diff --git a/src/translations/en.json b/src/translations/en.json index e228ccb712..940bdd61f6 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1654,6 +1654,8 @@ "caption": "View user", "name": "Name", "change_password": "Change password", + "new_password": "New Password", + "password_changed": "The password is changed!", "activate_user": "Activate user", "deactivate_user": "Deactivate user", "delete_user": "Delete user", @@ -1674,6 +1676,8 @@ "name": "Name", "username": "Username", "password": "Password", + "password_confirm": "Confirm Password", + "password_not_match": "Passwords don't match", "create": "Create" } }, From 119c5c907123a3035d2a5c5951eb9bb48ce20466 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Fri, 28 Aug 2020 08:31:54 -0500 Subject: [PATCH 094/300] Add generic/generic_thermostat/homekit/min_max/history_stats/trend/ping/filesize to the list of reloadables (#6721) * Add generic/generic_thermostat/homekit/min_max/history_stats/trend/ping/filesize to the list of reloadables * Update src/translations/en.json Co-authored-by: Zack Arnett * Update src/translations/en.json Co-authored-by: Zack Arnett * Update src/translations/en.json Co-authored-by: Zack Arnett * Update src/translations/en.json Co-authored-by: Zack Arnett Co-authored-by: Zack Arnett --- .../config/server_control/ha-config-server-control.ts | 8 ++++++++ src/translations/en.json | 10 +++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/panels/config/server_control/ha-config-server-control.ts b/src/panels/config/server_control/ha-config-server-control.ts index f5e3f13ac0..def3ad5492 100644 --- a/src/panels/config/server_control/ha-config-server-control.ts +++ b/src/panels/config/server_control/ha-config-server-control.ts @@ -41,6 +41,14 @@ const reloadableDomains = [ "command_line", "filter", "statistics", + "generic", + "generic_thermostat", + "homekit", + "min_max", + "history_stats", + "trend", + "ping", + "filesize", ]; @customElement("ha-config-server-control") diff --git a/src/translations/en.json b/src/translations/en.json index 940bdd61f6..2108e81755 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -843,7 +843,15 @@ "rest": "Reload rest entities", "command_line": "Reload command line entities", "filter": "Reload filter entities", - "statistics": "Reload statistics entities" + "statistics": "Reload statistics entities", + "generic": "Reload generic IP camera entities", + "generic_thermostat": "Reload generic thermostat entities", + "homekit": "Reload HomeKit", + "min_max": "Reload min/max entities", + "history_stats": "Reload history stats entities", + "trend": "Reload trend entities", + "ping": "Reload ping binary sensor entities", + "filesize": "Reload file size entities" }, "server_management": { "heading": "Server management", From b39b54e0acf66aca44ee6ce9ae7266db81b33f09 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Fri, 28 Aug 2020 15:50:32 +0200 Subject: [PATCH 095/300] Enable filtering on hidden columns (#6717) --- src/components/data-table/ha-data-table.ts | 81 +++++---- .../data-table/sort_filter_worker.ts | 8 +- .../config/areas/ha-config-areas-dashboard.ts | 8 +- .../devices/ha-config-devices-dashboard.ts | 165 +++++++----------- 4 files changed, 119 insertions(+), 143 deletions(-) diff --git a/src/components/data-table/ha-data-table.ts b/src/components/data-table/ha-data-table.ts index af549b942f..db83db5a6d 100644 --- a/src/components/data-table/ha-data-table.ts +++ b/src/components/data-table/ha-data-table.ts @@ -70,6 +70,7 @@ export interface DataTableColumnData extends DataTableSortColumnData { maxWidth?: string; grows?: boolean; forceLTR?: boolean; + hidden?: boolean; } export interface DataTableRowData { @@ -242,8 +243,10 @@ export class HaDataTable extends LitElement {
    ` : ""} - ${Object.entries(this.columns).map((columnEntry) => { - const [key, column] = columnEntry; + ${Object.entries(this.columns).map(([key, column]) => { + if (column.hidden) { + return ""; + } const sorted = key === this._sortColumn; const classes = { "mdc-data-table__header-cell--numeric": Boolean( @@ -346,41 +349,45 @@ export class HaDataTable extends LitElement {
    ` : ""} - ${Object.entries(this.columns).map((columnEntry) => { - const [key, column] = columnEntry; - return html` -
    - ${column.template - ? column.template(row[key], row) - : row[key]} -
    - `; - })} + ${Object.entries(this.columns).map( + ([key, column]) => { + if (column.hidden) { + return ""; + } + return html` +
    + ${column.template + ? column.template(row[key], row) + : row[key]} +
    + `; + } + )}
    `; }, diff --git a/src/components/data-table/sort_filter_worker.ts b/src/components/data-table/sort_filter_worker.ts index 4c0d6d1987..1c04338a3c 100644 --- a/src/components/data-table/sort_filter_worker.ts +++ b/src/components/data-table/sort_filter_worker.ts @@ -1,11 +1,11 @@ // To use comlink under ES5 -import "proxy-polyfill"; import { expose } from "comlink"; +import "proxy-polyfill"; import type { - DataTableSortColumnData, DataTableRowData, - SortingDirection, + DataTableSortColumnData, SortableColumnContainer, + SortingDirection, } from "./ha-data-table"; const filterData = ( @@ -19,7 +19,7 @@ const filterData = ( const [key, column] = columnEntry; if (column.filterable) { if ( - (column.filterKey ? row[key][column.filterKey] : row[key]) + String(column.filterKey ? row[key][column.filterKey] : row[key]) .toUpperCase() .includes(filter) ) { diff --git a/src/panels/config/areas/ha-config-areas-dashboard.ts b/src/panels/config/areas/ha-config-areas-dashboard.ts index d5c776baa7..3b2262ee75 100644 --- a/src/panels/config/areas/ha-config-areas-dashboard.ts +++ b/src/panels/config/areas/ha-config-areas-dashboard.ts @@ -1,3 +1,5 @@ +import "@material/mwc-fab"; +import { mdiPlus } from "@mdi/js"; import "@polymer/paper-item/paper-item"; import "@polymer/paper-item/paper-item-body"; import { @@ -16,7 +18,8 @@ import { DataTableColumnContainer, RowClickedEvent, } from "../../../components/data-table/ha-data-table"; -import "@material/mwc-fab"; +import "../../../components/ha-icon-button"; +import "../../../components/ha-svg-icon"; import { AreaRegistryEntry, createAreaRegistryEntry, @@ -26,8 +29,6 @@ import { devicesInArea, } from "../../../data/device_registry"; import { showAlertDialog } from "../../../dialogs/generic/show-dialog-box"; -import "../../../components/ha-icon-button"; -import "../../../components/ha-svg-icon"; import "../../../layouts/hass-loading-screen"; import "../../../layouts/hass-tabs-subpage-data-table"; import { HomeAssistant, Route } from "../../../types"; @@ -37,7 +38,6 @@ import { loadAreaRegistryDetailDialog, showAreaRegistryDetailDialog, } from "./show-dialog-area-registry-detail"; -import { mdiPlus } from "@mdi/js"; @customElement("ha-config-areas-dashboard") export class HaConfigAreasDashboard extends LitElement { diff --git a/src/panels/config/devices/ha-config-devices-dashboard.ts b/src/panels/config/devices/ha-config-devices-dashboard.ts index 884c7c16dc..274eecf5e0 100644 --- a/src/panels/config/devices/ha-config-devices-dashboard.ts +++ b/src/panels/config/devices/ha-config-devices-dashboard.ts @@ -1,9 +1,9 @@ import { customElement, html, + internalProperty, LitElement, property, - internalProperty, TemplateResult, } from "lit-element"; import memoizeOne from "memoize-one"; @@ -25,8 +25,8 @@ import { } from "../../../data/device_registry"; import { EntityRegistryEntry, - findBatteryEntity, findBatteryChargingEntity, + findBatteryEntity, } from "../../../data/entity_registry"; import { domainToName } from "../../../data/integration"; import "../../../layouts/hass-tabs-subpage-data-table"; @@ -181,8 +181,8 @@ export class HaConfigDeviceDashboard extends LitElement { ); private _columns = memoizeOne( - (narrow: boolean): DataTableColumnContainer => - narrow + (narrow: boolean): DataTableColumnContainer => { + const columns: DataTableColumnContainer = narrow ? { name: { title: "Device", @@ -199,36 +199,6 @@ export class HaConfigDeviceDashboard extends LitElement { `; }, }, - battery_entity: { - title: this.hass.localize( - "ui.panel.config.devices.data_table.battery" - ), - sortable: true, - type: "numeric", - width: "90px", - template: ( - batteryEntityPair: DeviceRowData["battery_entity"] - ) => { - const battery = - batteryEntityPair && batteryEntityPair[0] - ? this.hass.states[batteryEntityPair[0]] - : undefined; - const batteryCharging = - batteryEntityPair && batteryEntityPair[1] - ? this.hass.states[batteryEntityPair[1]] - : undefined; - return battery - ? html` - ${isNaN(battery.state as any) ? "-" : battery.state}% - - ` - : html` - `; - }, - }, } : { name: { @@ -240,70 +210,69 @@ export class HaConfigDeviceDashboard extends LitElement { grows: true, direction: "asc", }, - manufacturer: { - title: this.hass.localize( - "ui.panel.config.devices.data_table.manufacturer" - ), - sortable: true, - filterable: true, - width: "15%", - }, - model: { - title: this.hass.localize( - "ui.panel.config.devices.data_table.model" - ), - sortable: true, - filterable: true, - width: "15%", - }, - area: { - title: this.hass.localize( - "ui.panel.config.devices.data_table.area" - ), - sortable: true, - filterable: true, - width: "15%", - }, - integration: { - title: this.hass.localize( - "ui.panel.config.devices.data_table.integration" - ), - sortable: true, - filterable: true, - width: "15%", - }, - battery_entity: { - title: this.hass.localize( - "ui.panel.config.devices.data_table.battery" - ), - sortable: true, - type: "numeric", - width: "15%", - maxWidth: "90px", - template: ( - batteryEntityPair: DeviceRowData["battery_entity"] - ) => { - const battery = - batteryEntityPair && batteryEntityPair[0] - ? this.hass.states[batteryEntityPair[0]] - : undefined; - const batteryCharging = - batteryEntityPair && batteryEntityPair[1] - ? this.hass.states[batteryEntityPair[1]] - : undefined; - return battery && !isNaN(battery.state as any) - ? html` - ${battery.state}% - - ` - : html` - `; - }, - }, - } + }; + + columns.manufacturer = { + title: this.hass.localize( + "ui.panel.config.devices.data_table.manufacturer" + ), + sortable: true, + hidden: narrow, + filterable: true, + width: "15%", + }; + columns.model = { + title: this.hass.localize("ui.panel.config.devices.data_table.model"), + sortable: true, + hidden: narrow, + filterable: true, + width: "15%", + }; + columns.area = { + title: this.hass.localize("ui.panel.config.devices.data_table.area"), + sortable: true, + hidden: narrow, + filterable: true, + width: "15%", + }; + columns.integration = { + title: this.hass.localize( + "ui.panel.config.devices.data_table.integration" + ), + sortable: true, + hidden: narrow, + filterable: true, + width: "15%", + }; + columns.battery_entity = { + title: this.hass.localize("ui.panel.config.devices.data_table.battery"), + sortable: true, + type: "numeric", + width: narrow ? "90px" : "15%", + maxWidth: "90px", + template: (batteryEntityPair: DeviceRowData["battery_entity"]) => { + const battery = + batteryEntityPair && batteryEntityPair[0] + ? this.hass.states[batteryEntityPair[0]] + : undefined; + const batteryCharging = + batteryEntityPair && batteryEntityPair[1] + ? this.hass.states[batteryEntityPair[1]] + : undefined; + return battery && !isNaN(battery.state as any) + ? html` + ${battery.state}% + + ` + : html` - `; + }, + }; + return columns; + } ); public constructor() { From 405bd29ebd92c600aecb18cf62179d98a54c3476 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Sat, 29 Aug 2020 00:08:56 +0200 Subject: [PATCH 096/300] Convert ha-progress-button to lit (#6728) --- src/components/buttons/ha-progress-button.js | 110 ------------------- src/components/buttons/ha-progress-button.ts | 97 ++++++++++++++++ 2 files changed, 97 insertions(+), 110 deletions(-) delete mode 100644 src/components/buttons/ha-progress-button.js create mode 100644 src/components/buttons/ha-progress-button.ts diff --git a/src/components/buttons/ha-progress-button.js b/src/components/buttons/ha-progress-button.js deleted file mode 100644 index ea4f90184c..0000000000 --- a/src/components/buttons/ha-progress-button.js +++ /dev/null @@ -1,110 +0,0 @@ -import "@material/mwc-button"; -import "../ha-circular-progress"; -import { html } from "@polymer/polymer/lib/utils/html-tag"; -/* eslint-plugin-disable lit */ -import { PolymerElement } from "@polymer/polymer/polymer-element"; - -class HaProgressButton extends PolymerElement { - static get template() { - return html` - -
    - - - - -
    - `; - } - - static get properties() { - return { - hass: { - type: Object, - }, - - progress: { - type: Boolean, - value: false, - }, - - disabled: { - type: Boolean, - value: false, - }, - }; - } - - tempClass(className) { - const classList = this.$.container.classList; - classList.add(className); - setTimeout(() => { - classList.remove(className); - }, 1000); - } - - ready() { - super.ready(); - this.addEventListener("click", (ev) => this.buttonTapped(ev)); - } - - buttonTapped(ev) { - if (this.progress) ev.stopPropagation(); - } - - actionSuccess() { - this.tempClass("success"); - } - - actionError() { - this.tempClass("error"); - } - - computeDisabled(disabled, progress) { - return disabled || progress; - } -} - -customElements.define("ha-progress-button", HaProgressButton); diff --git a/src/components/buttons/ha-progress-button.ts b/src/components/buttons/ha-progress-button.ts new file mode 100644 index 0000000000..eebd0cfa6b --- /dev/null +++ b/src/components/buttons/ha-progress-button.ts @@ -0,0 +1,97 @@ +import "@material/mwc-button"; +import { + css, + CSSResult, + customElement, + html, + LitElement, + property, + TemplateResult, +} from "lit-element"; + +import "../ha-circular-progress"; + +@customElement("ha-progress-button") +class HaProgressButton extends LitElement { + @property({ type: Boolean }) public disabled = false; + + @property({ type: Boolean }) public progress = false; + + public render(): TemplateResult { + return html` + + + + ${this.progress + ? html`
    + +
    ` + : ""} + `; + } + + public actionSuccess(): void { + this._tempClass("success"); + } + + public actionError(): void { + this._tempClass("error"); + } + + private _tempClass(className: string): void { + this.classList.add(className); + setTimeout(() => { + this.classList.remove(className); + }, 1000); + } + + private _buttonTapped(ev: Event): void { + if (this.progress) { + ev.stopPropagation(); + } + } + + static get styles(): CSSResult { + return css` + :host { + outline: none; + display: inline-block; + position: relative; + } + + mwc-button { + transition: all 1s; + } + + .success mwc-button { + --mdc-theme-primary: white; + background-color: var(--success-color); + transition: none; + } + + .error mwc-button { + --mdc-theme-primary: white; + background-color: var(--error-color); + transition: none; + } + + .progress { + bottom: 0; + margin-top: 4px; + position: absolute; + text-align: center; + top: 0; + width: 100%; + } + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + "ha-progress-button": HaProgressButton; + } +} From 9f2e3f05a1a186a489836097cab002642c49bf36 Mon Sep 17 00:00:00 2001 From: Zack Arnett Date: Fri, 28 Aug 2020 17:09:42 -0500 Subject: [PATCH 097/300] Entities & Glance Card: Add state color to editors (#6723) --- .../hui-entities-card-editor.ts | 55 ++++++++++++------- .../config-elements/hui-glance-card-editor.ts | 51 +++++++++++------ src/translations/en.json | 3 +- 3 files changed, 71 insertions(+), 38 deletions(-) diff --git a/src/panels/lovelace/editor/config-elements/hui-entities-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-entities-card-editor.ts index cc7d38c669..21c884a702 100644 --- a/src/panels/lovelace/editor/config-elements/hui-entities-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-entities-card-editor.ts @@ -47,6 +47,7 @@ const cardConfigStruct = object({ title: optional(union([string(), boolean()])), theme: optional(string()), show_header_toggle: optional(boolean()), + state_color: optional(boolean()), entities: array(entitiesConfigStruct), header: optional(headerFooterConfigStructs), footer: optional(headerFooterConfigStructs), @@ -89,33 +90,47 @@ export class HuiEntitiesCardEditor extends LitElement )} (${this.hass.localize( "ui.panel.lovelace.editor.card.config.optional" )})" - .value="${this._title}" - .configValue="${"title"}" - @value-changed="${this._valueChanged}" + .value=${this._title} + .configValue=${"title"} + @value-changed=${this._valueChanged} > - - - +
    + + + + + + +
    `; } diff --git a/src/panels/lovelace/editor/config-elements/hui-glance-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-glance-card-editor.ts index b8bde70faf..7d3de02655 100644 --- a/src/panels/lovelace/editor/config-elements/hui-glance-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-glance-card-editor.ts @@ -47,6 +47,7 @@ const cardConfigStruct = object({ show_name: optional(boolean()), show_state: optional(boolean()), show_icon: optional(boolean()), + state_color: optional(boolean()), entities: array(entitiesConfigStruct), }); @@ -89,6 +90,10 @@ export class HuiGlanceCardEditor extends LitElement return this._config!.show_state || true; } + get _state_color(): boolean { + return this._config!.state_color ?? true; + } + protected render(): TemplateResult { if (!this.hass || !this._config) { return html``; @@ -105,16 +110,16 @@ export class HuiGlanceCardEditor extends LitElement )} (${this.hass.localize( "ui.panel.lovelace.editor.card.config.optional" )})" - .value="${this._title}" - .configValue="${"title"}" - @value-changed="${this._valueChanged}" + .value=${this._title} + .configValue=${"title"} + @value-changed=${this._valueChanged} >
    @@ -138,8 +143,8 @@ export class HuiGlanceCardEditor extends LitElement >
    @@ -152,8 +157,8 @@ export class HuiGlanceCardEditor extends LitElement > @@ -167,18 +172,30 @@ export class HuiGlanceCardEditor extends LitElement > + + + `; } diff --git a/src/translations/en.json b/src/translations/en.json index 2108e81755..d922b5f919 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -2256,7 +2256,8 @@ "url": "Url", "state": "State", "secondary_info_attribute": "Secondary Info Attribute", - "search": "Search" + "search": "Search", + "state_color": "Color icons based on state?" }, "map": { "name": "Map", From 2e178164cc4e6dbe844d41fb2a6e820553731e86 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Sat, 29 Aug 2020 00:32:29 +0000 Subject: [PATCH 098/300] [ci skip] Translation update --- translations/frontend/cs.json | 46 +++++++++++++++----------- translations/frontend/cy.json | 62 ++++++++++++++++++++++++++++++++++- translations/frontend/en.json | 13 ++++++++ translations/frontend/fr.json | 11 ++++--- translations/frontend/pl.json | 10 ++++-- translations/frontend/ru.json | 6 ++-- 6 files changed, 116 insertions(+), 32 deletions(-) diff --git a/translations/frontend/cs.json b/translations/frontend/cs.json index 797186bebd..95982b31fb 100644 --- a/translations/frontend/cs.json +++ b/translations/frontend/cs.json @@ -1338,7 +1338,7 @@ "warning": { "include_link": "zahrnout customize.yaml", "include_sentence": "Zdá se, že configuration.yaml správně nefunguje", - "not_applied": "Změny zde provedené jsou zapsány, ale nebudou použity po opětovném načtení konfigurace, pokud není zahrnut do umístění." + "not_applied": "Změny zde provedené jsou zapsány, ale nebudou použity při novém načtení konfigurace, pokud není \"customize\" konfigurace nastavena v globální konfiguraci." } }, "devices": { @@ -1524,8 +1524,9 @@ "no_device": "Entity bez zařízení", "no_devices": "Tato integrace nemá žádná zařízení.", "options": "Možnosti", - "reload_confirm": "Integrace byla obnovena", - "reload_restart_confirm": "Restartujte Home Assistant pro obnovení této integrace", + "reload": "Nově načíst", + "reload_confirm": "Integrace byla nově načtena", + "reload_restart_confirm": "Restartujte Home Assistant pro nové načtení této integrace", "rename": "Přejmenovat", "restart_confirm": "Restartujte Home Assistant pro odstranění této integrace", "settings_button": "Upravit nastavení pro {integration}", @@ -1883,21 +1884,26 @@ "description": "Restart a zastavení serveru Home Asistent", "section": { "reloading": { - "automation": "Znovu načíst automatizace", - "core": "Znovu načíst umístění a přizpůsobení", - "group": "Znovu načíst skupiny", + "automation": "Nově načíst automatizace", + "command_line": "Nově načíst entity integrace \"command line\"", + "core": "Nově načíst umístění a přizpůsobení", + "filter": "Nově načíst entity integrace \"filter\"", + "group": "Nově načíst skupiny", "heading": "Konfigurace se načítá", - "input_boolean": "Znovu načíst pomocníky - přepínače", - "input_datetime": "Znovu načíst pomocníky - data/časy", - "input_number": "Znovu načíst pomocníky - čísla", - "input_select": "Znovu načíst pomocníky - výběry", - "input_text": "Znovu načíst pomocníky - texty", - "introduction": "Některé části Home Assistant lze načíst bez nutnosti restartování. Volba načtení zahodí jejich aktuální konfiguraci a načte novou.", - "person": "Znovu načíst osoby", - "scene": "Znovu načíst scény", - "script": "Znovu načíst skripty", - "template": "Znovu načíst entity šablon", - "zone": "Znovu načíst zóny" + "input_boolean": "Nově načíst pomocníky - přepínače", + "input_datetime": "Nově načíst pomocníky - data/časy", + "input_number": "Nově načíst pomocníky - čísla", + "input_select": "Nově načíst pomocníky - výběry", + "input_text": "Nově načíst pomocníky - texty", + "introduction": "Některé části Home Assistant lze nově načíst bez nutnosti restartování. Nové načtení zahodí jejich aktuální konfiguraci a načte novou.", + "person": "Nově načíst osoby", + "rest": "Nově načíst entity integrace \"rest\"", + "scene": "Nově načíst scény", + "script": "Nově načíst skripty", + "statistics": "Nově načíst entity integrace \"statistics\"", + "template": "Nově načíst entity integrace \"template\"", + "universal": "Nově načíst entity integrace \"universal media player\"", + "zone": "Nově načíst zóny" }, "server_management": { "confirm_restart": "Opravdu chcete restartovat Home Assistant?", @@ -2614,11 +2620,11 @@ "exit_edit_mode": "Ukončit režim úprav uživatelského rozhraní", "help": "Pomoc", "refresh": "Obnovit", - "reload_resources": "Opětovné načtení prostředků" + "reload_resources": "Nově načíst zdroje" }, - "reload_lovelace": "Znovu načíst Lovelace", + "reload_lovelace": "Nově načíst Lovelace", "reload_resources": { - "refresh_body": "Chcete-li dokončit opětovné načtení, musíte stránku aktualizovat, chcete ji nyní aktualizovat?", + "refresh_body": "Chcete-li dokončit nové načtení, musíte stránku aktualizovat. Chcete ji nyní aktualizovat?", "refresh_header": "Chcete aktualizovat stránku?" }, "unused_entities": { diff --git a/translations/frontend/cy.json b/translations/frontend/cy.json index c52366d0d7..15f461bf91 100644 --- a/translations/frontend/cy.json +++ b/translations/frontend/cy.json @@ -733,6 +733,9 @@ "no_area": "Dim Ardal", "no_device": "Endidau heb ddyfeisiau", "no_devices": "Tydi'r integreiddad yma ddim efo dyfeisiadau.", + "reload": "Ail-lwytho", + "reload_confirm": "Cafodd yr integreiddiad ei ail-lwytho", + "reload_restart_confirm": "Ailgychwyn Home Assistant i ddarfod yr integreiddiadau", "restart_confirm": "Ailgychwyn Home Assistant i ddarfod dileu'r integreiddiad hwn" }, "config_flow": { @@ -783,6 +786,52 @@ "mqtt": { "title": "MQTT" }, + "ozw": { + "button": "Ffurfweddu", + "common": { + "controller": "Rheolwr", + "instance": "Enghraifft", + "network": "Rhwydwaith" + }, + "navigation": { + "network": "Rhwydwaith", + "nodes": "Nodau", + "select_instance": "Dewis Enghraifft" + }, + "network_status": { + "details": { + "driverallnodesqueried": "Holwyd pob nod", + "driverallnodesqueriedsomedead": "Holwyd pob nod. Cafwyd hyd i rai nodau yn farw", + "driverawakenodesqueries": "Holwyd pob nod effro", + "driverfailed": "Wedi methu cysylltu â rheolydd Z-Wave", + "driverready": "Cychwyn y rheolydd Z-Wave", + "driverremoved": "Mae'r gyrrwr wedi'i diddymu", + "driverreset": "Mae'r gyrrwr wedi cael ei ailosod", + "offline": "OZWDaemon all-lein", + "ready": "Barod i gysylltu", + "started": "Cysylltu â MQTT", + "starting": "Cysylltu â MQTT", + "stopped": "Stopiodd OpenZWave" + }, + "offline": "All-lein", + "online": "Ar-lein", + "starting": "Cychwyn", + "unknown": "Anhysbys" + }, + "network": { + "header": "Rheolaeth Rhwydwaith", + "introduction": "Rheoli swyddogaethau rhwydwaith-lydan", + "node_count": "nodau {count}" + }, + "select_instance": { + "header": "Dewiswch Enghraifft OpenZWave", + "introduction": "Mae gennych fwy nag un enghraifft OpenZWave yn rhedeg. Pa enghraifft hoffech chi ei rheoli?" + }, + "services": { + "add_node": "Ychwanegu Nod", + "remove_node": "Tynnu Nod" + } + }, "person": { "caption": "Pobl", "description": "Rheoli'r pobl mae Home Assistant yn tracio.", @@ -838,11 +887,16 @@ "section": { "reloading": { "automation": "Ail-lwytho awtomeiddiadau", + "command_line": "Ail-lwytho endidau llinell orchymyn", "core": "Ail-lwytho craidd", + "filter": "Ail-lwytho endidau hidlo", "group": "Ail-lwytho grwpiau", "heading": "Ffurfweddiad yn ail-lwytho", "introduction": "Gall rhai rhannau o Home Assistant ail-lwytho heb orfod ailgychwyn. Bydd taro ail-lwytho yn dadlwytho eu cyfluniad cyfredol a llwytho'r un newydd.", - "script": "Ail-lwytho sgriptiau" + "rest": "Ail-lwytho endidau gorffwys", + "script": "Ail-lwytho sgriptiau", + "statistics": "Ail-lwytho endidau ystadegau", + "universal": "Ail-lwytho endidau chwaraewyr cyfryngau cyffredinol" }, "server_management": { "heading": "Rheoli gweinydd", @@ -945,6 +999,7 @@ "title": "Cyflerau" }, "templates": { + "reset": "Ailosod i dempled demo", "title": "Templedi" } } @@ -995,6 +1050,10 @@ "button": { "description": "Mae'r cerdyn Botwm yn caniatáu ichi ychwanegu botymau i gyflawni tasgau." }, + "calendar": { + "description": "Mae'r cerdyn Calendr yn dangos calendr gan gynnwys gweddlun dydd, wythnos a restr", + "name": "Calendr" + }, "conditional": { "card": "Cerdyn", "change_type": "Newid math", @@ -1281,6 +1340,7 @@ "intro": "Helo {name}, croeso i Home Assistant. Sut hoffech enwi eich tŷ?", "intro_location": "Hoffem wybod ble rydych chi'n byw. Bydd y wybodaeth yn helpu i arddangos gwybodaeth a sefydlu awtomeiddiadau haul. Tydi'r data byth yn cael ei rannu thu allan i'ch rhwydwaith.", "intro_location_detect": "Gallwn eich helpu i lenwi'r wybodaeth hon drwy wneud cais un-tro i wasanaeth allanol.", + "location_name": "Enw eich gosodiad Home Assistant", "location_name_default": "Hafan" }, "integration": { diff --git a/translations/frontend/en.json b/translations/frontend/en.json index 44aa3512db..e31995defc 100644 --- a/translations/frontend/en.json +++ b/translations/frontend/en.json @@ -1895,21 +1895,29 @@ "automation": "Reload automations", "command_line": "Reload command line entities", "core": "Reload location & customizations", + "filesize": "Reload file size entities", "filter": "Reload filter entities", + "generic": "Reload generic IP camera entities", + "generic_thermostat": "Reload generic thermostat entities", "group": "Reload groups", "heading": "YAML configuration reloading", + "history_stats": "Reload history stats entities", + "homekit": "Reload HomeKit", "input_boolean": "Reload input booleans", "input_datetime": "Reload input date times", "input_number": "Reload input numbers", "input_select": "Reload input selects", "input_text": "Reload input texts", "introduction": "Some parts of Home Assistant can reload without requiring a restart. Hitting reload will unload their current YAML configuration and load the new one.", + "min_max": "Reload min/max entities", "person": "Reload persons", + "ping": "Reload ping binary sensor entities", "rest": "Reload rest entities", "scene": "Reload scenes", "script": "Reload scripts", "statistics": "Reload statistics entities", "template": "Reload template entities", + "trend": "Reload trend entities", "universal": "Reload universal media player entities", "zone": "Reload zones" }, @@ -1962,6 +1970,8 @@ "create": "Create", "name": "Name", "password": "Password", + "password_confirm": "Confirm Password", + "password_not_match": "Passwords don't match", "username": "Username" }, "caption": "Users", @@ -1978,7 +1988,9 @@ "group": "Group", "id": "ID", "name": "Name", + "new_password": "New Password", "owner": "Owner", + "password_changed": "The password is changed!", "system_generated": "System generated", "system_generated_users_not_editable": "Unable to update system generated users.", "system_generated_users_not_removable": "Unable to remove system generated users.", @@ -2428,6 +2440,7 @@ "show_name": "Show Name?", "show_state": "Show State?", "state": "State", + "state_color": "Color icons based on state?", "tap_action": "Tap Action", "theme": "Theme", "title": "Title", diff --git a/translations/frontend/fr.json b/translations/frontend/fr.json index 551a996ed0..7d2f666bca 100644 --- a/translations/frontend/fr.json +++ b/translations/frontend/fr.json @@ -1898,11 +1898,11 @@ "filter": "Recharger les entités de filtre", "group": "Recharger les groupes", "heading": "Rechargement de la configuration", - "input_boolean": "Recharger les booléens d'entrée", - "input_datetime": "Recharger les heures de date d'entrée", - "input_number": "Recharger les numéros d'entrée", - "input_select": "Recharger les sélections d'entrée", - "input_text": "Recharger les textes d'entrée", + "input_boolean": "Recharger les entrées booléennes (input boolean)", + "input_datetime": "Recharger les entrées de date et heure (input date time)", + "input_number": "Recharger les entrées numériques (input number)", + "input_select": "Recharger les listes de sélection (input select)", + "input_text": "Recharger les entrées de texte (input text)", "introduction": "Certaines parties de Home Assistant peuvent être rechargées sans nécessiter de redémarrage. Le fait de cliquer sur recharger déchargera leur configuration actuelle et chargera la nouvelle.", "person": "Recharger les personnes", "rest": "Recharger les entités REST", @@ -1910,6 +1910,7 @@ "script": "Recharger les scripts", "statistics": "Recharger les entités de statistiques", "template": "Recharger les entités modèles", + "universal": "Recharger les entités de lecteur média universel", "zone": "Recharger les zones" }, "server_management": { diff --git a/translations/frontend/pl.json b/translations/frontend/pl.json index 2e3df7bffa..6407a004e3 100644 --- a/translations/frontend/pl.json +++ b/translations/frontend/pl.json @@ -1893,20 +1893,24 @@ "section": { "reloading": { "automation": "Automatyzacje", + "command_line": "Encje komponentu linia komend", "core": "Lokalizacja i dostosowywanie", + "filter": "Encje komponentu filtr", "group": "Grupy", - "heading": "Ponowne wczytanie konfiguracji", + "heading": "Ponowne wczytanie konfiguracji YAML", "input_boolean": "Pomocnicy typu przełącznik", "input_datetime": "Pomocnicy typu data i czas", "input_number": "Pomocnicy typu numer", "input_select": "Pomocnicy typu pole wyboru", "input_text": "Pomocnicy typu tekst", - "introduction": "Niektóre fragmenty konfiguracji można przeładować bez ponownego uruchamiania. Poniższe przyciski pozwalają na ponowne wczytanie konfiguracji.", + "introduction": "Niektóre fragmenty konfiguracji można przeładować bez ponownego uruchamiania. Poniższe przyciski pozwalają na ponowne wczytanie danej części konfiguracji YAML.", "person": "Osoby", + "rest": "Encje komponentu rest", "scene": "Sceny", "script": "Skrypty", + "statistics": "Encje komponentu statystyka", "template": "Szablony encji", - "universal": "Encje uniwersalnego odtwarzacza mediów", + "universal": "Encje komponentu uniwersalny odtwarzacz mediów", "zone": "Strefy" }, "server_management": { diff --git a/translations/frontend/ru.json b/translations/frontend/ru.json index 5d24f67304..03968a3cd9 100644 --- a/translations/frontend/ru.json +++ b/translations/frontend/ru.json @@ -1177,11 +1177,11 @@ "remote": { "access_is_being_prepared": "Удалённый доступ подготавливается. Мы сообщим Вам, когда он будет готов.", "certificate_info": "Информация о сертификате", - "info": "Home Assistant Cloud обеспечивает безопасное удалённое подключение к Вашему серверу, даже если Вы находитесь вдали от дома.", + "info": "Home Assistant Cloud обеспечивает безопасное подключение к Вашему серверу, даже если Вы находитесь вдали от дома.", "instance_is_available": "Ваш Home Assistant доступен по адресу", "instance_will_be_available": "Ваш Home Assistant будет доступен по адресу", "link_learn_how_it_works": "Узнайте, как это работает", - "title": "Удалённое управление" + "title": "Удалённый доступ" }, "sign_out": "Выйти", "thank_you_note": "Спасибо за то, что стали частью Home Assistant Cloud. Именно благодаря таким людям, как Вы, мы можем сделать все возможное для того, чтобы домашняя автоматизация была максимально удобной для всех. Спасибо!", @@ -1252,7 +1252,7 @@ "email": "Адрес электронной почты", "email_error_msg": "Неверный адрес электронной почты.", "forgot_password": "забыли пароль?", - "introduction": "Home Assistant Cloud обеспечивает безопасное удалённое подключение к Вашему серверу, даже если Вы находитесь вдали от дома. Также это даёт возможность подключения к функциям облачных сервисов Amazon Alexa и Google Assistant.", + "introduction": "Home Assistant Cloud обеспечивает безопасный доступ к Вашему серверу, даже если Вы находитесь вдали от дома. Также это даёт возможность подключения к функциям облачных сервисов Amazon Alexa и Google Assistant.", "introduction2": "Услуга предоставляется нашим партнером ", "introduction2a": ", компанией от основателей Home Assistant и Hass.io.", "introduction3": "Home Assistant Cloud предлагает одноразовый бесплатный пробный период продолжительностью один месяц. Для активации пробного периода платёжная информация не требуется.", From 448e9b71b8a3a03d4ceb39b56718e3e4da5b6331 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Sun, 30 Aug 2020 00:32:28 +0000 Subject: [PATCH 099/300] [ci skip] Translation update --- translations/frontend/ca.json | 13 +++ translations/frontend/cs.json | 167 +++++++++++++++++++--------------- translations/frontend/nb.json | 59 +++++++----- translations/frontend/ru.json | 25 +++-- 4 files changed, 162 insertions(+), 102 deletions(-) diff --git a/translations/frontend/ca.json b/translations/frontend/ca.json index 5d3ed1ae94..a5337fd828 100644 --- a/translations/frontend/ca.json +++ b/translations/frontend/ca.json @@ -1895,21 +1895,29 @@ "automation": "Actualitza automatitzacions", "command_line": "Torna a carregar entitats de comandes", "core": "Actualitza ubicació i personalitzacions", + "filesize": "Torna a carregar entitats de mida de fitxer", "filter": "Torna a carregar entitats de filtre", + "generic": "Torna a carregar entitats genèriques de càmera IP", + "generic_thermostat": "Torna a carregar entitats genèriques de termòstat", "group": "Actualitza grups", "heading": "Tornant a carregar la configuració", + "history_stats": "Torna a carregar entitats d'estadístiques històriques", + "homekit": "Torna a carregar HomeKit", "input_boolean": "Actualitza entrades booleanes", "input_datetime": "Actualitza entrades de data i hora", "input_number": "Actualitza entrades numèriques", "input_select": "Actualitza entrades de selecció", "input_text": "Actualitza entrades de text", "introduction": "Algunes parts de Home Assistant es poden actualitzar sense necessitat reiniciar-lo. Si prems actualitza s'esborrarà la configuració YAML actual i se'n carregarà la nova.", + "min_max": "Torna a carregar entitats min/max", "person": "Actualitza persones", + "ping": "Torna a carregar entitats de sensors binaris de ping", "rest": "Torna a carregar entitats de repòs", "scene": "Actualitza escenes", "script": "Actualitza programes", "statistics": "Torna a carregar entitats estadístiques", "template": "Torna a carregar entitats de plantilla", + "trend": "Torna a carregar entitats de tendència", "universal": "Torna a carregar entitats del reproductor universal", "zone": "Actualitza zones" }, @@ -1962,6 +1970,8 @@ "create": "Crear", "name": "Nom", "password": "Contrasenya", + "password_confirm": "Confirma la contrasenya", + "password_not_match": "Les contrasenyes no coincideixen", "username": "Nom d'usuari" }, "caption": "Usuaris", @@ -1978,7 +1988,9 @@ "group": "Grup", "id": "ID", "name": "Nom", + "new_password": "Nova contrasenya", "owner": "Propietari", + "password_changed": "La contrasenya s'ha canviat!", "system_generated": "Generat pel sistema", "system_generated_users_not_editable": "No es poden actualitzar usuaris generats pel sistema.", "system_generated_users_not_removable": "No es poden eliminar usuaris generats pel sistema.", @@ -2428,6 +2440,7 @@ "show_name": "Mostra nom?", "show_state": "Mostra estat?", "state": "Estat", + "state_color": "Color de les icones basat en l'estat?", "tap_action": "Acció en tocar", "theme": "Tema", "title": "Títol", diff --git a/translations/frontend/cs.json b/translations/frontend/cs.json index 95982b31fb..dbd70c4099 100644 --- a/translations/frontend/cs.json +++ b/translations/frontend/cs.json @@ -105,7 +105,7 @@ "triggered": "Spuštěno" }, "automation": { - "off": "Neaktivní", + "off": "Vypnuto", "on": "Aktivní" }, "binary_sensor": { @@ -115,7 +115,7 @@ }, "cold": { "off": "Normální", - "on": "Chladné" + "on": "Studený" }, "connectivity": { "off": "Odpojeno", @@ -139,7 +139,7 @@ }, "heat": { "off": "Normální", - "on": "Horké" + "on": "Horký" }, "lock": { "off": "Zamčeno", @@ -191,8 +191,8 @@ } }, "calendar": { - "off": "Neaktivní", - "on": "Aktivní" + "off": "Vypnuto", + "on": "Zapnuto" }, "camera": { "idle": "Nečinný", @@ -205,7 +205,7 @@ "fan_only": "Pouze ventilátor", "heat": "Topení", "heat_cool": "Vytápění/Chlazení", - "off": "Neaktivní" + "off": "Vypnuto" }, "configurator": { "configure": "Konfigurovat", @@ -213,9 +213,9 @@ }, "cover": { "closed": "Zavřeno", - "closing": "Zavírání", + "closing": "Zavírá se", "open": "Otevřeno", - "opening": "Otevírání", + "opening": "Otvírá se", "stopped": "Zastaveno" }, "default": { @@ -228,30 +228,30 @@ "not_home": "Pryč" }, "fan": { - "off": "Neaktivní", - "on": "Aktivní" + "off": "Vypnuto", + "on": "Zapnuto" }, "group": { "closed": "Zavřeno", - "closing": "Zavírání", + "closing": "Zavírá se", "home": "Doma", "locked": "Zamčeno", "not_home": "Pryč", - "off": "Neaktivní", + "off": "Vypnuto", "ok": "V pořádku", - "on": "Aktivní", + "on": "Zapnuto", "open": "Otevřeno", - "opening": "Otevírání", + "opening": "Otvírá se", "problem": "Problém", "stopped": "Zastaveno", "unlocked": "Odemčeno" }, "input_boolean": { "off": "Neaktivní", - "on": "Aktivní" + "on": "Zapnuto" }, "light": { - "off": "Neaktivní", + "off": "Vypnuto", "on": "Aktivní" }, "lock": { @@ -260,8 +260,8 @@ }, "media_player": { "idle": "Nečinný", - "off": "Neaktivní", - "on": "Aktivní", + "off": "Vypnuto", + "on": "Zapnuto", "paused": "Pozastaveno", "playing": "Přehrávání", "standby": "Pohotovostní režim" @@ -274,27 +274,27 @@ "problem": "Problém" }, "remote": { - "off": "Neaktivní", - "on": "Aktivní" + "off": "Vypnuto", + "on": "Zapnuto" }, "scene": { "scening": "Scenérie" }, "script": { - "off": "Neaktivní", - "on": "Aktivní" + "off": "Vypnuto", + "on": "Zapnuto" }, "sensor": { - "off": "Neaktivní", - "on": "Aktivní" + "off": "Vypnuto", + "on": "Zapnuto" }, "sun": { "above_horizon": "Nad horizontem", "below_horizon": "Za horizontem" }, "switch": { - "off": "Neaktivní", - "on": "Aktivní" + "off": "Vypnuto", + "on": "Zapnuto" }, "timer": { "active": "aktivní", @@ -306,8 +306,8 @@ "docked": "Ve stanici", "error": "Chyba", "idle": "Nečinný", - "off": "Off", - "on": "On", + "off": "Vypnuto", + "on": "Zapnuto", "paused": "Pozastaveno", "returning": "Návrat do stanice" }, @@ -786,8 +786,8 @@ }, "duration": { "day": "{count} {count, plural,\none {den}\nfew {dny}\nother {dnů}\n}", - "hour": "{count} {count, plural,\n one {hodinou}\n other {hodiny}\n}", - "minute": "{count} {count, plural,\none {minutou}\nother {minuty}\n}", + "hour": "{count} {count, plural,\n one {hodina}\n few {hodiny}\n other {hodin}\n}", + "minute": "{count} {count, plural,\none {minuta}\nfew {minuty}\nother {minut}\n}", "second": "{count} {count, plural,\none {sekunda}\nfew {sekundy}\nother {sekund}\n}", "week": "{count} {count, plural,\none {týden}\nfew {týdny}\nother {týdnů}\n}" }, @@ -820,7 +820,7 @@ "link_profile_page": "stránka vašeho profilu" }, "areas": { - "caption": "Registr oblastí", + "caption": "Oblasti", "data_table": { "area": "Oblast", "devices": "Zařízení" @@ -829,7 +829,7 @@ "confirmation_text": "Všechna zařízení v této oblasti budou nastavena jako nepřiřazena.", "confirmation_title": "Opravdu chcete tuto oblast smazat?" }, - "description": "Přehled všech oblastí ve vaší domácnosti.", + "description": "Správa oblastí ve vaší domácnosti", "editor": { "area_id": "ID oblasti", "create": "VYTVOŘIT", @@ -838,11 +838,11 @@ "name": "Název", "name_required": "Název je povinný", "unknown_error": "Neznámá chyba", - "update": "UPRAVIT" + "update": "Aktualizovat" }, "picker": { "create_area": "Vytvořit oblast", - "header": "Registr oblastí", + "header": "Oblasti", "integrations_page": "Stránka integrací", "introduction": "Oblasti se používají k uspořádání zařízení podle místa kde jsou. Tato informace bude použita k organizaci rozhraní, k nastavení oprávnění a v integraci s ostatnímy systémy.", "introduction2": "Pro přídání zařízení do oblasti přejděte na stránku integrací pomocí odkazu níže tam klikněte na nakonfigurovanou integraci abyste se dostali na kartu zažízení.", @@ -851,7 +851,7 @@ }, "automation": { "caption": "Automatizace", - "description": "Vytvářejte a upravujte automatizace", + "description": "Správa automatizací", "editor": { "actions": { "add": "Přidat akci", @@ -923,7 +923,7 @@ "wait_template": "Šablona pro čekání" } }, - "unsupported_action": "Nepodporovaná akce: {action}" + "unsupported_action": "Akce {action} není podporována v uživatelském rozhraní" }, "alias": "Název", "conditions": { @@ -989,7 +989,7 @@ "zone": "Zóna" } }, - "unsupported_condition": "Nepodporovaná podmínka: {condition}" + "unsupported_condition": "Podmínka {condition} není podporována v uživatelském rozhraní" }, "default_name": "Nová automatizace", "description": { @@ -1111,7 +1111,7 @@ "zone": "Zóna" } }, - "unsupported_platform": "Nepodporovaná platforma: {platform}" + "unsupported_platform": "Platforma {platform} není podporována v uživatelském rozhraní" }, "unsaved_confirm": "Máte neuložené změny. Opravdu chcete odejít?" }, @@ -1124,7 +1124,7 @@ "headers": { "name": "Název" }, - "introduction": "Editor automatizací umožňuje vytvářet a upravovat automatizace. Přečtěte si prosím [pokyny] (https://home-assistant.io/docs/automation/editor/), abyste se ujistili, že jste aplikaci Home Assistant nakonfigurovali správně.", + "introduction": "Editor automatizací umožňuje vytvářet a upravovat automatizace. Přečtěte si prosím [pokyny] (https://home-assistant.io/docs/automation/editor/), abyste se ujistili, že jste Home Assistant nakonfigurovali správně.", "learn_more": "Další informace o automatizacích", "no_automations": "Nemohli jsme najít žádné upravitelné automatizace", "only_editable": "Upravitelné mohou být pouze automatizace definované v automations.yaml.", @@ -1295,7 +1295,7 @@ }, "core": { "caption": "Obecné", - "description": "Ověřte konfigurační soubor a spravujte server", + "description": "Změny obecné konfigurace Home Assistant", "section": { "core": { "core_config": { @@ -1315,7 +1315,7 @@ "unit_system_imperial": "Imperiální", "unit_system_metric": "Metrický" }, - "header": "Konfigurace a správa serveru", + "header": "Obecná konfigurace", "introduction": "Moc dobře víme, že změna konfigurace může být velmi únavným procesem. Tato sekce se proto pokusí udělat váš život alespoň trochu jednodušší." } } @@ -1342,6 +1342,7 @@ } }, "devices": { + "add_prompt": "Pomocí tohoto zařízení dosud nebyl přidán žádný {name}. Můžete ho přidat kliknutím na tlačítko + výše.", "automation": { "actions": { "caption": "Když je něco spuštěno ..." @@ -1377,7 +1378,7 @@ "device_info": "Informace o zařízení", "device_not_found": "Zařízení nebylo nalezeno.", "entities": { - "add_entities_lovelace": "Přidat všechny entity zařízení do Lovelace", + "add_entities_lovelace": "Přidat do Lovelace", "disabled_entities": "+{count} {count, plural,\n one {zakázaná entita}\n other {zakázaných entit}\n}", "entities": "Entity", "hide_disabled": "Skrýt zakázané", @@ -1402,8 +1403,8 @@ "update": "Aktualizovat" }, "entities": { - "caption": "Registr entit", - "description": "Přehled všech známých entit", + "caption": "Entity", + "description": "Správa známých entit", "picker": { "disable_selected": { "button": "Zakázat vybrané", @@ -1421,7 +1422,7 @@ "show_readonly": "Zobrazit entity jen pro čtení", "show_unavailable": "Zobrazit nedostupné entity" }, - "header": "Registr entit", + "header": "Entity", "headers": { "entity_id": "ID entity", "integration": "Integrace", @@ -1429,7 +1430,7 @@ "status": "Stav" }, "introduction": "Homa Assistant uchovává registr všech entit, které kdy viděl a mohou být jednoznačně identifikovány. Každá z těchto entit bude mít přiděleno ID, které bude rezervováno pouze pro tuto entitu.", - "introduction2": "Pomocí registru entit můžete přepsat název, změnit identifikátor entity nebo odebrat entitu. Poznámka: odebrání entity z registru entit nesmaže entitu. Pro smazání přejděte na stránku integrací pomocí odkazu níže.", + "introduction2": "Pomocí registru entit můžete přepsat název, změnit identifikátor entity nebo odebrat entitu.", "remove_selected": { "button": "Odstranit vybrané", "confirm_partly_text": "Můžete odebrat pouze {removable} z vybraných {selected} entit. Entity lze odebrat pouze v případě, že integrace již entity neposkytuje. Občas je třeba restartovat Home Assistant před tím, než je možné odstranit entity ze smazané integrace. Opravdu chcete odebrat odstranitelné entity?", @@ -1551,14 +1552,14 @@ }, "configure": "Konfigurovat", "configured": "Zkonfigurováno", - "description": "Spravovat připojená zařízení a služby", + "description": "Správa integrací", "details": "Podrobnosti o integraci", "discovered": "Objeveno", "home_assistant_website": "stránky Home Assistant", "ignore": { "confirm_delete_ignore": "To způsobí, že se integrace znovu objeví ve vašich zjištěných integracích. Může to vyžadovat restartování nebo to může nějakou dobu trvat.", "confirm_delete_ignore_title": "Přestat ignorovat {name}?", - "confirm_ignore": "Opravdu nechcete tuto integraci nastavit? Tuto akci můžete vrátit zpět klepnutím na 'Zobrazit ignorované integrace' v nabídce vpravo nahoře.", + "confirm_ignore": "Opravdu nechcete tuto integraci nastavit? Tuto akci můžete vrátit zpět klepnutím na \"Zobrazit ignorované integrace\" v nabídce vpravo nahoře.", "confirm_ignore_title": "Ignorovat objevený {name}?", "hide_ignored": "Skrýt ignorované integrace", "ignore": "Ignorovat", @@ -1579,7 +1580,7 @@ "rename_input_label": "Název položky", "search": "Hledat integraci" }, - "introduction": "Zde je možné konfigurovat vaše komponenty a Home Assistant.\nZ uživatelského rozhraní sice zatím není možné konfigurovat vše, ale pracujeme na tom.", + "introduction": "Zde je možné konfigurovat vaše komponenty a Home Assistant.\nZatím není možné vše konfigurovat přímo z uživatelského rozhraní, ale pracujeme na tom.", "logs": { "caption": "Logy", "clear": "Zrušit", @@ -1600,7 +1601,7 @@ "cant_edit_yaml": "Dashboardy definované v YAML nelze upravovat z uživatelského rozhraní. Změňte je v configuration.yaml.", "caption": "Dashboardy", "conf_mode": { - "storage": "Řízeno UI", + "storage": "Řízeno uživatelským rozhraním", "yaml": "Soubor YAML" }, "confirm_delete": "Opravdu chcete odstranit tento dashboard?", @@ -1635,7 +1636,7 @@ "open": "Otevřít" } }, - "description": "Nakonfigurujte své Lovelace Dashboardy", + "description": "Správa Lovelace Dashboardů", "resources": { "cant_edit_yaml": "Používáte Lovelace v režimu YAML, proto nemůžete spravovat své zdroje prostřednictvím uživatelského rozhraní. Spravujte je v souboru configuration.yaml.", "caption": "Zdroje", @@ -1696,6 +1697,7 @@ }, "device_info": { "node_failed": "Uzel selhal", + "stage": "Fáze", "zwave_info": "Informace o Z-Wave" }, "navigation": { @@ -1725,9 +1727,13 @@ }, "network": { "header": "Správa sítě", + "introduction": "Správa funkcí pro celou síť", "node_count": "{count} uzlů" }, "node_query_stages": { + "associations": "Obnovuji přidružené skupiny a členství", + "cacheload": "Načítám informace ze souboru mezipaměti OpenZWave. Uzly baterií zůstanou v této fázi, dokud se uzel neprobudí.", + "complete": "Proces komunikace je dokončen", "configuration": "Získávám konfiguraci z uzlu", "dynamic": "Získávám často se měnící hodnoty z uzlu", "instances": "Získávám podrobnosti o tom, jaké instance nebo kanály zařízení podporuje", @@ -1746,12 +1752,14 @@ "refresh_node": { "battery_note": "Pokud je uzel napájen z baterie, nezapomeňte jej probudit, než budete pokračovat", "complete": "Obnova uzlu dokončena", + "description": "Toto řekne OpenZWave, aby znovu provedl komunikaci s uzlem a aktualizoval typy příkazů, schopnosti a hodnoty uzlu.", "node_status": "Stav uzlu", "refreshing_description": "Aktualizuji informací o uzlu...", "start_refresh_button": "Spustit Obnovení", "step": "Krok", "title": "Aktualizovat informace o uzlu", - "wakeup_header": "Pokyny pro probuzení pro" + "wakeup_header": "Pokyny pro probuzení pro", + "wakeup_instructions_source": "Pokyny k probuzení pocházejí z komunitní databáze zařízení OpenZWave." }, "select_instance": { "header": "Vyberte instanci OpenZWave", @@ -1768,7 +1776,7 @@ "confirm_delete": "Opravdu chcete odstranit tuto osobu?", "confirm_delete2": "Všechna zařízení patřící této osobě budou nastavena jako nepřiřazena.", "create_person": "Vytvořit osobu", - "description": "Spravujte osoby, které Home Assistant sleduje.", + "description": "Správa osob, které Home Assistant sleduje", "detail": { "create": "Vytvořit", "delete": "Smazat", @@ -1791,7 +1799,7 @@ "scene": { "activated": "Aktivovaná scéna {name}.", "caption": "Scény", - "description": "Vytváření a úpravy scén", + "description": "Správa scén", "editor": { "default_name": "Nová scéna", "devices": { @@ -1834,8 +1842,8 @@ } }, "script": { - "caption": "Skript", - "description": "Vytvářejte a upravujte skripty", + "caption": "Skripty", + "description": "Správa skriptů", "editor": { "alias": "Název", "default_name": "Nový skript", @@ -1885,24 +1893,32 @@ "section": { "reloading": { "automation": "Nově načíst automatizace", - "command_line": "Nově načíst entity integrace \"command line\"", + "command_line": "Nově načíst entity integrace Command line", "core": "Nově načíst umístění a přizpůsobení", - "filter": "Nově načíst entity integrace \"filter\"", + "filesize": "Nově načíst entity integrace File size", + "filter": "Nově načíst entity integrace Filter", + "generic": "Nově načíst entity integrace Generic IP camera", + "generic_thermostat": "Nově načíst entity integrace Generic thermostat", "group": "Nově načíst skupiny", "heading": "Konfigurace se načítá", + "history_stats": "Nově načíst entity integrace History stats", + "homekit": "Nově načíst entity integrace HomeKit", "input_boolean": "Nově načíst pomocníky - přepínače", "input_datetime": "Nově načíst pomocníky - data/časy", "input_number": "Nově načíst pomocníky - čísla", "input_select": "Nově načíst pomocníky - výběry", "input_text": "Nově načíst pomocníky - texty", "introduction": "Některé části Home Assistant lze nově načíst bez nutnosti restartování. Nové načtení zahodí jejich aktuální konfiguraci a načte novou.", + "min_max": "Nově načíst entity integrace Min/Max", "person": "Nově načíst osoby", - "rest": "Nově načíst entity integrace \"rest\"", + "ping": "Nově načíst entity integrace Ping", + "rest": "Nově načíst entity integrace Rest", "scene": "Nově načíst scény", "script": "Nově načíst skripty", - "statistics": "Nově načíst entity integrace \"statistics\"", - "template": "Nově načíst entity integrace \"template\"", - "universal": "Nově načíst entity integrace \"universal media player\"", + "statistics": "Nově načíst entity integrace Statistics", + "template": "Nově načíst entity integrace Template", + "trend": "Nově načíst entity integrace Trend", + "universal": "Nově načíst entity integrace Universal media player", "zone": "Nově načíst zóny" }, "server_management": { @@ -1954,6 +1970,8 @@ "create": "Vytvořit", "name": "Jméno", "password": "Heslo", + "password_confirm": "Potvrzení hesla", + "password_not_match": "Hesla se neshodují", "username": "Uživatelské jméno" }, "caption": "Uživatelé", @@ -1970,7 +1988,9 @@ "group": "Skupina", "id": "ID", "name": "Jméno", + "new_password": "Nové heslo", "owner": "Vlastník", + "password_changed": "Heslo změněno!", "system_generated": "Generovaný systémem", "system_generated_users_not_editable": "Nelze aktualizovat uživatele generované systémem.", "system_generated_users_not_removable": "Nelze odebrat uživatele generované systémem.", @@ -2054,7 +2074,7 @@ "create_group": "Zigbee Home Automation - Vytvoření skupiny", "create_group_details": "Zadejte požadované podrobnosti pro vytvoření nové zigbee skupiny", "creating_group": "Vytváření skupiny", - "description": "Vytvoření a úprava Zigbee skupin", + "description": "Správa skupin Zigbee", "group_details": "Zde jsou všechny podrobnosti o vybrané skupině Zigbee.", "group_id": "ID skupiny", "group_info": "Informace o skupině", @@ -2420,6 +2440,7 @@ "show_name": "Zobrazit název?", "show_state": "Zobrazit stav?", "state": "Stav", + "state_color": "Barevné ikony dle stavu?", "tap_action": "Akce při stisknutí", "theme": "Motiv", "title": "Název", @@ -2445,7 +2466,7 @@ }, "iframe": { "description": "Karta Webová stránka umožňuje vložit oblíbenou webovou stránku přímo do Home Assistanta.", - "name": "iFrame" + "name": "Webová stránka" }, "light": { "description": "Karta Světlo umožňuje změnit jas světla.", @@ -2521,13 +2542,13 @@ "edit_card": { "add": "Přidat kartu", "confirm_cancel": "Opravdu chcete zahodit změny?", - "delete": "Odstranit", + "delete": "Smazat kartu", "duplicate": "Duplikovat Kartu", "edit": "Upravit", "header": "Konfigurace karty", "move": "Přesunout", "options": "Více možností", - "pick_card": "Vyberte kartu, kterou chcete přidat.", + "pick_card": "Kterou kartu chcete přidat?", "pick_card_view_title": "Kterou kartu byste chtěli přidat do svého {name} pohledu?", "show_code_editor": "Zobrazit editor kódu", "show_visual_editor": "Zobrazit vizuální editor", @@ -2559,19 +2580,19 @@ "header": "Upravit UI", "menu": { "open": "Otevřít Lovelace menu", - "raw_editor": "Editor zdrojového kódu" + "raw_editor": "Editor kódu konfigurace" }, "migrate": { "header": "Konfigurace není kompatibilní", "migrate": "Migrovat konfiguraci", - "para_migrate": "Home Assistant může automaticky přidávat ID ke všem kartám a pohledům stisknutím tlačítka \"Migrovat konfiguraci\".", + "para_migrate": "Home Assistant může automaticky přidat ID ke všem vašim kartám a pohledům stisknutím tlačítka \"Migrovat konfiguraci\".", "para_no_id": "Tento prvek nemá ID. Přidejte k tomuto prvku ID v 'ui-lovelace.yaml'." }, "move_card": { "header": "Vyberte pohled, do kterého chcete kartu přesunout" }, "raw_editor": { - "confirm_remove_config_text": "Pokud odeberete nastavení Lovelace, automaticky vygenerujeme vaše zobrazení Lovelace s vašimi oblastmi a zařízeními.", + "confirm_remove_config_text": "Pokud odeberete konfiguraci uživatelského rozhraní Lovelace, automaticky vygenerujeme pohledy Lovelace s vašimi oblastmi a zařízeními.", "confirm_remove_config_title": "Opravdu chcete odstranit nastavení Lovelace? Automaticky vygenerujeme vaše zobrazení Lovelace s vašimi oblastmi a zařízeními.", "confirm_unsaved_changes": "Máte neuložené změny. Opravdu chcete odejít?", "confirm_unsaved_comments": "Vaše konfigurace obsahuje komentáře, které se neuloží. Chcete pokračovat?", @@ -2590,7 +2611,7 @@ "close": "Zavřít", "empty_config": "Začít s prázdným dashboardem", "header": "Převzít kontrolu nad vaší Lovelace UI", - "para": "Ve výchozím nastavení bude Home Assistant spravovat vaše uživatelské rozhraní – aktualizovat jej při přidání nové entity nebo Lovelace komponenty. Pokud převezmete kontrolu, nebudeme již provádět změny automaticky za vás.", + "para": "Tento dashboard momentálně spravuje Home Assistant. Je automaticky aktualizován při přidání nové entity nebo Lovelace komponenty. Pokud převezmete kontrolu, nebudeme již provádět změny automaticky za vás. Vždy si můžete vytvořit nový dashboard na hraní.", "para_sure": "Opravdu chcete převzít kontrolu nad uživalským rozhraním ?", "save": "Převzít kontrolu", "yaml_config": "Abyste mohli snadněji začít, zde aktuální konfigurace tohoto dashboardu:", @@ -2616,7 +2637,7 @@ }, "menu": { "close": "Zavřít", - "configure_ui": "Konfigurovat UI", + "configure_ui": "Upravit Dashboard", "exit_edit_mode": "Ukončit režim úprav uživatelského rozhraní", "help": "Pomoc", "refresh": "Obnovit", @@ -2725,7 +2746,7 @@ "data": { "password": "Heslo API" }, - "description": "Zadejte API heslo v http config" + "description": "Zadejte heslo pro API ve své HTTP konfiguraci" }, "mfa": { "data": { @@ -2940,7 +2961,7 @@ "shopping-list": { "add_item": "Přidat položku", "clear_completed": "Vymazat nakoupené", - "microphone_tip": "Klepněte na mikrofon vpravo nahoře a řekněte \"Add candy to my shopping list\"" + "microphone_tip": "Klepněte na mikrofon vpravo nahoře a řekněte nebo napište \"Add candy to my shopping list\"" } }, "sidebar": { diff --git a/translations/frontend/nb.json b/translations/frontend/nb.json index dbc46b6ae2..71dd339158 100644 --- a/translations/frontend/nb.json +++ b/translations/frontend/nb.json @@ -1113,7 +1113,7 @@ "enable_ha_skill": "Aktivere Home Assistant-ferdigheten for Alexa", "enable_state_reporting": "Aktiver tilstandsrapportering", "info": "Med Alexa-integrasjonen for Home Assistant Cloud vil du kunne kontrollere alle dine Home Assistant-enheter via hvilken som helst Alexa-aktivert enhet.", - "info_state_reporting": "Hvis du aktiverer tilstandsrapportering, vil Home Assistant sende alle tilstandsendringer av utsatte enheter til Amazon. Dette lar deg alltid se de siste tilstandene i Alexa-appen og bruke tilstandsendringene til å lage rutiner.", + "info_state_reporting": "Hvis du aktiverer tilstandsrapportering, vil Home Assistant sende alle tilstandsendringer av eksponerte entiteter til Amazon. Dette lar deg alltid se de siste tilstandene i Alexa-appen og bruke tilstandsendringene til å lage rutiner.", "manage_entities": "Håndtér entiteter", "state_reporting_error": "Kan ikke {enable_disable} rapportere status.", "sync_entities": "Synkronisér entiteter", @@ -1131,7 +1131,7 @@ "enter_pin_hint": "Angi en PIN-kode for å bruke sikkerhetsenheter", "enter_pin_info": "Angi en PIN-kode for å samhandle med sikkerhetsenheter. Sikkerhetsanordninger er dører, garasjeporter og låser. Du vil bli bedt om å si/angi denne PIN-koden når du samhandler med slike enheter via Google Assistant.", "info": "Med Google Assistant-integrasjonen for Home Assistant Cloud vil du kunne kontrollere alle dine Home Assistant-enheter via hvilken som helst Google Assistant-aktivert enhet.", - "info_state_reporting": "Hvis du aktiverer tilstandsrapportering, vil Home Assistant sende alle tilstandsendringer av utsatte enheter til Google. Dette lar deg alltid se de nyeste delene av Google-appen.", + "info_state_reporting": "Hvis du aktiverer tilstandsrapportering, vil Home Assistant sende alle tilstandsendringer av eksponerte entiteter til Google. Dette lar deg alltid se de siste tilstandene i Google-appen.", "manage_entities": "Håndtér entiteter", "security_devices": "Sikkerhetsenheter", "sync_entities": "Synkronisér entiteter til Google", @@ -1168,7 +1168,7 @@ } }, "alexa": { - "banner": "Redigere hvilke entiteter som vises via dette grensesnittet er deaktivert fordi du har konfigurert entitetsfiltre i configuration.yaml.", + "banner": "Redigere hvilke entiteter som vises via dette grensesnittet er deaktivert fordi du har konfigurert entitetsfilter i configuration.yaml.", "expose": "Eksponer til Alexa", "exposed_entities": "Eksponerte entiteter", "not_exposed_entities": "Ikke-eksponerte entiteter" @@ -1204,7 +1204,7 @@ "title": "Glemt passord" }, "google": { - "banner": "Redigere hvilke entiteter som vises via dette grensesnittet er deaktivert fordi du har konfigurert entitetsfiltre i configuration.yaml.", + "banner": "Redigere hvilke entiteter som vises via dette grensesnittet er deaktivert fordi du har konfigurert entitetsfilter i configuration.yaml.", "disable_2FA": "Deaktiver totrinnsbekreftelse", "expose": "Eksponer til Google Assistant", "exposed_entities": "Eksponerte entiteter", @@ -1847,24 +1847,32 @@ "section": { "reloading": { "automation": "Last inn automasjoner på nytt", - "command_line": "Last inn kommandolinjeenheter på nytt", + "command_line": "Last inn kommandolinje entiteter på nytt", "core": "Last inn lokasjon og spesialtilpassinger på nytt", - "filter": "Last inn filterenheter på nytt", + "filesize": "Last inn filstørrelse entiteter på nytt", + "filter": "Last inn filter entiteter på nytt", + "generic": "Last inn generiske IP-kamera entiteter på nytt", + "generic_thermostat": "Last inn generiske termostat entiteter på nytt", "group": "Last inn grupper på nytt", "heading": "YAML -Konfigurasjon lastes på nytt", - "input_boolean": "Last inn bolsk inndata på nytt", - "input_datetime": "Last inn dato inndata på nytt", - "input_number": "Last inn nummer inndata på nytt", - "input_select": "Last inn valg inndata på nytt ", - "input_text": "Last inn tekst inndata på nytt", + "history_stats": "Last inn historiske tilstander på nytt", + "homekit": "Last inn HomeKit på nytt", + "input_boolean": "Last inn inndata bolsk på nytt", + "input_datetime": "Last inn inndata datotid på nytt", + "input_number": "Last inn numerisk inndata på nytt", + "input_select": "Last inn inndata valg på nytt", + "input_text": "Last inn inndata tekst på nytt", "introduction": "Noen deler av Home Assistant kan laste inn uten å kreve omstart. Hvis du trykker last på nytt, vil du bytte den nåværende konfigurasjonen med den nye.", + "min_max": "Last inn min/maks entiteter på nytt", "person": "Last inn personer på nytt", - "rest": "Last hvileenhetene på nytt", + "ping": "Last inn ping binære sensor entiteter på nytt", + "rest": "Last inn REST entiteter på nytt", "scene": "Last inn scener på nytt", "script": "Last inn skript på nytt", - "statistics": "Last inn statistiske enheter på nytt", - "template": "Laste inn malenheter på nytt", - "universal": "Laste inn universelle mediespillerenheter på nytt", + "statistics": "Last inn statistiske entiteter på nytt", + "template": "Laste inn mal entiteter på nytt", + "trend": "Laste inn trend entiteter på nytt", + "universal": "Laste inn universelle mediespiller entiteter på nytt", "zone": "Last inn soner på nytt" }, "server_management": { @@ -1916,6 +1924,8 @@ "create": "Opprett", "name": "Navn", "password": "Passord", + "password_confirm": "Bekreft passord", + "password_not_match": "Passord samsvarer ikke", "username": "Brukernavn" }, "caption": "Brukere", @@ -1931,7 +1941,9 @@ "group": "Gruppe", "id": "Id", "name": "Navn", + "new_password": "Nytt passord", "owner": "Eier", + "password_changed": "Passordet er endret!", "system_generated": "System opprettet", "system_generated_users_not_editable": "Kan ikke oppdatere systemopprettede brukere.", "system_generated_users_not_removable": "Kan ikke fjerne systemopprettede brukere.", @@ -2181,11 +2193,11 @@ "data": "Hendelsesdata (YAML, valgfritt)", "description": "Send ut en hendelse på hendelsesbussen", "documentation": "Hendelsesdokumentasjon.", - "event_fired": "Hendelse {name} avfyrt", + "event_fired": "Hendelse {name} utført", "fire_event": "Utfør hendelse", "listen_to_events": "Lytt til hendelser", "listening_to": "Lytte til", - "notification_event_fired": "Hendelse {type} vellykket avfyrt!", + "notification_event_fired": "Hendelsen {type} vellykket utløst!", "start_listening": "Begynn å lytte", "stop_listening": "Stopp lytting", "subscribe_to": "Hendelse for å abonnere på", @@ -2212,15 +2224,15 @@ "description1": "Angi representasjonen av en enhet i Home Assistant.", "description2": "Dette vil ikke kommunisere med den faktiske enheten.", "entity": "Entitet", - "filter_attributes": "Filtrer attributter", - "filter_entities": "Filtrér entiteter", - "filter_states": "Filtrer tilstander", + "filter_attributes": "Filtrere attributter", + "filter_entities": "Filtrere entiteter", + "filter_states": "Filtrere tilstander", "more_info": "Mer info", "no_entities": "Ingen entiteter", "set_state": "Sett tilstand", "state": "Tilstand", "state_attributes": "Tilstandsattributter (YAML, valgfritt)", - "title": "Statuser" + "title": "Tilstander" }, "templates": { "description": "Maler blir rendret ved hjelp av Jinja2-malmotoren med noen spesifikke utvidelser for Home Assistant.", @@ -2333,7 +2345,7 @@ "toggle": "Aktivér/deaktivér entiteter." }, "entity-filter": { - "description": "Entity Filter-kortet lar deg definere en liste over entiteter du bare vil spore når de er i en viss tilstand.", + "description": "Entitetsfilter kortet lar deg definere en liste over entiteter du bare vil spore når de er i en viss tilstand.", "name": "Entitetsfilter" }, "entity": { @@ -2375,6 +2387,7 @@ "show_name": "Vis navn?", "show_state": "Vis tilstand?", "state": "Tilstand", + "state_color": "Fargeikoner basert på tilstand?", "tap_action": "Trykk handling", "theme": "Tema", "title": "Tittel", @@ -2427,7 +2440,7 @@ "name": "Bildeelementer" }, "picture-entity": { - "description": "Picture Entity-kortet viser en entitet i form av et bilde. I stedet for bilder fra URL, kan det også vise bilde av kameraentiteter.", + "description": "Bilde entitet kortet viser en entitet i form av et bilde. I stedet for bilder fra URL, kan det også vise bilde av kameraentiteter.", "name": "Bildeoppføring" }, "picture-glance": { diff --git a/translations/frontend/ru.json b/translations/frontend/ru.json index 03968a3cd9..29b46a8046 100644 --- a/translations/frontend/ru.json +++ b/translations/frontend/ru.json @@ -1893,24 +1893,32 @@ "section": { "reloading": { "automation": "Перезагрузить автоматизации", - "command_line": "Перезагрузить объекты командной строки", + "command_line": "Перезагрузить объекты интеграции \"Command Line\"", "core": "Обновить местоположение и кастомизацию", - "filter": "Перезагрузить объекты фильтров", + "filesize": "Перезагрузить объекты интеграции \"File Size\"", + "filter": "Перезагрузить объекты интеграции \"Filter\"", + "generic": "Перезагрузить объекты интеграции \"Generic IP Camera\"", + "generic_thermostat": "Перезагрузить объекты интеграции \"Generic Thermostat\"", "group": "Перезагрузить группы", "heading": "Перезагрузка конфигурации YAML", + "history_stats": "Перезагрузить объекты интеграции \"History Stats\"", + "homekit": "Перезагрузить HomeKit", "input_boolean": "Перезагрузить вспомогательные переключатели", "input_datetime": "Перезагрузить вспомогательные элементы ввода даты и времени", "input_number": "Перезагрузить вспомогательные элементы ввода чисел", "input_select": "Перезагрузить вспомогательные выпадающие списки", "input_text": "Перезагрузить вспомогательные элементы ввода текста", "introduction": "Некоторые компоненты Home Assistant можно перезагрузить без необходимости перезапуска всей системы. Перезагрузка выгружает текущую конфигурацию YAML и загружает новую.", + "min_max": "Перезагрузить объекты интеграции \"Min/Max\"", "person": "Перезагрузить персоны", - "rest": "Перезагрузить остальные объекты", + "ping": "Перезагрузить объекты интеграции \"Ping (ICMP)\"", + "rest": "Перезагрузить объекты интеграции \"REST\"", "scene": "Перезагрузить сцены", "script": "Перезагрузить сценарии", - "statistics": "Перезагрузить объекты статистики", - "template": "Перезагрузить шаблоны", - "universal": "Перезагрузить объекты универсального медиаплеера", + "statistics": "Перезагрузить объекты интеграции \"Statistics\"", + "template": "Перезагрузить объекты шаблонов", + "trend": "Перезагрузить объекты интеграции \"Trend\"", + "universal": "Перезагрузить объекты интеграции \"Universal Media Player\"", "zone": "Перезагрузить зоны" }, "server_management": { @@ -1962,6 +1970,8 @@ "create": "Добавить", "name": "Имя", "password": "Пароль", + "password_confirm": "Подтвердите пароль", + "password_not_match": "Пароли не совпадают", "username": "Логин" }, "caption": "Пользователи", @@ -1978,7 +1988,9 @@ "group": "Группа", "id": "ID", "name": "Имя", + "new_password": "Новый пароль", "owner": "Владелец", + "password_changed": "Пароль изменен", "system_generated": "Системный", "system_generated_users_not_editable": "Системные пользователи защищены от редактирования", "system_generated_users_not_removable": "Системные пользователи защищены от удаления", @@ -2428,6 +2440,7 @@ "show_name": "Название", "show_state": "Состояние", "state": "Состояние", + "state_color": "Изменять цвет значка в зависимости от состояния", "tap_action": "При нажатии", "theme": "Тема", "title": "Название", From d8e88bc58d84dd673bcb59c5bb44992728866d1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Sun, 30 Aug 2020 09:39:34 +0200 Subject: [PATCH 100/300] Ignore 504 errors while updating (#6743) --- hassio/src/dashboard/hassio-update.ts | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/hassio/src/dashboard/hassio-update.ts b/hassio/src/dashboard/hassio-update.ts index 2a10b8318d..e4cd4dbb07 100644 --- a/hassio/src/dashboard/hassio-update.ts +++ b/hassio/src/dashboard/hassio-update.ts @@ -161,11 +161,18 @@ export class HassioUpdate extends LitElement { try { await this.hass.callApi>("POST", item.apiPath); } catch (err) { - showAlertDialog(this, { - title: "Update failed", - text: - typeof err === "object" ? err.body?.message || "Unkown error" : err, - }); + // Only show an error if the status code was not 504 (timeout reported by proxies) + if (err.status_code !== 504) { + showAlertDialog(this, { + title: "Update failed", + text: + typeof err === "object" + ? typeof err.body === "object" + ? err.body.message + : err.body || "Unkown error" + : err, + }); + } } item.progress = false; } From 78a1e45be20cb1986f97919991048379da4519ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Sun, 30 Aug 2020 09:42:58 +0200 Subject: [PATCH 101/300] Dismiss dialog if the user clicks outside it or hit the escape button (#6741) Co-authored-by: Bram Kragten --- hassio/src/dialogs/network/dialog-hassio-network.ts | 9 ++++++++- src/dialogs/generic/dialog-box.ts | 6 +++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/hassio/src/dialogs/network/dialog-hassio-network.ts b/hassio/src/dialogs/network/dialog-hassio-network.ts index 4eea315d9c..f49d1c1a86 100644 --- a/hassio/src/dialogs/network/dialog-hassio-network.ts +++ b/hassio/src/dialogs/network/dialog-hassio-network.ts @@ -90,7 +90,14 @@ export class DialogHassioNetwork extends LitElement implements HassDialog { } return html` - +
    diff --git a/src/dialogs/generic/dialog-box.ts b/src/dialogs/generic/dialog-box.ts index 0663b6bfe7..b8fcea9a70 100644 --- a/src/dialogs/generic/dialog-box.ts +++ b/src/dialogs/generic/dialog-box.ts @@ -55,9 +55,9 @@ class DialogBox extends LitElement { return html` Date: Sun, 30 Aug 2020 10:03:04 +0200 Subject: [PATCH 102/300] Remove animation delay from paper tooltip (#6716) --- hassio/src/addon-view/info/hassio-addon-info.ts | 5 ++--- .../config-flow/dialog-data-entry-flow.ts | 11 +++++------ src/dialogs/config-flow/step-flow-form.ts | 4 ++-- .../persistent-notification-item.ts | 9 +++------ src/layouts/hass-tabs-subpage-data-table.ts | 4 ++-- src/panels/config/areas/ha-config-area-page.ts | 10 +++++----- .../config/automation/ha-automation-picker.ts | 12 ++++++------ .../config/devices/ha-config-device-page.ts | 16 +++++++++------- src/panels/config/entities/ha-config-entities.ts | 16 ++++++++-------- .../config/helpers/dialog-helper-detail.ts | 4 ++-- src/panels/config/helpers/ha-config-helpers.ts | 10 +++++----- .../dashboards/ha-config-lovelace-dashboards.ts | 8 ++++---- .../resources/ha-config-lovelace-resources.ts | 9 ++++----- src/panels/config/scene/ha-scene-dashboard.ts | 14 +++++++------- src/panels/config/users/dialog-user-detail.ts | 4 ++-- src/panels/config/zone/ha-config-zone.ts | 4 ++-- src/panels/profile/ha-refresh-tokens-card.js | 10 +++++----- 17 files changed, 73 insertions(+), 77 deletions(-) diff --git a/hassio/src/addon-view/info/hassio-addon-info.ts b/hassio/src/addon-view/info/hassio-addon-info.ts index a7b3796909..28343352c7 100644 --- a/hassio/src/addon-view/info/hassio-addon-info.ts +++ b/hassio/src/addon-view/info/hassio-addon-info.ts @@ -14,15 +14,14 @@ import { mdiPound, mdiShield, } from "@mdi/js"; -import "@polymer/paper-tooltip/paper-tooltip"; import { css, CSSResult, customElement, html, + internalProperty, LitElement, property, - internalProperty, TemplateResult, } from "lit-element"; import { classMap } from "lit-html/directives/class-map"; @@ -34,6 +33,7 @@ import "../../../../src/components/buttons/ha-progress-button"; import "../../../../src/components/ha-card"; import "../../../../src/components/ha-label-badge"; import "../../../../src/components/ha-markdown"; +import "../../../../src/components/ha-settings-row"; import "../../../../src/components/ha-svg-icon"; import "../../../../src/components/ha-switch"; import { @@ -52,7 +52,6 @@ import { HomeAssistant } from "../../../../src/types"; import "../../components/hassio-card-content"; import { showHassioMarkdownDialog } from "../../dialogs/markdown/show-dialog-hassio-markdown"; import { hassioStyle } from "../../resources/hassio-style"; -import "../../../../src/components/ha-settings-row"; const STAGE_ICON = { stable: mdiCheckCircle, diff --git a/src/dialogs/config-flow/dialog-data-entry-flow.ts b/src/dialogs/config-flow/dialog-data-entry-flow.ts index 976a98d301..79a95c2bc2 100644 --- a/src/dialogs/config-flow/dialog-data-entry-flow.ts +++ b/src/dialogs/config-flow/dialog-data-entry-flow.ts @@ -1,21 +1,22 @@ import "@material/mwc-button"; import "@polymer/paper-dialog-scrollable/paper-dialog-scrollable"; -import "../../components/ha-icon-button"; -import "../../components/ha-circular-progress"; -import "@polymer/paper-tooltip/paper-tooltip"; import type { UnsubscribeFunc } from "home-assistant-js-websocket"; import { css, CSSResultArray, customElement, html, - LitElement, internalProperty, + LitElement, PropertyValues, TemplateResult, } from "lit-element"; +import { fireEvent } from "../../common/dom/fire_event"; +import { computeRTL } from "../../common/util/compute_rtl"; +import "../../components/ha-circular-progress"; import "../../components/ha-dialog"; import "../../components/ha-form/ha-form"; +import "../../components/ha-icon-button"; import "../../components/ha-markdown"; import { AreaRegistryEntry, @@ -35,8 +36,6 @@ import "./step-flow-external"; import "./step-flow-form"; import "./step-flow-loading"; import "./step-flow-pick-handler"; -import { fireEvent } from "../../common/dom/fire_event"; -import { computeRTL } from "../../common/util/compute_rtl"; let instance = 0; diff --git a/src/dialogs/config-flow/step-flow-form.ts b/src/dialogs/config-flow/step-flow-form.ts index a0d13a98e6..660595b2f3 100644 --- a/src/dialogs/config-flow/step-flow-form.ts +++ b/src/dialogs/config-flow/step-flow-form.ts @@ -1,5 +1,4 @@ import "@material/mwc-button"; -import "../../components/ha-circular-progress"; import "@polymer/paper-tooltip/paper-tooltip"; import { css, @@ -12,6 +11,7 @@ import { TemplateResult, } from "lit-element"; import { fireEvent } from "../../common/dom/fire_event"; +import "../../components/ha-circular-progress"; import "../../components/ha-form/ha-form"; import type { HaFormSchema } from "../../components/ha-form/ha-form"; import "../../components/ha-markdown"; @@ -91,7 +91,7 @@ class StepFlowForm extends LitElement { ${!allRequiredInfoFilledIn ? html` - ${this.hass.localize( "ui.panel.config.integrations.config_flow.not_all_required_fields" )} diff --git a/src/dialogs/notifications/persistent-notification-item.ts b/src/dialogs/notifications/persistent-notification-item.ts index a8f2a20777..cc5359f306 100644 --- a/src/dialogs/notifications/persistent-notification-item.ts +++ b/src/dialogs/notifications/persistent-notification-item.ts @@ -43,12 +43,9 @@ export class HuiPersistentNotificationItem extends LitElement { .hass=${this.hass} .datetime="${this.notification.created_at}" > - ${this._computeTooltip( - this.hass, - this.notification - )} + + ${this._computeTooltip(this.hass, this.notification)} +
    diff --git a/src/layouts/hass-tabs-subpage-data-table.ts b/src/layouts/hass-tabs-subpage-data-table.ts index dce430e320..58ea90fb99 100644 --- a/src/layouts/hass-tabs-subpage-data-table.ts +++ b/src/layouts/hass-tabs-subpage-data-table.ts @@ -11,6 +11,7 @@ import { TemplateResult, } from "lit-element"; import { navigate } from "../common/navigate"; +import { computeRTLDirection } from "../common/util/compute_rtl"; import "../components/data-table/ha-data-table"; import type { DataTableColumnContainer, @@ -20,7 +21,6 @@ import type { import type { HomeAssistant, Route } from "../types"; import "./hass-tabs-subpage"; import type { PageNavigation } from "./hass-tabs-subpage"; -import { computeRTLDirection } from "../common/util/compute_rtl"; @customElement("hass-tabs-subpage-data-table") export class HaTabsSubpageDataTable extends LitElement { @@ -136,7 +136,7 @@ export class HaTabsSubpageDataTable extends LitElement { ? html`
    - + ${this.hass.localize( "ui.panel.config.filtering.filtering_by" )} diff --git a/src/panels/config/areas/ha-config-area-page.ts b/src/panels/config/areas/ha-config-area-page.ts index 41bd615b2d..7f3d7cc2d1 100644 --- a/src/panels/config/areas/ha-config-area-page.ts +++ b/src/panels/config/areas/ha-config-area-page.ts @@ -4,9 +4,9 @@ import { CSSResult, customElement, html, + internalProperty, LitElement, property, - internalProperty, TemplateResult, } from "lit-element"; import { ifDefined } from "lit-html/directives/if-defined"; @@ -175,8 +175,8 @@ class HaConfigAreaPage extends LitElement { ${!state.attributes.id ? html` - ${this.hass.localize( + + ${this.hass.localize( "ui.panel.config.devices.cant_edit" )} @@ -228,8 +228,8 @@ class HaConfigAreaPage extends LitElement { ${!state.attributes.id ? html` - ${this.hass.localize( + + ${this.hass.localize( "ui.panel.config.devices.cant_edit" )} diff --git a/src/panels/config/automation/ha-automation-picker.ts b/src/panels/config/automation/ha-automation-picker.ts index 57286eccd4..e56b62fe2b 100644 --- a/src/panels/config/automation/ha-automation-picker.ts +++ b/src/panels/config/automation/ha-automation-picker.ts @@ -1,12 +1,13 @@ -import "../../../components/ha-icon-button"; +import "@material/mwc-fab"; +import { mdiPlus } from "@mdi/js"; import "@polymer/paper-tooltip/paper-tooltip"; import { + CSSResult, customElement, html, LitElement, property, TemplateResult, - CSSResult, } from "lit-element"; import { ifDefined } from "lit-html/directives/if-defined"; import memoizeOne from "memoize-one"; @@ -16,7 +17,8 @@ import { fireEvent } from "../../../common/dom/fire_event"; import { computeStateName } from "../../../common/entity/compute_state_name"; import { DataTableColumnContainer } from "../../../components/data-table/ha-data-table"; import "../../../components/entity/ha-entity-toggle"; -import "@material/mwc-fab"; +import "../../../components/ha-icon-button"; +import "../../../components/ha-svg-icon"; import { AutomationConfig, AutomationEntity, @@ -28,8 +30,6 @@ import { haStyle } from "../../../resources/styles"; import { HomeAssistant, Route } from "../../../types"; import { configSections } from "../ha-panel-config"; import { showThingtalkDialog } from "./show-dialog-thingtalk"; -import "../../../components/ha-svg-icon"; -import { mdiPlus } from "@mdi/js"; @customElement("ha-automation-picker") class HaAutomationPicker extends LitElement { @@ -138,7 +138,7 @@ class HaAutomationPicker extends LitElement { ${!automation.attributes.id ? html` - + ${this.hass.localize( "ui.panel.config.automation.picker.only_editable" )} diff --git a/src/panels/config/devices/ha-config-device-page.ts b/src/panels/config/devices/ha-config-device-page.ts index e3577eb5dd..0287b084cd 100644 --- a/src/panels/config/devices/ha-config-device-page.ts +++ b/src/panels/config/devices/ha-config-device-page.ts @@ -4,9 +4,9 @@ import { CSSResult, customElement, html, + internalProperty, LitElement, property, - internalProperty, TemplateResult, } from "lit-element"; import { ifDefined } from "lit-html/directives/if-defined"; @@ -14,6 +14,7 @@ import memoizeOne from "memoize-one"; import { isComponentLoaded } from "../../../common/config/is_component_loaded"; import { computeStateName } from "../../../common/entity/compute_state_name"; import { compare } from "../../../common/string/compare"; +import { slugify } from "../../../common/string/slugify"; import "../../../components/entity/ha-battery-icon"; import "../../../components/ha-icon-next"; import { AreaRegistryEntry } from "../../../data/area_registry"; @@ -25,8 +26,8 @@ import { } from "../../../data/device_registry"; import { EntityRegistryEntry, - findBatteryEntity, findBatteryChargingEntity, + findBatteryEntity, updateEntityRegistryEntry, } from "../../../data/entity_registry"; import { SceneEntities, showSceneEditor } from "../../../data/scene"; @@ -35,6 +36,7 @@ import { loadDeviceRegistryDetailDialog, showDeviceRegistryDetailDialog, } from "../../../dialogs/device-registry-detail/show-dialog-device-registry-detail"; +import { showConfirmationDialog } from "../../../dialogs/generic/show-dialog-box"; import "../../../layouts/hass-error-screen"; import "../../../layouts/hass-tabs-subpage"; import { HomeAssistant, Route } from "../../../types"; @@ -43,8 +45,6 @@ import { configSections } from "../ha-panel-config"; import "./device-detail/ha-device-entities-card"; import "./device-detail/ha-device-info-card"; import { showDeviceAutomationDialog } from "./device-detail/show-dialog-device-automation"; -import { slugify } from "../../../common/string/slugify"; -import { showConfirmationDialog } from "../../../dialogs/generic/show-dialog-box"; export interface EntityRegistryStateEntry extends EntityRegistryEntry { stateName?: string | null; @@ -296,8 +296,8 @@ export class HaConfigDevicePage extends LitElement { ${!state.attributes.id ? html` - ${this.hass.localize( + + ${this.hass.localize( "ui.panel.config.devices.cant_edit" )} @@ -369,7 +369,9 @@ export class HaConfigDevicePage extends LitElement { ${!state.attributes.id ? html` ${this.hass.localize( + animation-delay="0" + > + ${this.hass.localize( "ui.panel.config.devices.cant_edit" )} diff --git a/src/panels/config/entities/ha-config-entities.ts b/src/panels/config/entities/ha-config-entities.ts index 9d3ad306d6..ad7c3d9e3d 100644 --- a/src/panels/config/entities/ha-config-entities.ts +++ b/src/panels/config/entities/ha-config-entities.ts @@ -1,4 +1,6 @@ import "@material/mwc-list/mwc-list-item"; +import type { RequestSelectedDetail } from "@material/mwc-list/mwc-list-item"; +import { mdiFilterVariant } from "@mdi/js"; import "@polymer/paper-checkbox/paper-checkbox"; import "@polymer/paper-dropdown-menu/paper-dropdown-menu"; import "@polymer/paper-item/paper-icon-item"; @@ -10,9 +12,9 @@ import { CSSResult, customElement, html, + internalProperty, LitElement, property, - internalProperty, query, TemplateResult, } from "lit-element"; @@ -56,8 +58,6 @@ import { loadEntityEditorDialog, showEntityEditorDialog, } from "./show-dialog-entity-editor"; -import { mdiFilterVariant } from "@mdi/js"; -import type { RequestSelectedDetail } from "@material/mwc-list/mwc-list-item"; export interface StateEntity extends EntityRegistryEntry { readonly?: boolean; @@ -192,7 +192,7 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) { ? "hass:cancel" : "hass:pencil-off"} > - + ${entity.restored ? this.hass.localize( "ui.panel.config.entities.picker.status.restored" @@ -390,7 +390,7 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) { icon="hass:undo" @click=${this._enableSelected} > - + ${this.hass.localize( "ui.panel.config.entities.picker.enable_selected.button" )} @@ -400,7 +400,7 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) { icon="hass:cancel" @click=${this._disableSelected} > - + ${this.hass.localize( "ui.panel.config.entities.picker.disable_selected.button" )} @@ -410,7 +410,7 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) { icon="hass:delete" @click=${this._removeSelected} > - + ${this.hass.localize( "ui.panel.config.entities.picker.remove_selected.button" )} @@ -433,7 +433,7 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) { ${this.narrow ? html`
    - + ${this.hass.localize( "ui.panel.config.filtering.filtering_by" )} diff --git a/src/panels/config/helpers/dialog-helper-detail.ts b/src/panels/config/helpers/dialog-helper-detail.ts index b752a5037d..a7320a5e0e 100644 --- a/src/panels/config/helpers/dialog-helper-detail.ts +++ b/src/panels/config/helpers/dialog-helper-detail.ts @@ -6,9 +6,9 @@ import { CSSResult, customElement, html, + internalProperty, LitElement, property, - internalProperty, query, TemplateResult, } from "lit-element"; @@ -136,7 +136,7 @@ export class DialogHelperDetail extends LitElement { ${!isLoaded ? html` - ${this.hass.localize( "ui.dialogs.helper_settings.platform_not_loaded", "platform", diff --git a/src/panels/config/helpers/ha-config-helpers.ts b/src/panels/config/helpers/ha-config-helpers.ts index e03b5463ad..fe96b3389e 100644 --- a/src/panels/config/helpers/ha-config-helpers.ts +++ b/src/panels/config/helpers/ha-config-helpers.ts @@ -1,3 +1,5 @@ +import "@material/mwc-fab"; +import { mdiPlus } from "@mdi/js"; import "@polymer/paper-checkbox/paper-checkbox"; import "@polymer/paper-dropdown-menu/paper-dropdown-menu"; import "@polymer/paper-item/paper-icon-item"; @@ -7,9 +9,9 @@ import { HassEntity } from "home-assistant-js-websocket"; import { customElement, html, + internalProperty, LitElement, property, - internalProperty, PropertyValues, TemplateResult, } from "lit-element"; @@ -21,8 +23,8 @@ import { DataTableColumnContainer, RowClickedEvent, } from "../../../components/data-table/ha-data-table"; -import "@material/mwc-fab"; import "../../../components/ha-icon"; +import "../../../components/ha-svg-icon"; import "../../../layouts/hass-loading-screen"; import "../../../layouts/hass-tabs-subpage-data-table"; import { HomeAssistant, Route } from "../../../types"; @@ -30,8 +32,6 @@ import { showEntityEditorDialog } from "../entities/show-dialog-entity-editor"; import { configSections } from "../ha-panel-config"; import { HELPER_DOMAINS } from "./const"; import { showHelperDetailDialog } from "./show-dialog-helper-detail"; -import "../../../components/ha-svg-icon"; -import { mdiPlus } from "@mdi/js"; @customElement("ha-config-helpers") export class HaConfigHelpers extends LitElement { @@ -110,7 +110,7 @@ export class HaConfigHelpers extends LitElement { style="display:inline-block; position: relative;" > - + ${this.hass.localize( "ui.panel.config.entities.picker.status.readonly" )} diff --git a/src/panels/config/lovelace/dashboards/ha-config-lovelace-dashboards.ts b/src/panels/config/lovelace/dashboards/ha-config-lovelace-dashboards.ts index 2edb4d0b8e..90205aa8a7 100644 --- a/src/panels/config/lovelace/dashboards/ha-config-lovelace-dashboards.ts +++ b/src/panels/config/lovelace/dashboards/ha-config-lovelace-dashboards.ts @@ -1,11 +1,12 @@ import "@material/mwc-fab"; +import { mdiPlus } from "@mdi/js"; import "@polymer/paper-tooltip/paper-tooltip"; import { customElement, html, + internalProperty, LitElement, property, - internalProperty, PropertyValues, TemplateResult, } from "lit-element"; @@ -18,6 +19,7 @@ import { } from "../../../../components/data-table/ha-data-table"; import "../../../../components/ha-icon"; import "../../../../components/ha-icon-button"; +import "../../../../components/ha-svg-icon"; import { createDashboard, deleteDashboard, @@ -33,8 +35,6 @@ import "../../../../layouts/hass-tabs-subpage-data-table"; import { HomeAssistant, Route } from "../../../../types"; import { lovelaceTabs } from "../ha-config-lovelace"; import { showDashboardDetailDialog } from "./show-dialog-lovelace-dashboard-detail"; -import "../../../../components/ha-svg-icon"; -import { mdiPlus } from "@mdi/js"; @customElement("ha-config-lovelace-dashboards") export class HaConfigLovelaceDashboards extends LitElement { @@ -76,7 +76,7 @@ export class HaConfigLovelaceDashboards extends LitElement { style="padding-left: 10px;" icon="hass:check-circle-outline" > - + ${this.hass.localize( `ui.panel.config.lovelace.dashboards.default_dashboard` )} diff --git a/src/panels/config/lovelace/resources/ha-config-lovelace-resources.ts b/src/panels/config/lovelace/resources/ha-config-lovelace-resources.ts index 0bfb4d68ca..5d35134956 100644 --- a/src/panels/config/lovelace/resources/ha-config-lovelace-resources.ts +++ b/src/panels/config/lovelace/resources/ha-config-lovelace-resources.ts @@ -1,15 +1,15 @@ +import "@material/mwc-fab"; +import { mdiPlus } from "@mdi/js"; import "@polymer/paper-checkbox/paper-checkbox"; import "@polymer/paper-dropdown-menu/paper-dropdown-menu"; import "@polymer/paper-item/paper-icon-item"; import "@polymer/paper-listbox/paper-listbox"; -import "@polymer/paper-tooltip/paper-tooltip"; -import "@material/mwc-fab"; import { customElement, html, + internalProperty, LitElement, property, - internalProperty, PropertyValues, TemplateResult, } from "lit-element"; @@ -20,6 +20,7 @@ import { RowClickedEvent, } from "../../../../components/data-table/ha-data-table"; import "../../../../components/ha-icon"; +import "../../../../components/ha-svg-icon"; import { createResource, deleteResource, @@ -37,8 +38,6 @@ import { HomeAssistant, Route } from "../../../../types"; import { loadLovelaceResources } from "../../../lovelace/common/load-resources"; import { lovelaceTabs } from "../ha-config-lovelace"; import { showResourceDetailDialog } from "./show-dialog-lovelace-resource-detail"; -import "../../../../components/ha-svg-icon"; -import { mdiPlus } from "@mdi/js"; @customElement("ha-config-lovelace-resources") export class HaConfigLovelaceRescources extends LitElement { diff --git a/src/panels/config/scene/ha-scene-dashboard.ts b/src/panels/config/scene/ha-scene-dashboard.ts index f2835f405b..e8b46223f7 100644 --- a/src/panels/config/scene/ha-scene-dashboard.ts +++ b/src/panels/config/scene/ha-scene-dashboard.ts @@ -1,4 +1,5 @@ -import "../../../components/ha-icon-button"; +import "@material/mwc-fab"; +import { mdiPlus } from "@mdi/js"; import "@polymer/paper-tooltip/paper-tooltip"; import { css, @@ -13,8 +14,11 @@ import { ifDefined } from "lit-html/directives/if-defined"; import memoizeOne from "memoize-one"; import { fireEvent } from "../../../common/dom/fire_event"; import { computeStateName } from "../../../common/entity/compute_state_name"; +import { stateIcon } from "../../../common/entity/state_icon"; import { DataTableColumnContainer } from "../../../components/data-table/ha-data-table"; -import "@material/mwc-fab"; +import "../../../components/ha-icon"; +import "../../../components/ha-icon-button"; +import "../../../components/ha-svg-icon"; import { forwardHaptic } from "../../../data/haptics"; import { activateScene, SceneEntity } from "../../../data/scene"; import { showAlertDialog } from "../../../dialogs/generic/show-dialog-box"; @@ -23,10 +27,6 @@ import { haStyle } from "../../../resources/styles"; import { HomeAssistant, Route } from "../../../types"; import { showToast } from "../../../util/toast"; import { configSections } from "../ha-panel-config"; -import "../../../components/ha-icon"; -import "../../../components/ha-svg-icon"; -import { mdiPlus } from "@mdi/js"; -import { stateIcon } from "../../../common/entity/state_icon"; @customElement("ha-scene-dashboard") class HaSceneDashboard extends LitElement { @@ -117,7 +117,7 @@ class HaSceneDashboard extends LitElement { ${!scene.attributes.id ? html` - + ${this.hass.localize( "ui.panel.config.scene.picker.only_editable" )} diff --git a/src/panels/config/users/dialog-user-detail.ts b/src/panels/config/users/dialog-user-detail.ts index fb5e29ce27..d662248f02 100644 --- a/src/panels/config/users/dialog-user-detail.ts +++ b/src/panels/config/users/dialog-user-detail.ts @@ -139,7 +139,7 @@ class DialogUserDetail extends LitElement { ${user.system_generated ? html` - + ${this.hass.localize( "ui.panel.config.users.editor.system_generated_users_not_removable" )} @@ -166,7 +166,7 @@ class DialogUserDetail extends LitElement { ${user.system_generated ? html` - + ${this.hass.localize( "ui.panel.config.users.editor.system_generated_users_not_editable" )} diff --git a/src/panels/config/zone/ha-config-zone.ts b/src/panels/config/zone/ha-config-zone.ts index b1690c6930..83910d3c15 100644 --- a/src/panels/config/zone/ha-config-zone.ts +++ b/src/panels/config/zone/ha-config-zone.ts @@ -11,9 +11,9 @@ import { CSSResult, customElement, html, + internalProperty, LitElement, property, - internalProperty, PropertyValues, query, TemplateResult, @@ -198,7 +198,7 @@ export class HaConfigZone extends SubscribeMixin(LitElement) { : mdiPencilOff} > - + ${state.entity_id === "zone.home" ? this.hass.localize( `ui.panel.config.zone.${ diff --git a/src/panels/profile/ha-refresh-tokens-card.js b/src/panels/profile/ha-refresh-tokens-card.js index e4f7e4f58c..9c4db68a7a 100644 --- a/src/panels/profile/ha-refresh-tokens-card.js +++ b/src/panels/profile/ha-refresh-tokens-card.js @@ -1,17 +1,17 @@ -import "../../components/ha-icon-button"; import "@polymer/paper-tooltip/paper-tooltip"; import { html } from "@polymer/polymer/lib/utils/html-tag"; /* eslint-plugin-disable lit */ import { PolymerElement } from "@polymer/polymer/polymer-element"; import { formatDateTime } from "../../common/datetime/format_date_time"; import "../../components/ha-card"; -import { EventsMixin } from "../../mixins/events-mixin"; -import LocalizeMixin from "../../mixins/localize-mixin"; +import "../../components/ha-icon-button"; +import "../../components/ha-settings-row"; import { showAlertDialog, showConfirmationDialog, } from "../../dialogs/generic/show-dialog-box"; -import "../../components/ha-settings-row"; +import { EventsMixin } from "../../mixins/events-mixin"; +import LocalizeMixin from "../../mixins/localize-mixin"; /* * @appliesMixin EventsMixin @@ -39,7 +39,7 @@ class HaRefreshTokens extends LocalizeMixin(EventsMixin(PolymerElement)) {
    [[_formatLastUsed(item)]]
    From 4070380ded6408fe6bf1640d734ed00f9f5f8e0a Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 30 Aug 2020 16:42:02 +0200 Subject: [PATCH 103/300] Remove credentials for load module (#6746) Fixes #6745 --- src/common/dom/load_resource.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/common/dom/load_resource.ts b/src/common/dom/load_resource.ts index c4933ed8e5..f5288b886d 100644 --- a/src/common/dom/load_resource.ts +++ b/src/common/dom/load_resource.ts @@ -22,9 +22,6 @@ const _load = ( (element as HTMLScriptElement).async = true; if (type) { (element as HTMLScriptElement).type = type; - // https://github.com/home-assistant/frontend/pull/6328 - (element as HTMLScriptElement).crossOrigin = - url.substr(0, 1) === "/" ? "use-credentials" : "anonymous"; } break; case "link": From 0d75fe6b81f5654ae6d6b5e58af204d91539fcb0 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Mon, 31 Aug 2020 00:32:41 +0000 Subject: [PATCH 104/300] [ci skip] Translation update --- translations/frontend/af.json | 11 +++-- translations/frontend/it.json | 10 ++++ translations/frontend/ja.json | 17 +++++++ translations/frontend/nl.json | 73 ++++++++++++++++++------------ translations/frontend/tr.json | 6 +-- translations/frontend/zh-Hans.json | 17 +++++++ translations/frontend/zh-Hant.json | 13 ++++++ 7 files changed, 111 insertions(+), 36 deletions(-) diff --git a/translations/frontend/af.json b/translations/frontend/af.json index 806b29fab4..ac989f9fa1 100644 --- a/translations/frontend/af.json +++ b/translations/frontend/af.json @@ -646,7 +646,7 @@ "create": "SKEP", "default_name": "Nuwe Gebied", "delete": "SKRAP", - "update": "OPDATEER" + "update": "Opdateer" }, "picker": { "create_area": "SKEP GEBIED", @@ -694,7 +694,7 @@ "wait_template": "Wag Templaat" } }, - "unsupported_action": "Ongesteunde aksie: {action}" + "unsupported_action": "Geen UI-ondersteuning vir aksie nie: {action}" }, "alias": "Naam", "conditions": { @@ -1350,6 +1350,8 @@ "network_stopped": "Z-Wave Netwerk het Gestop" }, "node_config": { + "config_value": "Konfigurasiewaarde", + "header": "Knooppuntkonfigurasieopsies", "set_config_parameter": "Stel Config-parameter in" }, "services": { @@ -1449,13 +1451,16 @@ "humidifier": { "description": "Die Luchtbevochtigerkaart verleen beheer oor u lugbevochtiger-entiteit. Hiermee kan u die humiditeit en modus van die entiteit verander." }, + "iframe": { + "name": "Webblad" + }, "shopping-list": { "integration_not_loaded": "Hierdie kaart vereis die ' shopping_list ' integrasie wat opgestel moet word." } }, "edit_card": { "add": "Voeg Kaart by", - "delete": "Skrap", + "delete": "Skrap kaart", "edit": "Wysig", "header": "Kaart opstelling", "move": "Skuif", diff --git a/translations/frontend/it.json b/translations/frontend/it.json index ad828074a1..0591ea70d6 100644 --- a/translations/frontend/it.json +++ b/translations/frontend/it.json @@ -1896,20 +1896,25 @@ "command_line": "Ricarica le entità della riga di comando", "core": "Ricarica la Posizione e le Personalizzazioni", "filter": "Ricaricare le entità filtro", + "generic": "Ricaricare le entità delle generiche telecamere IP", + "generic_thermostat": "Ricaricare le entità termostati generiche", "group": "Ricarica i Gruppi", "heading": "Ricarica Configurazione YAML", + "homekit": "Ricarica HomeKit", "input_boolean": "Ricarica input booleani", "input_datetime": "Ricarica input data e/o tempo", "input_number": "Ricarica input numerici", "input_select": "Ricarica input a discesa", "input_text": "Ricarica input testuali", "introduction": "Alcune parti di Home Assistant possono essere ricaricate senza richiedere un riavvio. Premendo su Ricarica si rimuoverà la loro Configurazione YAML attuale e si caricherà la versione aggiornata.", + "min_max": "Ricaricare le entità min/max", "person": "Ricarica le persone", "rest": "Ricarica le entità della piattaforma rest", "scene": "Ricarica le Scene", "script": "Ricarica gli Script", "statistics": "Ricaricare le entità statistiche", "template": "Ricaricare le entità modello", + "trend": "Ricaricare le entità di tendenza", "universal": "Ricarica le entità del lettore multimediale universale", "zone": "Ricarica le zone" }, @@ -1962,6 +1967,8 @@ "create": "Crea", "name": "Nome", "password": "Password", + "password_confirm": "Conferma la password", + "password_not_match": "Le password non corrispondono", "username": "Nome utente" }, "caption": "Utenti", @@ -1978,7 +1985,9 @@ "group": "Gruppo", "id": "ID", "name": "Nome", + "new_password": "Nuova password", "owner": "Proprietario", + "password_changed": "La password è stata cambiata!", "system_generated": "Generato dal sistema", "system_generated_users_not_editable": "Impossibile aggiornare gli utenti generati dal sistema.", "system_generated_users_not_removable": "Impossibile rimuovere gli utenti generati dal sistema.", @@ -2428,6 +2437,7 @@ "show_name": "Mostrare il nome?", "show_state": "Mostrare lo stato?", "state": "Stato", + "state_color": "Colorare le icone in base allo stato?", "tap_action": "Tocca Azione", "theme": "Tema", "title": "Titolo", diff --git a/translations/frontend/ja.json b/translations/frontend/ja.json index eb5c64a3ad..f0d6e46475 100644 --- a/translations/frontend/ja.json +++ b/translations/frontend/ja.json @@ -66,7 +66,9 @@ "state_badge": { "alarm_control_panel": { "armed_home": "アームしました", + "disarmed": "解除", "disarming": "解除", + "pending": "保留", "triggered": "トリガー" }, "default": { @@ -85,6 +87,8 @@ }, "state": { "alarm_control_panel": { + "disarmed": "解除", + "disarming": "解除", "pending": "保留中", "triggered": "トリガー" }, @@ -1877,21 +1881,29 @@ "automation": "オートメーションの再読込", "command_line": "コマンド ライン エンティティの再読み込み", "core": "ロケーションとカスタマイズの再読込", + "filesize": "ファイルサイズエンティティを再読み込み", "filter": "フィルターエンティティの再読み込み", + "generic": "汎用 IP カメラ エンティティの再読み込み", + "generic_thermostat": "汎用サーモスタット エンティティの再読み込み", "group": "グループの再読込", "heading": "設定の再読込", + "history_stats": "履歴エンティティを再読み込み", + "homekit": "HomeKitの再読み込み", "input_boolean": "入力ブール値を再読み込み", "input_datetime": "入力日時を再読み込み", "input_number": "入力番号を再読み込み", "input_select": "入力選択の再読み込み", "input_text": "入力テキストを再読み込み", "introduction": "Home Assistant の一部は、再起動を必要とせずに再読込できます。再読込を押すと、現在の設定をアンロードし、新しい設定を読み込みます。", + "min_max": "最小/最大エンティティを再読み込み", "person": "人の再読込", + "ping": "ping バイナリ センサー エンティティの再読み込み", "rest": "残りのエンティティの再読み込み", "scene": "シーンの再読込", "script": "スクリプトの再読込", "statistics": "静的エンティティの再読み込み", "template": "テンプレート エンティティの再読み込み", + "trend": "トレンドエンティティを再読み込み", "universal": "ユニバーサル メディア プレーヤー エンティティの再読み込み", "zone": "ゾーンの再読込" }, @@ -1944,6 +1956,8 @@ "create": "作成する", "name": "名前", "password": "パスワード", + "password_confirm": "パスワードの確認", + "password_not_match": "パスワードが一致しません", "username": "ユーザー名" }, "caption": "ユーザー", @@ -1960,7 +1974,9 @@ "group": "グループ", "id": "ID", "name": "名前", + "new_password": "新しいパスワード", "owner": "所有者", + "password_changed": "パスワードが変更されました!", "system_generated": "システムジェネレート", "system_generated_users_not_editable": "システムが生成されたユーザーを変更できません。", "system_generated_users_not_removable": "システムで生成されたユーザーを削除できません。", @@ -2410,6 +2426,7 @@ "show_name": "名前を表示しますか?", "show_state": "状態を表示しますか?", "state": "状態", + "state_color": "状態に基づいたカラーアイコン?", "tap_action": "アクションをタップ", "theme": "テーマ", "title": "タイトル", diff --git a/translations/frontend/nl.json b/translations/frontend/nl.json index 5b982da212..8e3ce0ba70 100644 --- a/translations/frontend/nl.json +++ b/translations/frontend/nl.json @@ -923,7 +923,7 @@ "wait_template": "Wachtsjabloon" } }, - "unsupported_action": "Niet-ondersteunde actie: {action}" + "unsupported_action": "Geen UI-ondersteuning voor actie: {action}" }, "alias": "Naam", "conditions": { @@ -1488,7 +1488,7 @@ "frontend": "Frontend", "frontend_version": "Frontend-versie: {version} - {type}", "home_assistant_logo": "Home Assistant-logo", - "icons_by": "Icons door", + "icons_by": "Pictogrammen door", "integrations": "Integraties", "issues": "Problemen", "license": "Gepubliceerd onder de Apache 2.0-licentie", @@ -1726,7 +1726,7 @@ "network": { "header": "Netwerkbeheer", "introduction": "Beheer netwerkbrede functies.", - "node_count": "{count} nodes" + "node_count": "{count} knooppunten" }, "node_query_stages": { "associations": "Associatiegroepen en lidmaatschappen verversen", @@ -1760,12 +1760,12 @@ "wakeup_instructions_source": "Wekinstructies zijn afkomstig uit de OpenZWave-gemeenschapsapparaatdatabase." }, "select_instance": { - "header": "Selecteer een OpenZWave-instantie", - "introduction": "Je hebt meer dan één OpenZWave instantie lopen. Welke instantie wilt u beheren?" + "header": "Selecteer een OpenZWave instantie", + "introduction": "Je hebt meer dan één OpenZWave instantie lopen. Welke instantie wil je beheren?" }, "services": { - "add_node": "Node toevoegen", - "remove_node": "Node verwijderen" + "add_node": "Knooppunt toevoegen", + "remove_node": "Knooppunt verwijderen" } }, "person": { @@ -1891,24 +1891,32 @@ "section": { "reloading": { "automation": "Herlaad automatiseringen", - "command_line": "Laad opdrachtregelentiteiten opnieuw", + "command_line": "Herlaad opdrachtregel-entiteiten", "core": "Herlaad locatie en aanpassingen", - "filter": "Laad filterentiteiten opnieuw", + "filesize": "Herlaad bestandsgrootte entiteiten", + "filter": "Herlaad filter-entiteiten", + "generic": "Herlaad generieke IP camera entiteiten", + "generic_thermostat": "Herlaad generieke thermostaat entiteiten", "group": "Herlaad groepen", "heading": "Configuratie herladen", + "history_stats": "Herlaad historische statistieken entiteiten", + "homekit": "Herlaad HomeKit", "input_boolean": "Herlaad input booleans", "input_datetime": "Herlaad input date times", "input_number": "Herlaad input numbers", "input_select": "Herlaad input selects", "input_text": "Herlaad input texts", "introduction": "Sommige delen van Home Assistant kunnen opnieuw worden geladen zonder dat een herstart vereist is. Als je herladen gebruikt, wordt de huidige configuratie leeggemaakt en wordt de nieuwe geladen.", + "min_max": "Herlaad min/max entiteiten", "person": "Herlaad personen", - "rest": "Laad rustentiteiten opnieuw", + "ping": "Herlaad ping binaire sensor entiteiten", + "rest": "Herlaad rust-entiteiten", "scene": "Herlaad scenes", "script": "Herlaad scripts", - "statistics": "Laad statistische entiteiten opnieuw", - "template": "Laad sjabloonentiteiten opnieuw", - "universal": "Laad de entiteiten van de universele mediaspeler opnieuw", + "statistics": "Herlaad statistische entiteiten", + "template": "Herlaad sjabloon-entiteiten", + "trend": "Herlaad trend-entiteiten", + "universal": "Herlaad universele mediaspeler entiteiten", "zone": "Herlaad zones" }, "server_management": { @@ -1960,6 +1968,8 @@ "create": "Maken", "name": "Naam", "password": "Wachtwoord", + "password_confirm": "Bevestig wachtwoord", + "password_not_match": "Wachtwoorden komen niet overeen", "username": "Gebruikersnaam" }, "caption": "Gebruikers", @@ -1976,7 +1986,9 @@ "group": "Groep", "id": "ID", "name": "Naam", + "new_password": "Nieuw wachtwoord", "owner": "Eigenaar", + "password_changed": "Het wachtwoord is gewijzigd!", "system_generated": "Gegenereerd door systeem", "system_generated_users_not_editable": "Kan door het systeem gegenereerde gebruikers niet bijwerken.", "system_generated_users_not_removable": "Kan door het systeem gegenereerde gebruikers niet verwijderen.", @@ -2144,17 +2156,17 @@ }, "network_status": { "network_started": "Z-Wave netwerk gestart", - "network_started_note_all_queried": "Alle nodes zijn opgevraagd.", - "network_started_note_some_queried": "Alle actieve nodes zijn opgevraagd. Inactieve nodes worden opgevraagd wanneer ze actief worden.", + "network_started_note_all_queried": "Alle knooppunten zijn opgevraagd.", + "network_started_note_some_queried": "Alle actieve knooppunten zijn opgevraagd. Inactieve knooppunten worden opgevraagd wanneer ze actief worden.", "network_starting": "Z-Wave netwerk starten...", "network_starting_note": "Dit kan een tijdje duren, afhankelijk van de grootte van je netwerk.", "network_stopped": "Z-Wave netwerk gestopt" }, "node_config": { "config_parameter": "Configuratie Parameter", - "config_value": "Configuratie Waarde", + "config_value": "Configuratiewaarde", "false": "Niet waar", - "header": "Node Configuratie Opties", + "header": "Knooppunt Configuratie Opties", "seconds": "Seconden", "set_config_parameter": "Stel de configuratieparameter in", "set_wakeup": "Activeringsinterval instellen", @@ -2170,11 +2182,11 @@ "introduction": "Voer Z-Wave commando's uit die een enkel knooppunt beïnvloeden. Kies een knooppunt om een lijst met beschikbare commando's te zien.", "max_associations": "Maximale associaties:", "node_group_associations": "Knooppuntgroepassociaties", - "node_protection": "Node beveiliging", - "node_to_control": "Node om te besturen", + "node_protection": "Knooppunt beveiliging", + "node_to_control": "Knooppunt om te besturen", "nodes": "Knooppunten", "nodes_hint": "Selecteer knooppunt om de opties per knooppunt te bekijken", - "nodes_in_group": "Andere nodes in deze groep:", + "nodes_in_group": "Andere knooppunten in deze groep:", "pooling_intensity": "Polling intensiteit", "protection": "Bescherming", "remove_broadcast": "Broadcast verwijderen", @@ -2189,24 +2201,24 @@ "tail": "Staart" }, "services": { - "add_node": "Node toevoegen", - "add_node_secure": "Secure Node toevoegen", + "add_node": "Knooppunt toevoegen", + "add_node_secure": "Beveiligd knooppunt toevoegen", "cancel_command": "Opdracht annuleren", "heal_network": "Herstel Netwerk", - "heal_node": "Herstel node", - "node_info": "Node informatie", - "print_node": "Print node", + "heal_node": "Herstel knooppunt", + "node_info": "Knooppunt informatie", + "print_node": "Print knooppunt", "refresh_entity": "Entiteit vernieuwen", - "refresh_node": "Node verwijderen", - "remove_failed_node": "Verwijder gefaalde node", - "remove_node": "Node verwijderen", - "replace_failed_node": "Vervang gefaalde node", + "refresh_node": "Knooppunt verversen", + "remove_failed_node": "Verwijder gefaald knooppunt", + "remove_node": "Knooppunt verwijderen", + "replace_failed_node": "Vervang gefaald knooppunt", "save_config": "Configuratie Opslaan", "soft_reset": "Soft Reset", "start_network": "Start netwerk", "stop_network": "Stop Netwerk", "test_network": "Test Netwerk", - "test_node": "Test node" + "test_node": "Test knooppunt" }, "values": { "header": "Knooppunt waarden" @@ -2426,6 +2438,7 @@ "show_name": "Naam weergeven?", "show_state": "Staat tonen?", "state": "Toestand", + "state_color": "Kleur pictogrammen op basis van status?", "tap_action": "Tik Actie", "theme": "Thema", "title": "Titel", diff --git a/translations/frontend/tr.json b/translations/frontend/tr.json index 1d11c4e2d7..13376adc80 100644 --- a/translations/frontend/tr.json +++ b/translations/frontend/tr.json @@ -613,7 +613,7 @@ "generic": { "cancel": "İptal", "close": "kapat", - "default_confirmation_title": "Emin misin?", + "default_confirmation_title": "Emin misiniz?", "ok": "Tamam" }, "helper_settings": { @@ -1069,7 +1069,7 @@ "picker": { "add_automation": "Otomasyon ekle", "delete_automation": "Otomasyonu sil", - "delete_confirm": "Bu otomasyonu silmek istediğinizden emin misin?", + "delete_confirm": "Bu otomasyonu silmek istediğinizden emin misiniz?", "edit_automation": "Otomasyonu düzenle", "header": "Otomasyon Düzenleyici", "headers": { @@ -1736,7 +1736,7 @@ "zone": "Bölgeleri yeniden yükle" }, "server_management": { - "confirm_restart": "Home Assistant'ı yeniden başlatmak istediğinizden emin misin?", + "confirm_restart": "Home Assistant'ı yeniden başlatmak istediğinizden emin misiniz?", "confirm_stop": "Home Assistant'ı durdurmak istediğinizden emin misin?", "heading": "Sunucu yönetimi", "introduction": "Home Assistant sunucunuzu kontrol edin.. Home Assistant üzerinden", diff --git a/translations/frontend/zh-Hans.json b/translations/frontend/zh-Hans.json index c9cb033ada..145b265f47 100644 --- a/translations/frontend/zh-Hans.json +++ b/translations/frontend/zh-Hans.json @@ -1893,19 +1893,31 @@ "section": { "reloading": { "automation": "重载自动化", + "command_line": "重载命令行实体", "core": "重载位置和自定义", + "filesize": "重载文件大小实体", + "filter": "重载 filter 实体", + "generic": "重载通用 IP 摄像机实体", + "generic_thermostat": "重载通用恒温器实体", "group": "重载分组", "heading": "配置重载", + "history_stats": "重载历史记录统计实体", + "homekit": "重载 HomeKit", "input_boolean": "重载二元选择器", "input_datetime": "重载日期选择器", "input_number": "重载数值选择器", "input_select": "重载多项选择器", "input_text": "重载文字输入", "introduction": "Home Assistant 中的部分配置可以直接重载,而无需重启服务。点击重载按钮将重新载入新的配置。", + "min_max": "重载最小值/最大值实体", "person": "重载人员", + "ping": "重载 ping 二元传感器实体", + "rest": "重载 REST 实体", "scene": "重载场景", "script": "重载脚本", + "statistics": "重载 statistics 实体", "template": "重载模板实体", + "trend": "重载 trend 实体", "universal": "重载通用媒体播放器实体", "zone": "重载地点" }, @@ -1958,6 +1970,8 @@ "create": "创建", "name": "名字", "password": "密码", + "password_confirm": "确认密码", + "password_not_match": "密码不匹配", "username": "用户名" }, "caption": "用户", @@ -1974,7 +1988,9 @@ "group": "群组", "id": "ID", "name": "名称", + "new_password": "新密码", "owner": "所有者", + "password_changed": "密码已更改!", "system_generated": "系统生成", "system_generated_users_not_editable": "无法更新系统生成的用户。", "system_generated_users_not_removable": "无法删除系统生成的用户。", @@ -2424,6 +2440,7 @@ "show_name": "显示名称?", "show_state": "显示状态?", "state": "状态", + "state_color": "使图标根据状态变色?", "tap_action": "点击动作", "theme": "主题", "title": "标题", diff --git a/translations/frontend/zh-Hant.json b/translations/frontend/zh-Hant.json index 15e8f547c3..ab1299f0fc 100644 --- a/translations/frontend/zh-Hant.json +++ b/translations/frontend/zh-Hant.json @@ -1895,21 +1895,29 @@ "automation": "重新載入自動化", "command_line": "重新載入命令列物件", "core": "重新載入座標與自訂化", + "filesize": "重新載入檔案大小物件", "filter": "重新載入過濾器物件", + "generic": "重新載入通用 IP 攝影機物件", + "generic_thermostat": "重新載入通用溫控器物件", "group": "重新載入群組", "heading": "YAML 設定新載入中", + "history_stats": "重新載入歷史狀態物件", + "homekit": "重新載入 Homekit", "input_boolean": "重新載入輸入 boolean", "input_datetime": "重新載入輸入日期時間", "input_number": "重新載入輸入數字", "input_select": "重新載入輸入選擇", "input_text": "重新載入輸入文字", "introduction": "Home Assistant 中部分設定無須重啟即可重新載入生效。點選重新載入按鈕,即可解除目前 YAML 設定,並重新載入最新設定。", + "min_max": "重新載入最低/最高物件", "person": "重新載入人員", + "ping": "重新載入 Pung 二進位傳感器物件", "rest": "重新載入剩餘物件", "scene": "重新載入場景", "script": "重新載入腳本", "statistics": "重新載入統計資訊物件", "template": "重新載入範例物件", + "trend": "重新載入趨勢物件", "universal": "重新載入通用媒體播放器物件", "zone": "重新載入區域" }, @@ -1962,6 +1970,8 @@ "create": "新增", "name": "名稱", "password": "密碼", + "password_confirm": "確認密碼", + "password_not_match": "密碼不相符", "username": "使用者名稱" }, "caption": "用戶", @@ -1978,7 +1988,9 @@ "group": "群組", "id": "ID", "name": "名稱", + "new_password": "新密碼", "owner": "擁有者", + "password_changed": "密碼已變更!", "system_generated": "系統產生", "system_generated_users_not_editable": "無法更新系統產生用戶", "system_generated_users_not_removable": "無法移除系統產生用戶", @@ -2428,6 +2440,7 @@ "show_name": "顯示名稱?", "show_state": "顯示狀態?", "state": "狀態", + "state_color": "以色彩顯示狀態?", "tap_action": "點選觸發", "theme": "主題", "title": "標題", From a3f680d80cd6696d462a7bc56757410887581815 Mon Sep 17 00:00:00 2001 From: Tomasz Date: Mon, 31 Aug 2020 14:59:12 +0200 Subject: [PATCH 105/300] Fix render modifiers - public to protected (#6753) --- hassio/src/components/hassio-ansi-to-html.ts | 2 +- hassio/src/system/hassio-host-info.ts | 22 ++++++++--------- hassio/src/system/hassio-supervisor-info.ts | 16 ++++++------- hassio/src/system/hassio-supervisor-log.ts | 2 +- hassio/src/system/hassio-system.ts | 4 ++-- src/components/ha-circular-progress.ts | 24 +++++++++---------- .../types/ha-automation-action-condition.ts | 2 +- .../types/ha-automation-action-delay.ts | 2 +- .../ha-automation-condition-numeric_state.ts | 4 ++-- .../types/ha-automation-trigger-event.ts | 2 +- .../ha-automation-trigger-homeassistant.ts | 2 +- .../ha-automation-trigger-numeric_state.ts | 4 ++-- src/panels/lovelace/hui-editor.ts | 12 +++++----- 13 files changed, 47 insertions(+), 51 deletions(-) diff --git a/hassio/src/components/hassio-ansi-to-html.ts b/hassio/src/components/hassio-ansi-to-html.ts index b553367b8a..b957b172b4 100644 --- a/hassio/src/components/hassio-ansi-to-html.ts +++ b/hassio/src/components/hassio-ansi-to-html.ts @@ -21,7 +21,7 @@ interface State { class HassioAnsiToHtml extends LitElement { @property() public content!: string; - public render(): TemplateResult | void { + protected render(): TemplateResult | void { return html`${this._parseTextToColoredPre(this.content)}`; } diff --git a/hassio/src/system/hassio-host-info.ts b/hassio/src/system/hassio-host-info.ts index 38ea35fa21..2f238a8c00 100644 --- a/hassio/src/system/hassio-host-info.ts +++ b/hassio/src/system/hassio-host-info.ts @@ -1,9 +1,8 @@ import "@material/mwc-button"; -import "@material/mwc-list/mwc-list-item"; import { ActionDetail } from "@material/mwc-list/mwc-list-foundation"; +import "@material/mwc-list/mwc-list-item"; import { mdiDotsVertical } from "@mdi/js"; import { safeDump } from "js-yaml"; -import memoizeOne from "memoize-one"; import { css, CSSResult, @@ -14,7 +13,11 @@ import { property, TemplateResult, } from "lit-element"; - +import memoizeOne from "memoize-one"; +import "../../../src/components/ha-button-menu"; +import "../../../src/components/ha-card"; +import "../../../src/components/ha-settings-row"; +import { fetchHassioHardwareInfo } from "../../../src/data/hassio/hardware"; import { changeHostOptions, configSyncOS, @@ -25,26 +28,21 @@ import { shutdownHost, updateOS, } from "../../../src/data/hassio/host"; -import { fetchHassioHardwareInfo } from "../../../src/data/hassio/hardware"; import { fetchNetworkInfo, NetworkInfo, } from "../../../src/data/hassio/network"; import { HassioInfo } from "../../../src/data/hassio/supervisor"; -import { hassioStyle } from "../resources/hassio-style"; -import { haStyle } from "../../../src/resources/styles"; -import { HomeAssistant } from "../../../src/types"; import { showAlertDialog, showConfirmationDialog, showPromptDialog, } from "../../../src/dialogs/generic/show-dialog-box"; +import { haStyle } from "../../../src/resources/styles"; +import { HomeAssistant } from "../../../src/types"; import { showHassioMarkdownDialog } from "../dialogs/markdown/show-dialog-hassio-markdown"; import { showNetworkDialog } from "../dialogs/network/show-dialog-network"; - -import "../../../src/components/ha-button-menu"; -import "../../../src/components/ha-card"; -import "../../../src/components/ha-settings-row"; +import { hassioStyle } from "../resources/hassio-style"; @customElement("hassio-host-info") class HassioHostInfo extends LitElement { @@ -58,7 +56,7 @@ class HassioHostInfo extends LitElement { @internalProperty() public _networkInfo?: NetworkInfo; - public render(): TemplateResult | void { + protected render(): TemplateResult | void { const primaryIpAddress = this.hostInfo.features.includes("network") ? this._primaryIpAddress(this._networkInfo!) : ""; diff --git a/hassio/src/system/hassio-supervisor-info.ts b/hassio/src/system/hassio-supervisor-info.ts index 6213c829ba..560a04e534 100644 --- a/hassio/src/system/hassio-supervisor-info.ts +++ b/hassio/src/system/hassio-supervisor-info.ts @@ -8,11 +8,10 @@ import { property, TemplateResult, } from "lit-element"; - +import "../../../src/components/ha-card"; +import "../../../src/components/ha-settings-row"; +import "../../../src/components/ha-switch"; import { HassioHostInfo as HassioHostInfoType } from "../../../src/data/hassio/host"; -import { hassioStyle } from "../resources/hassio-style"; -import { haStyle } from "../../../src/resources/styles"; -import { HomeAssistant } from "../../../src/types"; import { HassioSupervisorInfo as HassioSupervisorInfoType, reloadSupervisor, @@ -24,10 +23,9 @@ import { showAlertDialog, showConfirmationDialog, } from "../../../src/dialogs/generic/show-dialog-box"; - -import "../../../src/components/ha-card"; -import "../../../src/components/ha-settings-row"; -import "../../../src/components/ha-switch"; +import { haStyle } from "../../../src/resources/styles"; +import { HomeAssistant } from "../../../src/types"; +import { hassioStyle } from "../resources/hassio-style"; @customElement("hassio-supervisor-info") class HassioSupervisorInfo extends LitElement { @@ -37,7 +35,7 @@ class HassioSupervisorInfo extends LitElement { @property() public hostInfo!: HassioHostInfoType; - public render(): TemplateResult | void { + protected render(): TemplateResult | void { return html`
    diff --git a/hassio/src/system/hassio-supervisor-log.ts b/hassio/src/system/hassio-supervisor-log.ts index de2c08cda5..68fba0f1ab 100644 --- a/hassio/src/system/hassio-supervisor-log.ts +++ b/hassio/src/system/hassio-supervisor-log.ts @@ -69,7 +69,7 @@ class HassioSupervisorLog extends LitElement { await this._loadData(); } - public render(): TemplateResult | void { + protected render(): TemplateResult | void { return html` ${this._error ? html`
    ${this._error}
    ` : ""} diff --git a/hassio/src/system/hassio-system.ts b/hassio/src/system/hassio-system.ts index ad91a42825..f2ffc2cc62 100644 --- a/hassio/src/system/hassio-system.ts +++ b/hassio/src/system/hassio-system.ts @@ -12,8 +12,8 @@ import { HassioHostInfo, } from "../../../src/data/hassio/host"; import { - HassioSupervisorInfo, HassioInfo, + HassioSupervisorInfo, } from "../../../src/data/hassio/supervisor"; import "../../../src/layouts/hass-tabs-subpage"; import { haStyle } from "../../../src/resources/styles"; @@ -40,7 +40,7 @@ class HassioSystem extends LitElement { @property({ attribute: false }) public hassOsInfo!: HassioHassOSInfo; - public render(): TemplateResult | void { + protected render(): TemplateResult | void { return html` diff --git a/src/panels/config/automation/trigger/types/ha-automation-trigger-numeric_state.ts b/src/panels/config/automation/trigger/types/ha-automation-trigger-numeric_state.ts index 6d10f83c2d..068dbd6856 100644 --- a/src/panels/config/automation/trigger/types/ha-automation-trigger-numeric_state.ts +++ b/src/panels/config/automation/trigger/types/ha-automation-trigger-numeric_state.ts @@ -1,8 +1,8 @@ import "@polymer/paper-input/paper-input"; +import "@polymer/paper-input/paper-textarea"; import { customElement, html, LitElement, property } from "lit-element"; import { fireEvent } from "../../../../../common/dom/fire_event"; import "../../../../../components/entity/ha-entity-picker"; -import "@polymer/paper-input/paper-textarea"; import { ForDict, NumericStateTrigger } from "../../../../../data/automation"; import { HomeAssistant } from "../../../../../types"; import { handleChangeEvent } from "../ha-automation-trigger-row"; @@ -19,7 +19,7 @@ export default class HaNumericStateTrigger extends LitElement { }; } - public render() { + protected render() { const { value_template, entity_id, below, above } = this.trigger; let trgFor = this.trigger.for; diff --git a/src/panels/lovelace/hui-editor.ts b/src/panels/lovelace/hui-editor.ts index 998b08af3b..84a9f86fe1 100644 --- a/src/panels/lovelace/hui-editor.ts +++ b/src/panels/lovelace/hui-editor.ts @@ -1,34 +1,34 @@ import "@material/mwc-button"; -import "../../layouts/ha-app-layout"; import "@polymer/app-layout/app-header/app-header"; import "@polymer/app-layout/app-toolbar/app-toolbar"; -import "../../components/ha-icon-button"; -import "../../components/ha-circular-progress"; import { safeDump, safeLoad } from "js-yaml"; import { css, CSSResult, customElement, html, + internalProperty, LitElement, property, - internalProperty, TemplateResult, } from "lit-element"; import { classMap } from "lit-html/directives/class-map"; +import { array, assert, object, optional, string, type } from "superstruct"; import { computeRTL } from "../../common/util/compute_rtl"; +import "../../components/ha-circular-progress"; import "../../components/ha-code-editor"; import type { HaCodeEditor } from "../../components/ha-code-editor"; import "../../components/ha-icon"; +import "../../components/ha-icon-button"; import type { LovelaceConfig } from "../../data/lovelace"; import { showAlertDialog, showConfirmationDialog, } from "../../dialogs/generic/show-dialog-box"; +import "../../layouts/ha-app-layout"; import { haStyle } from "../../resources/styles"; import type { HomeAssistant } from "../../types"; import type { Lovelace } from "./types"; -import { optional, array, string, object, type, assert } from "superstruct"; const lovelaceStruct = type({ title: optional(string()), @@ -49,7 +49,7 @@ class LovelaceFullConfigEditor extends LitElement { private _generation = 1; - public render(): TemplateResult | void { + protected render(): TemplateResult | void { return html` From 154b53b0d8fa8aea9e869f1c1497a8907bf351d3 Mon Sep 17 00:00:00 2001 From: Pascal Roeleven Date: Mon, 31 Aug 2020 16:04:02 +0200 Subject: [PATCH 106/300] Fix automation modes documentation link (#6754) --- src/panels/config/automation/ha-automation-editor.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/panels/config/automation/ha-automation-editor.ts b/src/panels/config/automation/ha-automation-editor.ts index 2a935d0f38..255edefff7 100644 --- a/src/panels/config/automation/ha-automation-editor.ts +++ b/src/panels/config/automation/ha-automation-editor.ts @@ -146,7 +146,7 @@ export class HaAutomationEditor extends LitElement { "ui.panel.config.automation.editor.modes.description", "documentation_link", html`${this.hass.localize( From 8e228baa82e85b6192686ff58b9afbd097a3a480 Mon Sep 17 00:00:00 2001 From: Kendell R Date: Mon, 31 Aug 2020 07:38:32 -0700 Subject: [PATCH 107/300] Change spot clean icon (#6750) * Change spot clean icon * Switch to target-variant Co-authored-by: Bram Kragten Co-authored-by: Bram Kragten --- src/dialogs/more-info/controls/more-info-vacuum.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dialogs/more-info/controls/more-info-vacuum.ts b/src/dialogs/more-info/controls/more-info-vacuum.ts index 0c131333f1..ce947e9929 100644 --- a/src/dialogs/more-info/controls/more-info-vacuum.ts +++ b/src/dialogs/more-info/controls/more-info-vacuum.ts @@ -68,7 +68,7 @@ const VACUUM_COMMANDS: VacuumCommand[] = [ }, { translationKey: "clean_spot", - icon: "hass:broom", + icon: "hass:target-variant", serviceName: "clean_spot", isVisible: (stateObj) => supportsFeature(stateObj, VACUUM_SUPPORT_CLEAN_SPOT), From 4a176f1b43dae0d3937d1e6b678c3590590be8f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Mon, 31 Aug 2020 21:38:24 +0200 Subject: [PATCH 108/300] Call service button feedback (#6752) --- src/components/buttons/ha-progress-button.ts | 25 ++++++++++++++--- .../service/developer-tools-service.js | 28 +++++++++++++------ 2 files changed, 41 insertions(+), 12 deletions(-) diff --git a/src/components/buttons/ha-progress-button.ts b/src/components/buttons/ha-progress-button.ts index eebd0cfa6b..a446d456fc 100644 --- a/src/components/buttons/ha-progress-button.ts +++ b/src/components/buttons/ha-progress-button.ts @@ -1,4 +1,5 @@ import "@material/mwc-button"; +import type { Button } from "@material/mwc-button"; import { css, CSSResult, @@ -7,6 +8,7 @@ import { LitElement, property, TemplateResult, + query, } from "lit-element"; import "../ha-circular-progress"; @@ -17,9 +19,14 @@ class HaProgressButton extends LitElement { @property({ type: Boolean }) public progress = false; + @property({ type: Boolean }) public raised = false; + + @query("mwc-button") private _button?: Button; + public render(): TemplateResult { return html` @@ -42,9 +49,9 @@ class HaProgressButton extends LitElement { } private _tempClass(className: string): void { - this.classList.add(className); + this._button!.classList.add(className); setTimeout(() => { - this.classList.remove(className); + this._button!.classList.remove(className); }, 1000); } @@ -66,18 +73,28 @@ class HaProgressButton extends LitElement { transition: all 1s; } - .success mwc-button { + mwc-button.success { --mdc-theme-primary: white; background-color: var(--success-color); transition: none; } - .error mwc-button { + mwc-button[raised].success { + --mdc-theme-primary: var(--success-color); + --mdc-theme-on-primary: white; + } + + mwc-button.error { --mdc-theme-primary: white; background-color: var(--error-color); transition: none; } + mwc-button[raised].error { + --mdc-theme-primary: var(--error-color); + --mdc-theme-on-primary: white; + } + .progress { bottom: 0; margin-top: 4px; diff --git a/src/panels/developer-tools/service/developer-tools-service.js b/src/panels/developer-tools/service/developer-tools-service.js index 51db6e7645..a0478ac55d 100644 --- a/src/panels/developer-tools/service/developer-tools-service.js +++ b/src/panels/developer-tools/service/developer-tools-service.js @@ -1,8 +1,9 @@ -import "@material/mwc-button"; import { html } from "@polymer/polymer/lib/utils/html-tag"; /* eslint-plugin-disable lit */ import { PolymerElement } from "@polymer/polymer/polymer-element"; import { safeDump, safeLoad } from "js-yaml"; +import { computeRTL } from "../../../common/util/compute_rtl"; +import "../../../components/buttons/ha-progress-button"; import "../../../components/entity/ha-entity-picker"; import "../../../components/ha-code-editor"; import "../../../components/ha-service-picker"; @@ -11,7 +12,6 @@ import { showAlertDialog } from "../../../dialogs/generic/show-dialog-box"; import LocalizeMixin from "../../../mixins/localize-mixin"; import "../../../styles/polymer-ha-style"; import "../../../util/app-localstorage-document"; -import { computeRTL } from "../../../common/util/compute_rtl"; const ERROR_SENTINEL = {}; /* @@ -34,7 +34,7 @@ class HaPanelDevService extends LocalizeMixin(PolymerElement) { max-width: 400px; } - mwc-button { + ha-progress-button { margin-top: 8px; } @@ -136,9 +136,13 @@ class HaPanelDevService extends LocalizeMixin(PolymerElement) { error="[[!validJSON]]" on-value-changed="_yamlChanged" > - + [[localize('ui.panel.developer-tools.tabs.services.call_service')]] - +