diff --git a/.prettierignore b/.prettierignore index 324cce418c..a2c8040d64 100644 --- a/.prettierignore +++ b/.prettierignore @@ -2,36 +2,10 @@ build build-translations/* translations/* node_modules/* -npm-debug.log -.DS_Store hass_frontend/* -.reify-cache demo/hademo-icons.html - -# Python stuff -*.py[cod] -*.egg -*.egg-info - -# venv stuff -pyvenv.cfg pip-selfcheck.json -venv -.venv -lib -bin -dist # vscode .vscode/* !.vscode/extensions.json - -# Cast dev settings -src/cast/dev_const.ts - -# Secrets -.lokalise_token -yarn-error.log - -#asdf -.tool-versions diff --git a/cast/src/launcher/layout/hc-cast.ts b/cast/src/launcher/layout/hc-cast.ts index 69fbabcecd..2f2cea6576 100644 --- a/cast/src/launcher/layout/hc-cast.ts +++ b/cast/src/launcher/layout/hc-cast.ts @@ -32,6 +32,7 @@ import { import "../../../../src/layouts/loading-screen"; import { generateDefaultViewConfig } from "../../../../src/panels/lovelace/common/generate-lovelace-config"; import "./hc-layout"; +import "@material/mwc-button/mwc-button"; @customElement("hc-cast") class HcCast extends LitElement { diff --git a/hassio/src/addon-view/hassio-addon-view.ts b/hassio/src/addon-view/hassio-addon-view.ts index 50dff7aa21..a26c31b416 100644 --- a/hassio/src/addon-view/hassio-addon-view.ts +++ b/hassio/src/addon-view/hassio-addon-view.ts @@ -24,6 +24,7 @@ import "./hassio-addon-config"; import "./hassio-addon-info"; import "./hassio-addon-logs"; import "./hassio-addon-network"; +import "../../../src/layouts/hass-subpage"; @customElement("hassio-addon-view") class HassioAddonView extends LitElement { diff --git a/hassio/src/snapshots/hassio-snapshots.ts b/hassio/src/snapshots/hassio-snapshots.ts index 529f9abb8d..dac771dc3d 100644 --- a/hassio/src/snapshots/hassio-snapshots.ts +++ b/hassio/src/snapshots/hassio-snapshots.ts @@ -132,7 +132,7 @@ class HassioSnapshots extends LitElement { (addon, idx) => html` ${addon.name} @@ -202,7 +202,6 @@ class HassioSnapshots extends LitElement { .icon=${snapshot.type === "full" ? "hassio:package-variant-closed" : "hassio:package-variant"} - . .icon-class="snapshot" > diff --git a/package.json b/package.json index f1a4726a5b..f2b154657c 100644 --- a/package.json +++ b/package.json @@ -8,12 +8,12 @@ "version": "1.0.0", "scripts": { "build": "script/build_frontend", - "lint:eslint": "eslint '{**/src,src}/**/*.{js,ts,html}' --ignore-path .gitignore", - "format:eslint": "eslint '{**/src,src}/**/*.{js,ts,html}' --fix --ignore-path .gitignore", - "lint:prettier": "prettier '{**/src,src}/**/*.{js,ts,json,css,md}' --check", - "format:prettier": "prettier '{**/src,src}/**/*.{js,ts,json,css,md}' --write", + "lint:eslint": "eslint '**/src/**/*.{js,ts,html}' --ignore-path .gitignore", + "format:eslint": "eslint '**/src/**/*.{js,ts,html}' --fix --ignore-path .gitignore", + "lint:prettier": "prettier '**/src/**/*.{js,ts,json,css,md}' --check", + "format:prettier": "prettier '**/src/**/*.{js,ts,json,css,md}' --write", "lint:types": "tsc", - "lint:lit": "lit-analyzer '{**/src,src}/**/*.ts'", + "lint:lit": "lit-analyzer '**/src/**/*.ts'", "lint": "npm run lint:eslint && npm run lint:prettier && npm run lint:types", "format": "npm run format:eslint && npm run format:prettier", "mocha": "node_modules/.bin/ts-mocha -p test-mocha/tsconfig.test.json --opts test-mocha/mocha.opts", diff --git a/setup.py b/setup.py index 1ca66681c8..7bc5859633 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name="home-assistant-frontend", - version="20200422.0", + version="20200424.0", description="The Home Assistant frontend", url="https://github.com/home-assistant/home-assistant-polymer", author="The Home Assistant Authors", diff --git a/src/common/entity/compute_state_display.ts b/src/common/entity/compute_state_display.ts index 4d03b81b9c..2aa00a2415 100644 --- a/src/common/entity/compute_state_display.ts +++ b/src/common/entity/compute_state_display.ts @@ -1,11 +1,11 @@ import { HassEntity } from "home-assistant-js-websocket"; +import { UNAVAILABLE, UNKNOWN } from "../../data/entity"; +import { atLeastCachedVersion } from "../config/version"; import { formatDate } from "../datetime/format_date"; import { formatDateTime } from "../datetime/format_date_time"; import { formatTime } from "../datetime/format_time"; import { LocalizeFunc } from "../translations/localize"; import { computeStateDomain } from "./compute_state_domain"; -import { UNKNOWN, UNAVAILABLE } from "../../data/entity"; -import { atLeastCachedVersion } from "../config/version"; const legacyComputeStateDisplay = ( localize: LocalizeFunc, @@ -96,7 +96,6 @@ export const computeStateDisplay = ( return legacyComputeStateDisplay(localize, stateObj, language); } - // Real code. if (stateObj.state === UNKNOWN || stateObj.state === UNAVAILABLE) { return localize(`state.default.${stateObj.state}`); } @@ -141,9 +140,15 @@ export const computeStateDisplay = ( return formatDateTime(date, language); } - const deviceClass = stateObj.attributes.device_class || "_"; return ( - localize(`component.${domain}.state.${deviceClass}.${stateObj.state}`) || + // Return device class translation + (stateObj.attributes.device_class && + localize( + `component.${domain}.state.${stateObj.attributes.device_class}.${stateObj.state}` + )) || + // Return default translation + localize(`component.${domain}.state._.${stateObj.state}`) || + // We don't know! Return the raw state. stateObj.state ); }; diff --git a/src/components/device/ha-area-devices-picker.ts b/src/components/device/ha-area-devices-picker.ts index 45145d966b..907d1ec974 100644 --- a/src/components/device/ha-area-devices-picker.ts +++ b/src/components/device/ha-area-devices-picker.ts @@ -1,3 +1,5 @@ +import "@material/mwc-button/mwc-button"; +import "@polymer/paper-icon-button/paper-icon-button"; import "@polymer/paper-input/paper-input"; import "@polymer/paper-item/paper-item"; import "@polymer/paper-item/paper-item-body"; diff --git a/src/components/device/ha-device-picker.ts b/src/components/device/ha-device-picker.ts index a0d52389e7..6d655dc6f1 100644 --- a/src/components/device/ha-device-picker.ts +++ b/src/components/device/ha-device-picker.ts @@ -1,3 +1,4 @@ +import "@polymer/paper-icon-button/paper-icon-button"; import "@polymer/paper-input/paper-input"; import "@polymer/paper-item/paper-item"; import "@polymer/paper-item/paper-item-body"; diff --git a/src/components/entity/ha-entity-picker.ts b/src/components/entity/ha-entity-picker.ts index 393a77fb0c..3451b7f00f 100644 --- a/src/components/entity/ha-entity-picker.ts +++ b/src/components/entity/ha-entity-picker.ts @@ -11,6 +11,7 @@ import { LitElement, property, PropertyValues, + query, TemplateResult, } from "lit-element"; import memoizeOne from "memoize-one"; @@ -91,12 +92,13 @@ class HaEntityPicker extends LitElement { @property() public entityFilter?: HaEntityPickerEntityFilterFunc; - @property({ type: Boolean }) private _opened?: boolean; + @property({ type: Boolean }) private _opened = false; - @property() private _hass?: HomeAssistant; + @query("vaadin-combo-box-light") private _comboBox!: HTMLElement; private _getStates = memoizeOne( ( + _opened: boolean, hass: this["hass"], includeDomains: this["includeDomains"], excludeDomains: this["excludeDomains"], @@ -147,27 +149,28 @@ class HaEntityPicker extends LitElement { ); protected updated(changedProps: PropertyValues) { - super.updated(changedProps); - - if (changedProps.has("hass") && !this._opened) { - this._hass = this.hass; + if (changedProps.has("_opened") && this._opened) { + const states = this._getStates( + this._opened, + this.hass, + this.includeDomains, + this.excludeDomains, + this.entityFilter, + this.includeDeviceClasses + ); + (this._comboBox as any).items = states; } } protected render(): TemplateResult { - const states = this._getStates( - this._hass, - this.includeDomains, - this.excludeDomains, - this.entityFilter, - this.includeDeviceClasses - ); + if (!this.hass) { + return html``; + } return html` ` : ""} - ${states.length > 0 - ? html` - - Toggle - - ` - : ""} + + + Toggle + `; diff --git a/src/components/entity/ha-state-label-badge.ts b/src/components/entity/ha-state-label-badge.ts index b268b89ebc..1761191504 100644 --- a/src/components/entity/ha-state-label-badge.ts +++ b/src/components/entity/ha-state-label-badge.ts @@ -11,6 +11,7 @@ import { } from "lit-element"; import { classMap } from "lit-html/directives/class-map"; import secondsToDuration from "../../common/datetime/seconds_to_duration"; +import { computeStateDisplay } from "../../common/entity/compute_state_display"; import { computeStateDomain } from "../../common/entity/compute_state_domain"; import { computeStateName } from "../../common/entity/compute_state_name"; import { domainIcon } from "../../common/entity/domain_icon"; @@ -18,7 +19,6 @@ import { stateIcon } from "../../common/entity/state_icon"; import { timerTimeRemaining } from "../../common/entity/timer_time_remaining"; import { HomeAssistant } from "../../types"; import "../ha-label-badge"; -import { computeStateDisplay } from "../../common/entity/compute_state_display"; @customElement("ha-state-label-badge") export class HaStateLabelBadge extends LitElement { diff --git a/src/components/ha-area-picker.ts b/src/components/ha-area-picker.ts index 01d5e71296..ee891eeccb 100644 --- a/src/components/ha-area-picker.ts +++ b/src/components/ha-area-picker.ts @@ -1,3 +1,4 @@ +import "@polymer/paper-icon-button/paper-icon-button"; import "@polymer/paper-input/paper-input"; import "@polymer/paper-item/paper-item"; import "@polymer/paper-item/paper-item-body"; diff --git a/src/components/ha-climate-state.js b/src/components/ha-climate-state.js index 76002a1f91..eb961cce4c 100644 --- a/src/components/ha-climate-state.js +++ b/src/components/ha-climate-state.js @@ -110,7 +110,7 @@ class HaClimateState extends LocalizeMixin(PolymerElement) { } _localizeState(localize, stateObj) { - const stateString = localize(`state.climate.${stateObj.state}`); + const stateString = localize(`component.climate.state._.${stateObj.state}`); return stateObj.attributes.hvac_action ? `${localize( `state_attributes.climate.hvac_action.${stateObj.attributes.hvac_action}` diff --git a/src/components/ha-fab.ts b/src/components/ha-fab.ts index aa0f382cee..3be2d7edda 100644 --- a/src/components/ha-fab.ts +++ b/src/components/ha-fab.ts @@ -4,6 +4,7 @@ import { ripple } from "@material/mwc-ripple/ripple-directive"; import { customElement, html, TemplateResult } from "lit-element"; import { classMap } from "lit-html/directives/class-map"; import type { Constructor } from "../types"; +import "./ha-icon"; const MwcFab = customElements.get("mwc-fab") as Constructor; diff --git a/src/components/ha-form/ha-form-multi_select.ts b/src/components/ha-form/ha-form-multi_select.ts index 80e25168c7..8ef4ed95bf 100644 --- a/src/components/ha-form/ha-form-multi_select.ts +++ b/src/components/ha-form/ha-form-multi_select.ts @@ -1,3 +1,4 @@ +import "@polymer/iron-icon/iron-icon"; import "@polymer/paper-checkbox/paper-checkbox"; import "@polymer/paper-input/paper-input"; import "@polymer/paper-item/paper-icon-item"; diff --git a/src/components/ha-form/ha-form-positive_time_period_dict.ts b/src/components/ha-form/ha-form-positive_time_period_dict.ts index 3f4942c8ec..b43bbd4ffa 100644 --- a/src/components/ha-form/ha-form-positive_time_period_dict.ts +++ b/src/components/ha-form/ha-form-positive_time_period_dict.ts @@ -7,6 +7,7 @@ import { TemplateResult, } from "lit-element"; import { fireEvent } from "../../common/dom/fire_event"; +import "../paper-time-input"; import { HaFormElement, HaFormTimeData, HaFormTimeSchema } from "./ha-form"; @customElement("ha-form-positive_time_period_dict") diff --git a/src/components/ha-related-items.ts b/src/components/ha-related-items.ts index 3a4e59a3ea..3e4df6d4e5 100644 --- a/src/components/ha-related-items.ts +++ b/src/components/ha-related-items.ts @@ -1,4 +1,3 @@ -/* eslint-disable lit/no-invalid-html */ import { HassEntity, UnsubscribeFunc } from "home-assistant-js-websocket"; import { css, @@ -96,7 +95,7 @@ export class HaRelatedItems extends SubscribeMixin(LitElement) { )}: ${this.hass.localize(`component.${entry.domain}.title`)}: diff --git a/src/components/ha-vacuum-state.js b/src/components/ha-vacuum-state.js index 4688224380..da4ab54acd 100644 --- a/src/components/ha-vacuum-state.js +++ b/src/components/ha-vacuum-state.js @@ -76,7 +76,7 @@ class HaVacuumState extends LocalizeMixin(PolymerElement) { ? this.localize( `ui.card.vacuum.actions.${STATES_INTERCEPTABLE[state].action}` ) - : this.localize(`state.vacuum.${state}`); + : this.localize(`component.vacuum._.${state}`); } _callService(ev) { diff --git a/src/components/ha-water_heater-state.js b/src/components/ha-water_heater-state.js index 39766d0620..9a6a8c7610 100644 --- a/src/components/ha-water_heater-state.js +++ b/src/components/ha-water_heater-state.js @@ -1,6 +1,7 @@ import { html } from "@polymer/polymer/lib/utils/html-tag"; /* eslint-plugin-disable lit */ import { PolymerElement } from "@polymer/polymer/polymer-element"; +import { computeStateDisplay } from "../common/entity/compute_state_display"; import LocalizeMixin from "../mixins/localize-mixin"; /* @@ -32,7 +33,7 @@ class HaWaterHeaterState extends LocalizeMixin(PolymerElement) {
- [[_localizeState(stateObj.state)]] + [[_localizeState(stateObj)]] [[computeTarget(hass, stateObj)]]
@@ -67,8 +68,8 @@ class HaWaterHeaterState extends LocalizeMixin(PolymerElement) { return ""; } - _localizeState(state) { - return this.localize(`state.water_heater.${state}`) || state; + _localizeState(stateObj) { + return computeStateDisplay(this.hass.localize, stateObj); } } customElements.define("ha-water_heater-state", HaWaterHeaterState); diff --git a/src/components/user/ha-user-picker.ts b/src/components/user/ha-user-picker.ts index ff5dc7c379..d0d5f39be9 100644 --- a/src/components/user/ha-user-picker.ts +++ b/src/components/user/ha-user-picker.ts @@ -17,6 +17,7 @@ import { fireEvent } from "../../common/dom/fire_event"; import { compare } from "../../common/string/compare"; import { fetchUsers, User } from "../../data/user"; import { HomeAssistant } from "../../types"; +import "./ha-user-badge"; class HaUserPicker extends LitElement { public hass?: HomeAssistant; diff --git a/src/dialogs/config-flow/show-dialog-config-flow.ts b/src/dialogs/config-flow/show-dialog-config-flow.ts index 46c9657b47..9287a7958f 100644 --- a/src/dialogs/config-flow/show-dialog-config-flow.ts +++ b/src/dialogs/config-flow/show-dialog-config-flow.ts @@ -8,12 +8,12 @@ import { getConfigFlowHandlers, handleConfigFlowStep, } from "../../data/config_flow"; +import { domainToName } from "../../data/integration"; import { DataEntryFlowDialogParams, loadDataEntryFlowDialog, showFlowDialog, } from "./show-dialog-data-entry-flow"; -import { domainToName } from "../../data/integration"; export const loadConfigFlowDialog = loadDataEntryFlowDialog; diff --git a/src/dialogs/config-flow/step-flow-pick-handler.ts b/src/dialogs/config-flow/step-flow-pick-handler.ts index bf7a64c585..879824a657 100644 --- a/src/dialogs/config-flow/step-flow-pick-handler.ts +++ b/src/dialogs/config-flow/step-flow-pick-handler.ts @@ -16,12 +16,12 @@ import { styleMap } from "lit-html/directives/style-map"; import memoizeOne from "memoize-one"; import { fireEvent } from "../../common/dom/fire_event"; import "../../common/search/search-input"; +import { LocalizeFunc } from "../../common/translations/localize"; import "../../components/ha-icon-next"; +import { domainToName } from "../../data/integration"; import { HomeAssistant } from "../../types"; import { FlowConfig } from "./show-dialog-data-entry-flow"; import { configFlowContentStyles } from "./styles"; -import { domainToName } from "../../data/integration"; -import { LocalizeFunc } from "../../common/translations/localize"; interface HandlerObj { name: string; diff --git a/src/dialogs/domain-toggler/dialog-domain-toggler.ts b/src/dialogs/domain-toggler/dialog-domain-toggler.ts index 14fac5294f..d3b7e7a06a 100644 --- a/src/dialogs/domain-toggler/dialog-domain-toggler.ts +++ b/src/dialogs/domain-toggler/dialog-domain-toggler.ts @@ -1,3 +1,4 @@ +import "@material/mwc-button/mwc-button"; import { css, CSSResultArray, @@ -8,11 +9,11 @@ import { TemplateResult, } from "lit-element"; import "../../components/dialog/ha-paper-dialog"; +import { domainToName } from "../../data/integration"; import { PolymerChangedEvent } from "../../polymer-types"; import { haStyleDialog } from "../../resources/styles"; import { HomeAssistant } from "../../types"; import { HaDomainTogglerDialogParams } from "./show-dialog-domain-toggler"; -import { domainToName } from "../../data/integration"; @customElement("dialog-domain-toggler") class DomainTogglerDialog extends LitElement { diff --git a/src/dialogs/generic/dialog-box.ts b/src/dialogs/generic/dialog-box.ts index 1e2be3dea4..8c9b40aadb 100644 --- a/src/dialogs/generic/dialog-box.ts +++ b/src/dialogs/generic/dialog-box.ts @@ -1,3 +1,4 @@ +import "@material/mwc-button/mwc-button"; import "@polymer/paper-dialog-scrollable/paper-dialog-scrollable"; import "@polymer/paper-input/paper-input"; import { @@ -72,6 +73,7 @@ class DialogBox extends LitElement { autofocus .value=${this._value} @value-changed=${this._valueChanged} + @keyup=${this._handleKeyUp} .label=${this._params.inputLabel ? this._params.inputLabel : ""} @@ -112,6 +114,12 @@ class DialogBox extends LitElement { this._params = undefined; } + private _handleKeyUp(ev: KeyboardEvent) { + if (ev.keyCode === 13) { + this._confirm(); + } + } + private async _confirm(): Promise { if (this._params!.confirm) { this._params!.confirm(this._value); diff --git a/src/dialogs/more-info/controls/more-info-climate.ts b/src/dialogs/more-info/controls/more-info-climate.ts index be4526fd8f..71a5d5ba55 100644 --- a/src/dialogs/more-info/controls/more-info-climate.ts +++ b/src/dialogs/more-info/controls/more-info-climate.ts @@ -185,7 +185,7 @@ class MoreInfoClimate extends LitElement { .map( (mode) => html` - ${hass.localize(`state.climate.${mode}`)} + ${hass.localize(`component.climate.state._.${mode}`)} ` )} diff --git a/src/dialogs/more-info/controls/more-info-person.ts b/src/dialogs/more-info/controls/more-info-person.ts index 746361146c..31def98ccf 100644 --- a/src/dialogs/more-info/controls/more-info-person.ts +++ b/src/dialogs/more-info/controls/more-info-person.ts @@ -11,6 +11,7 @@ import { } from "lit-element"; import memoizeOne from "memoize-one"; import { fireEvent } from "../../../common/dom/fire_event"; +import "../../../components/ha-attributes"; import "../../../components/map/ha-map"; import { showZoneEditor } from "../../../data/zone"; import { HomeAssistant } from "../../../types"; diff --git a/src/dialogs/more-info/controls/more-info-timer.ts b/src/dialogs/more-info/controls/more-info-timer.ts index cbfa31c883..4a1dbeb40a 100644 --- a/src/dialogs/more-info/controls/more-info-timer.ts +++ b/src/dialogs/more-info/controls/more-info-timer.ts @@ -8,6 +8,7 @@ import { property, TemplateResult, } from "lit-element"; +import "../../../components/ha-attributes"; import { TimerEntity } from "../../../data/timer"; import { HomeAssistant } from "../../../types"; diff --git a/src/dialogs/more-info/controls/more-info-water_heater.js b/src/dialogs/more-info/controls/more-info-water_heater.js index ce1c5e2994..5caf3122e6 100644 --- a/src/dialogs/more-info/controls/more-info-water_heater.js +++ b/src/dialogs/more-info/controls/more-info-water_heater.js @@ -246,7 +246,7 @@ class MoreInfoWaterHeater extends LocalizeMixin(EventsMixin(PolymerElement)) { } _localizeOperationMode(localize, mode) { - return localize(`state.water_heater.${mode}`) || mode; + return localize(`component.water_heater.state._.${mode}`) || mode; } } diff --git a/src/dialogs/mqtt-device-debug-info-dialog/dialog-mqtt-device-debug-info.ts b/src/dialogs/mqtt-device-debug-info-dialog/dialog-mqtt-device-debug-info.ts index 80ce1a52ef..a825d12396 100644 --- a/src/dialogs/mqtt-device-debug-info-dialog/dialog-mqtt-device-debug-info.ts +++ b/src/dialogs/mqtt-device-debug-info-dialog/dialog-mqtt-device-debug-info.ts @@ -1,23 +1,24 @@ +import "@material/mwc-button/mwc-button"; import { - LitElement, css, - html, CSSResult, - TemplateResult, customElement, + html, + LitElement, property, + TemplateResult, } from "lit-element"; +import { computeStateName } from "../../common/entity/compute_state_name"; import "../../components/ha-dialog"; import "../../components/ha-switch"; -import { computeDeviceName } from "../../data/device_registry"; -import { computeStateName } from "../../common/entity/compute_state_name"; -import { haStyleDialog } from "../../resources/styles"; import type { HaSwitch } from "../../components/ha-switch"; +import { computeDeviceName } from "../../data/device_registry"; +import { fetchMQTTDebugInfo, MQTTDeviceDebugInfo } from "../../data/mqtt"; +import { haStyleDialog } from "../../resources/styles"; import { HomeAssistant } from "../../types"; -import { MQTTDeviceDebugInfoDialogParams } from "./show-dialog-mqtt-device-debug-info"; -import { MQTTDeviceDebugInfo, fetchMQTTDebugInfo } from "../../data/mqtt"; -import "./mqtt-messages"; import "./mqtt-discovery-payload"; +import "./mqtt-messages"; +import { MQTTDeviceDebugInfoDialogParams } from "./show-dialog-mqtt-device-debug-info"; @customElement("dialog-mqtt-device-debug-info") class DialogMQTTDeviceDebugInfo extends LitElement { diff --git a/src/dialogs/mqtt-device-debug-info-dialog/mqtt-discovery-payload.ts b/src/dialogs/mqtt-device-debug-info-dialog/mqtt-discovery-payload.ts index b000f5499a..04fc6f0a5c 100644 --- a/src/dialogs/mqtt-device-debug-info-dialog/mqtt-discovery-payload.ts +++ b/src/dialogs/mqtt-device-debug-info-dialog/mqtt-discovery-payload.ts @@ -1,11 +1,11 @@ -import { - LitElement, - html, - TemplateResult, - customElement, - property, -} from "lit-element"; import { safeDump } from "js-yaml"; +import { + customElement, + html, + LitElement, + property, + TemplateResult, +} from "lit-element"; @customElement("mqtt-discovery-payload") class MQTTDiscoveryPayload extends LitElement { diff --git a/src/dialogs/mqtt-device-debug-info-dialog/mqtt-messages.ts b/src/dialogs/mqtt-device-debug-info-dialog/mqtt-messages.ts index c3f3b799ef..401eb86141 100644 --- a/src/dialogs/mqtt-device-debug-info-dialog/mqtt-messages.ts +++ b/src/dialogs/mqtt-device-debug-info-dialog/mqtt-messages.ts @@ -1,11 +1,11 @@ -import { - LitElement, - html, - TemplateResult, - customElement, - property, -} from "lit-element"; import { safeDump } from "js-yaml"; +import { + customElement, + html, + LitElement, + property, + TemplateResult, +} from "lit-element"; import { MQTTMessage } from "../../data/mqtt"; @customElement("mqtt-messages") diff --git a/src/dialogs/notifications/configurator-notification-item.ts b/src/dialogs/notifications/configurator-notification-item.ts index 178ebeff97..296ead9767 100644 --- a/src/dialogs/notifications/configurator-notification-item.ts +++ b/src/dialogs/notifications/configurator-notification-item.ts @@ -7,10 +7,11 @@ import { TemplateResult, } from "lit-element"; import { fireEvent } from "../../common/dom/fire_event"; +import { computeStateDisplay } from "../../common/entity/compute_state_display"; +import { domainToName } from "../../data/integration"; import { PersitentNotificationEntity } from "../../data/persistent_notification"; import { HomeAssistant } from "../../types"; import "./notification-item-template"; -import { domainToName } from "../../data/integration"; @customElement("configurator-notification-item") export class HuiConfiguratorNotificationItem extends LitElement { @@ -38,8 +39,10 @@ export class HuiConfiguratorNotificationItem extends LitElement { ${this.hass.localize( - `state.configurator.${this.notification.state}` + >${computeStateDisplay( + this.hass.localize, + this.notification, + this.hass.language )} diff --git a/src/layouts/hass-tabs-subpage-data-table.ts b/src/layouts/hass-tabs-subpage-data-table.ts index add5bc19d3..b55bbcfa37 100644 --- a/src/layouts/hass-tabs-subpage-data-table.ts +++ b/src/layouts/hass-tabs-subpage-data-table.ts @@ -1,3 +1,5 @@ +import "@material/mwc-button/mwc-button"; +import "@polymer/paper-tooltip/paper-tooltip"; import { css, CSSResult, @@ -8,6 +10,7 @@ import { query, TemplateResult, } from "lit-element"; +import { navigate } from "../common/navigate"; import "../components/data-table/ha-data-table"; import type { DataTableColumnContainer, @@ -17,9 +20,6 @@ import type { import type { HomeAssistant, Route } from "../types"; import "./hass-tabs-subpage"; import type { PageNavigation } from "./hass-tabs-subpage"; -import "@material/mwc-button/mwc-button"; -import { navigate } from "../common/navigate"; -import "@polymer/paper-tooltip/paper-tooltip"; @customElement("hass-tabs-subpage-data-table") export class HaTabsSubpageDataTable extends LitElement { diff --git a/src/layouts/hass-tabs-subpage.ts b/src/layouts/hass-tabs-subpage.ts index cf2c593c22..ac91b3b8b2 100644 --- a/src/layouts/hass-tabs-subpage.ts +++ b/src/layouts/hass-tabs-subpage.ts @@ -16,6 +16,7 @@ import { navigate } from "../common/navigate"; import "../components/ha-menu-button"; import "../components/ha-paper-icon-button-arrow-prev"; import { HomeAssistant, Route } from "../types"; +import "../components/ha-icon"; export interface PageNavigation { path: string; @@ -228,6 +229,10 @@ class HassTabsSubpage extends LitElement { min-width: 0; } + :host(:not([narrow])) #toolbar-icon { + min-width: 40px; + } + ha-menu-button, ha-paper-icon-button-arrow-prev, ::slotted([slot="toolbar-icon"]) { diff --git a/src/layouts/home-assistant.ts b/src/layouts/home-assistant.ts index cef1dd0733..76352dea69 100644 --- a/src/layouts/home-assistant.ts +++ b/src/layouts/home-assistant.ts @@ -1,5 +1,6 @@ import "@polymer/app-route/app-location"; import { html, property, PropertyValues } from "lit-element"; +import { setHAVersion } from "../common/config/version"; import { navigate } from "../common/navigate"; import { getStorageDefaultPanelUrlPath } from "../data/panel"; import "../resources/custom-card-support"; @@ -12,7 +13,6 @@ import { } from "../util/register-service-worker"; import "./ha-init-page"; import "./home-assistant-main"; -import { setHAVersion } from "../common/config/version"; export class HomeAssistantAppEl extends HassElement { @property() private _route?: Route; diff --git a/src/onboarding/ha-onboarding.ts b/src/onboarding/ha-onboarding.ts index 1bb279b465..414731adf7 100644 --- a/src/onboarding/ha-onboarding.ts +++ b/src/onboarding/ha-onboarding.ts @@ -24,10 +24,10 @@ import { import { subscribeUser } from "../data/ws-user"; import { litLocalizeLiteMixin } from "../mixins/lit-localize-lite-mixin"; import { HassElement } from "../state/hass-element"; +import { HomeAssistant } from "../types"; import { registerServiceWorker } from "../util/register-service-worker"; import "./onboarding-create-user"; import "./onboarding-loading"; -import { HomeAssistant } from "../types"; interface OnboardingEvent { type: T; diff --git a/src/onboarding/onboarding-integrations.ts b/src/onboarding/onboarding-integrations.ts index 85ab7b2558..9e24c4d076 100644 --- a/src/onboarding/onboarding-integrations.ts +++ b/src/onboarding/onboarding-integrations.ts @@ -20,6 +20,7 @@ import { subscribeConfigFlowInProgress, } from "../data/config_flow"; import { DataEntryFlowProgress } from "../data/data_entry_flow"; +import { domainToName } from "../data/integration"; import { onboardIntegrationStep } from "../data/onboarding"; import { loadConfigFlowDialog, @@ -28,7 +29,6 @@ import { import { HomeAssistant } from "../types"; import "./action-badge"; import "./integration-badge"; -import { domainToName } from "../data/integration"; @customElement("onboarding-integrations") class OnboardingIntegrations extends LitElement { diff --git a/src/panels/config/automation/action/ha-automation-action-row.ts b/src/panels/config/automation/action/ha-automation-action-row.ts index 77cb775b86..99f67af95a 100644 --- a/src/panels/config/automation/action/ha-automation-action-row.ts +++ b/src/panels/config/automation/action/ha-automation-action-row.ts @@ -1,3 +1,4 @@ +import "@polymer/paper-dropdown-menu/paper-dropdown-menu-light"; import "@polymer/paper-icon-button/paper-icon-button"; import "@polymer/paper-item/paper-item"; import "@polymer/paper-listbox/paper-listbox"; diff --git a/src/panels/config/automation/action/types/ha-automation-action-scene.ts b/src/panels/config/automation/action/types/ha-automation-action-scene.ts index 3399286deb..b69808c522 100644 --- a/src/panels/config/automation/action/types/ha-automation-action-scene.ts +++ b/src/panels/config/automation/action/types/ha-automation-action-scene.ts @@ -6,6 +6,8 @@ import { PolymerChangedEvent } from "../../../../../polymer-types"; import { HomeAssistant } from "../../../../../types"; import { ActionElement } from "../ha-automation-action-row"; +const includeDomains = ["scene"]; + @customElement("ha-automation-action-scene") export class HaSceneAction extends LitElement implements ActionElement { @property() public hass!: HomeAssistant; @@ -24,7 +26,7 @@ export class HaSceneAction extends LitElement implements ActionElement { .hass=${this.hass} .value=${scene} @value-changed=${this._entityPicked} - .includeDomains=${["scene"]} + .includeDomains=${includeDomains} allow-custom-entity > `; diff --git a/src/panels/config/automation/action/types/ha-automation-action-service.ts b/src/panels/config/automation/action/types/ha-automation-action-service.ts index 4a7751e9c3..3cdbc811e2 100644 --- a/src/panels/config/automation/action/types/ha-automation-action-service.ts +++ b/src/panels/config/automation/action/types/ha-automation-action-service.ts @@ -34,6 +34,8 @@ export class HaServiceAction extends LitElement implements ActionElement { return { service: "", data: {} }; } + private _domain = memoizeOne((service: string) => [computeDomain(service)]); + private _getServiceData = memoizeOne((service: string) => { if (!service) { return []; @@ -85,7 +87,7 @@ export class HaServiceAction extends LitElement implements ActionElement { .value=${entity_id} .label=${entity.description} @value-changed=${this._entityPicked} - .includeDomains=${[computeDomain(service)]} + .includeDomains=${this._domain(service)} allow-custom-entity > ` diff --git a/src/panels/config/automation/condition/ha-automation-condition-editor.ts b/src/panels/config/automation/condition/ha-automation-condition-editor.ts index ef6d855c4d..506b7bb8c8 100644 --- a/src/panels/config/automation/condition/ha-automation-condition-editor.ts +++ b/src/panels/config/automation/condition/ha-automation-condition-editor.ts @@ -1,3 +1,4 @@ +import "@polymer/paper-dropdown-menu/paper-dropdown-menu-light"; import "@polymer/paper-item/paper-item"; import "@polymer/paper-listbox/paper-listbox"; import type { PaperListboxElement } from "@polymer/paper-listbox/paper-listbox"; @@ -7,6 +8,7 @@ import { fireEvent } from "../../../../common/dom/fire_event"; import "../../../../components/ha-card"; import type { Condition } from "../../../../data/automation"; import type { HomeAssistant } from "../../../../types"; +import "../../../../components/ha-yaml-editor"; import "./types/ha-automation-condition-and"; import "./types/ha-automation-condition-device"; import "./types/ha-automation-condition-numeric_state"; diff --git a/src/panels/config/automation/condition/types/ha-automation-condition-zone.ts b/src/panels/config/automation/condition/types/ha-automation-condition-zone.ts index 213fb1966e..2f7416f4e1 100644 --- a/src/panels/config/automation/condition/types/ha-automation-condition-zone.ts +++ b/src/panels/config/automation/condition/types/ha-automation-condition-zone.ts @@ -12,6 +12,8 @@ function zoneAndLocationFilter(stateObj) { return hasLocation(stateObj) && computeStateDomain(stateObj) !== "zone"; } +const includeDomains = ["zone"]; + @customElement("ha-automation-condition-zone") export class HaZoneCondition extends LitElement { @property() public hass!: HomeAssistant; @@ -46,7 +48,7 @@ export class HaZoneCondition extends LitElement { @value-changed=${this._zonePicked} .hass=${this.hass} allow-custom-entity - .includeDomains=${["zone"]} + .includeDomains=${includeDomains} >
+ ${this._errors + ? html`
${this._errors}
` : ""} - - ${this.hass.localize( - "ui.panel.config.automation.editor.introduction" - )} - - -
- - - -
- ${this.creatingNew - ? "" - : html` -
-
- - ${this.hass.localize( - "ui.panel.config.automation.editor.enable_disable" - )} + + ${!this.narrow + ? html` ${this._config.alias} ` + : ""} + + ${this.hass.localize( + "ui.panel.config.automation.editor.introduction" + )} + + +
+ + + +
+ ${stateObj + ? html` +
+
+ + ${this.hass.localize( + "ui.panel.config.automation.editor.enable_disable" + )} +
+ + ${this.hass.localize( + "ui.card.automation.trigger" + )} +
- - ${this.hass.localize("ui.card.automation.trigger")} - -
- `} - - + ` + : ""} + + - - - ${this.hass.localize( - "ui.panel.config.automation.editor.triggers.header" - )} - - -

+ + ${this.hass.localize( - "ui.panel.config.automation.editor.triggers.introduction" + "ui.panel.config.automation.editor.triggers.header" )} -

-
- ${this.hass.localize( - "ui.panel.config.automation.editor.triggers.learn_more" - )} - - - - + + +

+ ${this.hass.localize( + "ui.panel.config.automation.editor.triggers.introduction" + )} +

+ + ${this.hass.localize( + "ui.panel.config.automation.editor.triggers.learn_more" + )} + +
+ + - - - ${this.hass.localize( - "ui.panel.config.automation.editor.conditions.header" - )} - - -

+ + ${this.hass.localize( - "ui.panel.config.automation.editor.conditions.introduction" + "ui.panel.config.automation.editor.conditions.header" )} -

- - ${this.hass.localize( - "ui.panel.config.automation.editor.conditions.learn_more" - )} - -
- -
+ + +

+ ${this.hass.localize( + "ui.panel.config.automation.editor.conditions.introduction" + )} +

+ + ${this.hass.localize( + "ui.panel.config.automation.editor.conditions.learn_more" + )} + +
+ + - - - ${this.hass.localize( - "ui.panel.config.automation.editor.actions.header" - )} - - -

+ + ${this.hass.localize( - "ui.panel.config.automation.editor.actions.introduction" + "ui.panel.config.automation.editor.actions.header" )} -

- - ${this.hass.localize( - "ui.panel.config.automation.editor.actions.learn_more" - )} - -
- -
+ + +

+ ${this.hass.localize( + "ui.panel.config.automation.editor.actions.introduction" + )} +

+ + ${this.hass.localize( + "ui.panel.config.automation.editor.actions.learn_more" + )} + +
+ + +
` : ""} ( "GET", - `config/automation/config/${this.automation.attributes.id}` + `config/automation/config/${this.automationId}` ) .then( (config) => { @@ -290,13 +304,12 @@ export class HaAutomationEditor extends LitElement { "err_no", resp.status_code ), - }); - history.back(); + }).then(() => history.back()); } ); } - if (changedProps.has("creatingNew") && this.creatingNew && this.hass) { + if (changedProps.has("automationId") && !this.automationId && this.hass) { const initData = getAutomationEditorInitData(); this._dirty = !!initData; this._config = { @@ -310,6 +323,21 @@ export class HaAutomationEditor extends LitElement { ...initData, }; } + + if ( + changedProps.has("automations") && + this.automationId && + !this._entityId + ) { + this._setEntityId(); + } + } + + private _setEntityId() { + const automation = this.automations.find( + (entity: AutomationEntity) => entity.attributes.id === this.automationId + ); + this._entityId = automation?.entity_id; } private _valueChanged(ev: CustomEvent) { @@ -348,8 +376,8 @@ export class HaAutomationEditor extends LitElement { this._dirty = true; } - private _excuteAutomation() { - triggerAutomation(this.hass, this.automation.entity_id); + private _excuteAutomation(ev: Event) { + triggerAutomation(this.hass, (ev.target as any).stateObj.entity_id); } private _backTapped(): void { @@ -379,14 +407,12 @@ export class HaAutomationEditor extends LitElement { } private async _delete() { - await deleteAutomation(this.hass, this.automation.attributes.id!); + await deleteAutomation(this.hass, this.automationId); history.back(); } private _saveAutomation(): void { - const id = this.creatingNew - ? "" + Date.now() - : this.automation.attributes.id; + const id = this.automationId || String(Date.now()); this.hass!.callApi( "POST", "config/automation/config/" + id, @@ -395,7 +421,7 @@ export class HaAutomationEditor extends LitElement { () => { this._dirty = false; - if (this.creatingNew) { + if (!this.automationId) { navigate(this, `/config/automation/edit/${id}`, true); } }, diff --git a/src/panels/config/automation/ha-config-automation.ts b/src/panels/config/automation/ha-config-automation.ts index 815c1b09af..c1f2b932a2 100644 --- a/src/panels/config/automation/ha-config-automation.ts +++ b/src/panels/config/automation/ha-config-automation.ts @@ -10,6 +10,7 @@ import { import { HomeAssistant } from "../../../types"; import "./ha-automation-editor"; import "./ha-automation-picker"; +import { debounce } from "../../../common/util/debounce"; @customElement("ha-config-automation") class HaConfigAutomation extends HassRouterPage { @@ -23,6 +24,13 @@ class HaConfigAutomation extends HassRouterPage { @property() public automations: AutomationEntity[] = []; + private _debouncedUpdateAutomations = debounce((pageEl) => { + const newAutomations = this._getAutomations(this.hass.states); + if (!this._equal(newAutomations, pageEl.automations)) { + pageEl.automations = newAutomations; + } + }, 10); + protected routerOptions: RouterOptions = { defaultPage: "dashboard", routes: { @@ -36,19 +44,15 @@ class HaConfigAutomation extends HassRouterPage { }, }; - private _computeAutomations = memoizeOne((states: HassEntities) => { - const automations: AutomationEntity[] = []; - Object.values(states).forEach((state) => { - if ( - computeStateDomain(state) === "automation" && - !state.attributes.hidden - ) { - automations.push(state as AutomationEntity); - } - }); - - return automations; - }); + private _getAutomations = memoizeOne( + (states: HassEntities): AutomationEntity[] => { + return Object.values(states).filter( + (entity) => + computeStateDomain(entity) === "automation" && + !entity.attributes.hidden + ) as AutomationEntity[]; + } + ); protected firstUpdated(changedProps) { super.firstUpdated(changedProps); @@ -63,25 +67,28 @@ class HaConfigAutomation extends HassRouterPage { pageEl.showAdvanced = this.showAdvanced; if (this.hass) { - pageEl.automations = this._computeAutomations(this.hass.states); + if (!pageEl.automations || !changedProps) { + pageEl.automations = this._getAutomations(this.hass.states); + } else if (changedProps && changedProps.has("hass")) { + this._debouncedUpdateAutomations(pageEl); + } } if ( (!changedProps || changedProps.has("route")) && this._currentPage === "edit" ) { - pageEl.creatingNew = undefined; const automationId = this.routeTail.path.substr(1); - pageEl.creatingNew = automationId === "new"; - pageEl.automation = - automationId === "new" - ? undefined - : pageEl.automations.find( - (entity: AutomationEntity) => - entity.attributes.id === automationId - ); + pageEl.automationId = automationId === "new" ? null : automationId; } } + + private _equal(a: AutomationEntity[], b: AutomationEntity[]): boolean { + if (a.length !== b.length) { + return false; + } + return a.every((automation, index) => automation === b[index]); + } } declare global { diff --git a/src/panels/config/automation/thingtalk/ha-thingtalk-placeholders.ts b/src/panels/config/automation/thingtalk/ha-thingtalk-placeholders.ts index 0e233445a8..2e853c10a2 100644 --- a/src/panels/config/automation/thingtalk/ha-thingtalk-placeholders.ts +++ b/src/panels/config/automation/thingtalk/ha-thingtalk-placeholders.ts @@ -22,12 +22,13 @@ import { subscribeDeviceRegistry, } from "../../../../data/device_registry"; import { subscribeEntityRegistry } from "../../../../data/entity_registry"; +import { domainToName } from "../../../../data/integration"; import { SubscribeMixin } from "../../../../mixins/subscribe-mixin"; import { PolymerChangedEvent } from "../../../../polymer-types"; import { haStyleDialog } from "../../../../resources/styles"; import { HomeAssistant } from "../../../../types"; +import "../../../../components/entity/ha-entity-picker"; import { Placeholder, PlaceholderContainer } from "./dialog-thingtalk"; -import { domainToName } from "../../../../data/integration"; declare global { // for fire event 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 8de3792209..2b27ac5782 100644 --- a/src/panels/config/automation/trigger/ha-automation-trigger-row.ts +++ b/src/panels/config/automation/trigger/ha-automation-trigger-row.ts @@ -1,3 +1,4 @@ +import "@polymer/paper-dropdown-menu/paper-dropdown-menu-light"; import "@polymer/paper-icon-button/paper-icon-button"; import "@polymer/paper-item/paper-item"; import "@polymer/paper-listbox/paper-listbox"; diff --git a/src/panels/config/automation/trigger/types/ha-automation-trigger-geo_location.ts b/src/panels/config/automation/trigger/types/ha-automation-trigger-geo_location.ts index ef5f470101..42fe2d0245 100644 --- a/src/panels/config/automation/trigger/types/ha-automation-trigger-geo_location.ts +++ b/src/panels/config/automation/trigger/types/ha-automation-trigger-geo_location.ts @@ -8,6 +8,8 @@ import type { GeoLocationTrigger } from "../../../../../data/automation"; import type { HomeAssistant } from "../../../../../types"; import { handleChangeEvent } from "../ha-automation-trigger-row"; +const includeDomains = ["zone"]; + @customElement("ha-automation-trigger-geo_location") export default class HaGeolocationTrigger extends LitElement { @property() public hass!: HomeAssistant; @@ -42,7 +44,7 @@ export default class HaGeolocationTrigger extends LitElement { @value-changed=${this._zonePicked} .hass=${this.hass} allow-custom-entity - .includeDomains=${["zone"]} + .includeDomains=${includeDomains} >

- ${domainToName(this.hass.localize, item.domain)} + ${integrationName}

- ${item.title} + ${integrationName === item.title + ? html` ` + : item.title}

${devices.length || entities.length ? html` @@ -282,7 +287,7 @@ class HaConfigIntegrations extends SubscribeMixin(LitElement) { ${devices.length ? html` ${this.hass.localize( "ui.panel.config.integrations.config_entry.devices", "count", @@ -297,7 +302,7 @@ class HaConfigIntegrations extends SubscribeMixin(LitElement) { ${entities.length ? html` ${this.hass.localize( "ui.panel.config.integrations.config_entry.entities", "count", @@ -385,8 +390,9 @@ class HaConfigIntegrations extends SubscribeMixin(LitElement) { aria-label=${this.hass.localize("ui.panel.config.integrations.new")} title=${this.hass.localize("ui.panel.config.integrations.new")} @click=${this._createFlow} - ?rtl=${computeRTL(this.hass!)} + ?is-wide=${this.isWide} ?narrow=${this.narrow} + ?rtl=${computeRTL(this.hass!)} > `; @@ -520,7 +526,7 @@ class HaConfigIntegrations extends SubscribeMixin(LitElement) { "ui.panel.config.integrations.rename_input_label" ), }); - if (!newName) { + if (newName === null) { return; } const newEntry = await updateConfigEntry(this.hass, configEntry.entry_id, { @@ -571,6 +577,7 @@ class HaConfigIntegrations extends SubscribeMixin(LitElement) { margin-bottom: 64px; } ha-card { + max-width: 500px; display: flex; flex-direction: column; justify-content: space-between; @@ -642,6 +649,10 @@ class HaConfigIntegrations extends SubscribeMixin(LitElement) { right: 16px; z-index: 1; } + ha-fab[is-wide] { + bottom: 24px; + right: 24px; + } ha-fab[narrow] { bottom: 84px; } @@ -649,6 +660,11 @@ class HaConfigIntegrations extends SubscribeMixin(LitElement) { right: auto; left: 16px; } + ha-fab[is-wide].rtl { + bottom: 24px; + left: 24px; + right: auto; + } paper-menu-button { color: var(--secondary-text-color); padding: 0; diff --git a/src/panels/config/lovelace/dashboards/dialog-lovelace-dashboard-detail.ts b/src/panels/config/lovelace/dashboards/dialog-lovelace-dashboard-detail.ts index 365d57d316..6e36887064 100644 --- a/src/panels/config/lovelace/dashboards/dialog-lovelace-dashboard-detail.ts +++ b/src/panels/config/lovelace/dashboards/dialog-lovelace-dashboard-detail.ts @@ -1,3 +1,4 @@ +import "@material/mwc-button/mwc-button"; import { css, CSSResult, diff --git a/src/panels/config/lovelace/resources/dialog-lovelace-resource-detail.ts b/src/panels/config/lovelace/resources/dialog-lovelace-resource-detail.ts index b369bfac8a..7613057db6 100644 --- a/src/panels/config/lovelace/resources/dialog-lovelace-resource-detail.ts +++ b/src/panels/config/lovelace/resources/dialog-lovelace-resource-detail.ts @@ -1,3 +1,7 @@ +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 { css, CSSResult, @@ -8,6 +12,7 @@ import { TemplateResult, } from "lit-element"; import { createCloseHeading } from "../../../../components/ha-dialog"; +import "../../../../components/ha-paper-dropdown-menu"; import { LovelaceResource, LovelaceResourcesMutableParams, diff --git a/src/panels/config/person/dialog-person-detail.ts b/src/panels/config/person/dialog-person-detail.ts index 570b4574a9..98ff7bbadb 100644 --- a/src/panels/config/person/dialog-person-detail.ts +++ b/src/panels/config/person/dialog-person-detail.ts @@ -18,6 +18,8 @@ import { haStyleDialog } from "../../../resources/styles"; import { HomeAssistant } from "../../../types"; import { PersonDetailDialogParams } from "./show-dialog-person-detail"; +const includeDomains = ["device_tracker"]; + class DialogPersonDetail extends LitElement { @property() public hass!: HomeAssistant; @@ -106,7 +108,7 @@ class DialogPersonDetail extends LitElement { this._backTapped()} .tabs=${configSections.automation} > - - ${ - this.creatingNew + ${this.creatingNew ? "" : html` - ` - } - - ${ - this._errors - ? html`
${this._errors}
` - : "" - } - ${this.narrow ? html` ${name} ` : ""} -
- - ${!this.narrow ? html` ${name} ` : ""} -
- ${this.hass.localize( - "ui.panel.config.scene.editor.introduction" - )} -
- -
- -
-
-
- - -
- ${this.hass.localize( - "ui.panel.config.scene.editor.devices.header" - )} -
-
- ${this.hass.localize( - "ui.panel.config.scene.editor.devices.introduction" - )} -
- - ${devices.map( - (device) => - html` - -
- ${device.name} - -
- ${device.entities.map((entityId) => { - const stateObj = this.hass.states[entityId]; - if (!stateObj) { - return html``; - } - return html` - - - - ${computeStateName(stateObj)} - - - `; - })} -
- ` - )} - - -
- -
-
-
- - ${ - this.showAdvanced - ? html` - -
- ${this.hass.localize( - "ui.panel.config.scene.editor.entities.header" - )} -
-
- ${this.hass.localize( - "ui.panel.config.scene.editor.entities.introduction" - )} -
- ${entities.length - ? html` - - ${entities.map((entityId) => { - const stateObj = this.hass.states[entityId]; - if (!stateObj) { - return html``; - } - return html` - - - - ${computeStateName(stateObj)} - - - - `; - })} - - ` - : ""} - - -
- ${this.hass.localize( - "ui.panel.config.scene.editor.entities.device_entities" - )} - -
-
-
- ` - : "" - } -
- ${this._errors} ` : ""} + ${this.narrow ? html` ${name} ` : ""} +
+ + ${!this.narrow ? html` ${name} ` : ""} +
+ ${this.hass.localize("ui.panel.config.scene.editor.introduction")} +
+ +
+ +
+
+
+ + +
+ ${this.hass.localize( + "ui.panel.config.scene.editor.devices.header" + )} +
+
+ ${this.hass.localize( + "ui.panel.config.scene.editor.devices.introduction" + )} +
+ + ${devices.map( + (device) => + html` + +
+ ${device.name} + +
+ ${device.entities.map((entityId) => { + const stateObj = this.hass.states[entityId]; + if (!stateObj) { + return html``; + } + return html` + + + + ${computeStateName(stateObj)} + + + `; + })} +
+ ` + )} + + +
+ +
+
+
+ + ${this.showAdvanced + ? html` + +
+ ${this.hass.localize( + "ui.panel.config.scene.editor.entities.header" + )} +
+
+ ${this.hass.localize( + "ui.panel.config.scene.editor.entities.introduction" + )} +
+ ${entities.length + ? html` + + ${entities.map((entityId) => { + const stateObj = this.hass.states[entityId]; + if (!stateObj) { + return html``; + } + return html` + + + + ${computeStateName(stateObj)} + + + + `; + })} + + ` + : ""} + + +
+ ${this.hass.localize( + "ui.panel.config.scene.editor.entities.device_entities" + )} + +
+
+
+ ` + : ""} +
+ - + `; } diff --git a/src/panels/config/users/dialog-add-user.ts b/src/panels/config/users/dialog-add-user.ts index b7f7858766..66833d4d90 100644 --- a/src/panels/config/users/dialog-add-user.ts +++ b/src/panels/config/users/dialog-add-user.ts @@ -1,4 +1,5 @@ import "@material/mwc-button"; +import "@polymer/paper-input/paper-input"; import "@polymer/paper-spinner/paper-spinner"; import { css, diff --git a/src/panels/config/zha/zha-config-dashboard.ts b/src/panels/config/zha/zha-config-dashboard.ts index f277ae2e54..4acf5faa91 100644 --- a/src/panels/config/zha/zha-config-dashboard.ts +++ b/src/panels/config/zha/zha-config-dashboard.ts @@ -113,7 +113,7 @@ class ZHAConfigDashboard extends LitElement { protected render(): TemplateResult { return html` - +
${this.hass.localize("ui.panel.config.zha.header")} diff --git a/src/panels/config/zha/zha-device-card.ts b/src/panels/config/zha/zha-device-card.ts index 5d7d887664..1bac828040 100644 --- a/src/panels/config/zha/zha-device-card.ts +++ b/src/panels/config/zha/zha-device-card.ts @@ -36,12 +36,12 @@ import { ZHADevice, ZHAEntityReference, } from "../../../data/zha"; +import { showZHADeviceZigbeeInfoDialog } from "../../../dialogs/zha-device-zigbee-signature-dialog/show-dialog-zha-device-zigbee-info"; import { haStyle } from "../../../resources/styles"; import { HomeAssistant } from "../../../types"; import { addEntitiesToLovelaceView } from "../../lovelace/editor/add-entities-to-view"; import { formatAsPaddedHex } from "./functions"; import { ItemSelectedEvent, NodeServiceData } from "./types"; -import { showZHADeviceZigbeeInfoDialog } from "../../../dialogs/zha-device-zigbee-signature-dialog/show-dialog-zha-device-zigbee-info"; declare global { // for fire event diff --git a/src/panels/developer-tools/info/integrations-card.ts b/src/panels/developer-tools/info/integrations-card.ts index 980b554012..1c9c9761ba 100644 --- a/src/panels/developer-tools/info/integrations-card.ts +++ b/src/panels/developer-tools/info/integrations-card.ts @@ -8,11 +8,12 @@ import { TemplateResult, } from "lit-element"; import memoizeOne from "memoize-one"; +import "../../../components/ha-card"; import { + domainToName, + fetchIntegrationManifests, integrationIssuesUrl, IntegrationManifest, - fetchIntegrationManifests, - domainToName, } from "../../../data/integration"; import { HomeAssistant } from "../../../types"; diff --git a/src/panels/developer-tools/info/system-health-card.ts b/src/panels/developer-tools/info/system-health-card.ts index 2fdec54f37..0ff2151131 100644 --- a/src/panels/developer-tools/info/system-health-card.ts +++ b/src/panels/developer-tools/info/system-health-card.ts @@ -8,12 +8,12 @@ import { TemplateResult, } from "lit-element"; import "../../../components/ha-card"; +import { domainToName } from "../../../data/integration"; import { fetchSystemHealthInfo, SystemHealthInfo, } from "../../../data/system_health"; import { HomeAssistant } from "../../../types"; -import { domainToName } from "../../../data/integration"; const sortKeys = (a: string, b: string) => { if (a === "homeassistant") { diff --git a/src/panels/developer-tools/logs/dialog-system-log-detail.ts b/src/panels/developer-tools/logs/dialog-system-log-detail.ts index cfa468c93a..f799ec0475 100644 --- a/src/panels/developer-tools/logs/dialog-system-log-detail.ts +++ b/src/panels/developer-tools/logs/dialog-system-log-detail.ts @@ -10,9 +10,9 @@ import { import "../../../components/dialog/ha-paper-dialog"; import { domainToName, + fetchIntegrationManifest, integrationIssuesUrl, IntegrationManifest, - fetchIntegrationManifest, } from "../../../data/integration"; import { getLoggedErrorIntegration } from "../../../data/system_log"; import { PolymerChangedEvent } from "../../../polymer-types"; diff --git a/src/panels/lovelace/cards/hui-alarm-panel-card.ts b/src/panels/lovelace/cards/hui-alarm-panel-card.ts index 230b86700c..aeec4d36fe 100644 --- a/src/panels/lovelace/cards/hui-alarm-panel-card.ts +++ b/src/panels/lovelace/cards/hui-alarm-panel-card.ts @@ -165,7 +165,7 @@ class HuiAlarmPanelCard extends LitElement implements LovelaceCard { - ${this._label(state)} + ${this._stateDisplay(state)} `; })} @@ -212,7 +212,9 @@ class HuiAlarmPanelCard extends LitElement implements LovelaceCard { outlined > ${value === "clear" - ? this._label("clear_code") + ? this.hass!.localize( + `ui.card.alarm_control_panel.clear_code` + ) : value} `; @@ -232,10 +234,9 @@ class HuiAlarmPanelCard extends LitElement implements LovelaceCard { : stateLabel; } - private _label(state: string): string { - return ( - this.hass!.localize(`state.alarm_control_panel.${state}`) || - this.hass!.localize(`ui.card.alarm_control_panel.${state}`) + private _stateDisplay(state: string): string { + return this.hass!.localize( + `component.alarm_control_panel.state._.${state}` ); } diff --git a/src/panels/lovelace/cards/hui-empty-state-card.ts b/src/panels/lovelace/cards/hui-empty-state-card.ts index 8118ffc1dd..b539111d95 100644 --- a/src/panels/lovelace/cards/hui-empty-state-card.ts +++ b/src/panels/lovelace/cards/hui-empty-state-card.ts @@ -1,3 +1,4 @@ +import "@material/mwc-button/mwc-button"; import { css, CSSResult, @@ -49,7 +50,7 @@ export class HuiEmptyStateCard extends LitElement implements LovelaceCard {
- + `; } diff --git a/src/panels/lovelace/cards/hui-entity-card.ts b/src/panels/lovelace/cards/hui-entity-card.ts index e161b87bdf..cc57b8ac75 100644 --- a/src/panels/lovelace/cards/hui-entity-card.ts +++ b/src/panels/lovelace/cards/hui-entity-card.ts @@ -10,6 +10,7 @@ import { } from "lit-element"; import { applyThemesOnElement } from "../../../common/dom/apply_themes_on_element"; import { fireEvent } from "../../../common/dom/fire_event"; +import { computeStateDisplay } from "../../../common/entity/compute_state_display"; import { computeStateName } from "../../../common/entity/compute_state_name"; import { stateIcon } from "../../../common/entity/state_icon"; import { isValidEntityId } from "../../../common/entity/valid_entity_id"; @@ -128,13 +129,11 @@ export class HuiEntityCard extends LitElement implements LovelaceCard { >${"attribute" in this._config ? stateObj.attributes[this._config.attribute!] || this.hass.localize("state.default.unknown") - : this.hass.localize(`state.default.${stateObj.state}`) || - this.hass.localize( - `state.${this._config.entity.split(".")[0]}.${ - stateObj.state - }` - ) || - stateObj.state}${showUnit ? html` - ${this.hass.localize(`state.default.${stateObj.state}`) || - stateObj.state} + ${computeStateDisplay( + this.hass.localize, + stateObj, + this.hass.language + )} ` : html` diff --git a/src/panels/lovelace/cards/hui-map-card.ts b/src/panels/lovelace/cards/hui-map-card.ts index cf9e230067..f215b0b214 100644 --- a/src/panels/lovelace/cards/hui-map-card.ts +++ b/src/panels/lovelace/cards/hui-map-card.ts @@ -37,6 +37,7 @@ import { findEntities } from "../common/find-entites"; import { processConfigEntities } from "../common/process-config-entities"; import { EntityConfig } from "../entity-rows/types"; import { LovelaceCard } from "../types"; +import "../../../components/ha-card"; import { MapCardConfig } from "./types"; @customElement("hui-map-card") diff --git a/src/panels/lovelace/cards/hui-media-control-card.ts b/src/panels/lovelace/cards/hui-media-control-card.ts index 50811470fc..a67ce7b7ba 100644 --- a/src/panels/lovelace/cards/hui-media-control-card.ts +++ b/src/panels/lovelace/cards/hui-media-control-card.ts @@ -45,6 +45,7 @@ import { findEntities } from "../common/find-entites"; import { hasConfigOrEntityChanged } from "../common/has-changed"; import "../components/hui-marquee"; import type { LovelaceCard, LovelaceCardEditor } from "../types"; +import "../components/hui-warning"; import { MediaControlCardConfig } from "./types"; function getContrastRatio( diff --git a/src/panels/lovelace/cards/hui-picture-elements-card.ts b/src/panels/lovelace/cards/hui-picture-elements-card.ts index a21722bf17..a57a4a53df 100644 --- a/src/panels/lovelace/cards/hui-picture-elements-card.ts +++ b/src/panels/lovelace/cards/hui-picture-elements-card.ts @@ -9,6 +9,7 @@ import { TemplateResult, } from "lit-element"; import { applyThemesOnElement } from "../../../common/dom/apply_themes_on_element"; +import "../../../components/ha-card"; import { HomeAssistant } from "../../../types"; import { findEntities } from "../common/find-entites"; import { LovelaceElement, LovelaceElementConfig } from "../elements/types"; @@ -107,7 +108,7 @@ class HuiPictureElementsCard extends LitElement implements LovelaceCard { } return html` - +
+ > `; } diff --git a/src/panels/lovelace/cards/hui-weather-forecast-card.ts b/src/panels/lovelace/cards/hui-weather-forecast-card.ts index 023633dd17..de40b4af6a 100644 --- a/src/panels/lovelace/cards/hui-weather-forecast-card.ts +++ b/src/panels/lovelace/cards/hui-weather-forecast-card.ts @@ -8,30 +8,29 @@ import { PropertyValues, TemplateResult, } from "lit-element"; - -import "../../../components/ha-icon"; -import "../../../components/ha-card"; -import "../components/hui-warning"; - -import { WeatherForecastCardConfig } from "./types"; -import { LovelaceCard, LovelaceCardEditor } from "../types"; -import { HomeAssistant, WeatherEntity } from "../../../types"; -import { findEntities } from "../common/find-entites"; -import { hasConfigOrEntityChanged } from "../common/has-changed"; -import { actionHandler } from "../common/directives/action-handler-directive"; -import { isValidEntityId } from "../../../common/entity/valid_entity_id"; -import { computeStateName } from "../../../common/entity/compute_state_name"; -import { fireEvent } from "../../../common/dom/fire_event"; import { applyThemesOnElement } from "../../../common/dom/apply_themes_on_element"; +import { fireEvent } from "../../../common/dom/fire_event"; +import { computeStateDisplay } from "../../../common/entity/compute_state_display"; +import { computeStateName } from "../../../common/entity/compute_state_name"; +import { stateIcon } from "../../../common/entity/state_icon"; +import { isValidEntityId } from "../../../common/entity/valid_entity_id"; import { debounce } from "../../../common/util/debounce"; +import "../../../components/ha-card"; +import "../../../components/ha-icon"; import { UNAVAILABLE } from "../../../data/entity"; import { - weatherIcons, getSecondaryWeatherAttribute, getWeatherUnit, + weatherIcons, weatherImages, } from "../../../data/weather"; -import { stateIcon } from "../../../common/entity/state_icon"; +import { HomeAssistant, WeatherEntity } from "../../../types"; +import { actionHandler } from "../common/directives/action-handler-directive"; +import { findEntities } from "../common/find-entites"; +import { hasConfigOrEntityChanged } from "../common/has-changed"; +import "../components/hui-warning"; +import { LovelaceCard, LovelaceCardEditor } from "../types"; +import { WeatherForecastCardConfig } from "./types"; const DAY_IN_MILLISECONDS = 86400000; @@ -185,8 +184,11 @@ class HuiWeatherForecastCard extends LitElement implements LovelaceCard { ${this._config.name || computeStateName(stateObj)}
- ${this.hass.localize(`state.weather.${stateObj.state}`) || - stateObj.state} + ${computeStateDisplay( + this.hass.localize, + stateObj, + this.hass.language + )}
diff --git a/src/panels/lovelace/common/generate-lovelace-config.ts b/src/panels/lovelace/common/generate-lovelace-config.ts index 6190d6e4fb..80d5230bb6 100644 --- a/src/panels/lovelace/common/generate-lovelace-config.ts +++ b/src/panels/lovelace/common/generate-lovelace-config.ts @@ -25,6 +25,7 @@ import { EntityRegistryEntry, subscribeEntityRegistry, } from "../../../data/entity_registry"; +import { domainToName } from "../../../data/integration"; import { LovelaceCardConfig, LovelaceConfig, @@ -41,7 +42,6 @@ import { } from "../cards/types"; import { processEditorEntities } from "../editor/process-editor-entities"; import { LovelaceRowConfig, WeblinkConfig } from "../entity-rows/types"; -import { domainToName } from "../../../data/integration"; const DEFAULT_VIEW_ENTITY_ID = "group.default_view"; const DOMAINS_BADGES = [ diff --git a/src/panels/lovelace/components/hui-image.ts b/src/panels/lovelace/components/hui-image.ts index c443bff079..2198bd3754 100644 --- a/src/panels/lovelace/components/hui-image.ts +++ b/src/panels/lovelace/components/hui-image.ts @@ -13,6 +13,7 @@ import { classMap } from "lit-html/directives/class-map"; import { styleMap } from "lit-html/directives/style-map"; import { STATES_OFF } from "../../../common/const"; import parseAspectRatio from "../../../common/util/parse-aspect-ratio"; +import "../../../components/ha-camera-stream"; import { fetchThumbnailUrlWithCache } from "../../../data/camera"; import { CameraEntity, HomeAssistant } from "../../../types"; diff --git a/src/panels/lovelace/components/hui-input-list-editor.ts b/src/panels/lovelace/components/hui-input-list-editor.ts index 0b5ea2e893..daeed5110e 100644 --- a/src/panels/lovelace/components/hui-input-list-editor.ts +++ b/src/panels/lovelace/components/hui-input-list-editor.ts @@ -1,3 +1,4 @@ +import "@polymer/paper-icon-button/paper-icon-button"; import "@polymer/paper-input/paper-input"; import { css, diff --git a/src/panels/lovelace/components/hui-theme-select-editor.ts b/src/panels/lovelace/components/hui-theme-select-editor.ts index a684a3ba3a..d82289c676 100644 --- a/src/panels/lovelace/components/hui-theme-select-editor.ts +++ b/src/panels/lovelace/components/hui-theme-select-editor.ts @@ -1,4 +1,7 @@ import "@material/mwc-button"; +import "@polymer/paper-dropdown-menu/paper-dropdown-menu"; +import "@polymer/paper-item/paper-item"; +import "@polymer/paper-listbox/paper-listbox"; import { css, CSSResult, diff --git a/src/panels/lovelace/editor/card-editor/hui-card-picker.ts b/src/panels/lovelace/editor/card-editor/hui-card-picker.ts index eb0e767a18..3d4be3394e 100644 --- a/src/panels/lovelace/editor/card-editor/hui-card-picker.ts +++ b/src/panels/lovelace/editor/card-editor/hui-card-picker.ts @@ -1,3 +1,4 @@ +import * as Fuse from "fuse.js"; import { css, CSSResult, @@ -11,17 +12,14 @@ import { import { classMap } from "lit-html/directives/class-map"; import { until } from "lit-html/directives/until"; import memoizeOne from "memoize-one"; -import * as Fuse from "fuse.js"; - -import { CardPickTarget } from "../types"; -import { LovelaceCard } from "../../types"; -import { LovelaceCardConfig, LovelaceConfig } from "../../../../data/lovelace"; import { fireEvent } from "../../../../common/dom/fire_event"; +import "../../../../common/search/search-input"; import { UNAVAILABLE_STATES } from "../../../../data/entity"; +import { LovelaceCardConfig, LovelaceConfig } from "../../../../data/lovelace"; import { - CUSTOM_TYPE_PREFIX, CustomCardEntry, customCards, + CUSTOM_TYPE_PREFIX, getCustomCardEntry, } from "../../../../data/lovelace_custom_cards"; import { HomeAssistant } from "../../../../types"; @@ -30,9 +28,9 @@ import { computeUsedEntities, } from "../../common/compute-unused-entities"; import { createCardElement } from "../../create-element/create-card-element"; +import { LovelaceCard } from "../../types"; import { getCardStubConfig } from "../get-card-stub-config"; - -import "../../../../common/search/search-input"; +import { CardPickTarget } from "../types"; interface Card { type: string; diff --git a/src/panels/lovelace/editor/card-editor/hui-dialog-move-card-view.ts b/src/panels/lovelace/editor/card-editor/hui-dialog-move-card-view.ts index ad969baf53..c0cfcd9e68 100644 --- a/src/panels/lovelace/editor/card-editor/hui-dialog-move-card-view.ts +++ b/src/panels/lovelace/editor/card-editor/hui-dialog-move-card-view.ts @@ -35,11 +35,12 @@ export class HuiDialogMoveCardView extends LitElement { @opened-changed="${this._openedChanged}" >

Choose view to move card

- - + + `; } diff --git a/src/panels/lovelace/editor/config-elements/hui-alarm-panel-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-alarm-panel-card-editor.ts index 4d4dde3186..cc763fa2d8 100644 --- a/src/panels/lovelace/editor/config-elements/hui-alarm-panel-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-alarm-panel-card-editor.ts @@ -29,6 +29,8 @@ const cardConfigStruct = struct({ theme: "string?", }); +const includeDomains = ["alarm_control_panel"]; + @customElement("hui-alarm-panel-card-editor") export class HuiAlarmPanelCardEditor extends LitElement implements LovelaceCardEditor { @@ -76,7 +78,7 @@ export class HuiAlarmPanelCardEditor extends LitElement .hass=${this.hass} .value="${this._entity}" .configValue=${"entity"} - .include-domains=${["alarm_control_panel"]} + .includeDomains=${includeDomains} @change="${this._valueChanged}" allow-custom-entity > diff --git a/src/panels/lovelace/editor/config-elements/hui-button-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-button-card-editor.ts index ac90dca17e..17b5ae531c 100644 --- a/src/panels/lovelace/editor/config-elements/hui-button-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-button-card-editor.ts @@ -22,6 +22,7 @@ import { EditorTarget, EntitiesEditorEvent, } from "../types"; +import "../../../../components/ha-switch"; import { configElementStyle } from "./config-elements-style"; const cardConfigStruct = struct({ diff --git a/src/panels/lovelace/editor/config-elements/hui-conditional-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-conditional-card-editor.ts index 086c58d4fc..a7a5b694d8 100644 --- a/src/panels/lovelace/editor/config-elements/hui-conditional-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-conditional-card-editor.ts @@ -1,4 +1,5 @@ import "@polymer/paper-tabs"; +import "@polymer/paper-tabs/paper-tab"; import { css, CSSResult, @@ -21,6 +22,7 @@ import { ConfigChangedEvent, HuiCardEditor, } from "../card-editor/hui-card-editor"; +import "../card-editor/hui-card-picker"; import { GUIModeChangedEvent } from "../types"; const conditionStruct = struct({ diff --git a/src/panels/lovelace/editor/config-elements/hui-gauge-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-gauge-card-editor.ts index 4f85e75ddb..c9b589bb4b 100644 --- a/src/panels/lovelace/editor/config-elements/hui-gauge-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-gauge-card-editor.ts @@ -30,6 +30,8 @@ const cardConfigStruct = struct({ theme: "string?", }); +const includeDomains = ["sensor"]; + @customElement("hui-gauge-card-editor") export class HuiGaugeCardEditor extends LitElement implements LovelaceCardEditor { @@ -87,7 +89,7 @@ export class HuiGaugeCardEditor extends LitElement .hass=${this.hass} .value="${this._entity}" .configValue=${"entity"} - .include-domains=${["sensor"]} + .includeDomains=${includeDomains} @change="${this._valueChanged}" allow-custom-entity > diff --git a/src/panels/lovelace/editor/config-elements/hui-light-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-light-card-editor.ts index c05d30178c..d91f43acfa 100644 --- a/src/panels/lovelace/editor/config-elements/hui-light-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-light-card-editor.ts @@ -34,6 +34,8 @@ const cardConfigStruct = struct({ double_tap_action: struct.optional(actionConfigStruct), }); +const includeDomains = ["light"]; + @customElement("hui-light-card-editor") export class HuiLightCardEditor extends LitElement implements LovelaceCardEditor { @@ -95,7 +97,7 @@ export class HuiLightCardEditor extends LitElement .hass=${this.hass} .value=${this._entity} .configValue=${"entity"} - .include-domains=${["light"]} + .includeDomains=${includeDomains} @change=${this._valueChanged} allow-custom-entity > diff --git a/src/panels/lovelace/editor/config-elements/hui-map-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-map-card-editor.ts index 62fc12f5f3..995cb222ff 100644 --- a/src/panels/lovelace/editor/config-elements/hui-map-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-map-card-editor.ts @@ -23,6 +23,7 @@ import { entitiesConfigStruct, EntitiesEditorEvent, } from "../types"; +import "../../../../components/ha-switch"; import { configElementStyle } from "./config-elements-style"; const cardConfigStruct = struct({ diff --git a/src/panels/lovelace/editor/config-elements/hui-media-control-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-media-control-card-editor.ts index 5f78265b17..6169664dda 100644 --- a/src/panels/lovelace/editor/config-elements/hui-media-control-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-media-control-card-editor.ts @@ -18,6 +18,8 @@ const cardConfigStruct = struct({ entity: "string?", }); +const includeDomains = ["media_player"]; + @customElement("hui-media-control-card-editor") export class HuiMediaControlCardEditor extends LitElement implements LovelaceCardEditor { @@ -50,7 +52,7 @@ export class HuiMediaControlCardEditor extends LitElement .hass=${this.hass} .value="${this._entity}" .configValue=${"entity"} - .include-domains=${["media_player"]} + .includeDomains=${includeDomains} @change="${this._valueChanged}" allow-custom-entity > diff --git a/src/panels/lovelace/editor/config-elements/hui-picture-entity-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-picture-entity-card-editor.ts index 3d7b46d751..47492336b0 100644 --- a/src/panels/lovelace/editor/config-elements/hui-picture-entity-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-picture-entity-card-editor.ts @@ -41,6 +41,8 @@ const cardConfigStruct = struct({ theme: "string?", }); +const includeDomains = ["camera"]; + @customElement("hui-picture-entity-card-editor") export class HuiPictureEntityCardEditor extends LitElement implements LovelaceCardEditor { @@ -150,7 +152,7 @@ export class HuiPictureEntityCardEditor extends LitElement .value="${this._camera_image}" .configValue=${"camera_image"} @change="${this._valueChanged}" - .include-domains=${["camera"]} + .includeDomains=${includeDomains} allow-custom-entity >
diff --git a/src/panels/lovelace/editor/config-elements/hui-picture-glance-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-picture-glance-card-editor.ts index c45f910ce1..1dfc60265d 100644 --- a/src/panels/lovelace/editor/config-elements/hui-picture-glance-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-picture-glance-card-editor.ts @@ -43,6 +43,8 @@ const cardConfigStruct = struct({ theme: "string?", }); +const includeDomains = ["camera"]; + @customElement("hui-picture-glance-card-editor") export class HuiPictureGlanceCardEditor extends LitElement implements LovelaceCardEditor { @@ -150,7 +152,7 @@ export class HuiPictureGlanceCardEditor extends LitElement .configValue=${"camera_image"} @change="${this._valueChanged}" allow-custom-entity - .include-domains=${["camera"]} + .includeDomains=${includeDomains} >
diff --git a/src/panels/lovelace/editor/config-elements/hui-sensor-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-sensor-card-editor.ts index 8b7077e2ec..458e877e78 100644 --- a/src/panels/lovelace/editor/config-elements/hui-sensor-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-sensor-card-editor.ts @@ -33,6 +33,8 @@ const cardConfigStruct = struct({ hours_to_show: "number?", }); +const includeDomains = ["sensor"]; + @customElement("hui-sensor-card-editor") export class HuiSensorCardEditor extends LitElement implements LovelaceCardEditor { @@ -96,7 +98,7 @@ export class HuiSensorCardEditor extends LitElement .hass=${this.hass} .value="${this._entity}" .configValue=${"entity"} - .include-domains=${["sensor"]} + .includeDomains=${includeDomains} @change="${this._valueChanged}" allow-custom-entity > diff --git a/src/panels/lovelace/editor/config-elements/hui-stack-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-stack-card-editor.ts index ffc36e9247..b7bc77f969 100644 --- a/src/panels/lovelace/editor/config-elements/hui-stack-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-stack-card-editor.ts @@ -1,4 +1,6 @@ +import "@polymer/paper-icon-button/paper-icon-button"; import "@polymer/paper-tabs"; +import "@polymer/paper-tabs/paper-tab"; import { css, CSSResult, @@ -19,6 +21,7 @@ import { ConfigChangedEvent, HuiCardEditor, } from "../card-editor/hui-card-editor"; +import "../card-editor/hui-card-picker"; import { GUIModeChangedEvent } from "../types"; const cardConfigStruct = struct({ @@ -79,63 +82,61 @@ export class HuiStackCardEditor extends LitElement - +
- ${ - selected < numcards - ? html` -
- - ${this.hass!.localize( - !this._cardEditorEl || this._GUImode - ? "ui.panel.lovelace.editor.edit_card.show_code_editor" - : "ui.panel.lovelace.editor.edit_card.show_visual_editor" - )} - - + ${selected < numcards + ? html` +
+ + ${this.hass!.localize( + !this._cardEditorEl || this._GUImode + ? "ui.panel.lovelace.editor.edit_card.show_code_editor" + : "ui.panel.lovelace.editor.edit_card.show_visual_editor" + )} + + - + - -
+ +
- - ` - : html` - - ` - } + + ` + : html` + + `}
`; diff --git a/src/panels/lovelace/editor/config-elements/hui-thermostat-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-thermostat-card-editor.ts index ba4116614f..0ce99f1323 100644 --- a/src/panels/lovelace/editor/config-elements/hui-thermostat-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-thermostat-card-editor.ts @@ -23,6 +23,8 @@ const cardConfigStruct = struct({ theme: "string?", }); +const includeDomains = ["climate"]; + @customElement("hui-thermostat-card-editor") export class HuiThermostatCardEditor extends LitElement implements LovelaceCardEditor { @@ -64,7 +66,7 @@ export class HuiThermostatCardEditor extends LitElement .hass=${this.hass} .value="${this._entity}" .configValue=${"entity"} - .include-domains=${["climate"]} + .includeDomains=${includeDomains} @change="${this._valueChanged}" allow-custom-entity > diff --git a/src/panels/lovelace/editor/config-elements/hui-weather-forecast-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-weather-forecast-card-editor.ts index f8d8415bbe..e4f9ab4815 100644 --- a/src/panels/lovelace/editor/config-elements/hui-weather-forecast-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-weather-forecast-card-editor.ts @@ -8,13 +8,12 @@ import { import { fireEvent } from "../../../../common/dom/fire_event"; import "../../../../components/entity/ha-entity-picker"; import "../../../../components/ha-switch"; - -import { EntitiesEditorEvent, EditorTarget } from "../types"; import { HomeAssistant } from "../../../../types"; import { WeatherForecastCardConfig } from "../../cards/types"; import { struct } from "../../common/structs/struct"; import "../../components/hui-theme-select-editor"; import { LovelaceCardEditor } from "../../types"; +import { EditorTarget, EntitiesEditorEvent } from "../types"; import { configElementStyle } from "./config-elements-style"; const cardConfigStruct = struct({ @@ -25,6 +24,8 @@ const cardConfigStruct = struct({ show_forecast: "boolean?", }); +const includeDomains = ["weather"]; + @customElement("hui-weather-forecast-card-editor") export class HuiWeatherForecastCardEditor extends LitElement implements LovelaceCardEditor { @@ -70,7 +71,7 @@ export class HuiWeatherForecastCardEditor extends LitElement .hass=${this.hass} .value=${this._entity} .configValue=${"entity"} - .includeDomains=${["weather"]} + .includeDomains=${includeDomains} @change=${this._valueChanged} allow-custom-entity > diff --git a/src/panels/lovelace/editor/hui-dialog-save-config.ts b/src/panels/lovelace/editor/hui-dialog-save-config.ts index 30f60d2a04..9ca6a348a5 100644 --- a/src/panels/lovelace/editor/hui-dialog-save-config.ts +++ b/src/panels/lovelace/editor/hui-dialog-save-config.ts @@ -1,4 +1,5 @@ import "@material/mwc-button"; +import "@polymer/paper-dialog-scrollable/paper-dialog-scrollable"; import "@polymer/paper-spinner/paper-spinner"; import { css, diff --git a/src/panels/lovelace/editor/select-view/hui-dialog-select-view.ts b/src/panels/lovelace/editor/select-view/hui-dialog-select-view.ts index 9aae8ec878..a9b90a0d2b 100644 --- a/src/panels/lovelace/editor/select-view/hui-dialog-select-view.ts +++ b/src/panels/lovelace/editor/select-view/hui-dialog-select-view.ts @@ -43,10 +43,11 @@ export class HuiDialogSelectView extends LitElement { @opened-changed="${this._openedChanged}" >

Choose a view

- - + + `; } diff --git a/src/panels/lovelace/entity-rows/hui-input-number-entity-row.ts b/src/panels/lovelace/entity-rows/hui-input-number-entity-row.ts index 92d55253f7..ab7e839980 100644 --- a/src/panels/lovelace/entity-rows/hui-input-number-entity-row.ts +++ b/src/panels/lovelace/entity-rows/hui-input-number-entity-row.ts @@ -1,3 +1,4 @@ +import "@polymer/paper-input/paper-input"; import { css, CSSResult, diff --git a/src/panels/lovelace/entity-rows/hui-lock-entity-row.ts b/src/panels/lovelace/entity-rows/hui-lock-entity-row.ts index 322ec83208..d37018cd71 100644 --- a/src/panels/lovelace/entity-rows/hui-lock-entity-row.ts +++ b/src/panels/lovelace/entity-rows/hui-lock-entity-row.ts @@ -1,3 +1,4 @@ +import "@material/mwc-button/mwc-button"; import { css, CSSResult, diff --git a/src/panels/lovelace/entity-rows/hui-scene-entity-row.ts b/src/panels/lovelace/entity-rows/hui-scene-entity-row.ts index 15b0f77798..87e16c12b7 100644 --- a/src/panels/lovelace/entity-rows/hui-scene-entity-row.ts +++ b/src/panels/lovelace/entity-rows/hui-scene-entity-row.ts @@ -1,3 +1,4 @@ +import "@material/mwc-button/mwc-button"; import { css, CSSResult, diff --git a/src/panels/lovelace/entity-rows/hui-script-entity-row.ts b/src/panels/lovelace/entity-rows/hui-script-entity-row.ts index 35413531b0..01e8a5bddb 100644 --- a/src/panels/lovelace/entity-rows/hui-script-entity-row.ts +++ b/src/panels/lovelace/entity-rows/hui-script-entity-row.ts @@ -1,3 +1,4 @@ +import "@material/mwc-button/mwc-button"; import { css, CSSResult, diff --git a/src/panels/lovelace/entity-rows/hui-weather-entity-row.ts b/src/panels/lovelace/entity-rows/hui-weather-entity-row.ts index dc1e526322..2e04013bb1 100644 --- a/src/panels/lovelace/entity-rows/hui-weather-entity-row.ts +++ b/src/panels/lovelace/entity-rows/hui-weather-entity-row.ts @@ -8,17 +8,20 @@ import { PropertyValues, TemplateResult, } from "lit-element"; +import { computeStateDisplay } from "../../../common/entity/compute_state_display"; import "../../../components/entity/state-badge"; import { UNAVAILABLE_STATES } from "../../../data/entity"; import { + getSecondaryWeatherAttribute, getWeatherUnit, weatherIcons, weatherImages, - getSecondaryWeatherAttribute, } from "../../../data/weather"; import { HomeAssistant, WeatherEntity } from "../../../types"; import { EntitiesCardEntityConfig } from "../cards/types"; import { hasConfigOrEntityChanged } from "../common/has-changed"; +import "../components/hui-generic-entity-row"; +import "../components/hui-warning"; import { LovelaceRow } from "./types"; @customElement("hui-weather-entity-row") @@ -69,8 +72,11 @@ class HuiWeatherEntityRow extends LitElement implements LovelaceRow {
${UNAVAILABLE_STATES.includes(stateObj.state) - ? this.hass.localize(`state.default.${stateObj.state}`) || - stateObj.state + ? computeStateDisplay( + this.hass.localize, + stateObj, + this.hass.language + ) : html` ${stateObj.attributes.temperature} ${getWeatherUnit(this.hass, "temperature")} diff --git a/src/panels/lovelace/ha-panel-lovelace.ts b/src/panels/lovelace/ha-panel-lovelace.ts index e405ac902f..16a0054c92 100644 --- a/src/panels/lovelace/ha-panel-lovelace.ts +++ b/src/panels/lovelace/ha-panel-lovelace.ts @@ -7,6 +7,7 @@ import { PropertyValues, TemplateResult, } from "lit-element"; +import { domainToName } from "../../data/integration"; import { deleteConfig, fetchConfig, @@ -25,7 +26,6 @@ import { loadLovelaceResources } from "./common/load-resources"; import { showSaveDialog } from "./editor/show-save-config-dialog"; import "./hui-root"; import { Lovelace } from "./types"; -import { domainToName } from "../../data/integration"; (window as any).loadCardHelpers = () => import("./custom-card-helpers"); diff --git a/src/panels/lovelace/header-footer/hui-graph-header-footer.ts b/src/panels/lovelace/header-footer/hui-graph-header-footer.ts index 05f311fd83..0d0c04422f 100644 --- a/src/panels/lovelace/header-footer/hui-graph-header-footer.ts +++ b/src/panels/lovelace/header-footer/hui-graph-header-footer.ts @@ -1,3 +1,5 @@ +import "@polymer/paper-spinner/paper-spinner"; +import { HassEntity } from "home-assistant-js-websocket"; import { css, CSSResult, @@ -8,16 +10,13 @@ import { PropertyValues, TemplateResult, } from "lit-element"; +import { fetchRecent } from "../../../data/history"; import { HomeAssistant } from "../../../types"; -import { HassEntity } from "home-assistant-js-websocket"; - -import "@polymer/paper-spinner/paper-spinner"; +import { coordinates } from "../common/graph/coordinates"; +import { hasConfigOrEntityChanged } from "../common/has-changed"; import "../components/hui-graph-base"; import { LovelaceHeaderFooter } from "../types"; import { GraphHeaderFooterConfig } from "./types"; -import { hasConfigOrEntityChanged } from "../common/has-changed"; -import { fetchRecent } from "../../../data/history"; -import { coordinates } from "../common/graph/coordinates"; const MINUTE = 60000; const DAY = 86400000; diff --git a/src/panels/lovelace/hui-root.ts b/src/panels/lovelace/hui-root.ts index 2501ccdf5f..c311e930f3 100644 --- a/src/panels/lovelace/hui-root.ts +++ b/src/panels/lovelace/hui-root.ts @@ -28,6 +28,7 @@ import { computeRTLDirection } from "../../common/util/compute_rtl"; import { debounce } from "../../common/util/debounce"; import { afterNextRender } from "../../common/util/render-status"; import "../../components/ha-icon"; +import "../../components/ha-menu-button"; import "../../components/ha-paper-icon-button-arrow-next"; import "../../components/ha-paper-icon-button-arrow-prev"; import type { LovelaceConfig, LovelacePanelConfig } from "../../data/lovelace"; @@ -81,12 +82,17 @@ class HUIRoot extends LitElement { protected render(): TemplateResult { return html` - - - ${ - this._editMode + + + ${this._editMode ? html` - ` - } - - ${ - this.lovelace!.config.views.length > 1 || this._editMode + `} + ${this.lovelace!.config.views.length > 1 || this._editMode ? html`
` - : "" - } -
-
- + : ""} +
+
+
`; } diff --git a/src/panels/lovelace/special-rows/hui-cast-row.ts b/src/panels/lovelace/special-rows/hui-cast-row.ts index 4b70d198fc..abfb00e6fa 100644 --- a/src/panels/lovelace/special-rows/hui-cast-row.ts +++ b/src/panels/lovelace/special-rows/hui-cast-row.ts @@ -1,3 +1,4 @@ +import "@material/mwc-button/mwc-button"; import { css, CSSResult, diff --git a/src/panels/lovelace/special-rows/hui-text-row.ts b/src/panels/lovelace/special-rows/hui-text-row.ts index fac5b08046..f526070893 100644 --- a/src/panels/lovelace/special-rows/hui-text-row.ts +++ b/src/panels/lovelace/special-rows/hui-text-row.ts @@ -1,16 +1,14 @@ import { - html, - LitElement, - TemplateResult, - customElement, - property, css, CSSResult, + customElement, + html, + LitElement, + property, + TemplateResult, } from "lit-element"; - -import { LovelaceRow, TextConfig } from "../entity-rows/types"; - import "../../../components/ha-icon"; +import { LovelaceRow, TextConfig } from "../entity-rows/types"; @customElement("hui-text-row") class HuiTextRow extends LitElement implements LovelaceRow { diff --git a/src/panels/profile/ha-advanced-mode-row.ts b/src/panels/profile/ha-advanced-mode-row.ts index c0d7942c70..77df00c329 100644 --- a/src/panels/profile/ha-advanced-mode-row.ts +++ b/src/panels/profile/ha-advanced-mode-row.ts @@ -8,11 +8,13 @@ import { TemplateResult, } from "lit-element"; import "../../components/ha-card"; +import "../../components/ha-switch"; import { CoreFrontendUserData, getOptimisticFrontendUserDataCollection, } from "../../data/frontend"; import { HomeAssistant } from "../../types"; +import "./ha-settings-row"; @customElement("ha-advanced-mode-row") class AdvancedModeRow extends LitElement { diff --git a/src/state-summary/state-card-configurator.js b/src/state-summary/state-card-configurator.js index fe6199c9c3..38ced37982 100644 --- a/src/state-summary/state-card-configurator.js +++ b/src/state-summary/state-card-configurator.js @@ -3,6 +3,7 @@ import "@polymer/iron-flex-layout/iron-flex-layout-classes"; import { html } from "@polymer/polymer/lib/utils/html-tag"; /* eslint-plugin-disable lit */ import { PolymerElement } from "@polymer/polymer/polymer-element"; +import { computeStateDisplay } from "../common/entity/compute_state_display"; import "../components/entity/state-info"; import LocalizeMixin from "../mixins/localize-mixin"; @@ -24,7 +25,7 @@ class StateCardConfigurator extends LocalizeMixin(PolymerElement) {
${this.stateInfoTemplate} [[_localizeState(stateObj.state)]][[_localizeState(stateObj)]]
@@ -56,8 +57,12 @@ class StateCardConfigurator extends LocalizeMixin(PolymerElement) { }; } - _localizeState(state) { - return this.localize(`state.configurator.${state}`); + _localizeState(stateObj) { + return computeStateDisplay( + this.hass.localize, + stateObj, + this.hass.language + ); } } customElements.define("state-card-configurator", StateCardConfigurator); diff --git a/src/state-summary/state-card-media_player.js b/src/state-summary/state-card-media_player.js index 048034be74..164e1b52cb 100644 --- a/src/state-summary/state-card-media_player.js +++ b/src/state-summary/state-card-media_player.js @@ -2,6 +2,7 @@ import "@polymer/iron-flex-layout/iron-flex-layout-classes"; import { html } from "@polymer/polymer/lib/utils/html-tag"; /* eslint-plugin-disable lit */ import { PolymerElement } from "@polymer/polymer/polymer-element"; +import { computeStateDisplay } from "../common/entity/compute_state_display"; import "../components/entity/state-info"; import LocalizeMixin from "../mixins/localize-mixin"; import HassMediaPlayerEntity from "../util/hass-media-player-model"; @@ -85,9 +86,7 @@ class StateCardMediaPlayer extends LocalizeMixin(PolymerElement) { computePrimaryText(localize, playerObj) { return ( playerObj.primaryTitle || - localize(`state.media_player.${playerObj.stateObj.state}`) || - localize(`state.default.${playerObj.stateObj.state}`) || - playerObj.stateObj.state + computeStateDisplay(localize, playerObj.stateObj, this.hass.language) ); } } diff --git a/src/state/translations-mixin.ts b/src/state/translations-mixin.ts index 92fbde74ab..345f0d13d6 100644 --- a/src/state/translations-mixin.ts +++ b/src/state/translations-mixin.ts @@ -1,10 +1,12 @@ +import { atLeastVersion } from "../common/config/version"; import { computeLocalize } from "../common/translations/localize"; import { computeRTL } from "../common/util/compute_rtl"; +import { debounce } from "../common/util/debounce"; import { getHassTranslations, + getHassTranslationsPre109, saveTranslationPreferences, TranslationCategory, - getHassTranslationsPre109, } from "../data/translation"; import { translationMetadata } from "../resources/translations-metadata"; import { Constructor, HomeAssistant } from "../types"; @@ -15,8 +17,6 @@ import { getUserLanguage, } from "../util/hass-translation"; import { HassBaseEl } from "./hass-base-mixin"; -import { atLeastVersion } from "../common/config/version"; -import { debounce } from "../common/util/debounce"; interface LoadedTranslationCategory { // individual integrations loaded for this category diff --git a/src/translations/en.json b/src/translations/en.json index 81f6e23278..48ac0a20fa 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1431,8 +1431,6 @@ } }, "zha": { - "caption": "ZHA", - "title": "Zigbee Home Automation", "header": "Configure Zigbee Home Automation", "introduction": "Here it is possible to configure the ZHA component. Not everything is possible to configure from the UI yet, but we're working on it.", "description": "Zigbee Home Automation network management", @@ -1714,9 +1712,9 @@ }, "save_config": { "header": "Take control of your Lovelace UI", - "para": "By default Home Assistant will maintain your user interface, updating it when new entities or Lovelace UI components become available. If you take control we will no longer make changes automatically for you.", + "para": "This dashboard is currently being maintained by Home Assistant. It is automatically updated when new entities or Lovelace UI components become available. If you take control, this dashboard will no longer be automatically updated. You can always create a new dashboard in configuration to play around with.", "para_sure": "Are you sure you want to take control of your user interface?", - "yaml_mode": "You are using YAML mode, which means you cannot change your Lovelace config from the UI. If you want to change Lovelace from the UI, remove 'mode: yaml' from your Lovelace configuration in 'configuration.yaml.'", + "yaml_mode": "You are using YAML mode for this dashboard, which means you cannot change your Lovelace config from the UI. If you want to manage this dashboard from the UI, remove 'mode: yaml' from your Lovelace configuration in 'configuration.yaml.'.", "yaml_control": "To take control in YAML mode, create a YAML file with the name you specified in your config for this dashboard, or the default 'ui-lovelace.yaml'.", "yaml_config": "To help you start here is the current config of this dashboard:", "empty_config": "Start with an empty dashboard", diff --git a/src/types.ts b/src/types.ts index 6a42dce227..6d06370b50 100644 --- a/src/types.ts +++ b/src/types.ts @@ -10,8 +10,8 @@ import { } from "home-assistant-js-websocket"; import { LocalizeFunc } from "./common/translations/localize"; import { CoreFrontendUserData } from "./data/frontend"; -import { ExternalMessaging } from "./external_app/external_messaging"; import { getHassTranslations } from "./data/translation"; +import { ExternalMessaging } from "./external_app/external_messaging"; declare global { /* eslint-disable no-var, no-redeclare */ diff --git a/translations/ca.json b/translations/ca.json index dad2926155..b7e739bf5e 100644 --- a/translations/ca.json +++ b/translations/ca.json @@ -654,6 +654,17 @@ "stop": "Atura" } }, + "mqtt_device_debug_info": { + "deserialize": "Intenta analitzar els missatges MQTT com a format JSON", + "entities": "Entitats", + "no_entities": "No hi ha entitats", + "no_triggers": "No hi ha disparadors", + "payload_display": "Mostra les dades/payload", + "recent_messages": "{n} últim/s missatge/s rebut/s", + "show_as_yaml": "Mostra en YAML", + "title": "Informació de depuració de {device}", + "triggers": "Disparadors" + }, "options_flow": { "form": { "header": "Opcions" @@ -763,7 +774,7 @@ "add": "Afegir acció", "delete": "Elimina", "delete_confirm": "Segur que vols eliminar-ho?", - "duplicate": "Duplicar", + "duplicate": "Duplica", "header": "Accions", "introduction": "Les accions són allò que farà Home Assistant quan es dispari l'automatització i es compleixin totes les condicions (si n'hi ha).", "learn_more": "Més informació sobre les accions", @@ -808,7 +819,7 @@ "add": "Afegir condició", "delete": "Elimina", "delete_confirm": "Segur que vols eliminar-ho?", - "duplicate": "Duplicar", + "duplicate": "Duplica", "header": "Condicions", "introduction": "Les condicions són part opcional d'una automatització i es poden utilitzar per permetre o evitar que es produeixi una acció quan es dispari l'automatització. Les condicions són similars als activadors però funcionen de forma diferent: un activador analitza els esdeveniments que ocorren en el sistema mentre que una condició només observa com està el sistema en un moment determinat, per exemple, un activador se n'adonarà de quan s'està activant un interruptor mentre que una condició només pot veure si un interruptor està activat o desactivat.", "learn_more": "Més informació sobre les condicions", @@ -878,15 +889,15 @@ "load_error_unknown": "Error en carregar l’automatització ({err_no}).", "save": "Desa", "triggers": { - "add": "Afegir activador", + "add": "Afegeix disparador", "delete": "Elimina", "delete_confirm": "Segur que vols eliminar-ho?", - "duplicate": "Duplicar", - "header": "Activadors", + "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ó.", "learn_more": "Més informació sobre els activadors", "name": "Disparador", - "type_select": "Tipus d'activador", + "type_select": "Tipus de disparador", "type": { "device": { "extra_fields": { @@ -1046,7 +1057,7 @@ "link_learn_more": "Més informació sobre la creació d'automatizacions basats en webhook.", "loading": "Carregant ...", "manage": "Gestiona", - "no_hooks_yet": "Sembla que encara no tens cap webhook. Comença configurant una", + "no_hooks_yet": "Sembla que encara no tens cap webhook. Comença configurant una ", "no_hooks_yet_link_automation": "automatització de webhook", "no_hooks_yet_link_integration": "integració basada en webhook", "no_hooks_yet2": "o bé creant una", @@ -1294,6 +1305,10 @@ } } }, + "filtering": { + "clear": "Esborra", + "filtering_by": "Filtratge per" + }, "header": "Configuració de Home Assistant", "helpers": { "caption": "Ajudants", @@ -1321,12 +1336,16 @@ } }, "integrations": { + "add_integration": "Afegeix integració", "caption": "Integracions", "config_entry": { "area": "A {area}", + "delete": "Elimina", "delete_button": "Elimina {integration}", "delete_confirm": "Estàs segur que vols eliminar aquesta integració?", "device_unavailable": "dispositiu no disponible", + "devices": "{count} {count, plural,\n one {dispositiu}\n other {dispositius}\n}", + "entities": "{count} {count, plural,\n one {entitat}\n other {entitats}\n}", "entity_unavailable": "entitat no disponible", "firmware": "Firmware: {version}", "hub": "Connectat a través de", @@ -1334,8 +1353,11 @@ "no_area": "Sense àrea", "no_device": "Entitats sense dispositius", "no_devices": "Aquesta integració no té dispositius.", + "options": "Opcions", + "rename": "Canvia el nom", "restart_confirm": "Reinicia el 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}" }, "config_flow": { @@ -1370,11 +1392,15 @@ "show_ignored": "Mostra les integracions ignorades", "stop_ignore": "Deixa d'ignorar" }, + "integration": "integració", "integration_not_found": "No s'ha trobat la integració.", "new": "Configura una nova integració", + "no_integrations": "Sembla que encara no tens cap integració configurada. Prem al botó de sota per afegir la teva primera integració!", "none": "Encara no hi ha res configurat", "note_about_integrations": "Encara no es poden configurar totes les integracions a través de la UI.", - "note_about_website_reference": "N'hi ha més disponibles al " + "note_about_website_reference": "N'hi ha més disponibles al ", + "rename_dialog": "Edita el nom de l'entrada de configuració", + "rename_input_label": "Nom de l’entrada" }, "introduction": "Aquí pots configurar Home Assistant i els seus components. Encara no és possible configurar-ho tot des de la interfície d'usuari, però hi estem treballant.", "lovelace": { @@ -2241,7 +2267,8 @@ "warning": { "attribute_not_found": "L'atribut {attribute} de {entity} no és disponible.", "entity_non_numeric": "Entitat no numèrica: {entity}", - "entity_not_found": "Entitat no disponible: {entity}" + "entity_not_found": "Entitat no disponible: {entity}", + "entity_unavailable": "{entity} no està disponible actualment" } }, "mailbox": { diff --git a/translations/da.json b/translations/da.json index f8d2846d5c..9644e9a28c 100644 --- a/translations/da.json +++ b/translations/da.json @@ -291,8 +291,8 @@ "docked": "I dock", "error": "Fejl", "idle": "Inaktiv", - "off": "Off", - "on": "On", + "off": "Slukket", + "on": "Tændt", "paused": "Sat på pause", "returning": "Vender tilbage til dock" }, @@ -742,6 +742,7 @@ "description": "Oversigt over alle områder i dit hjem.", "editor": { "create": "Opret", + "default_name": "Nyt område", "delete": "Slet", "update": "Opdater" }, @@ -750,7 +751,8 @@ "header": "Områder", "integrations_page": "Integrationsside", "introduction": "Områder bruges til at organisere hvor enheder befinder sig. Disse oplysninger vil blive brugt i Home Assistant til at hjælpe dig med at organisere din brugerflade, tilladelser og integrationer med andre systemer.", - "introduction2": "Hvis du vil placere enheder i et område, skal du bruge linket herunder til at navigere til integrationssiden og derefter klikke på en konfigureret integration for at komme til enhedskortene." + "introduction2": "Hvis du vil placere enheder i et område, skal du bruge linket herunder til at navigere til integrationssiden og derefter klikke på en konfigureret integration for at komme til enhedskortene.", + "no_areas": "Det ser ud til, at du endnu ikke har nogen områder endnu!" } }, "automation": { diff --git a/translations/en.json b/translations/en.json index fe53201b2c..f39b939c20 100644 --- a/translations/en.json +++ b/translations/en.json @@ -654,6 +654,17 @@ "stop": "Stop" } }, + "mqtt_device_debug_info": { + "deserialize": "Attempt to parse MQTT messages as JSON", + "entities": "Entities", + "no_entities": "No entities", + "no_triggers": "No triggers", + "payload_display": "Payload display", + "recent_messages": "{n} most recently received message(s)", + "show_as_yaml": "Show as YAML", + "title": "{device} debug info", + "triggers": "Triggers" + }, "options_flow": { "form": { "header": "Options" @@ -1294,6 +1305,10 @@ } } }, + "filtering": { + "clear": "Clear", + "filtering_by": "Filtering by" + }, "header": "Configure Home Assistant", "helpers": { "caption": "Helpers", @@ -1321,12 +1336,16 @@ } }, "integrations": { + "add_integration": "Add integration", "caption": "Integrations", "config_entry": { "area": "In {area}", + "delete": "Delete", "delete_button": "Delete {integration}", "delete_confirm": "Are you sure you want to delete this integration?", "device_unavailable": "device unavailable", + "devices": "{count} {count, plural,\n one {device}\n other {devices}\n}", + "entities": "{count} {count, plural,\n one {entity}\n other {entities}\n}", "entity_unavailable": "entity unavailable", "firmware": "Firmware: {version}", "hub": "Connected via", @@ -1334,8 +1353,11 @@ "no_area": "No Area", "no_device": "Entities without devices", "no_devices": "This integration has no devices.", + "options": "Options", + "rename": "Rename", "restart_confirm": "Restart Home Assistant to finish removing this integration", "settings_button": "Edit settings for {integration}", + "system_options": "System options", "system_options_button": "System options for {integration}" }, "config_flow": { @@ -1370,11 +1392,15 @@ "show_ignored": "Show ignored integrations", "stop_ignore": "Stop ignoring" }, + "integration": "integration", "integration_not_found": "Integration not found.", "new": "Set up a new integration", + "no_integrations": "Seems like you don't have any integations configured yet. Click on the button below to add your first integration!", "none": "Nothing configured yet", "note_about_integrations": "Not all integrations can be configured via the UI yet.", - "note_about_website_reference": "More are available on the " + "note_about_website_reference": "More are available on the ", + "rename_dialog": "Edit the name of this config entry", + "rename_input_label": "Entry name" }, "introduction": "Here it is possible to configure your components and Home Assistant. Not everything is possible to configure from the UI yet, but we're working on it.", "lovelace": { @@ -2241,7 +2267,8 @@ "warning": { "attribute_not_found": "Attribute {attribute} not available in: {entity}", "entity_non_numeric": "Entity is non-numeric: {entity}", - "entity_not_found": "Entity not available: {entity}" + "entity_not_found": "Entity not available: {entity}", + "entity_unavailable": "{entity} is currently unavailable" } }, "mailbox": { diff --git a/translations/es.json b/translations/es.json index d776fbf248..812bce064d 100644 --- a/translations/es.json +++ b/translations/es.json @@ -654,6 +654,17 @@ "stop": "Detener" } }, + "mqtt_device_debug_info": { + "deserialize": "Intentar analizar mensajes MQTT como JSON", + "entities": "Entidades", + "no_entities": "No hay entidades", + "no_triggers": "No hay desencadenantes", + "payload_display": "Mostrar payload", + "recent_messages": "{n} mensaje(s) recibidos más recientemente", + "show_as_yaml": "Mostrar como YAML", + "title": "{device} información de depuración", + "triggers": "Desencadenantes" + }, "options_flow": { "form": { "header": "Opciones" @@ -1294,6 +1305,10 @@ } } }, + "filtering": { + "clear": "Limpiar", + "filtering_by": "Filtrando por" + }, "header": "Configurar Home Assistant", "helpers": { "caption": "Ayudantes", @@ -1321,12 +1336,16 @@ } }, "integrations": { + "add_integration": "Añadir integración", "caption": "Integraciones", "config_entry": { "area": "En {area}", + "delete": "Eliminar", "delete_button": "Eliminar {integration}", "delete_confirm": "¿Estás seguro de que quieres eliminar esta integración?", "device_unavailable": "dispositivo no disponible", + "devices": "{count} {count, plural,\n one {dispositivo}\n other {dispositivos}\n}", + "entities": "{count} {count, plural,\n one {entidad}\n other {entidades}\n}", "entity_unavailable": "entidad no disponible", "firmware": "Firmware: {version}", "hub": "Conectado a través de", @@ -1334,8 +1353,11 @@ "no_area": "Ningún área", "no_device": "Entidades sin dispositivos", "no_devices": "Esta integración no tiene dispositivos.", + "options": "Opciones", + "rename": "Renombrar", "restart_confirm": "Reinicia Home Assistant para terminar de eliminar esta integración.", "settings_button": "Editar configuración para {integration}", + "system_options": "Opciones del sistema", "system_options_button": "Opciones del sistema para {integration}" }, "config_flow": { @@ -1370,11 +1392,15 @@ "show_ignored": "Mostrar integraciones ignoradas", "stop_ignore": "Dejar de ignorar" }, + "integration": "integración", "integration_not_found": "Integración no encontrada.", "new": "Configurar una nueva integración.", + "no_integrations": "Parece que todavía no tienes ninguna integración configurada. ¡Pulsa en el botón de abajo para añadir tu primera integración!", "none": "Todavía no hay nada configurado", "note_about_integrations": "Todavía no se pueden configurar todas las integraciones a través de la interfaz de usuario.", - "note_about_website_reference": "Más están disponibles en el" + "note_about_website_reference": "Más están disponibles en el", + "rename_dialog": "Edita el nombre de esta entrada de configuración", + "rename_input_label": "Nombre de la entrada" }, "introduction": "Aquí puedes configurar tus componentes y Home Assistant. Aún no es posible configurar todo desde la interfaz de usuario, pero estamos trabajando en ello.", "lovelace": { @@ -2241,7 +2267,8 @@ "warning": { "attribute_not_found": "El atributo {attribute} no está disponible en: {entity}", "entity_non_numeric": "La entidad no es numérica: {entity}", - "entity_not_found": "La entidad no está disponible: {entity}" + "entity_not_found": "La entidad no está disponible: {entity}", + "entity_unavailable": "{entity} no está disponible actualmente" } }, "mailbox": { diff --git a/translations/fi.json b/translations/fi.json index c886a3c442..1f26d8647c 100644 --- a/translations/fi.json +++ b/translations/fi.json @@ -352,8 +352,11 @@ "climate": { "aux_heat": "Lisälämpö", "away_mode": "Poissa kotoa -tila", + "cooling": "{name} jäähdytys", + "current_temperature": "{name} nykyinen lämpötila", "currently": "Tällä hetkellä", "fan_mode": "Tuuletustila", + "heating": "{name} lämmitys", "high": "korkea", "low": "matala", "on_off": "Päällä / pois", @@ -361,7 +364,9 @@ "preset_mode": "Esiasetus", "swing_mode": "Heilutustila", "target_humidity": "Tavoitekosteus", - "target_temperature": "Tavoitelämpötila" + "target_temperature": "Tavoitelämpötila", + "target_temperature_entity": "{name} tavoitelämpötila", + "target_temperature_mode": "{name} tavoitelämpötila {mode}" }, "counter": { "actions": { @@ -406,6 +411,9 @@ "script": { "execute": "Suorita" }, + "service": { + "run": "Suorita" + }, "timer": { "actions": { "cancel": "Peruuta", @@ -467,10 +475,12 @@ "close": "Sulje", "delete": "Poista", "loading": "Ladataan", + "no": "Ei", "save": "Tallenna", "successfully_deleted": "Poistettu onnistuneesti", "successfully_saved": "Tallennus onnistui", - "undo": "Kumoa" + "undo": "Kumoa", + "yes": "Kyllä" }, "components": { "area-picker": { @@ -525,6 +535,7 @@ }, "dialogs": { "config_entry_system_options": { + "enable_new_entities_description": "Jos tämä ei ole käytössä, {integration}-sovelluksen äskettäin löydettyjä entiteettejä ei lisätä automaattisesti Home Assistantiin.", "enable_new_entities_label": "Ota vasta lisätyt kohteet käyttöön.", "title": "Järjestelmäasetukset kohteelle {integration}", "update": "Päivitä" @@ -540,6 +551,7 @@ "name": "Nimen yliajo", "update": "Päivitä" }, + "related": "liittyvä", "settings": "Asetukset" }, "generic": { @@ -606,6 +618,7 @@ "fan_speed": "Tuulettimen nopeus", "locate": "Paikanna", "pause": "Tauko", + "return_home": "Palaa kotiin", "start": "Käynnistä", "start_pause": "Käynnistys / Tauko", "status": "Tila", @@ -621,9 +634,12 @@ } }, "voice_command": { + "did_not_hear": "Home Assistant ei kuullut mitään", "error": "Hups, tapahtui virhe", + "found": "Löysin seuraavat sinulle:", "how_can_i_help": "Miten voin auttaa?", - "label": "Kirjoita kysymys ja paina 'Enter'" + "label": "Kirjoita kysymys ja paina 'Enter'", + "label_voice": "Kirjoita ja paina 'Enter' tai napauta mikrofonia puhuaksesi" }, "zha_device_info": { "buttons": { @@ -955,14 +971,20 @@ "fetching_subscription": "Haetaan tilausta...", "google": { "config_documentation": "Asetusten dokumentaatio.", + "devices_pin": "Suojauslaitteiden pin", + "enable_ha_skill": "Aktivoi Home Assistant -taito Google Assistantille", + "enable_state_reporting": "Ota tilaraportointi käyttöön", "enter_pin_error": "PIN-koodin tallentaminen ei onnistu:", "enter_pin_hint": "Anna PIN-koodi turvalaitteiden käyttämistä varten", "info": "Google Assistant Integraatio Home Assistant Cloudille mahdollistaa Home Assistant laitteiden ohjaamisen miltä tahansa Google Assistant laitteelta.", + "manage_entities": "Hallitse kohteita", "security_devices": "Turvalaitteet", + "sync_entities": "Synkronoi kohteet Googleen", "title": "Google Assistant" }, "integrations": "Integraatiot", "integrations_introduction": "Home Assistant Cloud integraatiot mahdollistavat pilvipalveluihin käytön ilman että Home Assistant asennus on näkyvissä julkisesti Internetissä.", + "integrations_introduction2": "Tsekkaa verkkosivut kohteesta", "integrations_link_all_features": " kaikki käytettävissä olevat ominaisuudet", "manage_account": "Tilin Hallinta", "nabu_casa_account": "Nabu Casa -tili", @@ -979,11 +1001,19 @@ "sign_out": "Kirjaudu ulos", "thank_you_note": "Kiitos, että olet osa Home Assistant Cloudia. Sinun kaltaisten ihmisten takia pystymme tarjoamaan loistavan kodin automaatiokokemuksen kaikille. Kiitos!", "webhooks": { + "disable_hook_error_msg": "Webhookin poistaminen epäonnistui:", + "link_learn_more": "Lisätietoja webhook-pohjaisten automaatioiden luomisesta.", + "loading": "Ladataan...", "manage": "Hallitse", + "no_hooks_yet": "Näyttää sinulla ei ole vielä webhookeja. Aloita määrittämällä ", + "no_hooks_yet_link_automation": "webhook-automaatio", + "no_hooks_yet_link_integration": "webhook-pohjainen integraatio", + "no_hooks_yet2": "tai luomalla", "title": "Webhooks" } }, "alexa": { + "expose": "Julkista Alexalle", "title": "Alexa" }, "caption": "Home Assistant Cloud", @@ -1015,6 +1045,8 @@ }, "google": { "disable_2FA": "Poista kaksivaiheinen tunnistautuminen", + "expose": "Julkista Google Assistantille", + "exposed_entities": "Julkistetut kohteet", "sync_to_google": "Synkronoidaan muutokset Googleen.", "title": "Google Assistant" }, @@ -1092,9 +1124,12 @@ } }, "customize": { + "attributes_customize": "Seuraavat määritteet on jo määritetty customize.yaml-tiedostossa.", + "attributes_outside": "Seuraavat attribuutit on räätälöity customize.yaml-tiedoston ulkopuolella.", "attributes_override": "Voit yliajaa ne, jos haluat.", "caption": "Muokkaukset", "description": "Muokkaa laitteita", + "pick_attribute": "Valitse yliajettava määrite", "picker": { "header": "Räätälöinti", "introduction": "Muotoile ominaisuuksia olemuskohtaisesti. Lisäykset/muokkaukset tulevat välittömästi voimaan. Poistetut mukautukset tulevat voimaan, kun olemus päivitetään." @@ -1164,7 +1199,8 @@ "button": "Poista valitut käytöstä" }, "enable_selected": { - "button": "Ota valitut käyttöön" + "button": "Ota valitut käyttöön", + "confirm_title": "Haluatko ottaa {number} kohdetta käyttöön?" }, "filter": { "filter": "Suodatin", @@ -1214,6 +1250,7 @@ "integrations": { "caption": "Integraatiot", "config_entry": { + "area": "Alueessa {alue}", "delete_button": "Poista {integration}", "delete_confirm": "Haluatko varmasti poistaa tämän integraation?", "device_unavailable": "laite ei saatavissa", @@ -1332,6 +1369,7 @@ "add_person": "Lisää henkilö", "caption": "Henkilöt", "confirm_delete": "Haluatko varmasti poistaa tämän henkilön?", + "confirm_delete2": "Tälle henkilölle kuuluvien laitteiden osoitus poistetaan.", "create_person": "Luo henkilö", "description": "Hallitse henkilöitä, joita Home Assistant seuraa", "detail": { @@ -1492,6 +1530,10 @@ "search_again": "Etsi uudestaan", "spinner": "Etsitään ZHA Zigbee laitteita..." }, + "add": { + "caption": "Lisää laitteita", + "description": "Lisää laitteita Zigbee-verkkoon" + }, "caption": "ZHA", "cluster_attributes": { "attributes_of_cluster": "Valitun klusterin määritteet", @@ -1510,15 +1552,20 @@ "issue_zigbee_command": "Anna Zigbee käsky" }, "clusters": { + "header": "Klusterit", "help_cluster_dropdown": "Valitse klusteri tarkastellaksesi määritteitä ja komentoja." }, "common": { "add_devices": "Lisää laitteita", "clusters": "Klusterit", "devices": "Laitteet", + "manufacturer_code_override": "Valmistajan koodin yliajo", "value": "Arvo" }, "description": "Zigbee kotiautomaation verkonhallinta", + "devices": { + "header": "Zigbee-kotiautomaatio - laite" + }, "group_binding": { "bind_button_label": "Sido ryhmä", "group_picker_label": "Sidottavat ryhmät", @@ -1539,7 +1586,9 @@ "group_info": "Ryhmätiedot", "group_name_placeholder": "Ryhmän nimi", "group_not_found": "Ryhmää ei löytynyt!", + "group-header": "Zigbee-kotiautomaatio - ryhmätiedot", "groups": "Ryhmät", + "groups-header": "Zigbee-kotiautomaatio - ryhmänhallinta", "header": "Zigbee-kotiautomaatio - ryhmänhallinta", "introduction": "Luo ja muokkaa zigbee-ryhmiä", "manage_groups": "Hallitse Zigbee-ryhmiä", @@ -1550,6 +1599,7 @@ "removing_members": "Poistetaan jäseniä", "zha_zigbee_groups": "ZHA Zigbee -ryhmät" }, + "header": "Määritä Zigbee-kotiautomaatio", "network_management": { "header": "Verkon hallinta", "introduction": "Koko verkkoon vaikuttavat komennot" @@ -1557,13 +1607,22 @@ "node_management": { "header": "Laitehallinta", "help_node_dropdown": "Valitse laite tarkastellaksesi laitekohtaisia vaihtoehtoja." - } + }, + "title": "Zigbee-kotiautomaatio" }, "zone": { "caption": "Alueet", "create_zone": "Luo alue", "detail": { - "passive_note": "Passiiviset vyöhykkeet on piilotetaan käyttöliittymässä, eikä niitä käytetä laitteiden paikannuksen sijaintina. Tämä on hyödyllistä, jos haluat käyttää vain automaatioihin." + "create": "Luo", + "delete": "Poista", + "latitude": "Leveysaste", + "longitude": "Pituusaste", + "passive": "Passiivinen", + "passive_note": "Passiiviset vyöhykkeet on piilotetaan käyttöliittymässä, eikä niitä käytetä laitteiden paikannuksen sijaintina. Tämä on hyödyllistä, jos haluat käyttää vain automaatioihin.", + "radius": "Säde", + "required_error_msg": "Tämä kenttä on pakollinen", + "update": "Päivitä" }, "edit_home_zone": "Voit asettaa kotisi sijainnin kohdasta Asetukset>Yleinen." }, @@ -1636,7 +1695,10 @@ "type": "Tapahtumatyyppi" }, "info": { + "built_using": "Rakennettu käyttäen", + "custom_uis": "Mukautetut käyttöliittymät:", "developed_by": "Kehittänyt joukko mahtavia ihmisiä.", + "frontend": "frontend-ui", "frontend_version": "Käyttöliittymän versio: {version} - {type}", "home_assistant_logo": "Home Assistant-logo", "icons_by": "Kuvakkeet luonut", @@ -1760,7 +1822,8 @@ "required": "Vaadittu" }, "entities": { - "name": "Kohteet" + "name": "Kohteet", + "show_header_toggle": "Näytä otsikkokytkin?" }, "entity-filter": { "name": "Kohteen suodatus" @@ -1898,6 +1961,7 @@ "delete": "Poista näkymä", "edit": "Muokkaa näkymää", "header": "Näytä asetukset", + "header_name": "{nimi} Näytä asetukset", "move_left": "Siirrä näkymää vasemmalle", "move_right": "Siirrä näkymää oikealle", "tab_badges": "Merkit", @@ -1921,7 +1985,9 @@ "confirm_unsaved_changes": "Sinulla on tallentamattomia muutoksia. Haluatko varmasti poistua?", "confirm_unsaved_comments": "Asetuksesi sisältää kommentoituja rivejä. Kommentoituja rivejä ei tallenneta. Haluatko jatkaa?", "error_invalid_config": "Asetuksesi ovat virheelliset: {error}", + "error_parse_yaml": "YAML-tiedostoa ei voida jäsentää: {error}", "error_remove": "Asetusta ei voida poistaa: {error}", + "error_save_yaml": "YAML-tiedostoa ei voi tallentaa: {error}", "header": "Muokkaa asetuksia", "save": "Tallenna", "saved": "Tallennettu", @@ -1938,7 +2004,8 @@ }, "suggest_card": { "add": "Lisää Lovelace-käyttöliittymään", - "create_own": "Valitse toinen kortti" + "create_own": "Valitse toinen kortti", + "header": "Loimme ehdotuksen sinulle" }, "view": { "panel_mode": { diff --git a/translations/fr.json b/translations/fr.json index c2c85bcf92..b4e0ff875e 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -213,8 +213,8 @@ "not_home": "Absent" }, "fan": { - "off": "Éteint", - "on": "Marche" + "off": "Off", + "on": "On" }, "group": { "closed": "Fermé", @@ -232,7 +232,7 @@ "unlocked": "Déverrouillé" }, "input_boolean": { - "off": "Arrêté", + "off": "Off", "on": "Actif" }, "light": { @@ -246,7 +246,7 @@ "media_player": { "idle": "En veille", "off": "Inactif", - "on": "Marche", + "on": "On", "paused": "En pause", "playing": "Lecture en cours", "standby": "En veille" @@ -259,7 +259,7 @@ "problem": "Problème" }, "remote": { - "off": "Arrêt", + "off": "Off", "on": "Actif" }, "scene": { @@ -654,6 +654,10 @@ "stop": "Arrêter" } }, + "mqtt_device_debug_info": { + "entities": "Entités", + "triggers": "Déclencheurs" + }, "options_flow": { "form": { "header": "Options" @@ -1294,6 +1298,10 @@ } } }, + "filtering": { + "clear": "Effacer", + "filtering_by": "Filtrage par" + }, "header": "Configurer Home Assistant", "helpers": { "caption": "Entrées", @@ -1321,9 +1329,11 @@ } }, "integrations": { + "add_integration": "Ajouter l'intégration", "caption": "Intégrations", "config_entry": { "area": "Dans {area}", + "delete": "Supprimer", "delete_button": "Supprimer {integration}", "delete_confirm": "Êtes-vous sûr de vouloir supprimer cette intégration?", "device_unavailable": "appareil indisponible", @@ -1334,8 +1344,11 @@ "no_area": "Pas de pièce", "no_device": "Entités sans appareils", "no_devices": "Cette intégration n'a pas d'appareils.", + "options": "Options", + "rename": "Renommer", "restart_confirm": "Redémarrer Home Assistant pour terminer la suppression de cette intégration", "settings_button": "Modifier les paramètres pour {integration}", + "system_options": "Options système", "system_options_button": "Options système pour {integration}" }, "config_flow": { @@ -1370,11 +1383,13 @@ "show_ignored": "Afficher les intégrations ignorées", "stop_ignore": "Arrêter d'ignorer" }, + "integration": "intégration", "integration_not_found": "Intégration introuvable.", "new": "Configurer une nouvelle intégration", "none": "Rien n'est encore configuré", "note_about_integrations": "Toutes les intégrations ne peuvent pas encore être configurées via l'interface utilisateur.", - "note_about_website_reference": "D'autres sont disponibles sur le " + "note_about_website_reference": "D'autres sont disponibles sur le ", + "rename_input_label": "Nom de l'entrée" }, "introduction": "Ici, il est possible de configurer vos composants et Home Assistant. Tout n'est pas encore possible de configurer à partir de l'interface utilisateur, mais nous y travaillons.", "lovelace": { diff --git a/translations/ja.json b/translations/ja.json index 73afe7895b..bd60965a43 100644 --- a/translations/ja.json +++ b/translations/ja.json @@ -294,6 +294,9 @@ "script": { "execute": "実行" }, + "service": { + "run": "実行" + }, "water_heater": { "away_mode": "外出モード", "target_temperature": "目標温度" @@ -302,6 +305,7 @@ "attributes": { "air_pressure": "気圧", "humidity": "湿度", + "precipitation": "降水量", "temperature": "温度", "wind_speed": "風速" }, @@ -323,13 +327,18 @@ "wnw": "西北西", "wsw": "西南西" }, - "forecast": "天気予報" + "forecast": "天気予報", + "high": "高", + "low": "低" } }, "common": { "cancel": "キャンセル", + "delete": "削除", "loading": "読込中", "no": "いいえ", + "successfully_deleted": "正常に削除されました", + "undo": "元に戻す", "yes": "はい" }, "components": { @@ -387,18 +396,59 @@ "title": "ドメインを切り替え" }, "entity_registry": { + "dismiss": "消去", "editor": { + "confirm_delete": "このエントリを削除してもよろしいですか?", "delete": "削除", "enabled_cause": "{cause} によって無効にされました。", + "enabled_description": "無効化されたエンティティは Home Assistant に追加されません。", "enabled_label": "エンティティを有効化", + "entity_id": "エンティティ ID", + "icon": "アイコンの上書き", + "name": "名前の上書き", + "unavailable": "このエンティティは現在利用できません。", "update": "更新" } }, "generic": { "cancel": "キャンセル", + "close": "閉じる", "default_confirmation_title": "本当ですか?", "ok": "OK" }, + "helper_settings": { + "generic": { + "icon": "アイコン", + "name": "名前" + }, + "input_datetime": { + "date": "日付", + "datetime": "日時", + "mode": "何を入力しますか", + "time": "時刻" + }, + "input_number": { + "box": "入力フィールド", + "max": "最大値", + "min": "最小値", + "mode": "表示モード", + "slider": "スライダー", + "step": "ステップサイズ", + "unit_of_measurement": "測定単位" + }, + "input_select": { + "add": "追加", + "add_option": "オプションを追加", + "no_options": "オプションはまだありません。", + "options": "オプション" + }, + "input_text": { + "mode": "表示モード", + "password": "パスワード", + "text": "テキスト" + }, + "required_error_msg": "この項目は必須です" + }, "more_info_control": { "dismiss": "ダイアログを閉じる", "edit": "エンティティを編集", @@ -433,6 +483,10 @@ "label_voice": "入力して「enter」を押すか、マイクをタップして話します" }, "zha_device_info": { + "buttons": { + "zigbee_information": "Zigbee 情報" + }, + "device_signature": "Zigbee デバイス署名", "services": { "remove": "Zigbee ネットワークからデバイスを削除します。" } @@ -466,6 +520,13 @@ }, "areas": { "caption": "エリア", + "data_table": { + "area": "エリア", + "devices": "デバイス" + }, + "delete": { + "confirmation_title": "このエリアを削除してもよろしいですか?" + }, "description": "すべて自宅のエリアの一覧", "picker": { "header": "エリア" @@ -611,6 +672,9 @@ "delete_confirm": "このオートメーションを削除してもよろしいですか?", "edit_automation": "オートメーションを編集", "header": "オートメーションエディター", + "headers": { + "name": "名前" + }, "no_automations": "編集可能なオートメーションが見つかりません。", "only_editable": "automations.yaml で定義されたオートメーションのみが編集可能です。", "show_info_automation": "オートメーションに関する情報を表示" @@ -688,9 +752,12 @@ "devices": { "automation": { "automations": "オートメーション", + "create": "デバイスからオートメーションを作成", "no_automations": "オートメーションなし", "no_device_automations": "このデバイスで利用可能なオートメーションはありません。" }, + "cant_edit": "編集できるのは、UI で作成された項目のみです。", + "confirm_delete": "このデバイスを削除してもよろしいですか?", "confirm_rename_entity_ids": "エンティティの ID も変更しますか?", "data_table": { "area": "エリア", @@ -698,12 +765,16 @@ "device": "デバイス", "integration": "インテグレーション", "manufacturer": "メーカー", - "model": "型番" + "model": "型番", + "no_devices": "デバイスなし" }, + "delete": "削除", "description": "接続されたデバイスの管理", "device_not_found": "デバイスが見つかりません。", "name": "名前", + "no_devices": "デバイスなし", "scene": { + "create": "デバイスからシーンを作成", "no_scenes": "シーンなし", "scenes": "シーン" }, @@ -736,6 +807,30 @@ } }, "header": "Home Assistant の設定", + "helpers": { + "caption": "ヘルパー", + "dialog": { + "add_helper": "ヘルパーを追加", + "add_platform": "{platform} を追加", + "create": "作成" + }, + "picker": { + "add_helper": "ヘルパーを追加", + "headers": { + "editable": "編集可能", + "entity_id": "エンティティ ID", + "name": "名前", + "type": "タイプ" + } + }, + "types": { + "input_boolean": "切り替え", + "input_datetime": "日付・時刻", + "input_number": "数", + "input_select": "ドロップダウン", + "input_text": "テキスト" + } + }, "integrations": { "config_entry": { "delete_button": "{integration} を削除" @@ -746,6 +841,7 @@ "created_config": "{name} の構成が作成しました。", "error_saving_area": "エリアを保存できません: {error}", "finish": "完了", + "loading_first_time": "インテグレーションのインストールを完了するまでお待ちください", "submit": "送信" }, "description": "インテグレーションの管理とセットアップ", @@ -753,6 +849,73 @@ "home_assistant_website": "Home Assistant のウェブサイト", "integration_not_found": "インテグレーションが見つかりません。" }, + "lovelace": { + "caption": "Lovelace ダッシュボード", + "dashboards": { + "caption": "ダッシュボード", + "conf_mode": { + "storage": "UI 制御", + "yaml": "YAML ファイル" + }, + "default_dashboard": "これはデフォルトのダッシュボードです", + "detail": { + "create": "作成", + "delete": "削除", + "dismiss": "閉じる", + "edit_dashboard": "ダッシュボードを編集", + "icon": "アイコン", + "new_dashboard": "新しいダッシュボードを追加", + "require_admin": "管理者のみ", + "show_sidebar": "サイドバーに表示", + "title": "タイトル", + "title_required": "タイトルが必要です。", + "update": "更新", + "url": "URL" + }, + "picker": { + "add_dashboard": "ダッシュボードを追加", + "headers": { + "default": "デフォルト", + "filename": "ファイル名", + "require_admin": "管理者のみ", + "sidebar": "サイドバーに表示", + "title": "タイトル" + }, + "open": "開く" + } + }, + "description": "Lovelace ダッシュボードを設定する", + "resources": { + "caption": "リソース", + "confirm_delete": "このリソースを削除してもよろしいですか?", + "detail": { + "create": "作成", + "delete": "削除", + "dismiss": "閉じる", + "new_resource": "新しいリソースを追加", + "type": "リソースの種類", + "update": "更新", + "url": "URL", + "url_error_msg": "URL は必須フィールドです", + "warning_header": "注意してください!" + }, + "picker": { + "add_resource": "リソースを追加", + "headers": { + "type": "タイプ", + "url": "URL" + }, + "no_resources": "リソースなし" + }, + "refresh_header": "更新しますか?", + "types": { + "css": "Stylesheet", + "html": "HTML (非推奨)", + "js": "JavaScript ファイル (非推奨)", + "module": "JavaScript モジュール" + } + } + }, "person": { "caption": "人", "description": "Home Assistant を追跡している人の管理。", @@ -795,6 +958,9 @@ "delete_scene": "シーンを削除", "edit_scene": "シーンを編集", "header": "シーンエディター", + "headers": { + "name": "名前" + }, "learn_more": "シーンの情報をもっと見る。", "no_scenes": "編集可能なシーンが見つかりません。", "only_editable": "scenes.yaml で定義されたシーンのみが編集可能です。", @@ -812,6 +978,10 @@ }, "picker": { "edit_script": "スクリプトを編集", + "headers": { + "name": "名前" + }, + "show_info": "スクリプトに関する情報を表示", "trigger_script": "トリガースクリプト" } }, @@ -849,13 +1019,24 @@ "editor": { "activate_user": "ユーザーを有効化", "active": "アクティブ", + "admin": "管理者", "change_password": "パスワードの変更", "deactivate_user": "ユーザーを無効化", "delete_user": "ユーザーを削除", "group": "グループ", "id": "ID", + "name": "名前", "owner": "所有者", - "system_generated": "システムジェネレート" + "system_generated": "システムジェネレート", + "system_generated_users_not_editable": "システムが生成されたユーザーを変更できません。", + "update_user": "更新" + }, + "picker": { + "headers": { + "group": "グループ", + "name": "名前", + "system": "システム" + } } }, "zha": { @@ -875,13 +1056,22 @@ } }, "zone": { + "add_zone": "ゾーンを追加", + "caption": "ゾーン", + "confirm_delete": "このゾーンを削除してもよろしいですか?", + "create_zone": "ゾーンを作成", "detail": { + "create": "作成", + "delete": "削除", "icon": "アイコン", "latitude": "緯度", "longitude": "経度", "name": "名前", "new_zone": "新しいゾーン", - "radius": "半径" + "passive": "パッシブ", + "radius": "半径", + "required_error_msg": "この項目は必須です", + "update": "更新" }, "go_to_core_config": "一般的な構成に移動しますか?" }, @@ -982,6 +1172,10 @@ }, "lovelace": { "cards": { + "safe-mode": { + "description": "Home Assistant は、構成の読み込み中に問題が発生し、セーフモードで実行されています。エラーログを見て、何が問題だったかを確認してください。", + "header": "セーフモードがアクティブになりました" + }, "shopping-list": { "add_item": "アイテムを追加", "clear_items": "チェックされたアイテムを削除" @@ -993,6 +1187,10 @@ "name": "ボタン" }, "conditional": { + "card": "カード", + "change_type": "タイプの変更", + "conditions": "条件", + "current_state": "現在", "name": "条件付き" }, "entities": { @@ -1002,10 +1200,18 @@ "entity-filter": { "name": "エンティティフィルター" }, + "entity": { + "name": "エンティティ" + }, "gauge": { "name": "ゲージ" }, "generic": { + "attribute": "属性", + "double_tap_action": "ダブルタップアクション", + "manual": "マニュアル", + "no_theme": "テーマなし", + "state": "状態", "theme": "テーマ" }, "history-graph": { @@ -1049,8 +1255,13 @@ "name": "垂直スタック" } }, + "cardpicker": { + "custom_card": "カスタム", + "no_description": "説明がありません。" + }, "edit_card": { "delete": "カードを削除", + "duplicate": "重複するカード", "move": "ビューに移動", "options": "その他のオプション", "pick_card": "どのカードを追加しますか?" @@ -1060,7 +1271,10 @@ }, "edit_view": { "move_left": "ビューを左に移動", - "move_right": "ビューを右に移動" + "move_right": "ビューを右に移動", + "tab_badges": "バッジ", + "tab_settings": "設定", + "tab_visibility": "可視性" }, "menu": { "open": "Lovelace メニューを開く" @@ -1071,13 +1285,20 @@ "error_invalid_config": "設定が無効です: {error}", "error_parse_yaml": "YAMLを解析できません: {error}", "error_save_yaml": "YAMLを保存できません: {error}" + }, + "save_config": { + "close": "閉じる" } }, "menu": { "close": "閉じる", - "exit_edit_mode": "UI 編集モードを終了" + "exit_edit_mode": "UI 編集モードを終了", + "reload_resources": "リソースの再読込" }, "reload_lovelace": "Lovelace の再読込", + "reload_resources": { + "refresh_header": "更新しますか?" + }, "unused_entities": { "available_entities": "これらは Lovelace UI にまだありませんの使用可能なエンティティです。", "domain": "ドメイン", @@ -1200,6 +1421,11 @@ "current_password": "現在のパスワード", "header": "パスワードの変更" }, + "dashboard": { + "description": "このデバイスのデフォルトのダッシュボードを選択してください。", + "dropdown_label": "ダッシュボード", + "header": "ダッシュボード" + }, "force_narrow": { "header": "サイドバーを常に非表示にする" }, diff --git a/translations/nb.json b/translations/nb.json index 1b6f5eb6f2..3c7cc12756 100644 --- a/translations/nb.json +++ b/translations/nb.json @@ -654,6 +654,17 @@ "stop": "Stopp" } }, + "mqtt_device_debug_info": { + "deserialize": "Forsøk å analysere MQTT-meldinger som JSON", + "entities": "Enheter", + "no_entities": "Ingen entiteter", + "no_triggers": "Ingen utløsere", + "payload_display": "Nyttelastvisning", + "recent_messages": "{n} sist mottatte melding(er)", + "show_as_yaml": "Vis som YAML", + "title": "{device} feilsøkingsinfo", + "triggers": "Utløsere" + }, "options_flow": { "form": { "header": "Alternativer" @@ -1294,6 +1305,10 @@ } } }, + "filtering": { + "clear": "Tøm", + "filtering_by": "Filtrering etter" + }, "header": "Konfigurer Home Assistant", "helpers": { "caption": "Hjelpere", @@ -1321,12 +1336,16 @@ } }, "integrations": { + "add_integration": "Legg til integrasjon", "caption": "Integrasjoner", "config_entry": { "area": "I {area}", + "delete": "Slett", "delete_button": "Slett {integration}", "delete_confirm": "Er du sikker på at du vil slette denne integrasjonen?", "device_unavailable": "enheten er utilgjengelig", + "devices": "{antall} {antall, flertall,\n én {enhet}\n andre {enheter}\n}", + "entities": "{antall} {antall, flertall,\n én {enhet}\n andre {enheter}\n}", "entity_unavailable": "entiteten er ikke tilgjengelig", "firmware": "Fastvare: {version}", "hub": "Tilkoblet via", @@ -1334,8 +1353,11 @@ "no_area": "Intet område", "no_device": "Oppføringer uten enheter", "no_devices": "Denne integrasjonen har ingen enheter.", + "options": "Alternativer", + "rename": "Gi nytt navn", "restart_confirm": "Start Home Assistant på nytt for å fullføre fjerningen av denne integrasjonen", "settings_button": "Rediger innstillinger for {integration}", + "system_options": "Systemalternativer", "system_options_button": "Systemalternativer for {integration}" }, "config_flow": { @@ -1370,11 +1392,15 @@ "show_ignored": "Vis ignorerte integrasjoner", "stop_ignore": "Slutt å ignorere" }, + "integration": "integrering", "integration_not_found": "Integrasjon ikke funnet.", "new": "Sett opp en ny integrasjon", + "no_integrations": "Virker som om du ikke har konfigurert noen integrasjoner ennå. Klikk på knappen nedenfor for å legge til din første integrasjon!", "none": "Ingenting er konfigurert enda", "note_about_integrations": "Ikke alle integrasjoner kan konfigureres via brukergrensesnittet ennå.", - "note_about_website_reference": "Flere er tilgjengelige på" + "note_about_website_reference": "Flere er tilgjengelige på", + "rename_dialog": "Redigere navnet på denne config-oppføringen", + "rename_input_label": "Navn på oppføring" }, "introduction": "Her er det mulig å konfigurere dine komponenter og Home Assistant. Ikke alt er mulig å konfigurere fra brukergrensesnittet enda, men vi jobber med det.", "lovelace": { @@ -2241,7 +2267,8 @@ "warning": { "attribute_not_found": "Attributtet {attribute} er ikke tilgjengelig i: {entity}", "entity_non_numeric": "Entiteten er ikke-numerisk: {entity}", - "entity_not_found": "Entitet ikke tilgjengelig: {entity}" + "entity_not_found": "Entitet ikke tilgjengelig: {entity}", + "entity_unavailable": "{entity} er for øyeblikket utilgjengelig" } }, "mailbox": { diff --git a/translations/nl.json b/translations/nl.json index 7a9a0df0ee..b93137544a 100644 --- a/translations/nl.json +++ b/translations/nl.json @@ -654,6 +654,17 @@ "stop": "Stop" } }, + "mqtt_device_debug_info": { + "deserialize": "Probeer MQTT-berichten als JSON te parseren", + "entities": "Entiteiten", + "no_entities": "Geen entiteiten", + "no_triggers": "Geen triggers", + "payload_display": "Payload-display", + "recent_messages": "{n} meest recent ontvangen bericht(en)", + "show_as_yaml": "Toon als YAML", + "title": "{device} foutopsporingsgegevens", + "triggers": "Triggers" + }, "options_flow": { "form": { "header": "Instellingen" @@ -674,11 +685,13 @@ "buttons": { "add": "Apparaten toevoegen", "reconfigure": "Apparaat opnieuw configureren", - "remove": "Verwijder apparaat" + "remove": "Verwijder apparaat", + "zigbee_information": "Zigbee Informatie" }, "confirmations": { "remove": "Weet je zeker dat je het apparaat wilt verwijderen?" }, + "device_signature": "Handtekening van het Zigbee-apparaat", "last_seen": "Laatst gezien", "manuf": "door {manufacturer}", "no_area": "Geen Gebied", @@ -687,7 +700,8 @@ "services": { "reconfigure": "Herconfigureer het ZHA-apparaat (heal device). Gebruik dit als je problemen hebt met het apparaat. Als het een apparaat met batterij is, zorg dan dat het wakker is en commando's accepteert wanneer je deze service gebruikt.", "remove": "Verwijder een apparaat uit het Zigbee-netwerk.", - "updateDeviceName": "Stel een aangepaste naam in voor dit apparaat in het apparaatregister." + "updateDeviceName": "Stel een aangepaste naam in voor dit apparaat in het apparaatregister.", + "zigbee_information": "Bekijk de Zigbee-informatie voor het apparaat." }, "unknown": "Onbekend", "zha_device_card": { @@ -1291,6 +1305,10 @@ } } }, + "filtering": { + "clear": "Wis", + "filtering_by": "Filteren op" + }, "header": "Configureer Home Assistant", "helpers": { "caption": "Helpers", @@ -1318,12 +1336,16 @@ } }, "integrations": { + "add_integration": "Integratie toevoegen", "caption": "Integraties", "config_entry": { "area": "In {area}", + "delete": "Verwijder", "delete_button": "Verwijder {integration}.", "delete_confirm": "Weet je zeker dat je deze integratie wilt verwijderen?", "device_unavailable": "apparaat niet beschikbaar", + "devices": "{count} {count, plural,\n one {device}\n other {devices}\n}", + "entities": "{count} {count, plural,\n one {entity}\n other {entities}\n}", "entity_unavailable": "entiteit niet beschikbaar", "firmware": "Firmware: {version}", "hub": "Verbonden via", @@ -1331,8 +1353,11 @@ "no_area": "Geen Gebied", "no_device": "Entiteiten zonder apparaten", "no_devices": "Deze integratie heeft geen apparaten.", + "options": "Opties", + "rename": "Naam wijzigen", "restart_confirm": "Herstart Home Assistant om het verwijderen van deze integratie te voltooien", "settings_button": "Instellingen bewerken voor {integration}", + "system_options": "Systeeminstellingen", "system_options_button": "Systeeminstellingen voor {integration}" }, "config_flow": { @@ -1367,11 +1392,15 @@ "show_ignored": "Toon genegeerde integraties", "stop_ignore": "Stop met negeren" }, + "integration": "integratie", "integration_not_found": "Integratie niet gevonden.", "new": "Stel een nieuwe integratie in", + "no_integrations": "Het lijkt erop dat je nog geen integraties hebt geconfigureerd. Klik op de knop hieronder om uw eerste integratie toe te voegen!", "none": "Er is nog niets geconfigureerd", "note_about_integrations": "Nog niet alle integraties kunnen via de UI worden geconfigureerd.", - "note_about_website_reference": "Meer zijn beschikbaar op de " + "note_about_website_reference": "Meer zijn beschikbaar op de ", + "rename_dialog": "Bewerk de naam van configuratie item", + "rename_input_label": "Vermeldingsnaam" }, "introduction": "Hier kun je je componenten en Home Assistant configureren. Het is nog niet mogelijk om alles te configureren vanuit de interface, maar we werken er aan.", "lovelace": { @@ -1920,7 +1949,7 @@ "add_entities": { "generated_unsupported": "Je kan deze functie alleen gebruiken als je de controle over de Lovelace gebruikersinterface hebt overgenomen", "saving_failed": "Opslaan van de Lovelace gebruikersinterface is mislukt.", - "yaml_unsupported": "Je kan deze functie niet gebruiken wanneer je de Lovelace gebruikersinterface gebruikt in YAML modus." + "yaml_unsupported": "Je kunt deze functie niet gebruiken wanneer je de Lovelace gebruikersinterface gebruikt in YAML modus." }, "cards": { "confirm_delete": "Weet je zeker dat je deze kaart wilt verwijderen?", @@ -2238,7 +2267,8 @@ "warning": { "attribute_not_found": "Kenmerk {attribute} niet beschikbaar in: {entity}", "entity_non_numeric": "Entiteit is niet-numeriek: {entity}", - "entity_not_found": "Entiteit niet beschikbaar: {entity}" + "entity_not_found": "Entiteit niet beschikbaar: {entity}", + "entity_unavailable": "{entity} is momenteel niet beschikbaar" } }, "mailbox": { diff --git a/translations/pl.json b/translations/pl.json index cdf1175dbf..3eef018fde 100644 --- a/translations/pl.json +++ b/translations/pl.json @@ -654,6 +654,17 @@ "stop": "Zatrzymaj" } }, + "mqtt_device_debug_info": { + "deserialize": "Próba parsowania komunikatów MQTT jako JSON", + "entities": "Encje", + "no_entities": "Brak encji", + "no_triggers": "Brak wyzwalaczy", + "payload_display": "Wyświetl payload", + "recent_messages": "{n} ostatnio otrzymanych wiadomości", + "show_as_yaml": "Pokaż jako YAML", + "title": "Informacje o {device}", + "triggers": "Wyzwalacze" + }, "options_flow": { "form": { "header": "Opcje" @@ -1294,6 +1305,10 @@ } } }, + "filtering": { + "clear": "Wyczyść", + "filtering_by": "Filtrowanie przez" + }, "header": "Konfiguruj Home Assistant'a", "helpers": { "caption": "Pomocnicy", @@ -1321,12 +1336,16 @@ } }, "integrations": { + "add_integration": "Dodaj integrację", "caption": "Integracje", "config_entry": { "area": "obszar: {area}", + "delete": "Usuń", "delete_button": "Usuń {integration}", "delete_confirm": "Na pewno chcesz usunąć tę integrację?", "device_unavailable": "urządzenie niedostępne", + "devices": "{count} {count, plural,\n one {urządzenie}\n other {urządze(nia/ń)}\n}", + "entities": "{count} {count, plural,\n one {encja}\n other {encj(e/i)}\n}", "entity_unavailable": "encja niedostępna", "firmware": "oprogramowanie: {version}", "hub": "połączony poprzez:", @@ -1334,8 +1353,11 @@ "no_area": "brak", "no_device": "Encje bez urządzeń", "no_devices": "Ta integracja nie ma żadnych urządzeń.", + "options": "Opcje", + "rename": "Zmień nazwę", "restart_confirm": "Zrestartuj Home Assistant'a, aby zakończyć usuwanie tej integracji", "settings_button": "Edytuj ustawienia dla {integration}", + "system_options": "Opcje systemowe", "system_options_button": "Opcje systemowe dla {integration}" }, "config_flow": { @@ -1370,15 +1392,19 @@ "show_ignored": "Pokaż ignorowane integracje", "stop_ignore": "Wyłączenie ignorowania" }, + "integration": "integracja", "integration_not_found": "Nie znaleziono integracji.", "new": "Konfiguruj nową integrację", + "no_integrations": "Wygląda na to, że nie masz jeszcze skonfigurowanych żadnych integracji. Kliknij przycisk poniżej, aby dodać pierwszą integrację!", "none": "Nic jeszcze nie zostało skonfigurowane", "note_about_integrations": "Jeszcze nie wszystkie integracje można skonfigurować za pomocą interfejsu użytkownika.", - "note_about_website_reference": "Więcej jest dostępnych na stronie integracji " + "note_about_website_reference": "Więcej jest dostępnych na stronie integracji ", + "rename_dialog": "Edytuj nazwę tego wpisu konfiguracji", + "rename_input_label": "Nazwa wpisu" }, "introduction": "Tutaj możesz skonfigurować Home Assistant'a i jego komponenty. Nie wszystkie opcje można konfigurować z interfejsu użytkownika, ale pracujemy nad tym.", "lovelace": { - "caption": "Dashboardy Lovelace", + "caption": "Dashboardy", "dashboards": { "cant_edit_default": "Standardowego dashboardu Lovelace nie można edytować za pomocą interfejsu użytkownika. Możesz go ukryć, ustawiając jako domyślny inny dashboard.", "cant_edit_yaml": "Dasboard'y zdefiniowane w plikach YAML nie mogą być edytowane z poziomu interfejsu użytkownika. Zmień je w pliku configuration.yaml.", @@ -2241,7 +2267,8 @@ "warning": { "attribute_not_found": "Atrybut {attribute} jest niedostępny dla: {entity}", "entity_non_numeric": "Encja nie jest numeryczna: {entity}", - "entity_not_found": "Encja niedostępna: {entity}" + "entity_not_found": "Encja niedostępna: {entity}", + "entity_unavailable": "{entity} jest obecnie niedostępna" } }, "mailbox": { diff --git a/translations/pt-BR.json b/translations/pt-BR.json index a51f4b9d73..26f0dcf815 100644 --- a/translations/pt-BR.json +++ b/translations/pt-BR.json @@ -614,6 +614,12 @@ "stop": "Parar" } }, + "mqtt_device_debug_info": { + "payload_display": "Exibição de carga", + "recent_messages": "{n} mensagem (s) recebida (s) mais recentemente", + "show_as_yaml": "Mostrar como YAML", + "triggers": "Gatilhos" + }, "options_flow": { "form": { "header": "Opções" @@ -1236,8 +1242,13 @@ } } }, + "filtering": { + "clear": "Limpar", + "filtering_by": "Filtrando por" + }, "header": "Configurar o Home Assistant", "integrations": { + "add_integration": "Adicionar integração", "caption": "Integrações", "config_entry": { "area": "Em {area}", @@ -1287,6 +1298,7 @@ "show_ignored": "Mostrar integrações ignoradas", "stop_ignore": "Deixar de ignorar" }, + "integration": "integração", "integration_not_found": "Integração não encontrada.", "new": "Configurar uma nova integração", "none": "Nada configurado ainda", diff --git a/translations/pt.json b/translations/pt.json index 433de73735..ec3b19ef72 100644 --- a/translations/pt.json +++ b/translations/pt.json @@ -297,7 +297,7 @@ "returning": "A regressar à doca" }, "weather": { - "clear-night": "Limpo, Noite", + "clear-night": "Limpo, noite", "cloudy": "Nublado", "exceptional": "Excepcional", "fog": "Nevoeiro", @@ -338,7 +338,7 @@ "arm_custom_bypass": "Desvio personalizado", "arm_home": "Armado casa", "arm_night": "Armado noite", - "clear_code": "Limpo", + "clear_code": "Apagar", "code": "Código", "disarm": "Desarmar" }, @@ -462,7 +462,9 @@ "wnw": "WNW", "wsw": "WSW" }, - "forecast": "Previsão" + "forecast": "Previsão", + "high": "Alta", + "low": "Baixa" } }, "common": { @@ -479,7 +481,12 @@ }, "components": { "area-picker": { - "area": "Área" + "add_dialog": { + "add": "Adicionar", + "name": "Nome" + }, + "area": "Área", + "clear": "Limpar" }, "device-picker": { "clear": "Apagar", @@ -497,6 +504,11 @@ "loading_history": "A carregar histórico de estados...", "no_history_found": "Nenhum histórico de estado encontrado." }, + "related-items": { + "area": "Área", + "device": "Dispositivo", + "integration": "Integração" + }, "relative_time": { "duration": { "day": "{count} {count, plural,\n one {dia}\n other {dias}\n}", @@ -505,7 +517,7 @@ "second": "{count} {count, plural,\n one {segundo}\n other {segundos}\n}", "week": "{count} {count, plural,\n one {semana}\n other {semanas}\n}" }, - "future": "Às {time}", + "future": "À {time}", "never": "Nunca", "past": "{time} atrás" }, @@ -524,9 +536,15 @@ "title": "Alternar domínios" }, "entity_registry": { + "control": "Controle", + "dismiss": "Fechar", "editor": { + "delete": "Apagar", + "enabled_label": "Ativar entidade", "update": "Atualizar" - } + }, + "related": "Relacionadas", + "settings": "Definições" }, "generic": { "cancel": "Cancelar", @@ -534,17 +552,36 @@ "ok": "OK" }, "helper_settings": { + "generic": { + "icon": "Ícone", + "name": "Nome" + }, "input_datetime": { "date": "Data", + "datetime": "Data e hora", "mode": "O que deseja inserir", "time": "Hora" }, "input_number": { - "min": "Valor mínimo" + "box": "Campo de entrada", + "min": "Valor mínimo", + "step": "Tamanho do passo", + "unit_of_measurement": "Unidade de medida" }, "input_select": { - "add": "Adicionar" - } + "add": "Adicionar", + "add_option": "Acrescentar opção", + "no_options": "Ainda não existem opções.", + "options": "Opções" + }, + "input_text": { + "max": "Comprimento máximo", + "min": "Comprimento mínimo", + "mode": "Modo de exibição", + "password": "Palavra-passe", + "text": "Texto" + }, + "yaml_not_editable": "As configurações desta entidade não podem ser editadas a partir do IU. Apenas as entidades adiccionadas a partir da IU são configuráveis a partir da IU." }, "more_info_control": { "dismiss": "Descartar diálogo", @@ -556,7 +593,8 @@ "remove_intro": "Se a entidade não estiver em uso, você pode removê-la." }, "script": { - "last_action": "Última ocorrência" + "last_action": "Última ocorrência", + "last_triggered": "Última ocorrência" }, "settings": "Definições da entidade", "sun": { @@ -574,6 +612,10 @@ "stop": "Parar" } }, + "mqtt_device_debug_info": { + "entities": "Entidades", + "show_as_yaml": "Mostrar como YAML" + }, "options_flow": { "form": { "header": "Opções do sistema" @@ -659,10 +701,12 @@ "description": "Visão geral de todas as áreas da sua casa.", "editor": { "create": "CRIAR", + "default_name": "Nova área", "delete": "APAGAR", "update": "ATUALIZAR" }, "picker": { + "create_area": "Criar área", "header": "Áreas", "integrations_page": "Página de Integrações", "introduction": "As áreas são utilizadas para organizar os dispositivos. Essas informações serão utilizadas no Home Assistant para o ajudar a organizar o seu interface, permissões e integrações com outros sistemas.", @@ -1136,9 +1180,11 @@ "entities": "Entidades", "none": "Este dispositivo não possui entidades" }, + "name": "Nome", "no_devices": "Sem dispositivos", "unknown_error": "Erro desconhecido", - "unnamed_device": "Dispositivo sem nome" + "unnamed_device": "Dispositivo sem nome", + "update": "Atualizar" }, "entities": { "caption": "Entidades", @@ -1177,16 +1223,32 @@ } } }, + "filtering": { + "clear": "Apagar", + "filtering_by": "A filtrar por" + }, "header": "Configurar o Home Assistant", "helpers": { + "caption": "Auxiliares", "dialog": { "create": "Criar" + }, + "picker": { + "headers": { + "entity_id": "ID da entidade" + } + }, + "types": { + "input_number": "Número", + "input_text": "Texto" } }, "integrations": { + "add_integration": "Adicionar integração", "caption": "Integrações", "config_entry": { "area": "Em {area}", + "delete": "Eliminar", "delete_button": "Apagar {integration}", "delete_confirm": "Tem a certeza que pretende apagar esta integração?", "device_unavailable": "Dispositivo indisponível", @@ -1197,6 +1259,8 @@ "no_area": "Nenhuma Área", "no_device": "Entidades sem dispositivos", "no_devices": "Esta integração não possui dispositivos.", + "options": "Opções", + "rename": "Renomear", "restart_confirm": "Reinicie o Home Assistant para concluir a remoção desta integração", "settings_button": "Editar configurações para {integration}", "system_options_button": "Opções do sistema para {integration}" @@ -1234,6 +1298,7 @@ }, "integration_not_found": "Integração não encontrada.", "new": "Configurar uma nova integração", + "no_integrations": "Parece que você ainda não possui integrações configuradas. Clique no botão abaixo para adicionar sua primeira integração!", "none": "Nada configurado ainda", "note_about_integrations": "De momento nem todas as integrações podem ser configuradas via UI.", "note_about_website_reference": "Existem mais disponíveis no" @@ -1242,20 +1307,55 @@ "lovelace": { "dashboards": { "default_dashboard": "Este é o painel de instrumentos padrão", + "detail": { + "create": "Criar", + "delete": "Apagar", + "dismiss": "Fechar", + "icon": "Ícone", + "require_admin": "Administrador apenas", + "title": "Título", + "title_required": "O título é obrigatório.", + "update": "Atualizar", + "url": "Url" + }, "picker": { "headers": { - "default": "Predefinição" - } + "default": "Predefinição", + "title": "Título" + }, + "open": "Abrir" } }, "resources": { + "cant_edit_yaml": "Você está a usar o Lovelace no modo YAML, portanto, não é possível gerir os seus recursos através do interface do utilizador. Configure-os em configuration.yaml.", + "caption": "Recursos", + "confirm_delete": "Tem certeza de que deseja apagar este recurso?", "detail": { + "create": "Criar", "delete": "Apagar", + "dismiss": "Fechar", + "new_resource": "Adicionar novo recurso", "type": "Tipo de recurso", - "url_error_msg": "URL é um campo obrigatório" + "update": "Atualizar", + "url": "Url", + "url_error_msg": "URL é um campo obrigatório", + "warning_header": "Seja cauteloso!", + "warning_text": "Acrescentar recursos pode ser perigoso, certifique-se que conhece a fonte do recurso e que confia nela. Recursos malignos podem prejudicar seriamente o seu sistema." }, "picker": { + "add_resource": "Adicionar recurso", + "headers": { + "type": "Tipo", + "url": "Url" + }, "no_resources": "Sem recursos" + }, + "refresh_body": "Você tem que atualizar a página para completar a remoção, quer atualizar agora?", + "refresh_header": "Deseja atualizar?", + "types": { + "css": "Stylesheet", + "html": "HTML (descontinuado)", + "js": "Ficheiro JavaScript (descontinuado)" } } }, @@ -1287,8 +1387,8 @@ }, "scene": { "activated": "Ativar cena {name}.", - "caption": "Cenas", - "description": "Criar e editar cenas", + "caption": "Cenários", + "description": "Criar e editar cenários", "editor": { "default_name": "Nova Cena", "devices": { @@ -1305,8 +1405,8 @@ "introduction": "Entidades que não pertencem a um dispositivo podem ser definidas aqui.", "without_device": "Entidades sem dispositivo" }, - "introduction": "Crie cenas para dar vida à sua casa.", - "load_error_not_editable": "Apenas cenas em scenes.yaml são editáveis.", + "introduction": "Crie cenários para dar vida à sua casa.", + "load_error_not_editable": "Apenas cenários em scenes.yaml são editáveis.", "load_error_unknown": "Erro ao carregar cena ({err_no}).", "name": "Nome", "save": "Guardar", @@ -1317,14 +1417,14 @@ "delete_confirm": "Tem certeza de que deseja apagar esta cena?", "delete_scene": "Eliminar cena", "edit_scene": "Editar cena", - "header": "Editor de cenas", + "header": "Editor de cenários", "headers": { "name": "Nome" }, - "introduction": "O editor de cenas permite criar e editar cenas. Leia as instruções do link em baixo para se certificar de que configurou o Home Assistant corretamente.", - "learn_more": "Aprender mais sobre cenas", + "introduction": "O editor de cenários permite criar e editar cenários. Leia as instruções do link em baixo para se certificar de que configurou o Home Assistant corretamente.", + "learn_more": "Aprender mais sobre cenários", "no_scenes": "Não conseguimos encontrar nenhuma cena editável", - "only_editable": "Apenas as cenas definidas em scenes.yaml são editáveis.", + "only_editable": "Apenas os cenários definidos em scenes.yaml são editáveis.", "pick_scene": "Escolha uma cena para editar", "show_info_scene": "Mostrar informações sobre a cena" } @@ -1368,8 +1468,10 @@ "group": "Recarregar grupos", "heading": "A recarregar configuração", "introduction": "Algumas partes do Home Assistant podem ser recarregadas sem necessidade de reiniciar. Ao carregar em Recarregar configuração irá descarregar a configuração atual e carregar a nova.", + "person": "Recarregar pessoas", "scene": "Recarregar cenas", - "script": "Recarregar scripts" + "script": "Recarregar scripts", + "zone": "Recarregar zonas" }, "server_management": { "confirm_restart": "Tem certeza de que reiniciar o Home Assistant?", @@ -1432,6 +1534,9 @@ "search_again": "Pesquisar Novamente", "spinner": "À procura de dispositivos ZHA Zigbee..." }, + "add": { + "caption": "Adicionar Dispositivos" + }, "caption": "ZHA", "cluster_attributes": { "attributes_of_cluster": "Atributos do cluster selecionado", @@ -1451,6 +1556,7 @@ "issue_zigbee_command": "Emitir comando ZigBee" }, "clusters": { + "header": "Clusters", "help_cluster_dropdown": "Selecione um cluster para visualizar atributos e comandos." }, "common": { @@ -1493,9 +1599,12 @@ "longitude": "Longitude", "name": "Nome", "passive": "Passivo", + "passive_note": "As zonas passivas estão ocultas no frontend e não são usadas como local para rastreadores de dispositivos. Isto é útil se quiser usá-lo apenas para automações.", "radius": "Raio", "required_error_msg": "Este campo é obrigatório" - } + }, + "edit_home_zone": "O raio da zona casa ainda não pode ser editado a partir do frontend. Arraste o marcador no mapa para mover a zona inicial.", + "edit_home_zone_narrow": "O raio da zona casa ainda não pode ser editado a partir do frontend. A localização pode ser modificada a partir da configuração geral." }, "zwave": { "caption": "Z-Wave", @@ -1594,13 +1703,13 @@ "title": "Informações" }, "logs": { - "clear": "Limpo", + "clear": "Limpar", "details": "Detalhes do log ( {level} )", "load_full_log": "Carregar log completo do Home Assistant", "loading_log": "A carregar o log de erros...", - "multiple_messages": "mensagem ocorreu primeiro em {tempo} e repetiu-se {contador} vezes", + "multiple_messages": "mensagem ocorreu primeiro em {time} e repetiu-se {counter} vezes", "no_errors": "Nenhum erro foi reportado.", - "no_issues": "Não há novos acontecimentos!", + "no_issues": "Não há novos problemas!", "refresh": "Atualizar", "title": "Logs" }, @@ -1674,6 +1783,9 @@ "no_devices": "Esta página permite-lhe controlar os seus dispositivos, no entanto, parece que ainda não tem dispositivos configurados. Vá para a página de integrações para começar.", "title": "Bem-vindo a casa" }, + "entities": { + "never_triggered": "Nunca acionado" + }, "picture-elements": { "call_service": "Chamar o serviço {name}", "hold": "Mantenha:", @@ -1703,7 +1815,14 @@ "name": "Botão" }, "conditional": { - "name": "Condicional" + "card": "Cartão", + "change_type": "Alterar tipo", + "condition_explanation": "O cartão será exibido quando TODAS as condições abaixo forem cumpridas.", + "conditions": "Condições", + "current_state": "atual", + "name": "Condicional", + "state_equal": "Estado é igual a", + "state_not_equal": "Estado não é igual a" }, "config": { "optional": "Opcional", @@ -1741,6 +1860,8 @@ "icon": "Ícone", "icon_height": "Altura do ícone", "image": "Endereço para imagem", + "manual": "Manual", + "manual_description": "Precisa de adicionar um cartão personalizado ou apenas deseja escrever manualmente o yaml?", "maximum": "Máximo", "minimum": "Mínimo", "name": "Nome", @@ -1749,6 +1870,7 @@ "show_icon": "Mostrar Ícone?", "show_name": "Mostrar nome?", "show_state": "Mostrar Estado?", + "state": "Estado", "tap_action": "Toque em Ação", "theme": "Tema", "title": "Título", @@ -1768,11 +1890,13 @@ "name": "" }, "light": { + "description": "O cartão Luz permite alterar o brilho da luz.", "name": "Luz" }, "map": { "dark_mode": "Modo escuro?", "default_zoom": "Zoom padrão", + "description": "O cartão Mapa que lhe permite exibir entidades num mapa.", "geo_location_sources": "Fontes de Geolocalização", "hours_to_show": "Horas a mostrar", "name": "Mapa", @@ -1780,7 +1904,8 @@ }, "markdown": { "content": "Conteúdo", - "name": "" + "description": "O cartão Markdown é usado para processar Markdown.", + "name": "Markdown" }, "media-control": { "name": "Controlo multimédia" @@ -1795,23 +1920,29 @@ "name": "Imagem" }, "plant-status": { + "description": "O cartão de Estado da planta é para todos os adoráveis botânicos por aí.", "name": "Estado da planta" }, "sensor": { + "description": "O cartão Sensor dá-lhe uma visão rápida do estado dos seus sensores com um gráfico opcional para visualizar a mudança ao longo do tempo.", "graph_detail": "Detalhe do Gráfico", "graph_type": "Tipo De Gráfico", "name": "Sensor" }, "shopping-list": { + "description": "O cartão Lista de compras permite adicionar, editar, marcar e limpar itens da sua lista de compras.", "name": "Lista de compras" }, "thermostat": { + "description": "O cartão Termóstato dá-lhe o controle da sua entidade de climatização. Permitindo alterar a temperatura e o modo dessa entidade.", "name": "Termóstato" }, "vertical-stack": { + "description": "O cartão Agrupamento Vertical permite agrupar vários cartões para que estes fiquem sempre na mesma coluna.", "name": "Agrupamento Vertical" }, "weather-forecast": { + "description": "O cartão Previsão do tempo exibe o tempo. Muito útil para incluir nos interfaces que coloca-mos na parede.", "name": "Previsão do tempo" } }, @@ -1871,6 +2002,7 @@ "error_parse_yaml": "Não foi possível analisar o YAML: {error}", "error_save_yaml": "Não é possível salvar o YAML: {error}", "header": "Editar configuração", + "resources_moved": "Os recursos não devem mais ser adicionados ao editor de configuração do código fonte do Lovelace, mas podem ser adicionados no painel de configuração do Lovelace.", "save": "Guardar", "saved": "Guardada", "unsaved_changes": "Alterações não guardadas" @@ -1882,12 +2014,14 @@ "header": "Assumir controle sobre a interface do Lovelace", "para": "Por omissão o Home Assistant irá manter a sua interface de utilizador, atualizando-a sempre que uma nova entidade ou novos componentes Lovelace fiquem disponíveis. Se assumir o controlo, não faremos mais alterações automáticas por si.", "para_sure": "Tem certeza que deseja assumir o controlo sobre a interface de utilizador?", - "save": "Assumir o controlo" + "save": "Assumir o controlo", + "yaml_control": "Para assumir o controle no modo YAML, crie um ficheiro YAML com o nome que especificou na sua configuração para este painel de controle, ou o padrão 'ui-lovelace.yaml'." }, "view": { "panel_mode": { "description": "Isto faz com que o primeiro cartão ocupe toda a vista, os outros cartões ficaram ocultos.", - "title": "Modo Painel?" + "title": "Modo Painel?", + "warning_multiple_cards": "Esta vista contém mais do que um cartão, mas a vista de painel só pode mostrar 1 cartão." } } }, @@ -1901,6 +2035,7 @@ }, "reload_lovelace": "Recarregar Lovelace", "reload_resources": { + "refresh_body": "É preciso atualizar a página para concluir o carregamento. Deseja atualizar agora?", "refresh_header": "Deseja atualizar?" }, "unused_entities": { @@ -1918,7 +2053,8 @@ "warning": { "attribute_not_found": "Atributo {attribute} não disponível em: {entity}", "entity_non_numeric": "A entidade é não numérica: {entity}", - "entity_not_found": "Entidade não disponível: {entity}" + "entity_not_found": "Entidade não disponível: {entity}", + "entity_unavailable": "{entity} está indisponível no momento" } }, "mailbox": { @@ -2100,6 +2236,7 @@ "profile": { "advanced_mode": { "description": "Desbloqueia funcionalidades avançadas.", + "link_promo": "Saber mais", "title": "Modo avançado" }, "change_password": { diff --git a/translations/ru.json b/translations/ru.json index c1142bcffc..94b24a3ff3 100644 --- a/translations/ru.json +++ b/translations/ru.json @@ -442,6 +442,7 @@ "attributes": { "air_pressure": "Давление", "humidity": "Влажность", + "precipitation": "Осадки", "temperature": "Температура", "visibility": "Видимость", "wind_speed": "Ветер" @@ -464,7 +465,9 @@ "wnw": "ЗСЗ", "wsw": "ЗЮЗ" }, - "forecast": "Прогноз" + "forecast": "Прогноз", + "high": "Высокий", + "low": "Низкий" } }, "common": { @@ -651,6 +654,17 @@ "stop": "Остановить" } }, + "mqtt_device_debug_info": { + "deserialize": "Разбирать сообщения в формате JSON", + "entities": "Объекты", + "no_entities": "Нет объектов", + "no_triggers": "Нет триггеров", + "payload_display": "Содержание сообщений", + "recent_messages": "{n} последних полученных сообщений", + "show_as_yaml": "Показывать сообщения в формате YAML", + "title": "Отладочная информация устройства {device}", + "triggers": "Триггеры" + }, "options_flow": { "form": { "header": "Настройки" @@ -1291,6 +1305,10 @@ } } }, + "filtering": { + "clear": "Очистить", + "filtering_by": "Отфильтровано по принадлежности к" + }, "header": "Настройка Home Assistant", "helpers": { "caption": "Вспомогательное", @@ -1318,12 +1336,16 @@ } }, "integrations": { + "add_integration": "Добавить интеграцию", "caption": "Интеграции", "config_entry": { "area": "Помещение: {area}", + "delete": "Удалить", "delete_button": "Удалить интеграцию {integration}", "delete_confirm": "Вы уверены, что хотите удалить эту интеграцию?", "device_unavailable": "устройство недоступно", + "devices": "{count} {count, plural,\n one {device}\n other {devices}\n}", + "entities": "{count} {count, plural,\n one {entity}\n other {entities}\n}", "entity_unavailable": "объект недоступен", "firmware": "Прошивка: {version}", "hub": "Подключено через", @@ -1331,8 +1353,11 @@ "no_area": "Не указано", "no_device": "Объекты без устройств", "no_devices": "Эта интеграция не имеет устройств", + "options": "Параметры", + "rename": "Переименовать", "restart_confirm": "Перезапустите Home Assistant, чтобы завершить удаление этой интеграции", "settings_button": "Настройки интеграции {integration}", + "system_options": "Настройки интеграции", "system_options_button": "Системные параметры интеграции {integration}" }, "config_flow": { @@ -1367,11 +1392,15 @@ "show_ignored": "Показать игнорируемые интеграции", "stop_ignore": "Прекратить игнорировать" }, + "integration": "интеграции", "integration_not_found": "Интеграция не найдена.", "new": "Интеграции", + "no_integrations": "Похоже, у Вас ещё нет настроенных интеграций. Нажмите на кнопку в правом нижнем углу, чтобы добавить свою первую интеграцию!", "none": "Пока ничего не настроено", "note_about_integrations": "Пока что не все интеграции могут быть настроены через пользовательский интерфейс.", - "note_about_website_reference": "Все доступные интеграции Вы можете найти на " + "note_about_website_reference": "Все доступные интеграции Вы можете найти на ", + "rename_dialog": "Изменение названия интеграции", + "rename_input_label": "Название" }, "introduction": "Здесь можно настроить Home Assistant. Пока что не все настройки доступны из интерфейса, но мы работаем над этим.", "lovelace": { @@ -2238,7 +2267,8 @@ "warning": { "attribute_not_found": "Атрибут {attribute} недоступен в {entity}", "entity_non_numeric": "Объект не является числом: {entity}", - "entity_not_found": "Объект {entity} недоступен." + "entity_not_found": "Объект {entity} недоступен.", + "entity_unavailable": "Объект \"{entity}\" сейчас недоступен" } }, "mailbox": { diff --git a/translations/sv.json b/translations/sv.json index 51ad9ee056..5848296dac 100644 --- a/translations/sv.json +++ b/translations/sv.json @@ -328,7 +328,7 @@ }, "ui": { "auth_store": { - "ask": "Vill du spara den här inloggningen?", + "ask": "Vill du fortsätta vara inloggad?", "confirm": "Spara inloggning", "decline": "Nej tack" }, @@ -442,6 +442,7 @@ "attributes": { "air_pressure": "Lufttryck", "humidity": "Luftfuktighet", + "precipitation": "Prognos", "temperature": "Temperatur", "visibility": "Sikt", "wind_speed": "Vindhastighet" @@ -464,7 +465,9 @@ "wnw": "VNV", "wsw": "VSV" }, - "forecast": "Prognos" + "forecast": "Prognos", + "high": "Hög", + "low": "Låg" } }, "common": { @@ -602,7 +605,9 @@ "pattern": "Regex-mönster för validering på klientsidan", "text": "Text" }, - "required_error_msg": "Det här fältet krävs" + "platform_not_loaded": "{platform} integrationen har ej lästs in. Lägg till integrationen genom att lägga till 'default_config:' eller '{platform}:'.", + "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." }, "more_info_control": { "dismiss": "Avfärda", @@ -643,6 +648,9 @@ "stop": "Stoppa" } }, + "mqtt_device_debug_info": { + "entities": "Entiteter" + }, "options_flow": { "form": { "header": "Inställningar" @@ -860,7 +868,7 @@ "delete": "Radera", "delete_confirm": "Säker på att du vill radera?", "duplicate": "Duplicera", - "header": "Triggers", + "header": "Händelse", "introduction": "Triggers är det som startar en automation. Det är möjligt att ange flera triggers för samma regel. När en trigger inträffar kommer Home Assistant att validera eventuella villkor och sedan köra åtgärden.", "learn_more": "Lär dig mer om utlösare", "name": "Trigger", @@ -1292,6 +1300,7 @@ "caption": "Integrationer", "config_entry": { "area": "I {area}", + "delete": "Ta bort", "delete_button": "Ta bort {integration}", "delete_confirm": "Är du säker på att du vill radera denna integration?", "device_unavailable": "enhet otillgänglig", @@ -1302,6 +1311,7 @@ "no_area": "Inget område (\"area\")", "no_device": "Entitet utan enheter", "no_devices": "Denna integration har inga enheter.", + "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}", "system_options_button": "Systeminställningar för {integration}" @@ -1347,7 +1357,7 @@ "lovelace": { "caption": "Lovelace kontrollpaneler", "dashboards": { - "cant_edit_yaml": "Instrumentpaneler som definieras i YAML kan inte bli redigerade från UI. Ändra dem i configuration.yaml.", + "cant_edit_yaml": "Instrumentpaneler som definieras i YAML kan inte bli redigerade från användargränssnittet. Ändra dem i configuration.yaml.", "caption": "Kontrollpaneler", "conf_mode": { "storage": "UI-kontrollerad", @@ -1366,7 +1376,7 @@ "title": "Sidofältets titel", "update": "Uppdatera", "url": "URL", - "url_error_msg": "URL-adressen kan inte innehålla mellanslag eller specialtecken, med undantag för _ och -" + "url_error_msg": "URL adressen ska innehålla ett '-' och kan inte innehålla mellanslag eller specialtecken, med undantag för '_ ' och '-'" }, "picker": { "add_dashboard": "Lägg till instrumentpanel", @@ -1382,7 +1392,7 @@ }, "description": "Konfigurera dina Lovelace kontrollpaneler", "resources": { - "cant_edit_yaml": "Du använder Lovelace i YAML-läge, därför kan du inte sköta dina resurser genom UI. Du får göra det i configuration.yaml istället.", + "cant_edit_yaml": "Du använder Lovelace i YAML-läge, därför kan du inte sköta dina resurser genom användargränssnittet. Du får göra det i configuration.yaml istället.", "caption": "Resurser", "confirm_delete": "Är du säker på att du vill ta bort denna resurs?", "detail": { @@ -1472,8 +1482,8 @@ "delete_confirm": "Är du säker på att du vill radera detta scenario?", "delete_scene": "Ta bort scenario", "edit_scene": "Redigera scenario", - "header": "Scenario-redigerare", - "introduction": "Scenarioredigeraren låter dig skapa och redigera scenario. Följ länken nedan för att läsa instruktionerna för att se till att du har konfigurerat Home Assistant korrekt.", + "header": "Scenarieredigerare", + "introduction": "Scenarieredigeraren låter dig skapa och redigera scenario. Följ länken nedan för att läsa instruktionerna för att se till att du har konfigurerat Home Assistant korrekt.", "learn_more": "Läs dig mer om scenarier", "no_scenes": "Vi kunde inte hitta några redigerbara scenarier", "only_editable": "Endast scenarier definierade i scenes.yaml kan redigeras.", @@ -1864,8 +1874,8 @@ "lovelace": { "add_entities": { "generated_unsupported": "Du kan bara använda den här funktionen när du har tagit kontroll över Lovelace UI.", - "saving_failed": "Det gick inte att spara Lovelace UI-konfigurationen.", - "yaml_unsupported": "Du kan inte använda den här funktionen när du använder Lovelace UI i YAML-läge." + "saving_failed": "Det gick inte att spara Lovelace användargränssnittskonfigurationen.", + "yaml_unsupported": "Du kan inte använda den här funktionen när du använder Lovelace användargränssnitt i YAML-läge." }, "cards": { "confirm_delete": "Är du säker på att du vill ta bort det här kortet?", @@ -1945,6 +1955,7 @@ "icon": "Ikon", "icon_height": "Ikonhöjd", "image": "Bildsökväg", + "manual": "Manuell", "maximum": "", "minimum": "", "name": "Namn", @@ -2087,7 +2098,7 @@ "save": "Ta kontroll", "yaml_config": "För att hjälpa dig igång, så är här nuvarande inställning för denna instrumentpanel:", "yaml_control": "Om du vill ta kontroll i YAML-läge skapar du en YAML-fil med det namn du angav i konfigurationen för den här instrumentpanelen eller standard \"ui-lovelace.yaml\".", - "yaml_mode": "Du använder YAML-läge, vilket betyder att du inte kan ändra dina Lovelace-inställning från UI. Om du vill ändra Lovelace från UI, ta bort 'mode: yaml' från dina Lovelaceinställningar i 'configuration.yaml'" + "yaml_mode": "Du använder YAML-läge, vilket betyder att du inte kan ändra dina Lovelace-inställning från användargränssnittet. Om du vill ändra Lovelace från användargränssnittet, ta bort 'mode: yaml' från dina Lovelaceinställningar i 'configuration.yaml'" }, "suggest_card": { "add": "Lägg till i Lovelace-gränsnitt", @@ -2123,7 +2134,8 @@ }, "warning": { "entity_non_numeric": "Enheten är icke-numerisk: {entity}", - "entity_not_found": "Enheten är ej tillgänglig: {entity}" + "entity_not_found": "Enheten är ej tillgänglig: {entity}", + "entity_unavailable": "{entity} är otillgänglig" } }, "mailbox": { diff --git a/translations/zh-Hans.json b/translations/zh-Hans.json index 2bb3ebc042..ddc843513f 100644 --- a/translations/zh-Hans.json +++ b/translations/zh-Hans.json @@ -654,6 +654,17 @@ "stop": "停止" } }, + "mqtt_device_debug_info": { + "deserialize": "尝试将 MQTT 消息解析为 JSON", + "entities": "实体", + "no_entities": "没有实体", + "no_triggers": "没有触发器", + "payload_display": "数据体显示", + "recent_messages": "最近 {n} 条收到的消息", + "show_as_yaml": "显示为 YAML", + "title": "{device} 调试信息", + "triggers": "触发器" + }, "options_flow": { "form": { "header": "选项" @@ -1294,6 +1305,10 @@ } } }, + "filtering": { + "clear": "清除", + "filtering_by": "筛选方式" + }, "header": "配置 Home Assistant", "helpers": { "caption": "辅助元素", @@ -1321,12 +1336,16 @@ } }, "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}", + "entities": "{count} {count, plural,\n one {个实体}\n other {个实体}\n}", "entity_unavailable": "实体不可用", "firmware": "固件:{version}", "hub": "连接于", @@ -1334,8 +1353,11 @@ "no_area": "没有区域", "no_device": "无设备关联的实体", "no_devices": "此集成没有设备。", + "options": "选项", + "rename": "重命名", "restart_confirm": "重启 Home Assistant 以完成此集成的删除", "settings_button": "编辑{integration}设置", + "system_options": "系统选项", "system_options_button": "{integration}系统选项" }, "config_flow": { @@ -1370,11 +1392,15 @@ "show_ignored": "显示忽略的集成", "stop_ignore": "不再忽略" }, + "integration": "个集成", "integration_not_found": "未找到集成。", "new": "设置新集成", + "no_integrations": "您好像还没有配置任何集成。点击下面的按钮来添加第一个集成!", "none": "尚未配置任何集成", "note_about_integrations": "并非所有集成都可以通过 UI 进行配置。", - "note_about_website_reference": "更多可用信息,尽在 " + "note_about_website_reference": "更多可用信息,尽在 ", + "rename_dialog": "编辑此配置项的名称", + "rename_input_label": "条目名称" }, "introduction": "您可以在此配置 Home Assistant 及组件。目前并非所有配置都能通过前端 UI 完成,但是我们在努力实现中。", "lovelace": { @@ -2241,7 +2267,8 @@ "warning": { "attribute_not_found": "属性 {attribute} 对 {entity} 不可用", "entity_non_numeric": "实体 {entity} 非数值", - "entity_not_found": "实体 {entity} 不可用" + "entity_not_found": "实体 {entity} 不可用", + "entity_unavailable": "{entity} 当前不可用" } }, "mailbox": { diff --git a/translations/zh-Hant.json b/translations/zh-Hant.json index dbacc83ed4..055f1b6b43 100644 --- a/translations/zh-Hant.json +++ b/translations/zh-Hant.json @@ -654,6 +654,17 @@ "stop": "停止清掃" } }, + "mqtt_device_debug_info": { + "deserialize": "嘗試將 MQTT 訊息解析為 JSON", + "entities": "物件", + "no_entities": "無物件", + "no_triggers": "無觸發", + "payload_display": "負載顯示", + "recent_messages": "{n} 個最近接收的訊息", + "show_as_yaml": "以 YAML 顯示", + "title": "{device} debug 訊息", + "triggers": "觸發" + }, "options_flow": { "form": { "header": "選項" @@ -1294,6 +1305,10 @@ } } }, + "filtering": { + "clear": "清除", + "filtering_by": "篩選" + }, "header": "設定 Home Assistant", "helpers": { "caption": "助手", @@ -1321,12 +1336,16 @@ } }, "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}", + "entities": "{count} {count, plural,\n one {物件}\n other {物件}\n}", "entity_unavailable": "物件不可用", "firmware": "韌體:{version}", "hub": "連線:", @@ -1334,8 +1353,11 @@ "no_area": "無分區", "no_device": "物件沒有設備", "no_devices": "此整合沒有任何設備。", + "options": "選項", + "rename": "重新命名", "restart_confirm": "重啟 Home Assistant 以完成此整合移動", "settings_button": "編輯 {integration} 設定", + "system_options": "系統選項", "system_options_button": "{integration} 系統選項" }, "config_flow": { @@ -1370,11 +1392,15 @@ "show_ignored": "顯示已忽略整合", "stop_ignore": "停止忽略中" }, + "integration": "整合", "integration_not_found": "找不到整合。", "new": "設定新整合", + "no_integrations": "目前似乎沒有設定任何整合。點選下方新增按鈕以新增第一個整合!", "none": "尚未設定", "note_about_integrations": "目前並非所有整合皆可以透過 UI 進行設定。", - "note_about_website_reference": "更多資訊請參閱" + "note_about_website_reference": "更多資訊請參閱", + "rename_dialog": "編輯設定物件名稱", + "rename_input_label": "物件名稱" }, "introduction": "此處為 Home Assistant 和元件相關配置區,目前尚未支援透過 UI 進行所有設定,我們正在努力改進中。", "lovelace": { @@ -2241,7 +2267,8 @@ "warning": { "attribute_not_found": "無法使用屬性 {attribute} 之物件:{entity}", "entity_non_numeric": "物件為非數字:{entity}", - "entity_not_found": "物件不可用:{entity}" + "entity_not_found": "物件不可用:{entity}", + "entity_unavailable": "{entity} 目前不可用" } }, "mailbox": {