diff --git a/cast/src/receiver/layout/hc-main.ts b/cast/src/receiver/layout/hc-main.ts index 63f0b30fc7..ccb20f5aa5 100644 --- a/cast/src/receiver/layout/hc-main.ts +++ b/cast/src/receiver/layout/hc-main.ts @@ -137,14 +137,14 @@ export class HcMain extends HassElement { }), }); } catch (err) { - this._error = err; + this._error = this._getErrorMessage(err); return; } let connection; try { connection = await createConnection({ auth }); } catch (err) { - this._error = err; + this._error = this._getErrorMessage(err); return; } if (this.hass) { @@ -213,6 +213,23 @@ export class HcMain extends HassElement { }); } + private _getErrorMessage(error: number): string { + switch (error) { + case 1: + return "Unable to connect to the Home Assistant websocket API."; + case 2: + return "The supplied authentication is invalid."; + case 3: + return "The connection to Home Assistant was lost."; + case 4: + return "Missing hassUrl. This is required."; + case 5: + return "Home Assistant needs to be served over https:// to use with Home Assistant Cast."; + default: + return "Unknown Error"; + } + } + private _breakFree() { const controls = document.body.querySelector("touch-controls"); if (controls) { diff --git a/demo/src/configs/arsaboo/entities.ts b/demo/src/configs/arsaboo/entities.ts index 9bbc753451..77a4d1c16a 100644 --- a/demo/src/configs/arsaboo/entities.ts +++ b/demo/src/configs/arsaboo/entities.ts @@ -115,10 +115,6 @@ export const demoEntitiesArsaboo: DemoConfig["entities"] = (localize) => attributes: { friendly_name: "Abode Updates", icon: "hademo:security", - templates: { - icon_color: - "if (state === 'on') return 'rgb(251, 210, 41)'; return 'rgb(54, 95, 140)';\n", - }, }, }, "input_boolean.tv": { @@ -127,10 +123,6 @@ export const demoEntitiesArsaboo: DemoConfig["entities"] = (localize) => attributes: { friendly_name: "TV", icon: "hademo:television", - templates: { - icon_color: - "if (state === 'on') return 'rgb(251, 210, 41)'; return 'rgb(54, 95, 140)';\n", - }, }, }, "input_boolean.homeautomation": { @@ -139,10 +131,6 @@ export const demoEntitiesArsaboo: DemoConfig["entities"] = (localize) => attributes: { friendly_name: "Home Automation", icon: "hass:home-automation", - templates: { - icon_color: - "if (state === 'on') return 'rgb(251, 210, 41)'; return 'rgb(54, 95, 140)';\n", - }, }, }, "input_boolean.tvtime": { @@ -151,12 +139,6 @@ export const demoEntitiesArsaboo: DemoConfig["entities"] = (localize) => attributes: { friendly_name: "TV Time", icon: "hademo:television-guide", - templates: { - icon: - "if (state === 'on') return 'hademo:television-classic'; return 'hademo:television-classic-off';\n", - icon_color: - "if (state === 'on') return 'rgb(251, 210, 41)'; return 'rgb(54, 95, 140)';\n", - }, }, }, "input_select.livingroomharmony": { @@ -560,12 +542,6 @@ export const demoEntitiesArsaboo: DemoConfig["entities"] = (localize) => state: "off", attributes: { friendly_name: "Driveway Light", - templates: { - icon_color: - "if (state === 'on') return 'rgb(251, 210, 41)'; return 'rgb(54, 95, 140)';\n", - icon: - "if (state === 'on') return 'hademo:lightbulb-on'; return 'hademo:lightbulb';\n", - }, }, }, "switch.wemoporch": { @@ -573,12 +549,6 @@ export const demoEntitiesArsaboo: DemoConfig["entities"] = (localize) => state: "off", attributes: { friendly_name: "Porch Lights", - templates: { - icon_color: - "if (state === 'on') return 'rgb(251, 210, 41)'; return 'rgb(54, 95, 140)';\n", - icon: - "if (state === 'on') return 'hademo:lightbulb-on'; return 'hademo:lightbulb';\n", - }, }, }, }); diff --git a/package.json b/package.json index 1583cea821..3f78d3ee8e 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "@material/mwc-checkbox": "^0.8.0", "@material/mwc-fab": "^0.8.0", "@material/mwc-ripple": "0.8.0", - "@mdi/svg": "4.3.95", + "@mdi/svg": "4.4.95", "@polymer/app-layout": "^3.0.2", "@polymer/app-localize-behavior": "^3.0.1", "@polymer/app-route": "^3.0.2", diff --git a/setup.py b/setup.py index 3acfa353ed..377135b74c 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name="home-assistant-frontend", - version="20190918.0", + version="20190918.1", description="The Home Assistant frontend", url="https://github.com/home-assistant/home-assistant-polymer", author="The Home Assistant Authors", diff --git a/src/dialogs/more-info/more-info-settings.js b/src/dialogs/more-info/more-info-settings.js index a2350a3ae6..dbf8a11cfa 100644 --- a/src/dialogs/more-info/more-info-settings.js +++ b/src/dialogs/more-info/more-info-settings.js @@ -36,6 +36,7 @@ class MoreInfoSettings extends LocalizeMixin(EventsMixin(PolymerElement)) { app-toolbar mwc-button { font-size: 0.8em; margin: 0; + --mdc-theme-primary: var(--more-info-header-color); } .form { diff --git a/src/panels/config/devices/ha-config-devices-dashboard.ts b/src/panels/config/devices/ha-config-devices-dashboard.ts index ce6bc77c91..a78239873e 100644 --- a/src/panels/config/devices/ha-config-devices-dashboard.ts +++ b/src/panels/config/devices/ha-config-devices-dashboard.ts @@ -35,6 +35,8 @@ import { EntityRegistryEntry } from "../../../data/entity_registry"; import { ConfigEntry } from "../../../data/config_entries"; import { AreaRegistryEntry } from "../../../data/area_registry"; import { navigate } from "../../../common/navigate"; +import { LocalizeFunc } from "../../../common/translations/localize"; +import computeStateName from "../../../common/entity/compute_state_name"; interface DeviceRowData extends DeviceRegistryEntry { device?: DeviceRowData; @@ -43,6 +45,10 @@ interface DeviceRowData extends DeviceRegistryEntry { battery_entity?: string; } +interface DeviceEntityLookup { + [deviceId: string]: EntityRegistryEntry[]; +} + @customElement("ha-config-devices-dashboard") export class HaConfigDeviceDashboard extends LitElement { @property() public hass!: HomeAssistant; @@ -59,37 +65,73 @@ export class HaConfigDeviceDashboard extends LitElement { entries: ConfigEntry[], entities: EntityRegistryEntry[], areas: AreaRegistryEntry[], - domain: string + domain: string, + localize: LocalizeFunc ) => { + // Some older installations might have devices pointing at invalid entryIDs + // So we guard for that. + let outputDevices: DeviceRowData[] = devices; + + const deviceLookup: { [deviceId: string]: DeviceRegistryEntry } = {}; + for (const device of devices) { + deviceLookup[device.id] = device; + } + + const deviceEntityLookup: DeviceEntityLookup = {}; + for (const entity of entities) { + if (!entity.device_id) { + continue; + } + if (!(entity.device_id in deviceEntityLookup)) { + deviceEntityLookup[entity.device_id] = []; + } + deviceEntityLookup[entity.device_id].push(entity); + } + + const entryLookup: { [entryId: string]: ConfigEntry } = {}; + for (const entry of entries) { + entryLookup[entry.entry_id] = entry; + } + + const areaLookup: { [areaId: string]: AreaRegistryEntry } = {}; + for (const area of areas) { + areaLookup[area.area_id] = area; + } + if (domain) { - outputDevices = outputDevices.filter( - (device) => - entries.find((entry) => - device.config_entries.includes(entry.entry_id) - )!.domain === domain + outputDevices = outputDevices.filter((device) => + device.config_entries.find( + (entryId) => + entryId in entryLookup && entryLookup[entryId].domain === domain + ) ); } outputDevices = outputDevices.map((device) => { - const output = { ...device }; - output.name = device.name_by_user || device.name || "No name"; - - output.area = - !areas || !device || !device.area_id - ? "No area" - : areas.find((area) => area.area_id === device.area_id)!.name; - - output.integration = - !entries || !device || !device.config_entries - ? "No integration" - : entries.find((entry) => - device.config_entries.includes(entry.entry_id) - )!.domain; - - output.battery_entity = this._batteryEntity(device, entities); - - return output; + return { + ...device, + name: + device.name_by_user || + device.name || + this._fallbackDeviceName(device.id, deviceEntityLookup) || + "No name", + model: device.model || "", + manufacturer: device.manufacturer || "", + area: device.area_id ? areaLookup[device.area_id].name : "No area", + integration: device.config_entries.length + ? device.config_entries + .filter((entId) => entId in entryLookup) + .map( + (entId) => + localize( + `component.${entryLookup[entId].domain}.config.title` + ) || entryLookup[entId].domain + ) + .join(", ") + : "No integration", + battery_entity: this._batteryEntity(device.id, deviceEntityLookup), + }; }); return outputDevices; @@ -171,7 +213,7 @@ export class HaConfigDeviceDashboard extends LitElement { > ` : html` - n/a + - `; }, }, @@ -190,7 +232,8 @@ export class HaConfigDeviceDashboard extends LitElement { this.entries, this.entities, this.areas, - this.domain + this.domain, + this.hass.localize ).map((device: DeviceRowData) => { // We don't need a lot of this data for mobile view, but kept it for filtering... const data: DataTabelRowData = { @@ -214,10 +257,12 @@ export class HaConfigDeviceDashboard extends LitElement { `; } - private _batteryEntity(device, entities): string | undefined { - const batteryEntity = entities.find( + private _batteryEntity( + deviceId: string, + deviceEntityLookup: DeviceEntityLookup + ): string | undefined { + const batteryEntity = (deviceEntityLookup[deviceId] || []).find( (entity) => - entity.device_id === device.id && this.hass.states[entity.entity_id] && this.hass.states[entity.entity_id].attributes.device_class === "battery" ); @@ -225,6 +270,20 @@ export class HaConfigDeviceDashboard extends LitElement { return batteryEntity ? batteryEntity.entity_id : undefined; } + private _fallbackDeviceName( + deviceId: string, + deviceEntityLookup: DeviceEntityLookup + ): string | undefined { + for (const entity of deviceEntityLookup[deviceId] || []) { + const stateObj = this.hass.states[entity.entity_id]; + if (stateObj) { + return computeStateName(stateObj); + } + } + + return undefined; + } + private _handleRowClicked(ev: CustomEvent) { const deviceId = (ev.detail as RowClickedEvent).id; navigate(this, `/config/devices/device/${deviceId}`); diff --git a/src/panels/config/devices/ha-config-devices.ts b/src/panels/config/devices/ha-config-devices.ts index 363e83a3ec..1e7c696abe 100644 --- a/src/panels/config/devices/ha-config-devices.ts +++ b/src/panels/config/devices/ha-config-devices.ts @@ -34,6 +34,7 @@ class HaConfigDevices extends HassRouterPage { routes: { dashboard: { tag: "ha-config-devices-dashboard", + cache: true, }, device: { tag: "ha-config-device-page", @@ -41,10 +42,10 @@ class HaConfigDevices extends HassRouterPage { }, }; - @property() private _configEntries?: ConfigEntry[]; - @property() private _entityRegistryEntries?: EntityRegistryEntry[]; - @property() private _deviceRegistryEntries?: DeviceRegistryEntry[]; - @property() private _areas?: AreaRegistryEntry[]; + @property() private _configEntries: ConfigEntry[] = []; + @property() private _entityRegistryEntries: EntityRegistryEntry[] = []; + @property() private _deviceRegistryEntries: DeviceRegistryEntry[] = []; + @property() private _areas: AreaRegistryEntry[] = []; private _unsubs?: UnsubscribeFunc[]; diff --git a/src/panels/config/integrations/ha-config-entries-dashboard.ts b/src/panels/config/integrations/ha-config-entries-dashboard.ts index 7b3cd73673..5c562375d7 100644 --- a/src/panels/config/integrations/ha-config-entries-dashboard.ts +++ b/src/panels/config/integrations/ha-config-entries-dashboard.ts @@ -37,25 +37,24 @@ import { HomeAssistant } from "../../../types"; import { ConfigEntry } from "../../../data/config_entries"; import { fireEvent } from "../../../common/dom/fire_event"; import { EntityRegistryEntry } from "../../../data/entity_registry"; +import { DataEntryFlowProgress } from "../../../data/data_entry_flow"; @customElement("ha-config-entries-dashboard") export class HaConfigManagerDashboard extends LitElement { @property() public hass!: HomeAssistant; - @property() public isWide = false; - - @property() private entries = []; + @property() private configEntries!: ConfigEntry[]; /** * Entity Registry entries. */ - @property() private entities: EntityRegistryEntry[] = []; + @property() private entityRegistryEntries!: EntityRegistryEntry[]; /** * Current flows that are in progress and have not been started by a user. * For example, can be discovered devices that require more config. */ - @property() private progress = []; + @property() private configEntriesInProgress!: DataEntryFlowProgress[]; public connectedCallback() { super.connectedCallback(); @@ -67,7 +66,7 @@ export class HaConfigManagerDashboard extends LitElement { - ${this.progress.length + ${this.configEntriesInProgress.length ? html` - ${this.progress.map( + ${this.configEntriesInProgress.map( (flow) => html`
@@ -102,8 +101,8 @@ export class HaConfigManagerDashboard extends LitElement { )} - ${this.entities.length - ? this.entries.map( + ${this.entityRegistryEntries.length + ? this.configEntries.map( (item: any, idx) => html` `; @@ -175,11 +173,11 @@ export class HaConfigManagerDashboard extends LitElement { } private _getEntities(configEntry: ConfigEntry): HassEntity[] { - if (!this.entities) { + if (!this.entityRegistryEntries) { return []; } const states: HassEntity[] = []; - this.entities.forEach((entity) => { + this.entityRegistryEntries.forEach((entity) => { if ( entity.config_entry_id === configEntry.entry_id && entity.entity_id in this.hass.states @@ -217,21 +215,10 @@ export class HaConfigManagerDashboard extends LitElement { z-index: 1; } - ha-fab[is-wide] { - bottom: 24px; - right: 24px; - } - ha-fab[rtl] { right: auto; left: 16px; } - - ha-fab[rtl][is-wide] { - bottom: 24px; - right: auto; - left: 24px; - } `; } } diff --git a/src/panels/config/integrations/ha-config-integrations.ts b/src/panels/config/integrations/ha-config-integrations.ts index 39a240bbb3..c471288ca4 100644 --- a/src/panels/config/integrations/ha-config-integrations.ts +++ b/src/panels/config/integrations/ha-config-integrations.ts @@ -1,4 +1,5 @@ import "@polymer/app-route/app-route"; +import { property, customElement, PropertyValues } from "lit-element"; import "./ha-config-entries-dashboard"; import "./config-entry/ha-config-entry-page"; @@ -11,7 +12,6 @@ import { HassRouterPage, RouterOptions, } from "../../../layouts/hass-router-page"; -import { property, customElement, PropertyValues } from "lit-element"; import { HomeAssistant } from "../../../types"; import { ConfigEntry, getConfigEntries } from "../../../data/config_entries"; import { @@ -42,7 +42,6 @@ class HaConfigIntegrations extends HassRouterPage { protected routerOptions: RouterOptions = { defaultPage: "dashboard", - preloadAll: true, routes: { dashboard: { tag: "ha-config-entries-dashboard", @@ -53,11 +52,11 @@ class HaConfigIntegrations extends HassRouterPage { }, }; - @property() private _configEntries?: ConfigEntry[]; - @property() private _configEntriesInProgress?: DataEntryFlowProgress[]; - @property() private _entityRegistryEntries?: EntityRegistryEntry[]; - @property() private _deviceRegistryEntries?: DeviceRegistryEntry[]; - @property() private _areas?: AreaRegistryEntry[]; + @property() private _configEntries: ConfigEntry[] = []; + @property() private _configEntriesInProgress: DataEntryFlowProgress[] = []; + @property() private _entityRegistryEntries: EntityRegistryEntry[] = []; + @property() private _deviceRegistryEntries: DeviceRegistryEntry[] = []; + @property() private _areas: AreaRegistryEntry[] = []; private _unsubs?: UnsubscribeFunc[]; @@ -98,15 +97,14 @@ class HaConfigIntegrations extends HassRouterPage { protected updatePageEl(pageEl) { pageEl.hass = this.hass; + pageEl.entityRegistryEntries = this._entityRegistryEntries; + pageEl.configEntries = this._configEntries; + if (this._currentPage === "dashboard") { - pageEl.entities = this._entityRegistryEntries; - pageEl.entries = this._configEntries; - pageEl.progress = this._configEntriesInProgress; + pageEl.configEntriesInProgress = this._configEntriesInProgress; return; } - pageEl.entityRegistryEntries = this._entityRegistryEntries; - pageEl.configEntries = this._configEntries; pageEl.configEntryId = this.routeTail.path.substr(1); pageEl.deviceRegistryEntries = this._deviceRegistryEntries; pageEl.areas = this._areas; diff --git a/src/panels/lovelace/components/hui-unavailable.ts b/src/panels/lovelace/components/hui-unavailable.ts index 37ad96d77c..306853f96f 100644 --- a/src/panels/lovelace/components/hui-unavailable.ts +++ b/src/panels/lovelace/components/hui-unavailable.ts @@ -39,7 +39,7 @@ export class HuiUnavailable extends LitElement { position: absolute; top: 50%; left: 50%; - font-size: 50px; + font-size: 24px; color: var(--primary-text-color); transform: translate(-50%, -50%); -ms-transform: translate(-50%, -50%); diff --git a/translations/ca.json b/translations/ca.json index 104cbe6fcc..95d684522b 100644 --- a/translations/ca.json +++ b/translations/ca.json @@ -681,7 +681,7 @@ }, "integrations": { "caption": "Integracions", - "description": "Gestiona dispositius i serveis connectats", + "description": "Gestiona i configura la integració", "discovered": "Descobertes", "configured": "Configurades", "new": "Configura una nova integració", @@ -805,6 +805,10 @@ "confirm_stop": "Segur que vols aturar Home Assistant?" } } + }, + "devices": { + "caption": "Dispositius", + "description": "Gestiona els dispositius connectats" } }, "profile": { diff --git a/translations/en.json b/translations/en.json index 9d731df86a..01df3bd3f2 100644 --- a/translations/en.json +++ b/translations/en.json @@ -681,7 +681,7 @@ }, "integrations": { "caption": "Integrations", - "description": "Manage connected devices and services", + "description": "Manage and setup integrations", "discovered": "Discovered", "configured": "Configured", "new": "Set up a new integration", @@ -805,6 +805,10 @@ "confirm_stop": "Are you sure you want to stop Home Assistant?" } } + }, + "devices": { + "caption": "Devices", + "description": "Manage connected devices" } }, "profile": { diff --git a/translations/es.json b/translations/es.json index ae4eda0b10..bde423e031 100644 --- a/translations/es.json +++ b/translations/es.json @@ -805,6 +805,10 @@ "confirm_stop": "¿Seguro que quieres detener Home Assistant?" } } + }, + "devices": { + "caption": "Dispositivos", + "description": "Administrar dispositivos conectados" } }, "profile": { diff --git a/translations/he.json b/translations/he.json index 3677c06852..4d2f6e998f 100644 --- a/translations/he.json +++ b/translations/he.json @@ -1301,6 +1301,11 @@ }, "config_entry_system_options": { "title": "אפשרויות מערכת" + }, + "zha_device_info": { + "services": { + "remove": "הסר מכשיר מרשת ה-ZigBee" + } } }, "auth_store": { diff --git a/translations/ko.json b/translations/ko.json index 3f6b969a32..cfbbc2e463 100644 --- a/translations/ko.json +++ b/translations/ko.json @@ -681,7 +681,7 @@ }, "integrations": { "caption": "통합 구성요소", - "description": "연결된 기기 및 서비스를 관리합니다", + "description": "통합 구성요소를 관리하고 설정합니다", "discovered": "발견된 구성요소", "configured": "설정된 구성요소", "new": "새로운 통합 구성요소 설정", @@ -805,6 +805,10 @@ "confirm_stop": "Home Assistant 를 중지 하시겠습니까?" } } + }, + "devices": { + "caption": "기기", + "description": "연결된 기기 관리" } }, "profile": { diff --git a/translations/lb.json b/translations/lb.json index e7077ec9fe..a3ffa988b7 100644 --- a/translations/lb.json +++ b/translations/lb.json @@ -805,6 +805,10 @@ "confirm_stop": "Sécher fir Home Assistant ze stoppen?" } } + }, + "devices": { + "caption": "Apparater", + "description": "Verwalt verbonnen Apparater" } }, "profile": { diff --git a/translations/nl.json b/translations/nl.json index 6026c44336..257c7ed559 100644 --- a/translations/nl.json +++ b/translations/nl.json @@ -681,7 +681,7 @@ }, "integrations": { "caption": "Integraties", - "description": "Beheer verbonden apparaten en services", + "description": "Beheer en installeer integraties", "discovered": "Ontdekt", "configured": "Geconfigureerd", "new": "Stel een nieuwe integratie in", @@ -805,6 +805,10 @@ "confirm_stop": "Weet je zeker dat je Home Assistant wilt afsluiten?" } } + }, + "devices": { + "caption": "Apparaten", + "description": "Beheer verbonden apparaten" } }, "profile": { diff --git a/translations/ro.json b/translations/ro.json index ce6ee18846..daaa9c1f7b 100644 --- a/translations/ro.json +++ b/translations/ro.json @@ -544,6 +544,9 @@ "label": "Zone", "entity": "Entitate cu localizare", "zone": "Zone" + }, + "device": { + "label": "Dispozitiv" } }, "learn_more": "Aflați mai multe despre condiții" @@ -578,6 +581,9 @@ "label": "Eveniment declansare", "event": "Eveniment", "service_data": "Date serviciu" + }, + "device_id": { + "label": "Dispozitiv" } }, "learn_more": "Aflați mai multe despre acțiuni" @@ -626,6 +632,8 @@ "header": "Valoare nod" }, "node_config": { + "true": "Adevărat", + "false": "Fals", "set_config_parameter": "Setați parametrul de configurare" } }, @@ -738,7 +746,9 @@ "unavailable": "Această entitate nu este disponibilă momentan.", "default_name": "Zonă nouă", "delete": "ȘTERGE", - "update": "ACTUALIZAȚI" + "update": "ACTUALIZAȚI", + "enabled_label": "Activează entitatea", + "enabled_description": "Entitățile dezactivate nu vof fi adăugate in Home Assistant" } }, "person": { @@ -750,6 +760,26 @@ "device_tracker_picked": "Urmăriți dispozitivul", "device_tracker_pick": "Alegeți dispozitivul pentru a urmări" } + }, + "server_control": { + "caption": "Control server", + "description": "Repornește si oprește serverul Home Assistant", + "section": { + "validation": { + "heading": "Validare configurație", + "introduction": "Validați configurația dvs. dacă ați făcut recent unele modificări și doriți să vă asigurați că aceasta este validă", + "check_config": "Verificați configurația", + "valid": "Configurația este validă!", + "invalid": "Configurația este invalidă" + }, + "reloading": { + "heading": "Reîncărcarea configurației", + "core": "Reîncărcați nucleul", + "group": "Reîncărcați grupurile", + "automation": "Reîncarcă automatizările", + "script": "Reîncărcați script-uri" + } + } } }, "profile": { @@ -1090,7 +1120,7 @@ "week": "{count}{count, plural,\n one { săptămână }\n other { săptămâni }\n}", "second": "{count} {count, plural,\none {secunda}\nother {secunde}\n}", "minute": "{count} {count, plural,\n one { minut }\n other { minute }\n}", - "hour": "{count}{count, plural,\n one { zi }\n other { zile }\n}" + "hour": "{count}{count, plural,\n one { ora }\n other { ore }\n}" }, "login-form": { "password": "Parola", @@ -1159,7 +1189,8 @@ "fan": { "speed": "Viteză", "oscillate": "Oscilare", - "direction": "Direcţie" + "direction": "Direcţie", + "forward": "Înainte" }, "light": { "brightness": "Luminozitate", @@ -1204,6 +1235,11 @@ "target_temperature": "Temperatura țintă", "operation": "Operație", "away_mode": "Plecat" + }, + "timer": { + "actions": { + "finish": "Termina" + } } }, "components": { @@ -1222,7 +1258,7 @@ "duration": { "second": "{count} {count, plural,\none {secunda}\nother {secunde}\n}", "minute": "{count} {count, plural,\n one { minut }\n other { minute }\n}", - "hour": "{count}{count, plural,\n one { zi }\n other { zile }\n}", + "hour": "{count}{count, plural,\n one { ora }\n other { ore }\n}", "day": "{count}{count, plural,\n one { zi }\n other { zile }\n}", "week": "{count}{count, plural,\n one { săptămână }\n other { săptămâni }\n}" } @@ -1257,6 +1293,31 @@ "updater": { "title": "Actualizați instrucțiunile" } + }, + "options_flow": { + "form": { + "header": "Opțiuni" + }, + "success": { + "description": "Opțiunile salvate cu succes." + } + }, + "config_entry_system_options": { + "title": "Setări de sistem", + "enable_new_entities_label": "Activează entitățile nou adăugate" + }, + "zha_device_info": { + "manuf": "de {producator}", + "no_area": "Nici o zonă", + "services": { + "updateDeviceName": "Setați un nume personalizat pentru acest dispozitiv în registrul de dispozitive.", + "remove": "Eliminați un dispozitiv din rețeaua ZigBee." + }, + "zha_device_card": { + "device_name_placeholder": "Nume dat de utilizator", + "area_picker_label": "Zonă", + "update_name_button": "Actualizați numele" + } } }, "auth_store": { @@ -1352,5 +1413,10 @@ "system-admin": "Administratori", "system-users": "Utilizatori", "system-read-only": "Utilizatori cu drepturi de citire" + }, + "config_entry": { + "disabled_by": { + "user": "Utilizator" + } } } \ No newline at end of file diff --git a/translations/ru.json b/translations/ru.json index ac16175590..54d296f6dd 100644 --- a/translations/ru.json +++ b/translations/ru.json @@ -681,7 +681,7 @@ }, "integrations": { "caption": "Интеграции", - "description": "Управляйте подключенными устройствами и службами", + "description": "Добавляйте и настраивайте интеграции", "discovered": "Обнаружено", "configured": "Настроено", "new": "Интеграции", @@ -805,6 +805,10 @@ "confirm_stop": "Вы уверены, что хотите остановить Home Assistant?" } } + }, + "devices": { + "caption": "Устройства", + "description": "Управляйте подключенными устройствами" } }, "profile": { diff --git a/translations/sk.json b/translations/sk.json index 4ad4d88e3e..736a8829ae 100644 --- a/translations/sk.json +++ b/translations/sk.json @@ -348,7 +348,7 @@ "description": "Skontrolujte Váš konfiguračný súbor a ovládajte server", "section": { "core": { - "header": "Konfigurácia a ovládanie servera", + "header": "Všeobecná konfigurácia", "introduction": "Zmena konfigurácie môže byť ťažkým procesom. My vieme. Táto sekcia sa Vám pokúsi zjednodušiť život.", "core_config": { "edit_requires_storage": "Editor je zablokovaný, pretože konfigurácia je uložená v configuration.yaml", @@ -540,6 +540,9 @@ "label": "Zóna", "entity": "Entita s umiestnením", "zone": "Zóna" + }, + "device": { + "label": "Zariadenie" } }, "learn_more": "Získajte viac informácií o podmienkach" @@ -574,6 +577,9 @@ "label": "Odpáliť udalosť", "event": "Udalosť:", "service_data": "Dáta služby" + }, + "device_id": { + "label": "Zariadenie" } }, "learn_more": "Získajte viac informácií o akciách" @@ -1006,6 +1012,10 @@ "save": "Uložiť", "unsaved_changes": "Neuložené zmeny", "saved": "Uložené" + }, + "edit_lovelace": { + "header": "Názov vášho Lovelace UI", + "explanation": "Tento názov sa zobrazuje nad všetkými vašimi zobrazeniami v Lovelace." } }, "menu": { @@ -1249,6 +1259,12 @@ "updater": { "title": "Pokyny pre aktualizáciu" } + }, + "zha_device_info": { + "zha_device_card": { + "area_picker_label": "Oblasť", + "update_name_button": "Aktualizovať názov" + } } }, "auth_store": { diff --git a/yarn.lock b/yarn.lock index c80eed1c6f..caca5e7466 100644 --- a/yarn.lock +++ b/yarn.lock @@ -699,10 +699,10 @@ dependencies: "@material/feature-targeting" "^3.1.0" -"@mdi/svg@4.3.95": - version "4.3.95" - resolved "https://registry.yarnpkg.com/@mdi/svg/-/svg-4.3.95.tgz#f2121132baab9e8953ee7ef71834cbe2f03065bb" - integrity sha512-RRda3q+270vhiL0Nt7oyeGX03zndEzkGJQJSz8dny1Yjwx2iVRUz51Xop6PTBPaEH4csa3sRkFY3q2PeIa2fKg== +"@mdi/svg@4.4.95": + version "4.4.95" + resolved "https://registry.yarnpkg.com/@mdi/svg/-/svg-4.4.95.tgz#0af47ecd777deb75bd2e1514afa52cfbd81ac262" + integrity sha512-ttQWCXZE8tAvqzFh4vijuuBJNbF2VsGB61rny5MAytWorqf0LKd3XyCrFxODi3uo/BH3Skb+7iXYav3E/9+sIw== "@polymer/app-layout@^3.0.2": version "3.0.2"