diff --git a/hassio/src/addon-view/hassio-addon-info.js b/hassio/src/addon-view/hassio-addon-info.js index 4ec0a959a9..6e9e8c9636 100644 --- a/hassio/src/addon-view/hassio-addon-info.js +++ b/hassio/src/addon-view/hassio-addon-info.js @@ -1,6 +1,7 @@ import "@polymer/iron-icon/iron-icon"; import "@material/mwc-button"; import "@polymer/paper-card/paper-card"; +import "@polymer/paper-tooltip/paper-tooltip"; import "@polymer/paper-toggle-button/paper-toggle-button"; import { html } from "@polymer/polymer/lib/utils/html-tag"; import { PolymerElement } from "@polymer/polymer/polymer-element"; @@ -109,10 +110,18 @@ class HassioAddonInfo extends EventsMixin(PolymerElement) { margin: 16px 0; display: block; } + .state { + display: flex; + margin: 8px 0; + } .state div { width: 180px; display: inline-block; } + .state iron-icon { + width: 16px; + color: var(--secondary-text-color); + } paper-toggle-button { display: inline; } @@ -156,6 +165,9 @@ class HassioAddonInfo extends EventsMixin(PolymerElement) { margin-right: 4px; --iron-icon-height: 45px; } + .protection-enable mwc-button { + --mdc-theme-primary: white; + } + +
@@ -226,22 +250,7 @@ class HassioAddonInfo extends EventsMixin(PolymerElement) { -
-

Add-on Security Rating

-
- Hass.io provides a security rating to each of the add-ons, which indicates the risks involved when using this add-on. The more access an add-on requires on your system, the lower the score, thus raising the possible security risks. -
+
-
Protection mode
+
+ Protection mode + + + Grant the add-on elevated system access. + +
-
@@ -580,5 +599,14 @@ class HassioAddonInfo extends EventsMixin(PolymerElement) { this.fire("hass-api-called", eventData); }); } + + _computeCannotIngressSidebar(hass, addon) { + return !addon.ingress || !this._computeHA92plus(hass); + } + + _computeHA92plus(hass) { + const [major, minor] = hass.config.version.split(".", 2); + return Number(major) > 0 || (major === "0" && Number(minor) >= 92); + } } customElements.define("hassio-addon-info", HassioAddonInfo); diff --git a/setup.py b/setup.py index bbb3e0c5cd..0e754b6250 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name="home-assistant-frontend", - version="20190424.0", + version="20190427.0", description="The Home Assistant frontend", url="https://github.com/home-assistant/home-assistant-polymer", author="The Home Assistant Authors", diff --git a/src/cards/ha-media_player-card.js b/src/cards/ha-media_player-card.js index e24f08cb68..6a08bb01c9 100644 --- a/src/cards/ha-media_player-card.js +++ b/src/cards/ha-media_player-card.js @@ -279,6 +279,14 @@ class HaMediaPlayerCard extends LocalizeMixin(EventsMixin(PolymerElement)) { } // We have a new picture url + // If entity picture is non-relative, we use that url directly. + if (picture.substr(0, 1) !== "/") { + this._coverShowing = true; + this._coverLoadError = false; + this.$.cover.style.backgroundImage = `url(${picture})`; + return; + } + try { const { content_type: contentType, diff --git a/src/common/dom/stop_propagation.ts b/src/common/dom/stop_propagation.ts new file mode 100644 index 0000000000..b04b2156c0 --- /dev/null +++ b/src/common/dom/stop_propagation.ts @@ -0,0 +1 @@ +export const stopPropagation = (ev) => ev.stopPropagation(); diff --git a/src/components/ha-date-input.ts b/src/components/ha-date-input.ts new file mode 100644 index 0000000000..4157d70af9 --- /dev/null +++ b/src/components/ha-date-input.ts @@ -0,0 +1,126 @@ +import { + html, + css, + LitElement, + TemplateResult, + property, + customElement, +} from "lit-element"; + +import "@polymer/paper-input/paper-input"; +// tslint:disable-next-line:no-duplicate-imports +import { PaperInputElement } from "@polymer/paper-input/paper-input"; + +@customElement("ha-date-input") +export class HaDateInput extends LitElement { + @property() public year?: string; + @property() public month?: string; + @property() public day?: string; + @property({ type: Boolean }) public disabled = false; + + static get styles() { + return css` + :host { + display: block; + font-family: var(--paper-font-common-base_-_font-family); + -webkit-font-smoothing: var( + --paper-font-common-base_-_-webkit-font-smoothing + ); + } + + paper-input { + width: 30px; + text-align: center; + --paper-input-container-input_-_-moz-appearance: textfield; + --paper-input-container-input-webkit-spinner_-_-webkit-appearance: none; + --paper-input-container-input-webkit-spinner_-_margin: 0; + --paper-input-container-input-webkit-spinner_-_display: none; + } + + paper-input#year { + width: 50px; + } + + .date-input-wrap { + display: flex; + flex-direction: row; + } + `; + } + + protected render(): TemplateResult { + return html` +
+ + - + + + - + + + +
+ `; + } + + private _formatYear() { + const yearElement = this.shadowRoot!.getElementById( + "year" + ) as PaperInputElement; + this.year = yearElement.value!; + } + + private _formatMonth() { + const monthElement = this.shadowRoot!.getElementById( + "month" + ) as PaperInputElement; + this.month = ("0" + monthElement.value!).slice(-2); + } + + private _formatDay() { + const dayElement = this.shadowRoot!.getElementById( + "day" + ) as PaperInputElement; + this.day = ("0" + dayElement.value!).slice(-2); + } + + get value() { + return `${this.year}-${this.month}-${this.day}`; + } +} + +declare global { + interface HTMLElementTagNameMap { + "ha-date-input": HaDateInput; + } +} diff --git a/src/components/paper-time-input.js b/src/components/paper-time-input.js index 59c819858a..3fec74281a 100644 --- a/src/components/paper-time-input.js +++ b/src/components/paper-time-input.js @@ -23,7 +23,7 @@ import "@polymer/paper-dropdown-menu/paper-dropdown-menu"; import { html } from "@polymer/polymer/lib/utils/html-tag"; import { PolymerElement } from "@polymer/polymer/polymer-element"; -class PaperTimeInput extends PolymerElement { +export class PaperTimeInput extends PolymerElement { static get template() { return html` - - [[localize('ui.panel.config.integrations.new')]] - - - - + `; } @@ -162,6 +176,12 @@ class HaConfigManagerDashboard extends LocalizeMixin( progress: Array, handlers: Array, + + rtl: { + type: Boolean, + reflectToAttribute: true, + computed: "_computeRTL(hass)", + }, }; } @@ -170,17 +190,14 @@ class HaConfigManagerDashboard extends LocalizeMixin( loadConfigFlowDialog(); } - _createFlow(ev) { + _createFlow() { showConfigFlowDialog(this, { - hass: this.hass, - newFlowForHandler: ev.model.item, dialogClosedCallback: () => this.fire("hass-reload-entries"), }); } _continueFlow(ev) { showConfigFlowDialog(this, { - hass: this.hass, continueFlowId: ev.model.item.flow_id, dialogClosedCallback: () => this.fire("hass-reload-entries"), }); @@ -230,6 +247,10 @@ class HaConfigManagerDashboard extends LocalizeMixin( _handleMoreInfo(ev) { this.fire("hass-more-info", { entityId: ev.model.item.entity_id }); } + + _computeRTL(hass) { + return computeRTL(hass); + } } customElements.define("ha-config-entries-dashboard", HaConfigManagerDashboard); diff --git a/src/panels/lovelace/common/compute-tooltip.ts b/src/panels/lovelace/common/compute-tooltip.ts index 87f921319d..f3e77143f2 100644 --- a/src/panels/lovelace/common/compute-tooltip.ts +++ b/src/panels/lovelace/common/compute-tooltip.ts @@ -11,6 +11,10 @@ interface Config extends LovelaceElementConfig { } export const computeTooltip = (hass: HomeAssistant, config: Config): string => { + if (config.title === null) { + return ""; + } + if (config.title) { return config.title; } @@ -26,10 +30,10 @@ export const computeTooltip = (hass: HomeAssistant, config: Config): string => { } const tapTooltip = config.tap_action - ? computeActionTooltip(stateName, config.tap_action, false) + ? computeActionTooltip(hass, stateName, config.tap_action, false) : ""; const holdTooltip = config.hold_action - ? computeActionTooltip(stateName, config.hold_action, true) + ? computeActionTooltip(hass, stateName, config.hold_action, true) : ""; const newline = tapTooltip && holdTooltip ? "\n" : ""; @@ -40,6 +44,7 @@ export const computeTooltip = (hass: HomeAssistant, config: Config): string => { }; function computeActionTooltip( + hass: HomeAssistant, state: string, config: ActionConfig, isHold: boolean @@ -48,20 +53,39 @@ function computeActionTooltip( return ""; } - let tooltip = isHold ? "Hold: " : "Tap: "; + let tooltip = + (isHold + ? hass.localize("ui.panel.lovelace.cards.picture-elements.hold") + : hass.localize("ui.panel.lovelace.cards.picture-elements.tap")) + " "; switch (config.action) { case "navigate": - tooltip += `Navigate to ${config.navigation_path}`; + tooltip += `${hass.localize( + "ui.panel.lovelace.cards.picture-elements.navigate_to", + "location", + config.navigation_path + )}`; break; case "toggle": - tooltip += `Toggle ${state}`; + tooltip += `${hass.localize( + "ui.panel.lovelace.cards.picture-elements.toggle", + "name", + state + )}`; break; case "call-service": - tooltip += `Call service ${config.service}`; + tooltip += `${hass.localize( + "ui.panel.lovelace.cards.picture-elements.call_service", + "name", + config.service + )}`; break; case "more-info": - tooltip += `Show more-info: ${state}`; + tooltip += `${hass.localize( + "ui.panel.lovelace.cards.picture-elements.more_info", + "name", + state + )}`; break; } diff --git a/src/panels/lovelace/common/create-row-element.ts b/src/panels/lovelace/common/create-row-element.ts index 510d52a53a..7269247bb6 100644 --- a/src/panels/lovelace/common/create-row-element.ts +++ b/src/panels/lovelace/common/create-row-element.ts @@ -10,6 +10,7 @@ import { import "../entity-rows/hui-climate-entity-row"; import "../entity-rows/hui-cover-entity-row"; import "../entity-rows/hui-group-entity-row"; +import "../entity-rows/hui-input-datetime-entity-row"; import "../entity-rows/hui-input-number-entity-row"; import "../entity-rows/hui-input-select-entity-row"; import "../entity-rows/hui-input-text-entity-row"; @@ -58,6 +59,7 @@ const DOMAIN_TO_ELEMENT_TYPE = { // Temporary. Once climate is rewritten, // water heater should get it's own row. water_heater: "climate", + input_datetime: "input-datetime", }; const TIMEOUT = 2000; diff --git a/src/panels/lovelace/elements/hui-state-icon-element.ts b/src/panels/lovelace/elements/hui-state-icon-element.ts index 91a41748d9..7f2c39057a 100644 --- a/src/panels/lovelace/elements/hui-state-icon-element.ts +++ b/src/panels/lovelace/elements/hui-state-icon-element.ts @@ -62,6 +62,7 @@ export class HuiStateIconElement extends LitElement implements LovelaceElement { @ha-click="${this._handleClick}" @ha-hold="${this._handleHold}" .longPress="${longPress()}" + .overrideIcon=${this._config.icon} > `; } diff --git a/src/panels/lovelace/elements/types.ts b/src/panels/lovelace/elements/types.ts index 5c82484003..bfc6ccdd2a 100644 --- a/src/panels/lovelace/elements/types.ts +++ b/src/panels/lovelace/elements/types.ts @@ -51,6 +51,7 @@ export interface StateIconElementConfig extends LovelaceElementConfig { entity: string; tap_action?: ActionConfig; hold_action?: ActionConfig; + icon?: string; } export interface StateLabelElementConfig extends LovelaceElementConfig { diff --git a/src/panels/lovelace/entity-rows/hui-input-datetime-entity-row.ts b/src/panels/lovelace/entity-rows/hui-input-datetime-entity-row.ts new file mode 100644 index 0000000000..12199b9359 --- /dev/null +++ b/src/panels/lovelace/entity-rows/hui-input-datetime-entity-row.ts @@ -0,0 +1,128 @@ +import { + html, + LitElement, + TemplateResult, + property, + PropertyValues, + customElement, +} from "lit-element"; + +import "../components/hui-generic-entity-row"; +import "../../../components/paper-time-input.js"; +// tslint:disable-next-line:no-duplicate-imports +import { PaperTimeInput } from "../../../components/paper-time-input.js"; +import "../../../components/ha-date-input"; +// tslint:disable-next-line:no-duplicate-imports +import { HaDateInput } from "../../../components/ha-date-input"; + +import { HomeAssistant } from "../../../types"; +import { EntityRow, EntityConfig } from "./types"; +import { setInputDateTimeValue } from "../../../data/input_datetime"; +import { hasConfigOrEntityChanged } from "../common/has-changed"; + +@customElement("hui-input-datetime-entity-row") +class HuiInputDatetimeEntityRow extends LitElement implements EntityRow { + @property() public hass?: HomeAssistant; + @property() private _config?: EntityConfig; + + public setConfig(config: EntityConfig): void { + if (!config) { + throw new Error("Configuration error"); + } + this._config = config; + } + + protected shouldUpdate(changedProps: PropertyValues): boolean { + return hasConfigOrEntityChanged(this, changedProps); + } + + protected render(): TemplateResult | void { + if (!this._config || !this.hass) { + return html``; + } + + const stateObj = this.hass.states[this._config.entity]; + + if (!stateObj) { + return html` + ${this.hass.localize( + "ui.panel.lovelace.warning.entity_not_found", + "entity", + this._config.entity + )} + `; + } + + return html` + + ${stateObj.attributes.has_date + ? html` + + ${stateObj.attributes.has_time ? "," : ""} + ` + : ``} + ${stateObj.attributes.has_time + ? html` + + ` + : ``} + + `; + } + + private _stopEventPropagation(ev: Event): void { + ev.stopPropagation(); + } + + private get _timeInputEl(): PaperTimeInput { + return this.shadowRoot!.querySelector("paper-time-input")!; + } + + private get _dateInputEl(): HaDateInput { + return this.shadowRoot!.querySelector("ha-date-input")!; + } + + private _selectedValueChanged(ev): void { + const stateObj = this.hass!.states[this._config!.entity]; + + const time = + this._timeInputEl !== null + ? this._timeInputEl.value.trim() + ":00" + : undefined; + + const date = + this._dateInputEl !== null ? this._dateInputEl.value : undefined; + + if (time !== stateObj.state) { + setInputDateTimeValue(this.hass!, stateObj.entity_id, time, date); + } + + ev.target.blur(); + } +} + +declare global { + interface HTMLElementTagNameMap { + "hui-input-datetime-entity-row": HuiInputDatetimeEntityRow; + } +} diff --git a/src/panels/lovelace/entity-rows/hui-input-select-entity-row.ts b/src/panels/lovelace/entity-rows/hui-input-select-entity-row.ts index c068fe3179..3568196454 100644 --- a/src/panels/lovelace/entity-rows/hui-input-select-entity-row.ts +++ b/src/panels/lovelace/entity-rows/hui-input-select-entity-row.ts @@ -8,7 +8,6 @@ import { customElement, PropertyValues, } from "lit-element"; -import { repeat } from "lit-html/directives/repeat"; import "@polymer/paper-item/paper-item"; import "@polymer/paper-listbox/paper-listbox"; @@ -18,11 +17,12 @@ import "../components/hui-warning"; import computeStateName from "../../../common/entity/compute_state_name"; -import { HomeAssistant } from "../../../types"; +import { HomeAssistant, InputSelectEntity } from "../../../types"; import { EntityRow, EntityConfig } from "./types"; -import { setOption } from "../../../data/input-select"; +import { setInputSelectOption } from "../../../data/input-select"; import { hasConfigOrEntityChanged } from "../common/has-changed"; import { forwardHaptic } from "../../../util/haptics"; +import { stopPropagation } from "../../../common/dom/stop_propagation"; @customElement("hui-input-select-entity-row") class HuiInputSelectEntityRow extends LitElement implements EntityRow { @@ -47,7 +47,9 @@ class HuiInputSelectEntityRow extends LitElement implements EntityRow { return html``; } - const stateObj = this.hass.states[this._config.entity]; + const stateObj = this.hass.states[this._config.entity] as + | InputSelectEntity + | undefined; if (!stateObj) { return html` @@ -64,26 +66,43 @@ class HuiInputSelectEntityRow extends LitElement implements EntityRow { return html` - - ${repeat( - stateObj.attributes.options, - (option) => - html` - ${option} - ` + + ${stateObj.attributes.options.map( + (option) => html` + ${option} + ` )} `; } + protected updated(changedProps: PropertyValues) { + super.updated(changedProps); + + if (!this.hass || !this._config) { + return; + } + + const stateObj = this.hass.states[this._config.entity] as + | InputSelectEntity + | undefined; + + if (!stateObj) { + return; + } + + // Update selected after rendering the items or else it won't work in Firefox + this.shadowRoot!.querySelector( + "paper-listbox" + )!.selected = stateObj.attributes.options.indexOf(stateObj.state); + } + static get styles(): CSSResult { return css` :host { @@ -94,22 +113,28 @@ class HuiInputSelectEntityRow extends LitElement implements EntityRow { margin-left: 16px; flex: 1; } + + paper-item { + cursor: pointer; + min-width: 200px; + } `; } private _selectedChanged(ev): void { - forwardHaptic(this, "light"); - // Selected Option will transition to '' before transitioning to new value const stateObj = this.hass!.states[this._config!.entity]; - if ( - !ev.target.selectedItem || - ev.target.selectedItem.innerText === "" || - ev.target.selectedItem.innerText === stateObj.state - ) { + const option = ev.detail.item.innerText; + if (option === stateObj.state) { return; } - setOption(this.hass!, stateObj.entity_id, ev.target.selectedItem.innerText); + forwardHaptic(this, "light"); + + setInputSelectOption( + this.hass!, + stateObj.entity_id, + ev.target.selectedItem.innerText + ); } } diff --git a/src/polymer-types.ts b/src/polymer-types.ts index 4432149176..4ffbf77df6 100644 --- a/src/polymer-types.ts +++ b/src/polymer-types.ts @@ -18,6 +18,12 @@ export interface PolymerChangedEvent extends Event { }; } +export interface PolymerIronSelectEvent extends Event { + detail: { + item: T; + }; +} + declare global { // for fire event interface HASSDomEvents { diff --git a/src/state-summary/state-card-input_select.js b/src/state-summary/state-card-input_select.js deleted file mode 100644 index 76e4667988..0000000000 --- a/src/state-summary/state-card-input_select.js +++ /dev/null @@ -1,96 +0,0 @@ -import "@polymer/paper-dropdown-menu/paper-dropdown-menu"; -import "@polymer/paper-item/paper-item"; -import "@polymer/paper-listbox/paper-listbox"; -import { html } from "@polymer/polymer/lib/utils/html-tag"; -import { PolymerElement } from "@polymer/polymer/polymer-element"; - -import "../components/entity/state-badge"; - -import computeStateName from "../common/entity/compute_state_name"; - -class StateCardInputSelect extends PolymerElement { - static get template() { - return html` - - - ${this.stateBadgeTemplate} - - - - - - `; - } - - static get stateBadgeTemplate() { - return html` - - `; - } - - static get properties() { - return { - hass: Object, - stateObj: Object, - inDialog: { - type: Boolean, - value: false, - }, - selectedOption: { - type: String, - observer: "selectedOptionChanged", - }, - }; - } - - _computeStateName(stateObj) { - return computeStateName(stateObj); - } - - computeSelected(stateObj) { - return stateObj.attributes.options.indexOf(stateObj.state); - } - - selectedOptionChanged(option) { - // Selected Option will transition to '' before transitioning to new value - if (option === "" || option === this.stateObj.state) { - return; - } - this.hass.callService("input_select", "select_option", { - option: option, - entity_id: this.stateObj.entity_id, - }); - } - - stopPropagation(ev) { - ev.stopPropagation(); - } -} -customElements.define("state-card-input_select", StateCardInputSelect); diff --git a/src/state-summary/state-card-input_select.ts b/src/state-summary/state-card-input_select.ts new file mode 100644 index 0000000000..19befdfb29 --- /dev/null +++ b/src/state-summary/state-card-input_select.ts @@ -0,0 +1,96 @@ +import { + LitElement, + customElement, + TemplateResult, + html, + CSSResult, + css, + property, + PropertyValues, +} from "lit-element"; +import "@polymer/paper-dropdown-menu/paper-dropdown-menu-light"; +import "@polymer/paper-item/paper-item"; +// tslint:disable-next-line: no-duplicate-imports +import { PaperItemElement } from "@polymer/paper-item/paper-item"; +import "@polymer/paper-listbox/paper-listbox"; + +import "../components/entity/state-badge"; + +import computeStateName from "../common/entity/compute_state_name"; +import { HomeAssistant, InputSelectEntity } from "../types"; +import { setInputSelectOption } from "../data/input-select"; +import { PolymerIronSelectEvent } from "../polymer-types"; +import { stopPropagation } from "../common/dom/stop_propagation"; + +@customElement("state-card-input_select") +class StateCardInputSelect extends LitElement { + @property() public hass!: HomeAssistant; + @property() public stateObj!: InputSelectEntity; + + protected render(): TemplateResult | void { + return html` + + + + ${this.stateObj.attributes.options.map( + (option) => html` + ${option} + ` + )} + + + `; + } + + protected updated(changedProps: PropertyValues) { + super.updated(changedProps); + // Update selected after rendering the items or else it won't work in Firefox + this.shadowRoot!.querySelector( + "paper-listbox" + )!.selected = this.stateObj.attributes.options.indexOf(this.stateObj.state); + } + + private async _selectedOptionChanged( + ev: PolymerIronSelectEvent + ) { + const option = ev.detail.item.innerText; + if (option === this.stateObj.state) { + return; + } + await setInputSelectOption(this.hass, this.stateObj.entity_id, option); + } + + static get styles(): CSSResult { + return css` + :host { + display: block; + } + + state-badge { + float: left; + margin-top: 10px; + } + + paper-dropdown-menu-light { + display: block; + margin-left: 53px; + } + + paper-item { + cursor: pointer; + min-width: 200px; + } + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + "state-card-input_select": StateCardInputSelect; + } +} diff --git a/src/translations/en.json b/src/translations/en.json index 477b3e9f62..fe58a46fdc 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -916,6 +916,14 @@ "checked_items": "Checked items", "clear_items": "Clear checked items", "add_item": "Add item" + }, + "picture-elements": { + "hold": "Hold:", + "tap": "Tap:", + "navigate_to": "Navigate to {location}", + "toggle": "Toggle {name}", + "call_service": "Call service {name}", + "more_info": "Show more-info: {name}" } }, "menu": { diff --git a/src/types.ts b/src/types.ts index e312a1f6b9..9a5a731a3b 100644 --- a/src/types.ts +++ b/src/types.ts @@ -219,6 +219,12 @@ export type CameraEntity = HassEntityBase & { }; }; +export type InputSelectEntity = HassEntityBase & { + attributes: HassEntityAttributeBase & { + options: string[]; + }; +}; + export interface Route { prefix: string; path: string; diff --git a/translations/cy.json b/translations/cy.json index 984277a1bf..7416302b9d 100644 --- a/translations/cy.json +++ b/translations/cy.json @@ -629,6 +629,9 @@ "password": "Cyfrinair", "create": "Creu" } + }, + "cloud": { + "description_features": "Rheolaeth oddi cartref, integreiddio gyda Alexa a Google Assistant." } }, "lovelace": { diff --git a/translations/el.json b/translations/el.json index 704c616fea..e47d0690c1 100644 --- a/translations/el.json +++ b/translations/el.json @@ -178,7 +178,7 @@ "stopped": "Σταμάτησε", "locked": "Κλειδωμένο", "unlocked": "Ξεκλείδωτο", - "ok": "Ένταξη", + "ok": "Εντάξει", "problem": "Πρόβλημα" }, "input_boolean": { diff --git a/translations/hu.json b/translations/hu.json index 5e4e7e068c..343e2b24cb 100644 --- a/translations/hu.json +++ b/translations/hu.json @@ -581,7 +581,8 @@ "cloud": { "caption": "Home Assistant Felhő", "description_login": "Bejelentkezve mint {email}", - "description_not_login": "Nincs bejelentkezve" + "description_not_login": "Nincs bejelentkezve", + "description_features": "Távoli vezérlés, Alexa és Google Assistant integráció" }, "integrations": { "caption": "Integrációk", diff --git a/translations/is.json b/translations/is.json index 245aff2d7b..9b10258be2 100644 --- a/translations/is.json +++ b/translations/is.json @@ -101,13 +101,24 @@ "gas": "Gas", "manual": "Handvirkt" }, + "cover": { + "open": "Opin", + "opening": "Opna", + "closed": "Lokað", + "closing": "Loka" + }, "device_tracker": { "home": "Heima", "not_home": "Fjarverandi" }, "group": { + "off": "Óvirkur", + "on": "Virkur", "home": "Heima", "not_home": "Fjarverandi", + "open": "Opin", + "opening": "Opna", + "closed": "Lokuð", "closing": "Loka", "stopped": "Stöðvað", "locked": "Læst", @@ -172,6 +183,7 @@ "rainy": "Rigning", "snowy": "Snjókoma", "snowy-rainy": "Slydda", + "sunny": "Sólskin", "windy": "Vindasamt", "windy-variant": "Vindasamt" }, @@ -229,12 +241,16 @@ }, "config": { "header": "Stilla af Home Assistant", + "introduction": "Hér er mögulegt að stilla af íhluti og Home Assistang. Því miður er ekki hægt að breyta öllu í gegnum viðmótið ennþá, en við erum að vinna í því.", "core": { "caption": "Almennt", "description": "Staðfesta að stillingarskráin þín sé rétt og stjórnun á miðlara", "section": { "core": { + "header": "Stillingar og stjórnun þjóns", + "introduction": "Að breyta stillingum getur verið þreytandi ferli og við vitum það. Þetta svæði mun reyna að létta þér lífið hvað það varðar.", "validation": { + "heading": "Staðfesta stillingar", "check_config": "Athuga stillingar", "valid": "Stillingar í lagi!", "invalid": "Stillingar ógildar" @@ -243,7 +259,8 @@ "heading": "Endurhleðsla stillinga", "core": "Endurhlaða inn kjarna", "group": "Endurhlaða inn hópum", - "automation": "Endurhlaða inn sjálfvirkni" + "automation": "Endurhlaða inn sjálfvirkni", + "script": "Endurhlaða inn skriftum" }, "server_management": { "heading": "Stjórnun miðlara", @@ -256,6 +273,7 @@ }, "customize": { "caption": "Séraðlögun", + "description": "Séraðlögun fyrir einingarnar þínar", "picker": { "header": "Séraðlögun" } @@ -265,6 +283,7 @@ "description": "Stofna og breyta sjálfvirkni", "picker": { "pick_automation": "Veldu sjálfvirkni sem á að breyta", + "no_automations": "Við fundum ekki neinar sjálfvirkni-skilgreiningar sem hægt er að breyta", "add_automation": "Bæta við sjálfvirkni", "learn_more": "Læra meira um sjálfvirkni" }, @@ -300,6 +319,10 @@ "mqtt": { "label": "MQTT" }, + "numeric_state": { + "above": "Yfir", + "below": "Undir" + }, "sun": { "label": "Sól", "event": "Viðburður:", @@ -348,6 +371,10 @@ "label": "Staða", "state": "Staða" }, + "numeric_state": { + "above": "Yfir", + "below": "Undir" + }, "sun": { "label": "Sól", "before": "Fyrir:", @@ -656,6 +683,7 @@ } }, "page-onboarding": { + "intro": "Ertu tilbúinn að vekja heimilið þitt, endurheimta friðhelgi þína og gerast þáttakandi í samfélagi grúskara á heimsvísu?", "user": { "intro": "Hefjumst handa með því að byrja á að stona notanda aðgang.", "required_field": "Skilyrt", @@ -896,6 +924,7 @@ "confirm": "Vista innskráningu" }, "notification_drawer": { + "click_to_configure": "Smelltu á hnappinn til að stilla {entity}", "empty": "Engar tilkynningar", "title": "Tilkynningar" } @@ -904,11 +933,16 @@ "automation": "Sjálfvirkni", "calendar": "Dagatal", "camera": "Myndavél", + "climate": "Loftslag", "configurator": "Stillingarálfur", "conversation": "Samtal", "cover": "Gluggatjöld", "fan": "Vifta", "group": "Hópur", + "input_datetime": "Innsláttar dagsetning\/tími", + "input_select": "Innsláttarval", + "input_number": "Innsláttarnúmer", + "input_text": "Innsláttartexti", "light": "Ljós", "lock": "Lás", "mailbox": "Pósthólf", @@ -917,6 +951,7 @@ "plant": "Planta", "proximity": "Nálægð", "scene": "Sena", + "script": "Skrifta", "sensor": "Skynjari", "sun": "Sól", "switch": "Rofi",