diff --git a/setup.py b/setup.py index efce5eff11..9ab9f5f280 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name="home-assistant-frontend", - version="20201203.0", + version="20201204.0", description="The Home Assistant frontend", url="https://github.com/home-assistant/home-assistant-polymer", author="The Home Assistant Authors", diff --git a/src/components/device/ha-device-picker.ts b/src/components/device/ha-device-picker.ts index 34897f2c5a..c1e86dd761 100644 --- a/src/components/device/ha-device-picker.ts +++ b/src/components/device/ha-device-picker.ts @@ -1,4 +1,5 @@ -import "../ha-icon-button"; +import "../ha-svg-icon"; +import "@material/mwc-icon-button/mwc-icon-button"; import "@polymer/paper-input/paper-input"; import "@polymer/paper-item/paper-item"; import "@polymer/paper-item/paper-item-body"; @@ -12,6 +13,8 @@ import { html, LitElement, property, + PropertyValues, + query, TemplateResult, } from "lit-element"; import memoizeOne from "memoize-one"; @@ -35,6 +38,7 @@ import { import { SubscribeMixin } from "../../mixins/subscribe-mixin"; import { PolymerChangedEvent } from "../../polymer-types"; import { HomeAssistant } from "../../types"; +import { mdiClose, mdiMenuUp, mdiMenuDown } from "@mdi/js"; interface Device { name: string; @@ -111,17 +115,9 @@ export class HaDevicePicker extends SubscribeMixin(LitElement) { @property({ type: Boolean }) private _opened?: boolean; - public open() { - this.updateComplete.then(() => { - (this.shadowRoot?.querySelector("vaadin-combo-box-light") as any)?.open(); - }); - } + @query("vaadin-combo-box-light", true) private _comboBox!: HTMLElement; - public focus() { - this.updateComplete.then(() => { - this.shadowRoot?.querySelector("paper-input")?.focus(); - }); - } + private _init = false; private _getDevices = memoizeOne( ( @@ -134,7 +130,13 @@ export class HaDevicePicker extends SubscribeMixin(LitElement) { deviceFilter: this["deviceFilter"] ): Device[] => { if (!devices.length) { - return []; + return [ + { + id: "", + area: "", + name: this.hass.localize("ui.components.device-picker.no_devices"), + }, + ]; } const deviceEntityLookup: DeviceEntityLookup = {}; @@ -225,6 +227,15 @@ export class HaDevicePicker extends SubscribeMixin(LitElement) { : this.hass.localize("ui.components.device-picker.no_area"), }; }); + if (!outputDevices.length) { + return [ + { + id: "", + area: "", + name: this.hass.localize("ui.components.device-picker.no_match"), + }, + ]; + } if (outputDevices.length === 1) { return outputDevices; } @@ -232,6 +243,18 @@ export class HaDevicePicker extends SubscribeMixin(LitElement) { } ); + public open() { + this.updateComplete.then(() => { + (this.shadowRoot?.querySelector("vaadin-combo-box-light") as any)?.open(); + }); + } + + public focus() { + this.updateComplete.then(() => { + this.shadowRoot?.querySelector("paper-input")?.focus(); + }); + } + public hassSubscribe(): UnsubscribeFunc[] { return [ subscribeDeviceRegistry(this.hass.connection!, (devices) => { @@ -246,25 +269,33 @@ export class HaDevicePicker extends SubscribeMixin(LitElement) { ]; } + protected updated(changedProps: PropertyValues) { + if ( + (!this._init && this.devices && this.areas && this.entities) || + (changedProps.has("_opened") && this._opened) + ) { + this._init = true; + (this._comboBox as any).items = this._getDevices( + this.devices!, + this.areas!, + this.entities!, + this.includeDomains, + this.excludeDomains, + this.includeDeviceClasses, + this.deviceFilter + ); + } + } + protected render(): TemplateResult { if (!this.devices || !this.areas || !this.entities) { return html``; } - const devices = this._getDevices( - this.devices, - this.areas, - this.entities, - this.includeDomains, - this.excludeDomains, - this.includeDeviceClasses, - this.deviceFilter - ); return html` ${this.value ? html` - - Clear - - ` - : ""} - ${devices.length > 0 - ? html` - - Toggle - + + ` : ""} + + + + `; @@ -346,7 +373,7 @@ export class HaDevicePicker extends SubscribeMixin(LitElement) { static get styles(): CSSResult { return css` - paper-input > ha-icon-button { + paper-input > mwc-icon-button { --mdc-icon-button-size: 24px; padding: 2px; color: var(--secondary-text-color); diff --git a/src/components/entity/ha-entity-picker.ts b/src/components/entity/ha-entity-picker.ts index c83c6a44e3..b24c5c227c 100644 --- a/src/components/entity/ha-entity-picker.ts +++ b/src/components/entity/ha-entity-picker.ts @@ -165,6 +165,24 @@ export class HaEntityPicker extends LitElement { ); } + if (!states.length) { + return [ + { + entity_id: "", + state: "", + last_changed: "", + last_updated: "", + context: { id: "", user_id: null }, + attributes: { + friendly_name: this.hass!.localize( + "ui.components.entity.entity-picker.no_match" + ), + icon: "mdi:magnify", + }, + }, + ]; + } + return states; } ); @@ -215,7 +233,6 @@ export class HaEntityPicker extends LitElement { .label=${this.label === undefined ? this.hass.localize("ui.components.entity.entity-picker.entity") : this.label} - .value=${this._value} .disabled=${this.disabled} class="input" autocapitalize="none" diff --git a/src/components/ha-area-picker.ts b/src/components/ha-area-picker.ts index 7a9cb710d1..9ad7391448 100644 --- a/src/components/ha-area-picker.ts +++ b/src/components/ha-area-picker.ts @@ -1,4 +1,5 @@ -import "./ha-icon-button"; +import "./ha-svg-icon"; +import "@material/mwc-icon-button/mwc-icon-button"; import "@polymer/paper-input/paper-input"; import "@polymer/paper-item/paper-item"; import "@polymer/paper-item/paper-item-body"; @@ -14,6 +15,8 @@ import { property, internalProperty, TemplateResult, + PropertyValues, + query, } from "lit-element"; import { fireEvent } from "../common/dom/fire_event"; import { @@ -40,6 +43,7 @@ import { } from "../data/entity_registry"; import { computeDomain } from "../common/entity/compute_domain"; import type { HaDevicePickerDeviceFilterFunc } from "./device/ha-device-picker"; +import { mdiClose, mdiMenuDown, mdiMenuUp } from "@mdi/js"; const rowRenderer = ( root: HTMLElement, @@ -121,6 +125,10 @@ export class HaAreaPicker extends SubscribeMixin(LitElement) { @internalProperty() private _opened?: boolean; + @query("vaadin-combo-box-light", true) private _comboBox!: HTMLElement; + + private _init = false; + public hassSubscribe(): UnsubscribeFunc[] { return [ subscribeAreaRegistry(this.hass.connection!, (areas) => { @@ -159,6 +167,15 @@ export class HaAreaPicker extends SubscribeMixin(LitElement) { entityFilter: this["entityFilter"], noAdd: this["noAdd"] ): AreaRegistryEntry[] => { + if (!areas.length) { + return [ + { + area_id: "", + name: this.hass.localize("ui.components.area-picker.no_areas"), + }, + ]; + } + const deviceEntityLookup: DeviceEntityLookup = {}; let inputDevices: DeviceRegistryEntry[] | undefined; let inputEntities: EntityRegistryEntry[] | undefined; @@ -243,7 +260,9 @@ export class HaAreaPicker extends SubscribeMixin(LitElement) { } if (entityFilter) { - entities = entities.filter((entity) => entityFilter!(entity)); + inputEntities = inputEntities!.filter((entity) => + entityFilter!(entity) + ); } let outputAreas = areas; @@ -268,6 +287,15 @@ export class HaAreaPicker extends SubscribeMixin(LitElement) { outputAreas = areas.filter((area) => areaIds!.includes(area.area_id)); } + if (!outputAreas.length) { + outputAreas = [ + { + area_id: "", + name: this.hass.localize("ui.components.area-picker.no_match"), + }, + ]; + } + return noAdd ? outputAreas : [ @@ -280,27 +308,35 @@ export class HaAreaPicker extends SubscribeMixin(LitElement) { } ); + protected updated(changedProps: PropertyValues) { + if ( + (!this._init && this._devices && this._areas && this._entities) || + (changedProps.has("_opened") && this._opened) + ) { + this._init = true; + (this._comboBox as any).items = this._getAreas( + this._areas!, + this._devices!, + this._entities!, + this.includeDomains, + this.excludeDomains, + this.includeDeviceClasses, + this.deviceFilter, + this.entityFilter, + this.noAdd + ); + } + } + protected render(): TemplateResult { if (!this._devices || !this._areas || !this._entities) { return html``; } - const areas = this._getAreas( - this._areas, - this._devices, - this._entities, - this.includeDomains, - this.excludeDomains, - this.includeDeviceClasses, - this.deviceFilter, - this.entityFilter, - this.noAdd - ); return html` ${this.value ? html` - - ${this.hass.localize("ui.components.area-picker.clear")} - - ` - : ""} - ${areas.length > 0 - ? html` - - ${this.hass.localize("ui.components.area-picker.toggle")} - + + ` : ""} + + + + `; @@ -424,7 +454,7 @@ export class HaAreaPicker extends SubscribeMixin(LitElement) { static get styles(): CSSResult { return css` - paper-input > ha-icon-button { + paper-input > mwc-icon-button { --mdc-icon-button-size: 24px; padding: 2px; color: var(--secondary-text-color); diff --git a/src/components/ha-selector/ha-selector-area.ts b/src/components/ha-selector/ha-selector-area.ts index d3f7d2f6a7..903626440b 100644 --- a/src/components/ha-selector/ha-selector-area.ts +++ b/src/components/ha-selector/ha-selector-area.ts @@ -77,7 +77,8 @@ export class HaAreaSelector extends LitElement { } if (this.selector.area.device?.integration) { if ( - !this._configEntries?.some((entry) => + this._configEntries && + !this._configEntries.some((entry) => device.config_entries.includes(entry.entry_id) ) ) { diff --git a/src/components/ha-selector/ha-selector-device.ts b/src/components/ha-selector/ha-selector-device.ts index 98a83ba562..f3f2c1ff35 100644 --- a/src/components/ha-selector/ha-selector-device.ts +++ b/src/components/ha-selector/ha-selector-device.ts @@ -63,7 +63,8 @@ export class HaDeviceSelector extends LitElement { } if (this.selector.device.integration) { if ( - !this._configEntries?.some((entry) => + this._configEntries && + !this._configEntries.some((entry) => device.config_entries.includes(entry.entry_id) ) ) { diff --git a/src/components/ha-target-picker.ts b/src/components/ha-target-picker.ts index 68a6e0701e..52f1ae550f 100644 --- a/src/components/ha-target-picker.ts +++ b/src/components/ha-target-picker.ts @@ -435,10 +435,19 @@ export class HaTargetPicker extends SubscribeMixin(LitElement) { type: string, id: string ): this["value"] { - return { - ...value, - [type]: ensureArray(value![type])!.filter((val) => val !== id), - }; + const newVal = ensureArray(value![type])!.filter((val) => val !== id); + if (newVal.length) { + return { + ...value, + [type]: newVal, + }; + } + const val = { ...value }!; + delete val[type]; + if (Object.keys(val).length) { + return val; + } + return undefined; } private _deviceMeetsFilter(device: DeviceRegistryEntry): boolean { diff --git a/src/panels/config/automation/blueprint-automation-editor.ts b/src/panels/config/automation/blueprint-automation-editor.ts index b7f6d46f05..570d4cee7b 100644 --- a/src/panels/config/automation/blueprint-automation-editor.ts +++ b/src/panels/config/automation/blueprint-automation-editor.ts @@ -18,9 +18,6 @@ import "@polymer/paper-input/paper-textarea"; import "@polymer/paper-dropdown-menu/paper-dropdown-menu-light"; import "../../../components/entity/ha-entity-toggle"; import "@material/mwc-button/mwc-button"; -import "./trigger/ha-automation-trigger"; -import "./condition/ha-automation-condition"; -import "./action/ha-automation-action"; import { fireEvent } from "../../../common/dom/fire_event"; import { haStyle } from "../../../resources/styles"; import { HassEntity } from "home-assistant-js-websocket"; @@ -151,7 +148,7 @@ export class HaBlueprintAutomationEditor extends LitElement { There is an error in this Blueprint: ${blueprint.error}

` : html`${blueprint?.metadata.description - ? html`

+ ? html`

${blueprint.metadata.description}

` : ""} @@ -227,12 +224,18 @@ export class HaBlueprintAutomationEditor extends LitElement { ) { return; } + const input = { ...this.config.use_blueprint.input, [key]: value }; + + if (value === "" || value === undefined) { + delete input[key]; + } + fireEvent(this, "value-changed", { value: { ...this.config!, use_blueprint: { ...this.config.use_blueprint, - input: { ...this.config.use_blueprint.input, [key]: value }, + input, }, }, }); @@ -264,6 +267,9 @@ export class HaBlueprintAutomationEditor extends LitElement { .padding { padding: 16px; } + .pre-line { + white-space: pre-line; + } .blueprint-picker-container { padding: 16px; } diff --git a/src/panels/config/blueprint/dialog-import-blueprint.ts b/src/panels/config/blueprint/dialog-import-blueprint.ts index 1abb786fec..ed65a04157 100644 --- a/src/panels/config/blueprint/dialog-import-blueprint.ts +++ b/src/panels/config/blueprint/dialog-import-blueprint.ts @@ -12,6 +12,7 @@ import { internalProperty, query, TemplateResult, + css, } from "lit-element"; import "../../../components/ha-dialog"; import { haStyleDialog } from "../../../resources/styles"; @@ -73,7 +74,9 @@ class DialogImportBlueprint extends LitElement { this._result.blueprint.metadata.domain )}
- ${this._result.blueprint.metadata.description} +

+ ${this._result.blueprint.metadata.description} +

${this._result.validation_errors ? html`

@@ -199,8 +202,15 @@ class DialogImportBlueprint extends LitElement { } } - static get styles(): CSSResult { - return haStyleDialog; + static get styles(): CSSResult[] { + return [ + haStyleDialog, + css` + .pre-line { + white-space: pre-line; + } + `, + ]; } } diff --git a/src/panels/config/blueprint/ha-blueprint-overview.ts b/src/panels/config/blueprint/ha-blueprint-overview.ts index bfdd513c94..76009e48fd 100644 --- a/src/panels/config/blueprint/ha-blueprint-overview.ts +++ b/src/panels/config/blueprint/ha-blueprint-overview.ts @@ -1,6 +1,6 @@ import "../../../components/ha-fab"; import "@material/mwc-icon-button"; -import { mdiPlus, mdiHelpCircle, mdiDelete, mdiRobot } from "@mdi/js"; +import { mdiHelpCircle, mdiDelete, mdiRobot, mdiDownload } from "@mdi/js"; import "@polymer/paper-tooltip/paper-tooltip"; import { CSSResult, @@ -182,7 +182,7 @@ class HaBlueprintOverview extends LitElement { extended @click=${this._addBlueprint} > - + `; @@ -195,7 +195,10 @@ class HaBlueprintOverview extends LitElement { ${this.hass.localize("ui.panel.config.blueprint.overview.introduction")}

diff --git a/src/panels/lovelace/cards/hui-button-card.ts b/src/panels/lovelace/cards/hui-button-card.ts index 719320ebcd..ef21e4c8b7 100644 --- a/src/panels/lovelace/cards/hui-button-card.ts +++ b/src/panels/lovelace/cards/hui-button-card.ts @@ -84,9 +84,6 @@ export class HuiButtonCard extends LitElement implements LovelaceCard { } public setConfig(config: ButtonCardConfig): void { - if (!config.entity) { - throw new Error("Entity must be specified"); - } if (config.entity && !isValidEntityId(config.entity)) { throw new Error("Invalid entity"); } diff --git a/src/panels/lovelace/cards/hui-entity-button-card.ts b/src/panels/lovelace/cards/hui-entity-button-card.ts index 7955ccf040..0cb0b7eb43 100644 --- a/src/panels/lovelace/cards/hui-entity-button-card.ts +++ b/src/panels/lovelace/cards/hui-entity-button-card.ts @@ -2,7 +2,14 @@ import { customElement } from "lit-element"; import { HuiButtonCard } from "./hui-button-card"; @customElement("hui-entity-button-card") -class HuiEntityButtonCard extends HuiButtonCard {} +class HuiEntityButtonCard extends HuiButtonCard { + public setConfig(config): void { + if (!config.entity) { + throw new Error("Entity must be specified"); + } + super.setConfig(config); + } +} declare global { interface HTMLElementTagNameMap { diff --git a/src/panels/lovelace/components/hui-card-options.ts b/src/panels/lovelace/components/hui-card-options.ts index a74acde408..a921a130d7 100644 --- a/src/panels/lovelace/components/hui-card-options.ts +++ b/src/panels/lovelace/components/hui-card-options.ts @@ -1,7 +1,8 @@ import "@material/mwc-button"; -import "@material/mwc-list/mwc-list-item"; import "@material/mwc-icon-button"; -import "../../../components/ha-button-menu"; +import { ActionDetail } from "@material/mwc-list/mwc-list-foundation"; +import "@material/mwc-list/mwc-list-item"; +import { mdiArrowDown, mdiArrowUp, mdiDotsVertical } from "@mdi/js"; import { css, CSSResult, @@ -9,21 +10,20 @@ import { html, LitElement, property, - TemplateResult, queryAssignedNodes, + TemplateResult, } from "lit-element"; -import { HomeAssistant } from "../../../types"; -import { showEditCardDialog } from "../editor/card-editor/show-edit-card-dialog"; -import { swapCard, moveCard, addCard, deleteCard } from "../editor/config-util"; -import { confDeleteCard } from "../editor/delete-card"; -import { Lovelace, LovelaceCard } from "../types"; -import { computeCardSize } from "../common/compute-card-size"; -import { mdiDotsVertical, mdiArrowDown, mdiArrowUp } from "@mdi/js"; -import { ActionDetail } from "@material/mwc-list/mwc-list-foundation"; -import { showSelectViewDialog } from "../editor/select-view/show-select-view-dialog"; +import { fireEvent } from "../../../common/dom/fire_event"; +import "../../../components/ha-button-menu"; import { saveConfig } from "../../../data/lovelace"; import { showAlertDialog } from "../../../dialogs/generic/show-dialog-box"; +import { HomeAssistant } from "../../../types"; import { showSaveSuccessToast } from "../../../util/toast-saved-success"; +import { computeCardSize } from "../common/compute-card-size"; +import { showEditCardDialog } from "../editor/card-editor/show-edit-card-dialog"; +import { addCard, deleteCard, moveCard, swapCard } from "../editor/config-util"; +import { showSelectViewDialog } from "../editor/select-view/show-select-view-dialog"; +import { Lovelace, LovelaceCard } from "../types"; @customElement("hui-card-options") export class HuiCardOptions extends LitElement { @@ -168,11 +168,7 @@ export class HuiCardOptions extends LitElement { } private _editCard(): void { - showEditCardDialog(this, { - lovelaceConfig: this.lovelace!.config, - saveConfig: this.lovelace!.saveConfig, - path: this.path!, - }); + fireEvent(this, "ll-edit-card", { path: this.path! }); } private _cardUp(): void { @@ -229,7 +225,7 @@ export class HuiCardOptions extends LitElement { } private _deleteCard(): void { - confDeleteCard(this, this.hass!, this.lovelace!, this.path!); + fireEvent(this, "ll-delete-card", { path: this.path! }); } } diff --git a/src/panels/lovelace/editor/card-editor/show-create-card-dialog.ts b/src/panels/lovelace/editor/card-editor/show-create-card-dialog.ts index 9ce58c1251..2aeec60aa0 100644 --- a/src/panels/lovelace/editor/card-editor/show-create-card-dialog.ts +++ b/src/panels/lovelace/editor/card-editor/show-create-card-dialog.ts @@ -8,7 +8,7 @@ export interface CreateCardDialogParams { entities?: string[]; // We can pass entity id's that will be added to the config when a card is picked } -const importCreateCardDialog = () => import("./hui-dialog-create-card"); +export const importCreateCardDialog = () => import("./hui-dialog-create-card"); export const showCreateCardDialog = ( element: HTMLElement, diff --git a/src/panels/lovelace/editor/card-editor/show-delete-card-dialog.ts b/src/panels/lovelace/editor/card-editor/show-delete-card-dialog.ts index 53fe8b1368..47395bfd95 100644 --- a/src/panels/lovelace/editor/card-editor/show-delete-card-dialog.ts +++ b/src/panels/lovelace/editor/card-editor/show-delete-card-dialog.ts @@ -6,7 +6,7 @@ export interface DeleteCardDialogParams { cardConfig?: LovelaceCardConfig; } -const importDeleteCardDialog = () => import("./hui-dialog-delete-card"); +export const importDeleteCardDialog = () => import("./hui-dialog-delete-card"); export const showDeleteCardDialog = ( element: HTMLElement, diff --git a/src/panels/lovelace/editor/card-editor/show-edit-card-dialog.ts b/src/panels/lovelace/editor/card-editor/show-edit-card-dialog.ts index 4f874a5d78..0636650ba0 100644 --- a/src/panels/lovelace/editor/card-editor/show-edit-card-dialog.ts +++ b/src/panels/lovelace/editor/card-editor/show-edit-card-dialog.ts @@ -8,7 +8,7 @@ export interface EditCardDialogParams { cardConfig?: LovelaceCardConfig; } -const importEditCardDialog = () => import("./hui-dialog-edit-card"); +export const importEditCardDialog = () => import("./hui-dialog-edit-card"); export const showEditCardDialog = ( element: HTMLElement, diff --git a/src/panels/lovelace/views/default-view-editable.ts b/src/panels/lovelace/views/default-view-editable.ts index d32e0774b4..b839edef98 100644 --- a/src/panels/lovelace/views/default-view-editable.ts +++ b/src/panels/lovelace/views/default-view-editable.ts @@ -1,3 +1,10 @@ // hui-view dependencies for when in edit mode. import "../../../components/ha-fab"; import "../components/hui-card-options"; +import { importCreateCardDialog } from "../editor/card-editor/show-create-card-dialog"; +import { importDeleteCardDialog } from "../editor/card-editor/show-delete-card-dialog"; +import { importEditCardDialog } from "../editor/card-editor/show-edit-card-dialog"; + +importCreateCardDialog(); +importDeleteCardDialog(); +importEditCardDialog(); diff --git a/src/panels/lovelace/views/hui-masonry-view.ts b/src/panels/lovelace/views/hui-masonry-view.ts index b123d3060a..42914224af 100644 --- a/src/panels/lovelace/views/hui-masonry-view.ts +++ b/src/panels/lovelace/views/hui-masonry-view.ts @@ -10,6 +10,7 @@ import { TemplateResult, } from "lit-element"; import { classMap } from "lit-html/directives/class-map"; +import { fireEvent } from "../../../common/dom/fire_event"; import { computeRTL } from "../../../common/util/compute_rtl"; import { nextRender } from "../../../common/util/render-status"; import "../../../components/entity/ha-state-label-badge"; @@ -21,7 +22,6 @@ import type { import type { HomeAssistant } from "../../../types"; import type { HuiErrorCard } from "../cards/hui-error-card"; import { computeCardSize } from "../common/compute-card-size"; -import { showCreateCardDialog } from "../editor/card-editor/show-create-card-dialog"; import type { Lovelace, LovelaceBadge, LovelaceCard } from "../types"; let editCodeLoaded = false; @@ -148,11 +148,7 @@ export class MasonryView extends LitElement implements LovelaceViewElement { } private _addCard(): void { - showCreateCardDialog(this, { - lovelaceConfig: this.lovelace!.config, - saveConfig: this.lovelace!.saveConfig, - path: [this.index!], - }); + fireEvent(this, "ll-create-card"); } private async _createColumns() { diff --git a/src/panels/lovelace/views/hui-view.ts b/src/panels/lovelace/views/hui-view.ts index 39b2cb3d44..0a56d3ff7f 100644 --- a/src/panels/lovelace/views/hui-view.ts +++ b/src/panels/lovelace/views/hui-view.ts @@ -20,11 +20,23 @@ import { processConfigEntities } from "../common/process-config-entities"; import { createBadgeElement } from "../create-element/create-badge-element"; import { createCardElement } from "../create-element/create-card-element"; import { createViewElement } from "../create-element/create-view-element"; +import { showCreateCardDialog } from "../editor/card-editor/show-create-card-dialog"; +import { showEditCardDialog } from "../editor/card-editor/show-edit-card-dialog"; +import { confDeleteCard } from "../editor/delete-card"; import type { Lovelace, LovelaceBadge, LovelaceCard } from "../types"; const DEFAULT_VIEW_LAYOUT = "masonry"; const PANEL_VIEW_LAYOUT = "panel"; +declare global { + // for fire event + interface HASSDomEvents { + "ll-create-card": undefined; + "ll-edit-card": { path: [number] | [number, number] }; + "ll-delete-card": { path: [number] | [number, number] }; + } +} + @customElement("hui-view") export class HUIView extends UpdatingElement { @property({ attribute: false }) public hass?: HomeAssistant; @@ -106,6 +118,23 @@ export class HUIView extends UpdatingElement { if (configChanged && !this._layoutElement) { this._layoutElement = createViewElement(viewConfig!); + this._layoutElement.addEventListener("ll-create-card", () => { + showCreateCardDialog(this, { + lovelaceConfig: this.lovelace!.config, + saveConfig: this.lovelace!.saveConfig, + path: [this.index!], + }); + }); + this._layoutElement.addEventListener("ll-edit-card", (ev) => { + showEditCardDialog(this, { + lovelaceConfig: this.lovelace!.config, + saveConfig: this.lovelace!.saveConfig, + path: ev.detail.path, + }); + }); + this._layoutElement.addEventListener("ll-delete-card", (ev) => { + confDeleteCard(this, this.hass!, this.lovelace!, ev.detail.path); + }); } if (configChanged) { diff --git a/src/state/panel-title-mixin.ts b/src/state/panel-title-mixin.ts index d6ec6a2f90..121c51d628 100644 --- a/src/state/panel-title-mixin.ts +++ b/src/state/panel-title-mixin.ts @@ -21,7 +21,8 @@ export const panelTitleMixin = >( if ( !oldHass || oldHass.panels !== this.hass.panels || - oldHass.panelUrl !== this.hass.panelUrl + oldHass.panelUrl !== this.hass.panelUrl || + oldHass.localize !== this.hass.localize ) { setTitle(getPanelTitle(this.hass)); } diff --git a/src/state/translations-mixin.ts b/src/state/translations-mixin.ts index fef6eb4792..e0fb4ed00a 100644 --- a/src/state/translations-mixin.ts +++ b/src/state/translations-mixin.ts @@ -36,6 +36,8 @@ export default >(superClass: T) => // eslint-disable-next-line: variable-name private __coreProgress?: string; + private __loadedFragmetTranslations: Set = new Set(); + private __loadedTranslations: { // track what things have been loaded [category: string]: LoadedTranslationCategory; @@ -101,6 +103,7 @@ export default >(superClass: T) => document.querySelector("html")!.setAttribute("lang", hass.language); this.style.direction = computeRTL(hass) ? "rtl" : "ltr"; this._loadCoreTranslations(hass.language); + this.__loadedFragmetTranslations = new Set(); this._loadFragmentTranslations(hass.language, hass.panelUrl); } @@ -195,10 +198,31 @@ export default >(superClass: T) => language: string, panelUrl: string ) { - if (translationMetadata.fragments.includes(panelUrl)) { - const result = await getTranslation(panelUrl, language); - this._updateResources(result.language, result.data); + if (!panelUrl) { + return; } + const panelComponent = this.hass?.panels?.[panelUrl]?.component_name; + + // If it's the first call we don't have panel info yet to check the component. + // If the url is not known it might be a custom lovelace dashboard, so we load lovelace translations + const fragment = translationMetadata.fragments.includes( + panelComponent || panelUrl + ) + ? panelComponent || panelUrl + : !panelComponent + ? "lovelace" + : undefined; + + if (!fragment) { + return; + } + + if (this.__loadedFragmetTranslations.has(fragment)) { + return; + } + this.__loadedFragmetTranslations.add(fragment); + const result = await getTranslation(fragment, language); + this._updateResources(result.language, result.data); } private async _loadCoreTranslations(language: string) { @@ -227,6 +251,9 @@ export default >(superClass: T) => // from this._pendingHass instead. Otherwise the first set of strings is // overwritten when we call _updateHass the second time! + // Allow hass to be updated + await new Promise((resolve) => setTimeout(resolve, 0)); + if (language !== (this.hass ?? this._pendingHass).language) { // the language was changed, abort return; diff --git a/src/translations/en.json b/src/translations/en.json index 124eb186ab..aa10caf715 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -328,6 +328,7 @@ "entity-picker": { "entity": "Entity", "clear": "Clear", + "no_match": "No matching entities found", "show_entities": "Show entities" }, "entity-attribute-picker": { @@ -359,6 +360,8 @@ "clear": "Clear", "toggle": "Toggle", "show_devices": "Show devices", + "no_devices": "You don't have any devices", + "no_match": "No matching devices found", "device": "Device", "no_area": "No area" }, @@ -367,6 +370,8 @@ "show_areas": "Show areas", "area": "Area", "add_new": "Add new area…", + "no_areas": "You don't have any areas", + "no_match": "No matching areas found", "add_dialog": { "title": "Add new area", "text": "Enter the name of the new area.", @@ -1456,8 +1461,8 @@ "description": "Manage blueprints", "overview": { "header": "Blueprint Editor", - "introduction": "The blueprint editor allows you to create and edit blueprints.", - "learn_more": "Learn more about blueprints", + "introduction": "The blueprint configuration allows you to import and manage your blueprints.", + "learn_more": "Learn more about using blueprints", "headers": { "name": "Name", "domain": "Domain", @@ -1470,18 +1475,18 @@ "delete_blueprint": "Delete blueprint" }, "add": { - "header": "Add new blueprint", - "import_header": "Import \"{name}\" (type: {domain})", + "header": "Import a blueprint", + "import_header": "Blueprint \"{name}\"", "import_introduction": "You can import blueprints of other users from Github and the community forums. Enter the URL of the blueprint below.", "url": "URL of the blueprint", "raw_blueprint": "Blueprint content", - "importing": "Importing blueprint...", - "import_btn": "Import blueprint", - "saving": "Saving blueprint...", - "save_btn": "Save blueprint", + "importing": "Loading blueprint...", + "import_btn": "Preview blueprint", + "saving": "Importing blueprint...", + "save_btn": "Import blueprint", "error_no_url": "Please enter the URL of the blueprint.", "unsupported_blueprint": "This blueprint is not supported", - "file_name": "Local blueprint file name" + "file_name": "Blueprint Path" } }, "script": { diff --git a/translations/frontend/cs.json b/translations/frontend/cs.json index 01c1bbdf87..f67f9f432f 100644 --- a/translations/frontend/cs.json +++ b/translations/frontend/cs.json @@ -2,6 +2,7 @@ "config_entry": { "disabled_by": { "config_entry": "Položka nastavení", + "device": "Zařízení", "integration": "Integrace", "user": "Uživatel" } @@ -709,6 +710,14 @@ "service-picker": { "service": "Služba" }, + "target-picker": { + "add_area_id": "Vyberte oblast", + "add_device_id": "Vyberte zařízení", + "add_entity_id": "Vyberte entitu", + "remove_area_id": "Odebrat oblast", + "remove_device_id": "Odebrat zařízení", + "remove_entity_id": "Odebrat entitu" + }, "user-picker": { "add_user": "Přidat uživatele", "no_user": "Žádný uživatel", @@ -732,6 +741,7 @@ "editor": { "confirm_delete": "Opravdu chcete tuto položku smazat?", "delete": "Odstranit", + "device_disabled": "Zařízení této entity je zakázáno.", "enabled_cause": "Zakázáno {cause}.", "enabled_delay_confirm": "Povolené entity budou přidány do Home Assistant za {delay} sekund", "enabled_description": "Zakázané entity nebudou přidány do Home Assistant.", @@ -742,6 +752,7 @@ "icon_error": "Ikony by měly být ve formátu 'prefix:nazevikony', např. 'mdi:home'", "name": "Jméno", "note": "Poznámka: U všech integrací to ještě nemusí fungovat.", + "open_device_settings": "Otevřít nastavení zařízení", "unavailable": "Tato entita není momentálně k dispozici.", "update": "Aktualizovat" }, @@ -1028,7 +1039,7 @@ "confirmation_text": "Všechna zařízení v této oblasti budou nastavena jako nepřiřazena.", "confirmation_title": "Opravdu chcete tuto oblast smazat?" }, - "description": "Správa oblastí ve vaší domácnosti", + "description": "Seskupte zařízení do oblastí", "editor": { "area_id": "ID oblasti", "create": "VYTVOŘIT", @@ -1050,7 +1061,7 @@ }, "automation": { "caption": "Automatizace", - "description": "Správa automatizací", + "description": "Vytvořte si pro svůj domov vlastní pravidla chování", "dialog_new": { "header": "Vytvoření automatizace", "how": "Jak chcete vytvořit svou novou automatizaci?", @@ -1585,7 +1596,7 @@ }, "core": { "caption": "Obecné", - "description": "Změny obecného nastavení Home Assistant", + "description": "Jednotkový systém, umístění, časové pásmo a další obecné parametry", "section": { "core": { "core_config": { @@ -1647,6 +1658,7 @@ "unknown_condition": "Neznámá podmínka" }, "create": "Vytvořit automatizaci se zařízením", + "create_disable": "Nelze vytvořit automatizaci se zakázaným zařízením", "no_automations": "Žádné automatizace", "no_device_automations": "Pro toto zařízení nejsou k dispozici žádné automatizace.", "triggers": { @@ -1672,9 +1684,18 @@ "no_devices": "Žádná zařízení" }, "delete": "Odstranit", - "description": "Správa připojených zařízení", + "description": "Spravujte připojená zařízení", "device_info": "Informace o zařízení", "device_not_found": "Zařízení nebylo nalezeno.", + "disabled": "Zakázáno", + "disabled_by": { + "config_entry": "Položka nastavení", + "integration": "Integrace", + "user": "Uživatel" + }, + "enabled_cause": "Zařízení je zakázáno přes {cause}.", + "enabled_description": "Zakázaná zařízení se nebudou zobrazovat a entity patřící k těmto zařízením budou zakázány a nebudou přidány do Home Assistant.", + "enabled_label": "Povolit zařízení", "entities": { "add_entities_lovelace": "Přidat do Lovelace", "disabled_entities": "+{count} {count, plural,\n one {zakázaná entita}\n other {zakázaných entit}\n}", @@ -1684,14 +1705,25 @@ }, "name": "Jméno", "no_devices": "Žádná zařízení", + "picker": { + "filter": { + "filter": "Filtrovat", + "hidden_devices": "{number} {number, plural,\n one {skryté zařízení}\n few {skrytá zařízení}\n other {skrytých zařízení}\n}", + "show_all": "Zobrazit vše", + "show_disabled": "Zobrazit zakázaná zařízení" + }, + "search": "Hledat zařízení" + }, "scene": { "create": "Vytvořit scénu se zařízením", + "create_disable": "Nelze vytvořit scénu se zakázaným zařízením", "no_scenes": "Žádné scény", "scenes": "Scény" }, "scenes": "Scény", "script": { "create": "Vytvořit skript se zařízením", + "create_disable": "Nelze vytvořit skript se zakázaným zařízením", "no_scripts": "Žádné skripty", "scripts": "Skripty" }, @@ -1757,7 +1789,7 @@ "header": "Nastavení Home Assistant", "helpers": { "caption": "Pomocníci", - "description": "Správa prvků, které mohou pomoci při vytváření automatizací", + "description": "Prvky, které pomáhají vytvářet automatizace", "dialog": { "add_helper": "Přidat pomocníka", "add_platform": "Přidat {platform}", @@ -1789,7 +1821,7 @@ "copy_github": "Pro GitHub", "copy_raw": "Nezpracovaný text", "custom_uis": "Vlastní uživatelská rozhraní:", - "description": "Informace o instalaci Home Assistant", + "description": "Verze, stav systému a odkazy na dokumentaci", "developed_by": "Vyvinuto partou úžasných lidí.", "documentation": "Dokumentace", "frontend": "frontend-ui", @@ -1895,7 +1927,7 @@ }, "configure": "Nastavit", "configured": "Nastaveno", - "description": "Správa integrací", + "description": "Spravujte integrace a jejich služby, zařízení, ...", "details": "Podrobnosti o integraci", "discovered": "Objeveno", "home_assistant_website": "stránky Home Assistant", @@ -1980,7 +2012,7 @@ "open": "Otevřít" } }, - "description": "Správa Lovelace Dashboardů", + "description": "Vytvořte vlastní sady karet pro ovládání svého domova", "resources": { "cant_edit_yaml": "Používáte Lovelace v režimu YAML, proto nemůžete spravovat své zdroje prostřednictvím uživatelského rozhraní. Spravujte je v souboru configuration.yaml.", "caption": "Zdroje", @@ -2179,7 +2211,7 @@ "scene": { "activated": "Aktivovaná scéna {name}.", "caption": "Scény", - "description": "Správa scén", + "description": "Zachyťte stavy zařízení a snadno je později vyvolejte", "editor": { "default_name": "Nová scéna", "devices": { @@ -2223,7 +2255,7 @@ }, "script": { "caption": "Skripty", - "description": "Správa skriptů", + "description": "Provádějte posloupnosti akcí", "editor": { "alias": "Název", "default_name": "Nový skript", @@ -2334,7 +2366,7 @@ "confirm_remove": "Opravdu chcete odebrat štítek {tag}?", "confirm_remove_title": "Odebrat štítek?", "create_automation": "Vytvořit automatizaci se štítkem", - "description": "Správa štítků", + "description": "Spusťte automatizaci skenováním NFC tagu, QR kódu atd.", "detail": { "companion_apps": "doprovodné aplikace", "create": "Vytvořit", @@ -2373,6 +2405,7 @@ "editor": { "activate_user": "Aktivovat uživatele", "active": "Aktivní", + "active_tooltip": "Určuje, zda se uživatel může přihlásit", "admin": "Administrátor", "caption": "Zobrazit uživatele", "change_password": "Změnit heslo", @@ -3391,10 +3424,13 @@ "change_password": { "confirm_new_password": "Potvrďte nové heslo", "current_password": "Současné heslo", + "error_new_is_old": "Nové heslo se musí lišit od aktuálního hesla", + "error_new_mismatch": "Zadaná nová hesla se neshodují", "error_required": "Povinný", "header": "Změnit heslo", "new_password": "Nové heslo", - "submit": "Odeslat" + "submit": "Odeslat", + "success": "Heslo bylo úspěšně změněno" }, "current_user": "Nyní jste přihlášeni jako {fullName}.", "customize_sidebar": { diff --git a/translations/frontend/en.json b/translations/frontend/en.json index 7966f0328b..a55c7c6a0f 100644 --- a/translations/frontend/en.json +++ b/translations/frontend/en.json @@ -1043,7 +1043,7 @@ "confirmation_text": "All devices in this area will become unassigned.", "confirmation_title": "Are you sure you want to delete this area?" }, - "description": "Group devices into areas", + "description": "Group devices and entities into areas", "editor": { "area_id": "Area ID", "create": "Create", @@ -1413,15 +1413,15 @@ "blueprint": { "add": { "error_no_url": "Please enter the URL of the blueprint.", - "file_name": "Local blueprint file name", - "header": "Add new blueprint", - "import_btn": "Import blueprint", - "import_header": "Import \"{name}\" (type: {domain})", + "file_name": "Blueprint Path", + "header": "Import a blueprint", + "import_btn": "Preview blueprint", + "import_header": "Blueprint \"{name}\"", "import_introduction": "You can import blueprints of other users from Github and the community forums. Enter the URL of the blueprint below.", - "importing": "Importing blueprint...", + "importing": "Loading blueprint...", "raw_blueprint": "Blueprint content", - "save_btn": "Save blueprint", - "saving": "Saving blueprint...", + "save_btn": "Import blueprint", + "saving": "Importing blueprint...", "unsupported_blueprint": "This blueprint is not supported", "url": "URL of the blueprint" }, @@ -2423,7 +2423,7 @@ "username": "Username" }, "caption": "Users", - "description": "Manage users", + "description": "Manage the Home Assistant user accounts", "editor": { "activate_user": "Activate user", "active": "Active", diff --git a/translations/frontend/es-419.json b/translations/frontend/es-419.json index bb9561fabb..11bf5e5e87 100644 --- a/translations/frontend/es-419.json +++ b/translations/frontend/es-419.json @@ -666,6 +666,16 @@ "service-picker": { "service": "Servicio" }, + "target-picker": { + "add_area_id": "Seleccionar área", + "add_device_id": "Seleccionar dispositivo", + "add_entity_id": "Seleccionar entidad", + "expand_area_id": "Expanda esta área en los dispositivos y entidades independientes que contiene. Después de expandirlo no actualizará los dispositivos y entidades cuando cambie el área.", + "expand_device_id": "Expanda este dispositivo en entidades independientes. Después de expandirlo no actualizará las entidades cuando cambie el dispositivo.", + "remove_area_id": "Eliminar área", + "remove_device_id": "Eliminar dispositivo", + "remove_entity_id": "Eliminar entidad" + }, "user-picker": { "add_user": "Agregar usuario", "no_user": "Sin usuario", @@ -689,6 +699,7 @@ "editor": { "confirm_delete": "¿Está seguro de que desea eliminar esta entrada?", "delete": "Eliminar", + "device_disabled": "El dispositivo de esta entidad está deshabilitado.", "enabled_cause": "Deshabilitado por {cause}.", "enabled_delay_confirm": "Las entidades habilitadas se agregarán a Home Assistant en {delay} segundos", "enabled_description": "Las entidades deshabilitadas no serán agregadas a Home Assistant.", @@ -699,6 +710,7 @@ "icon_error": "Los iconos deben estar en el formato 'prefijo:nombre del icono', por ejemplo, 'mdi: home'", "name": "Sustituir nombre", "note": "Nota: esto podría no funcionar todavía con todas las integraciones.", + "open_device_settings": "Abrir la configuración del dispositivo", "unavailable": "Esta entidad no está disponible actualmente.", "update": "Actualizar" }, @@ -1489,6 +1501,7 @@ "unknown_condition": "Condición desconocida" }, "create": "Crear automatización con dispositivo", + "create_disable": "No se puede crear automatización con un dispositivo deshabilitado", "no_automations": "Sin automatizaciones", "no_device_automations": "No hay automatizaciones disponibles para este dispositivo.", "triggers": { @@ -1515,6 +1528,14 @@ "description": "Administrar dispositivos conectados", "device_info": "Información del dispositivo", "device_not_found": "Dispositivo no encontrado.", + "disabled": "Deshabilitado", + "disabled_by": { + "config_entry": "Entrada de configuración", + "integration": "Integración", + "user": "Usuario" + }, + "enabled_description": "Los dispositivos deshabilitados no se mostrarán y las entidades que pertenecen al dispositivo se deshabilitarán y no se agregarán a Home Assistant.", + "enabled_label": "Habilitar dispositivo", "entities": { "add_entities_lovelace": "Agregar a Lovelace", "disabled_entities": "+{count} {count, plural,\n one {entidad deshabilitada}\n other {entidades deshabilitadas}\n}", @@ -1524,14 +1545,24 @@ }, "name": "Nombre", "no_devices": "Sin dispositivos", + "picker": { + "filter": { + "filter": "Filtrar", + "show_all": "Mostrar todo", + "show_disabled": "Mostrar los dispositivos deshabilitadas" + }, + "search": "Mostrar dispositivos" + }, "scene": { "create": "Crear escena con dispositivo", + "create_disable": "No se puede crear una escena con un dispositivo deshabilitado", "no_scenes": "Sin escenas", "scenes": "Escenas" }, "scenes": "Escenas", "script": { "create": "Crear script con dispositivo", + "create_disable": "No se puede crear un script con un dispositivo deshabilitado", "no_scripts": "Sin scripts", "scripts": "Scripts" }, @@ -2168,6 +2199,7 @@ "editor": { "activate_user": "Activar usuario", "active": "Activo", + "active_tooltip": "Controla si el usuario puede iniciar sesión", "admin": "Administrador", "caption": "Ver usuario", "change_password": "Cambiar contraseña", @@ -3136,10 +3168,13 @@ "change_password": { "confirm_new_password": "Confirmar nueva contraseña", "current_password": "Contraseña actual", + "error_new_is_old": "La nueva contraseña debe ser diferente a la contraseña actual", + "error_new_mismatch": "Las contraseñas no coinciden", "error_required": "Necesario", "header": "Cambiar contraseña", "new_password": "Nueva contraseña", - "submit": "Enviar" + "submit": "Enviar", + "success": "La contraseña se cambió con éxito" }, "current_user": "Actualmente estás conectado como {fullName} .", "customize_sidebar": { diff --git a/translations/frontend/es.json b/translations/frontend/es.json index 43f3b62782..cc23e72cfd 100644 --- a/translations/frontend/es.json +++ b/translations/frontend/es.json @@ -2,6 +2,7 @@ "config_entry": { "disabled_by": { "config_entry": "Entrada de configuración", + "device": "Dispositivo", "integration": "Integración", "user": "Usuario" } @@ -710,6 +711,16 @@ "service-picker": { "service": "Servicio" }, + "target-picker": { + "add_area_id": "Seleccionar área", + "add_device_id": "Seleccionar dispositivo", + "add_entity_id": "Seleccionar entidad", + "expand_area_id": "Expande este área en los dispositivos y entidades independientes que contiene. Después de expandirse, no actualizará los dispositivos y entidades cuando cambie el área.", + "expand_device_id": "Expande este dispositivo en entidades separadas. Después de expandirse, no actualizará las entidades cuando cambie el dispositivo.", + "remove_area_id": "Eliminar área", + "remove_device_id": "Eliminar dispositivo", + "remove_entity_id": "Eliminar entidad" + }, "user-picker": { "add_user": "Añadir usuario", "no_user": "Sin usuario", @@ -733,6 +744,7 @@ "editor": { "confirm_delete": "¿Estás seguro de que quieres eliminar este elemento?", "delete": "Eliminar", + "device_disabled": "El dispositivo de esta entidad está deshabilitado.", "enabled_cause": "Desactivado por {cause}.", "enabled_delay_confirm": "Las entidades habilitadas se agregarán a Home Assistant en {delay} segundos", "enabled_description": "Las entidades deshabilitadas no se agregarán a Home Assistant.", @@ -743,6 +755,7 @@ "icon_error": "Los iconos deben tener el formato 'prefijo:nombreicono', por ejemplo, 'mdi:home'", "name": "Nombre", "note": "Nota: puede que esto no funcione todavía con todas las integraciones", + "open_device_settings": "Abrir la configuración del dispositivo", "unavailable": "Esta entidad no está disponible actualmente.", "update": "Actualizar" }, @@ -1030,7 +1043,7 @@ "confirmation_text": "Todos los dispositivos en esta área quedarán sin asignar.", "confirmation_title": "¿Estás seguro de que deseas eliminar esta área?" }, - "description": "Administra áreas en tu hogar", + "description": "Agrupa dispositivos en áreas", "editor": { "area_id": "ID de área", "create": "Crear", @@ -1052,7 +1065,7 @@ }, "automation": { "caption": "Automatizaciones", - "description": "Administra las automatizaciones", + "description": "Crea reglas de comportamiento personalizadas para tu hogar", "dialog_new": { "blueprint": { "use_blueprint": "Usa un plano" @@ -1510,7 +1523,7 @@ "title": "Alexa" }, "caption": "Nube Home Assistant", - "description_features": "Control fuera de casa, integración con Alexa y Google Assistant.", + "description_features": "Controla tu hogar cuando estés fuera e intégralo con Alexa y Google Assistant", "description_login": "Has iniciado sesión como {email}", "description_not_login": "No has iniciado sesión", "dialog_certificate": { @@ -1605,7 +1618,7 @@ }, "core": { "caption": "Configuración general", - "description": "Cambia la configuración general de Home Assistant", + "description": "Sistema de unidades, ubicación, zona horaria y otros parámetros generales", "section": { "core": { "core_config": { @@ -1667,6 +1680,7 @@ "unknown_condition": "Condición desconocida" }, "create": "Crear automatización con el dispositivo", + "create_disable": "No se puede crear una automatización con un dispositivo deshabilitado", "no_automations": "Sin automatizaciones", "no_device_automations": "No hay automatizaciones disponibles para este dispositivo.", "triggers": { @@ -1692,9 +1706,18 @@ "no_devices": "Sin dispositivos" }, "delete": "Eliminar", - "description": "Administrar dispositivos conectados", + "description": "Administra dispositivos configurados", "device_info": "Información del dispositivo", "device_not_found": "Dispositivo no encontrado.", + "disabled": "Deshabilitado", + "disabled_by": { + "config_entry": "Entrada de configuración", + "integration": "Integración", + "user": "Usuario" + }, + "enabled_cause": "El dispositivo está deshabilitado por {cause} .", + "enabled_description": "Los dispositivos deshabilitados no se mostrarán y las entidades que pertenecen al dispositivo se deshabilitarán y no se añadirán a Home Assistant.", + "enabled_label": "Habilitar dispositivo", "entities": { "add_entities_lovelace": "Añadir a Lovelace", "disabled_entities": "+{count} {count, plural,\n one {entidad deshabilitada}\n other {entidades deshabilitadas}\n}", @@ -1704,14 +1727,25 @@ }, "name": "Nombre", "no_devices": "Sin dispositivos", + "picker": { + "filter": { + "filter": "Filtrar", + "hidden_devices": "{number} {number, plural,\n one {dispositivo oculto}\n other {dispositivos ocultos}\n}", + "show_all": "Mostrar todo", + "show_disabled": "Mostrar dispositivos deshabilitados" + }, + "search": "Buscar dispositivos" + }, "scene": { "create": "Crear escena con el dispositivo", + "create_disable": "No se puede crear una escena con un dispositivo deshabilitado", "no_scenes": "Sin escenas", "scenes": "Escenas" }, "scenes": "Escenas", "script": { "create": "Crear script con el dispositivo", + "create_disable": "No se puede crear un script con un dispositivo deshabilitado", "no_scripts": "Sin scripts", "scripts": "Scripts" }, @@ -1777,7 +1811,7 @@ "header": "Configurar Home Assistant", "helpers": { "caption": "Ayudantes", - "description": "Administra los elementos que pueden ayudar a construir automatizaciones.", + "description": "Elementos que ayudan a construir automatizaciones", "dialog": { "add_helper": "Añadir ayudante", "add_platform": "Añadir {platform}", @@ -1809,7 +1843,7 @@ "copy_github": "Para GitHub", "copy_raw": "Texto sin procesar", "custom_uis": "IU personalizadas:", - "description": "Ver información sobre tu instalación de Home Assistant", + "description": "Versión, estado del sistema y enlaces a la documentación", "developed_by": "Desarrollado por un montón de gente impresionante.", "documentation": "Documentación", "frontend": "interfaz de usuario", @@ -1915,7 +1949,7 @@ }, "configure": "Configurar", "configured": "Configurado", - "description": "Administra las integraciones", + "description": "Gestiona integraciones con servicios, dispositivos, ...", "details": "Detalles de la integración", "discovered": "Descubierto", "home_assistant_website": "Sitio web de Home Assistant", @@ -2000,7 +2034,7 @@ "open": "Abrir" } }, - "description": "Administra tus Paneles de Control Lovelace", + "description": "Crea conjuntos personalizados de tarjetas para controlar tu hogar", "resources": { "cant_edit_yaml": "Estás utilizando Lovelace en modo YAML, por tanto no puedes administrar tus recursos a través de la IU. Adminístralos en configuration.yaml.", "caption": "Recursos", @@ -2199,7 +2233,7 @@ "scene": { "activated": "Activada escena {name}.", "caption": "Escenas", - "description": "Administra las escenas", + "description": "Captura los estados de los dispositivos y recupéralos fácilmente más tarde", "editor": { "default_name": "Nueva Escena", "devices": { @@ -2243,7 +2277,7 @@ }, "script": { "caption": "Scripts", - "description": "Administra los scripts", + "description": "Ejecuta una secuencia de acciones", "editor": { "alias": "Nombre", "default_name": "Nuevo script", @@ -2354,7 +2388,7 @@ "confirm_remove": "¿Estás seguro de que quieres eliminar la etiqueta {tag} ?", "confirm_remove_title": "¿Eliminar etiqueta?", "create_automation": "Crear automatización con etiqueta", - "description": "Administrar etiquetas", + "description": "Activa automatizaciones cuando se escanea una etiqueta NFC, un código QR, etc.", "detail": { "companion_apps": "aplicaciones complementarias", "create": "Crear", @@ -2393,6 +2427,7 @@ "editor": { "activate_user": "Activar usuario", "active": "Activo", + "active_tooltip": "Controla si el usuario puede iniciar sesión", "admin": "Administrador", "caption": "Ver usuario", "change_password": "Cambiar la contraseña", @@ -3411,10 +3446,13 @@ "change_password": { "confirm_new_password": "Confirmar nueva contraseña", "current_password": "Contraseña actual", + "error_new_is_old": "La nueva contraseña debe ser diferente a la contraseña actual", + "error_new_mismatch": "Los nuevos valores de contraseña introducidos no coinciden", "error_required": "Obligatorio", "header": "Cambiar contraseña", "new_password": "Nueva contraseña", - "submit": "Enviar" + "submit": "Enviar", + "success": "Contraseña cambiada con éxito" }, "current_user": "Has iniciado sesión como {fullName}.", "customize_sidebar": { diff --git a/translations/frontend/et.json b/translations/frontend/et.json index 829de8071c..0124647cb6 100644 --- a/translations/frontend/et.json +++ b/translations/frontend/et.json @@ -2,6 +2,7 @@ "config_entry": { "disabled_by": { "config_entry": "Seade kanne", + "device": "Seade", "integration": "Sidumine", "user": "Kasutaja" } @@ -710,6 +711,16 @@ "service-picker": { "service": "Teenus" }, + "target-picker": { + "add_area_id": "Vali ala", + "add_device_id": "Vali seade", + "add_entity_id": "Vali olem", + "expand_area_id": "Laienda seda ala eraldi seadmetesse jaolemitesse mis sellesse kuuluvad. Pärast laiendamist ei värskendata seadmeid ja olemeid, kui ala muutub.", + "expand_device_id": "Laienda seda seadet eraldi olemitesse. Pärast laiendamist ei värskendata olemeid, kui seade muutub.", + "remove_area_id": "Eemalda ala", + "remove_device_id": "Eemalda seade", + "remove_entity_id": "Eemalda olem" + }, "user-picker": { "add_user": "Lisa kasutaja", "no_user": "Kasutaja puudub", @@ -733,6 +744,7 @@ "editor": { "confirm_delete": "Oled kindel, et soovid selle kirje kustutada?", "delete": "Kustuta", + "device_disabled": "Selle olemi seade on keelatud.", "enabled_cause": "Keelatud, sest {cause}.", "enabled_delay_confirm": "Lubatud üksused lisatakse Home Assistanti {delay} sekundi pärast", "enabled_description": "Keelatud olemeid ei lisata Home Assistant'i.", @@ -743,6 +755,7 @@ "icon_error": "Ikoonid peaksid olema vormingus 'prefix: iconname', nt 'mdi: home'", "name": "Nime muutmine", "note": "Märkus: see ei pruugi veel töötada kõigi sidumistega.", + "open_device_settings": "Seadme sätete avamine", "unavailable": "See olem pole praegu saadaval.", "update": "Uuenda" }, @@ -1030,7 +1043,7 @@ "confirmation_text": "Kõik sellele ala seadmed jäävad peremehetuks.", "confirmation_title": "Oled kindel, et soovid selle ala kustutada?" }, - "description": "Ülevaade kõikidest oma kodu aladest.", + "description": "Seadmete rühmitamine aladesse", "editor": { "area_id": "Piirkonna ID", "create": "LOO", @@ -1052,7 +1065,7 @@ }, "automation": { "caption": "Automatiseeringud", - "description": "Loo ja redigeeri automatiseeringuid", + "description": "Loo oma kodu jaoks kohandatud käitumisreeglid", "dialog_new": { "blueprint": { "use_blueprint": "Kasuta kavandit" @@ -1456,7 +1469,7 @@ "enable_state_reporting": "Lubada olekuteavitused", "enter_pin_error": "PIN-koodi ei saa salvestada:", "enter_pin_hint": "Turvaseadmete kasutamiseks sisesta PIN", - "enter_pin_info": "Turvaseadmetega suhtlemiseks sisestage PIN-kood. Turvaseadmed on uksed, garaažiuksed ja lukud. Google Assistanti kaudu selliste seadmetega suheldes palutakse Teil see PIN-kood öelda / sisestada.", + "enter_pin_info": "Turvaseadmetega suhtlemiseks sisesta PIN-kood. Turvaseadmed on uksed, garaažiuksed ja lukud. Google Assistanti kaudu selliste seadmetega suheldes palutakse Teil see PIN-kood öelda / sisestada.", "info": "Google Assistanti integreerimisel läbi Home Assistant Cloudi saate juhtida kõiki oma Home Assistanti seadmeid mis tahes Google Assistanti toega seadme kaudu.", "info_state_reporting": "Kui lubate olekute avaldamise, saadab Home Assistant Google'ile kõik avaldatud olemite olekumuutused. See võimaldab Teil alati näha Google'i rakenduses uusimaid olekuid.", "manage_entities": "Halda olemeid", @@ -1478,7 +1491,7 @@ "info": "Home Assistant Cloud pakub turvalist kaugühendust teie Home Assistantiga kodust eemal olles.", "instance_is_available": "Teie Home Assistant on saadaval aadressil", "instance_will_be_available": "Teie Home Assistanti on aadressiks saab", - "link_learn_how_it_works": "Loe, kuidas see töötab", + "link_learn_how_it_works": "Loe kuidas see töötab", "title": "Kaugjuhtimine" }, "sign_out": "Logi välja", @@ -1535,7 +1548,7 @@ "check_your_email": "Parooli lähtestamise kohta saate juhiseid oma e-posti aadressilt.", "email": "E-post", "email_error_msg": "Vigane meiliaadress", - "instructions": "Sisestage oma e-posti aadress ja me saadame teile lingi parooli lähtestamiseks.", + "instructions": "Sisesta oma e-posti aadress ja me saadame teile lingi parooli lähtestamiseks.", "send_reset_email": "Saatke lähtestamismeil", "subtitle": "Unustasid oma salasõna", "title": "Unustasid salasõna" @@ -1605,7 +1618,7 @@ }, "core": { "caption": "Üldine", - "description": "Home Assistant'i üldiste seadete muutmine", + "description": "Ühikud, asukoht, ajavöönd ja muud üldised parameetrid", "section": { "core": { "core_config": { @@ -1667,6 +1680,7 @@ "unknown_condition": "Tundmatu tingimus" }, "create": "Loo seadmega automatiseering", + "create_disable": "Keelatud seadmega ei saa automaatiseeringuid luua", "no_automations": "Automatiseeringuid pole", "no_device_automations": "Selle seadme jaoks pole automatiseerimisi saadaval.", "triggers": { @@ -1692,9 +1706,18 @@ "no_devices": "Seadmeid pole" }, "delete": "Kustuta", - "description": "Halda ühendatud seadmeid", + "description": "Halda häälestatud seadmeid", "device_info": "Seadme info", "device_not_found": "Seadet ei leitud.", + "disabled": "Keelatud", + "disabled_by": { + "config_entry": "Seade kanne", + "integration": "Sidumine", + "user": "Kasutaja" + }, + "enabled_cause": "{cause} on seadme keelanud.", + "enabled_description": "Keelatud seadmeid ei kuvata ja seadmele kuuluvad olemid keelatakse ning neid ei lisata Home Assistantile.", + "enabled_label": "Luba seade", "entities": { "add_entities_lovelace": "Lisa Lovelace'i", "disabled_entities": "{count} {count, plural,\n one {keelatud olem}\n other {keelatud olemit}\n}", @@ -1704,14 +1727,25 @@ }, "name": "Nimi", "no_devices": "Seadmeid pole", + "picker": { + "filter": { + "filter": "Filtreeri", + "hidden_devices": "{number} peidetud {number, plural,\n one {olem}\n other {olemit}\n}", + "show_all": "Kuva kõik", + "show_disabled": "Kuva keelatud seadmed" + }, + "search": "Otsi seadmeid" + }, "scene": { "create": "Loo seadmega stseen", + "create_disable": "Keelatud seadmega ei saa stseene luua", "no_scenes": "Stseene pole", "scenes": "Stseenid" }, "scenes": "Stseenid", "script": { "create": "Loo seadmega skript", + "create_disable": "Keelatud seadmega ei saa skripte luua", "no_scripts": "Skripte pole", "scripts": "Skriptid" }, @@ -1777,7 +1811,7 @@ "header": "Home Assistant'i seadistamine", "helpers": { "caption": "Abimehed", - "description": "Hallake elemente mis aitavad automatiseeringuid luua", + "description": "Elemendid mis aitavad automatiseeringuid luua", "dialog": { "add_helper": "Lisage abistaja", "add_platform": "Lisa {platform}", @@ -1809,7 +1843,7 @@ "copy_github": "GitHubi jaoks", "copy_raw": "Ainult tekst", "custom_uis": "Kohandatud kasutajaliidesed:", - "description": "Kuva Home Assistant'i info", + "description": "Versioon, süsteemi olek ja lingid dokumentatsioonile", "developed_by": "Tehtud paljude lahedate inimeste poolt.", "documentation": "Dokumentatsioon", "frontend": "frontend-ui", @@ -1827,9 +1861,9 @@ "checks": { "cloud": { "alexa_enabled": "Alexa on lubatud", - "can_reach_cert_server": "Ühendu serdiserveriga", - "can_reach_cloud": "Ühendu Home Assistant Cloudiga", - "can_reach_cloud_auth": "Ühendu tuvastusserveriga", + "can_reach_cert_server": "Ühendus serdiserveriga", + "can_reach_cloud": "Ühendus Home Assistant Cloudiga", + "can_reach_cloud_auth": "Ühendus tuvastusserveriga", "google_enabled": "Google on lubatud", "logged_in": "Sisse logitud", "relayer_connected": "Edastaja on ühendatud", @@ -1915,7 +1949,7 @@ }, "configure": "Seadista", "configured": "Seadistatud", - "description": "Halda ja seadista sidumisi", + "description": "Halda teenuste, seadmete jne. sidumisi", "details": "Sidumise üksikasjad", "discovered": "Leitud", "home_assistant_website": "Home Assistant veebisait", @@ -2000,7 +2034,7 @@ "open": "Ava" } }, - "description": "Hallake oma Lovelace juhtpaneele", + "description": "Loo oma kodu juhtimiseks kohandatud juhtpaneele", "resources": { "cant_edit_yaml": "Kasutate Lovelace YAML režiimis. Seega ei saa Te hallata oma ressursse kasutajaliidese kaudu. Halda neid kirjes configuration.yaml.", "caption": "Ressursid", @@ -2199,7 +2233,7 @@ "scene": { "activated": "Stseen {name} on käivitatud.", "caption": "Stseenid", - "description": "Loo ja muuda stseene", + "description": "Seadme olekute hõivamine ja nende hilisem taaskasutamine", "editor": { "default_name": "Uus stseen", "devices": { @@ -2243,7 +2277,7 @@ }, "script": { "caption": "Skriptid", - "description": "Loo ja muuda skripte", + "description": "Vallanda toimingute jada", "editor": { "alias": "Nimi", "default_name": "Uus skript", @@ -2293,7 +2327,7 @@ }, "server_control": { "caption": "Serveri juhtimine", - "description": "Taaskäivita ja peata Home Assistant server", + "description": "Taaskäivita ja peata Home Assistant serverit", "section": { "reloading": { "automation": "Taaslae automatiseeringud", @@ -2331,7 +2365,7 @@ "zone": "Taaslae tsoonid" }, "server_management": { - "confirm_restart": "Oled kindel, et soovid taaskäivitada Home Assistant'i?", + "confirm_restart": "Oled kindel, et soovid Home Assistant'i taaskäivitada?", "confirm_stop": "Oled kindel, et soovid seisata Home Assistant'i?", "heading": "Serveri haldamine", "introduction": "Kontrolli oma Home Assistant serverit... Home Assistant'ist.", @@ -2354,7 +2388,7 @@ "confirm_remove": "Kas soovid kindlasti eemaldada märgise {tag}?", "confirm_remove_title": "Kas kustutan märgise?", "create_automation": "Lisa automatiseering TAG abil", - "description": "Halda TAGe", + "description": "Käivita automaatiseering NFC-sildi, QR-koodi jne. skännimisel", "detail": { "companion_apps": "mobiilirakendused", "create": "Loo", @@ -2393,6 +2427,7 @@ "editor": { "activate_user": "Aktiveeri kasutaja", "active": "Aktiivne", + "active_tooltip": "Määrab kas kasutaja saab sisse logida", "admin": "Administraator", "caption": "Vaata kasutajat", "change_password": "Muuda salasõna", @@ -2503,7 +2538,7 @@ "caption": "Grupid", "create": "Loo grupp", "create_group": "Zigbee Home Automation - Loo grupp", - "create_group_details": "Sisestage uue zigbee grupi loomiseks vajalikud üksikasjad.", + "create_group_details": "Sisesta uue Zigbee grupi loomiseks vajalikud üksikasjad.", "creating_group": "Loon gruppi", "description": "Loo ja muuda Zigbee gruppe", "group_details": "Siin on kõik valitud Zigbee rühma üksikasjad.", @@ -2832,7 +2867,7 @@ }, "calendar": { "calendar_entities": "Kalendri olemid", - "description": "Kalendri kaardil kuvatakse kalender mis sisaldab päeva, nädala ja loendivaateid", + "description": "Kalendri kaardil kuvatakse kalender mis sisaldab päeva-, nädala- ja loendivaateid", "inital_view": "Vaikevaade", "name": "Kalender", "views": { @@ -2857,7 +2892,7 @@ "required": "Nõutav" }, "entities": { - "description": "Olemite kaart on kõige levinum kaarditüüp. See rühmitabolemid loenditeks.", + "description": "Olemite kaart on kõige levinum kaarditüüp. See rühmitab olemid loenditeks.", "edit_special_row": "Selle rea üksikasjade vaatamiseks klõpsa nuppu Muuda", "entity_row_editor": "Olemirea redaktor", "entity_row": { @@ -2887,7 +2922,7 @@ "toggle": "Vaheta olemeid." }, "entity-filter": { - "description": "Olemifiltri kaart võimaldab teil määratleda nende olemite loendit mida soovite jälgida ainult teatud olekus.", + "description": "Olemifiltri kaart võimaldab teil määratleda nende olemite loendit mida soovid jälgida ainult teatud olekus.", "name": "Olemi filter" }, "entity": { @@ -3411,10 +3446,13 @@ "change_password": { "confirm_new_password": "Kinnita uut salasõna", "current_password": "Praegune salasõna", + "error_new_is_old": "Uus salasõna peab praegusest erinema", + "error_new_mismatch": "Sisestatud uus salasõna ei ühti", "error_required": "Nõutav", "header": "Muuda salasõna", "new_password": "Uus salasõna", - "submit": "Esita" + "submit": "Esita", + "success": "Salasõna muutmine õnnestus" }, "current_user": "Oled praegu sisse logitud kui {fullName}.", "customize_sidebar": { diff --git a/translations/frontend/nb.json b/translations/frontend/nb.json index 4ed6a06dd5..5191407fb0 100644 --- a/translations/frontend/nb.json +++ b/translations/frontend/nb.json @@ -2,6 +2,7 @@ "config_entry": { "disabled_by": { "config_entry": "Konfigurer oppføring", + "device": "Enhet", "integration": "Integrasjon", "user": "Bruker" } @@ -710,6 +711,16 @@ "service-picker": { "service": "Tjeneste" }, + "target-picker": { + "add_area_id": "Velg område", + "add_device_id": "Velg enhet", + "add_entity_id": "Velg entitet", + "expand_area_id": "Utvid dette området med de separate enhetene og entitetene det inneholder. Etter utvidelse vil den ikke oppdatere enhetene og entitetene når området endres.", + "expand_device_id": "Utvid denne enheten i separate entiteter. Etter utvidelse vil den ikke oppdatere entitetene når enheten endres.", + "remove_area_id": "Fjern område", + "remove_device_id": "Fjern enhet", + "remove_entity_id": "Fjern entitet" + }, "user-picker": { "add_user": "Legg til bruker", "no_user": "Ingen bruker", @@ -733,6 +744,7 @@ "editor": { "confirm_delete": "Er du sikker på at du vil slette denne oppføringen?", "delete": "Slett", + "device_disabled": "Enheten til denne enhtiteen er deaktivert", "enabled_cause": "Deaktivert av {cause}.", "enabled_delay_confirm": "De aktiverte enhetene blir lagt til i Home Assistant om {delay} sekunder", "enabled_description": "Deaktiverte entiteter vil ikke bli lagt til i Home Assistant.", @@ -743,6 +755,7 @@ "icon_error": "Ikoner bør være i formatet 'prefiks:ikonnavn', f.eks 'mdi:home'", "name": "Navn", "note": "Merk: Dette fungerer kanskje ikke ennå med alle integrasjoner.", + "open_device_settings": "Åpne enhetsinnstillinger", "unavailable": "Denne entiteten er ikke tilgjengelig for øyeblikket.", "update": "Oppdater" }, @@ -1667,6 +1680,7 @@ "unknown_condition": "Ukjent tilstand" }, "create": "Lag automasjon med enheten", + "create_disable": "Kan ikke opprette automasjon med deaktivert enhet", "no_automations": "Ingen automasjoner", "no_device_automations": "Det er ingen automasjoner tilgjengelig for denne enheten.", "triggers": { @@ -1695,6 +1709,15 @@ "description": "Administrer tilkoblede enheter", "device_info": "Enhetsinformasjon", "device_not_found": "Enhet ikke funnet", + "disabled": "Deaktivert", + "disabled_by": { + "config_entry": "Konfigurer oppføring", + "integration": "Integrasjon", + "user": "Bruker" + }, + "enabled_cause": "Enheten er deaktivert av {cause}", + "enabled_description": "Deaktiverte enheter vises ikke, og entiteter som tilhører enheten deaktiveres og ikke legges til i Home Assistant", + "enabled_label": "Aktivér enhet", "entities": { "add_entities_lovelace": "Legg til i Lovelace", "disabled_entities": "+{count} {count, plural,\n one {deaktivert entitet}\n other {deaktiverte entiteter}\n}", @@ -1704,14 +1727,25 @@ }, "name": "Navn", "no_devices": "Ingen enheter", + "picker": { + "filter": { + "filter": "Filter", + "hidden_devices": "{number} {number, plural,\n one {skjult enhet}\n other {skjulte enheter}\n}", + "show_all": "Vis alle", + "show_disabled": "Vis deaktiverte enheter" + }, + "search": "Søk etter enheter" + }, "scene": { "create": "Lag scene med enheten", + "create_disable": "Kan ikke opprette scene med deaktivert enhet", "no_scenes": "Ingen scener", "scenes": "Scener" }, "scenes": "Scener", "script": { "create": "Lag skript med enheten", + "create_disable": "Kan ikke opprette skript med deaktivert enhet", "no_scripts": "Ingen skript", "scripts": "Skript" }, @@ -2393,6 +2427,7 @@ "editor": { "activate_user": "Aktiver bruker", "active": "Aktiv", + "active_tooltip": "Kontrollerer om brukeren kan logge inn", "admin": "", "caption": "Vis bruker", "change_password": "Endre passord", @@ -2989,20 +3024,20 @@ "name": "Mediekontroll" }, "picture-elements": { - "description": "Picture Elements-kortet er en av de mest allsidige korttyper. Kortene lar deg plassere ikoner eller tekst og til og med tjenester! På et bilde basert på koordinater.", + "description": "Bildeelementer-kortet er et av de mest allsidige korttypene. Kortene lar deg plassere ikoner eller tekst og til og med tjenester! På et bilde basert på koordinater.", "name": "Bildeelementer" }, "picture-entity": { "description": "Bilde entitet kortet viser en entitet i form av et bilde. I stedet for bilder fra URL, kan det også vise bilde av kameraentiteter.", - "name": "Bildeoppføring" + "name": "Bilde entitet" }, "picture-glance": { - "description": "Picture Glance-kortet viser et bilde og tilhørende entitetstilstander som et ikon. Entitetene på høyre side tillater veksling av handlinger, andre viser dialogboksen mer informasjon.", + "description": "Bilde blikk-kortet viser et bilde og tilhørende entitetstilstander som et ikon. Entitetene på høyre side tillater veksling av handlinger, andre viser dialogboksen mer informasjon.", "name": "Bilde blikk", "state_entity": "Statusentitet" }, "picture": { - "description": "Bildekortet lar deg stille inn et bilde som skal brukes til navigasjon til forskjellige baner i grensesnittet ditt eller for å tilkalle en tjeneste.", + "description": "Bildekortet lar deg sette inn et bilde som skal brukes til navigasjon til forskjellige baner i grensesnittet ditt eller for å tilkalle en tjeneste.", "name": "Bilde" }, "plant-status": { @@ -3411,10 +3446,13 @@ "change_password": { "confirm_new_password": "Bekreft nytt passord", "current_password": "Nåværende passord", + "error_new_is_old": "Nytt passord må være annerledes enn gjeldende passord", + "error_new_mismatch": "Oppgitte nye passordverdier stemmer ikke overens", "error_required": "Nødvendig", "header": "Endre passord", "new_password": "Nytt passord", - "submit": "Send inn" + "submit": "Send inn", + "success": "Passordet ble endret" }, "current_user": "Du er logget inn som {fullName}.", "customize_sidebar": { diff --git a/translations/frontend/nl.json b/translations/frontend/nl.json index 9e41528e69..115376f058 100644 --- a/translations/frontend/nl.json +++ b/translations/frontend/nl.json @@ -2,6 +2,7 @@ "config_entry": { "disabled_by": { "config_entry": "Configuratie-item", + "device": "Apparaat", "integration": "Integratie", "user": "Gebruiker" } @@ -710,6 +711,16 @@ "service-picker": { "service": "Service" }, + "target-picker": { + "add_area_id": "Kies gebied", + "add_device_id": "Kies apparaat", + "add_entity_id": "Kies entiteit", + "expand_area_id": "Breid dit gebied uit in de afzonderlijke apparaten en entiteiten die het bevat. Na het uitbreiden zal het de apparaten en entiteiten niet bijwerken wanneer het gebied verandert.", + "expand_device_id": "Breid dit apparaat uit in afzonderlijke entiteiten. Na het uitbreiden worden de entiteiten niet bijgewerkt wanneer het apparaat verandert.", + "remove_area_id": "Verwijder gebied", + "remove_device_id": "Verwijder apparaat", + "remove_entity_id": "Verwijder entiteit" + }, "user-picker": { "add_user": "Gebruiker toevoegen", "no_user": "Geen gebruiker", @@ -733,6 +744,7 @@ "editor": { "confirm_delete": "Weet je zeker dat je dit item wilt verwijderen?", "delete": "Verwijderen", + "device_disabled": "Het apparaat van deze entiteit is uitgeschakeld.", "enabled_cause": "Uitgeschakeld vanwege {cause}", "enabled_delay_confirm": "De ingeschakelde entiteiten worden over {delay} seconden aan Home Assistant toegevoegd", "enabled_description": "Uitgeschakelde entiteiten zullen niet aan Home Assistant worden toegevoegd", @@ -743,6 +755,7 @@ "icon_error": "Pictogrammen moeten de notatie 'prefix:pictogramnaam' hebben, bijvoorbeeld 'mdi:home'", "name": "Naam", "note": "Opmerking: dit werkt mogelijk nog niet met alle integraties.", + "open_device_settings": "Open de apparaatinstellingen", "unavailable": "Deze entiteit is momenteel niet beschikbaar.", "update": "Bijwerken" }, @@ -1029,7 +1042,7 @@ "confirmation_text": "Alle apparaten in dit gebied zullen niet meer toegewezen zijn.", "confirmation_title": "Weet je zeker dat je dit gebied wilt verwijderen?" }, - "description": "Overzicht van alle gebieden in je huis.", + "description": "Groepeer apparaten in gebieden", "editor": { "area_id": "Gebieds-ID", "create": "Aanmaken", @@ -1051,7 +1064,7 @@ }, "automation": { "caption": "Automatiseringen", - "description": "Het maken en bewerken van automatiseringen", + "description": "Maak aangepaste gedragsregels voor uw huis", "dialog_new": { "blueprint": { "use_blueprint": "Gebruik een blauwdruk" @@ -1505,7 +1518,7 @@ "title": "Alexa" }, "caption": "Home Assistent Cloud", - "description_features": "Bestuur weg van huis, verbind met Alexa en Google Assistant.", + "description_features": "Bedien uw huis wanneer u weg bent en integreer met Alexa en Google Assistant", "description_login": "Ingelogd als {email}", "description_not_login": "Niet ingelogd", "dialog_certificate": { @@ -1600,7 +1613,7 @@ }, "core": { "caption": "Algemeen", - "description": "Wijzig je algemene Home Assistant-configuratie", + "description": "Eenheidssysteem, locatie, tijdzone en andere algemene parameters", "section": { "core": { "core_config": { @@ -1662,6 +1675,7 @@ "unknown_condition": "Onbekende toestand" }, "create": "Maak een automatisering aan met het apparaat", + "create_disable": "Kan geen automatisering maken met een uitgeschakeld apparaat", "no_automations": "Geen automatiseringen", "no_device_automations": "Er zijn geen automatiseringen beschikbaar voor dit apparaat.", "triggers": { @@ -1687,9 +1701,18 @@ "no_devices": "Geen apparaten" }, "delete": "Verwijderen", - "description": "Beheer verbonden apparaten", + "description": "Beheer geconfigureerde apparaten", "device_info": "Apparaat info", "device_not_found": "Apparaat niet gevonden.", + "disabled": "Uitgeschakeld", + "disabled_by": { + "config_entry": "Configuratie-invoer", + "integration": "Integratie", + "user": "Gebruiker" + }, + "enabled_cause": "Het apparaat is uitgeschakeld door {cause}.", + "enabled_description": "Uitgeschakelde apparaten worden niet weergegeven en entiteiten die bij het apparaat horen, worden uitgeschakeld en niet toegevoegd aan Home Assistant.", + "enabled_label": "Schakel apparaat in", "entities": { "add_entities_lovelace": "Voeg toe aan de Lovelace gebruikersinterface", "disabled_entities": "+{count} {count, plural,\n one {uitgeschakelde entiteit}\n other {uitgeschakelde entiteiten}\n}", @@ -1699,14 +1722,25 @@ }, "name": "Naam", "no_devices": "Geen apparaten", + "picker": { + "filter": { + "filter": "Filter", + "hidden_devices": "{number} verborgen {number, plural,\n one {apparaat}\n other {apparaten}\n}", + "show_all": "Alles weergeven", + "show_disabled": "Toon uitgeschakelde apparaten" + }, + "search": "Zoek apparaten" + }, "scene": { "create": "Maak een scène aan met het apparaat", + "create_disable": "Kan geen scène maken met een uitgeschakeld apparaat", "no_scenes": "Geen scènes", "scenes": "Scènes" }, "scenes": "Scènes", "script": { "create": "Maak een script aan met het apparaat", + "create_disable": "Kan geen script maken met een uitgeschakeld apparaat", "no_scripts": "Geen scripts", "scripts": "Scripts" }, @@ -1804,7 +1838,7 @@ "copy_github": "Voor GitHub", "copy_raw": "Ruwe tekst", "custom_uis": "Aangepaste UI's:", - "description": "Informatie over je Home Assistant installatie", + "description": "Versie, systeemstatus en links naar documentatie", "developed_by": "Ontwikkeld door een stel geweldige mensen.", "documentation": "Documentatie", "frontend": "Frontend", @@ -1910,7 +1944,7 @@ }, "configure": "Configureer", "configured": "Geconfigureerd", - "description": "Beheer en installeer integraties", + "description": "Beheer integraties met services, apparaten, ...", "details": "Integratiedetails", "discovered": "Ontdekt", "home_assistant_website": "Home Assistant-website", @@ -1995,7 +2029,7 @@ "open": "Open" } }, - "description": "Configureer je Lovelace-dashboards", + "description": "Maak aangepaste cards om uw huis te besturen", "resources": { "cant_edit_yaml": "Je gebruikt Lovelace in YAML-modus, daarom kun je je bronnen niet beheren via de gebruikersinterface. Beheer ze in configuration.yaml.", "caption": "Bronnen", @@ -2194,7 +2228,7 @@ "scene": { "activated": "Scène {name} geactiveerd.", "caption": "Scènes", - "description": "Maak en bewerk scènes", + "description": "Leg apparaatstatussen vast en roep ze later gemakkelijk op", "editor": { "default_name": "Nieuwe scène", "devices": { @@ -2238,7 +2272,7 @@ }, "script": { "caption": "Scripts", - "description": "Maak en bewerk scripts", + "description": "Voer een reeks acties uit", "editor": { "alias": "Naam", "default_name": "Nieuw script", @@ -2349,7 +2383,7 @@ "confirm_remove": "Weet je zeker dat je tag {tag} wilt verwijderen?", "confirm_remove_title": "Tag verwijderen?", "create_automation": "Creëer automatisering met tag", - "description": "Beheer tags", + "description": "Activeer automatiseringen wanneer een NFC-tag, QR-code, enz. wordt gescand", "detail": { "companion_apps": "bijbehorende apps", "create": "Creëer", @@ -2388,6 +2422,7 @@ "editor": { "activate_user": "Activeer gebruiker", "active": "Actief", + "active_tooltip": "Bepaal of de gebruiker kan inloggen", "admin": "Beheerder", "caption": "Bekijk gebruiker", "change_password": "Wachtwoord wijzigen", @@ -2533,7 +2568,11 @@ "hint_wakeup": "Sommige apparaten, zoals Xiaomi-sensoren hebben een wekknop die je met tussenpozen van 5 seconden kunt indrukken om het apparaat wakker te houden terwijl je ermee communiceert", "introduction": "Voer ZHA-commando's uit die van invloed zijn op een enkel apparaat. Kies een apparaat om een lijst met beschikbare commando's te zien." }, - "title": "Zigbee Home Automation" + "title": "Zigbee Home Automation", + "visualization": { + "caption": "Visualisatie", + "header": "Netwerkvisualisatie" + } }, "zone": { "add_zone": "Zone toevoegen", @@ -3400,10 +3439,12 @@ "change_password": { "confirm_new_password": "Bevestig nieuw wachtwoord", "current_password": "Huidige wachtwoord", + "error_new_is_old": "Het nieuwe wachtwoord moet anders zijn dan het huidige wachtwoord", "error_required": "Verplicht", "header": "Wachtwoord wijzigen", "new_password": "Nieuw wachtwoord", - "submit": "Verzenden" + "submit": "Verzenden", + "success": "Wachtwoord is succesvol veranderd" }, "current_user": "Je bent momenteel ingelogd als {fullName}.", "customize_sidebar": { diff --git a/translations/frontend/ru.json b/translations/frontend/ru.json index 2cdf4bc2e0..cf04465052 100644 --- a/translations/frontend/ru.json +++ b/translations/frontend/ru.json @@ -1,7 +1,8 @@ { "config_entry": { "disabled_by": { - "config_entry": "Запись", + "config_entry": "Конфигурация", + "device": "Устройство", "integration": "Интеграция", "user": "Пользователь" } @@ -394,7 +395,7 @@ }, "cover": { "position": "Положение", - "tilt_position": "Положение наклона" + "tilt_position": "Наклон" }, "fan": { "direction": "Направление", @@ -550,7 +551,8 @@ }, "blueprint-picker": { "add_user": "Добавить пользователя", - "remove_user": "Удалить пользователя" + "remove_user": "Удалить пользователя", + "select_blueprint": "Выберите проект" }, "data-table": { "no-data": "Нет данных", @@ -709,6 +711,16 @@ "service-picker": { "service": "Служба" }, + "target-picker": { + "add_area_id": "Выбрать помещение", + "add_device_id": "Выбрать устройство", + "add_entity_id": "Выбрать объект", + "expand_area_id": "Разделить это помещение на отдельные устройства и объекты. После разделения устройства и объекты не будут обновляться при изменении помещения.", + "expand_device_id": "Разделить это устройство на отдельные объекты. После разделения объекты не будут обновляться при изменении устройства.", + "remove_area_id": "Удалить помещение", + "remove_device_id": "Удалить устройство", + "remove_entity_id": "Удалить объект" + }, "user-picker": { "add_user": "Добавить пользователя", "no_user": "Нет пользователя", @@ -732,6 +744,7 @@ "editor": { "confirm_delete": "Вы уверены, что хотите удалить эту запись?", "delete": "Удалить", + "device_disabled": "Родительское устройство этого объекта скрыто.", "enabled_cause": "Инициатор: {cause}.", "enabled_delay_confirm": "Объекты будут добавлены в Home Assistant через {delay} секунд", "enabled_description": "Скрытые объекты не будут доступны в Home Assistant.", @@ -742,6 +755,7 @@ "icon_error": "Параметр должен быть в формате 'prefix:iconname' (например: 'mdi:home')", "name": "Название", "note": "(может работать не со всеми интеграциями)", + "open_device_settings": "Открыть настройки устройства", "unavailable": "Этот объект в настоящее время недоступен.", "update": "Обновить" }, @@ -811,7 +825,10 @@ "controls": "Управление", "cover": { "close_cover": "Закрыть", - "open_cover": "Открыть" + "close_tile_cover": "Закрыть", + "open_cover": "Открыть", + "open_tilt_cover": "Открыть", + "stop_cover": "Остановить" }, "details": "Свойства", "dismiss": "Закрыть диалог", @@ -879,6 +896,7 @@ "navigation": { "areas": "Помещения", "automation": "Автоматизация", + "blueprint": "Проекты", "core": "Общие", "customize": "Кастомизация", "devices": "Устройства", @@ -1049,7 +1067,18 @@ "caption": "Автоматизация", "description": "Управление правилами автоматизации", "dialog_new": { - "header": "Новая автоматизация" + "blueprint": { + "use_blueprint": "Использовать проект" + }, + "header": "Новая автоматизация", + "how": "Каким образом Вы хотели бы создать автоматизацию?", + "start_empty": "Начать с пустой автоматизации", + "thingtalk": { + "create": "Создать", + "header": "Описать автоматизацию, которую Вы хотите создать", + "input_label": "Что должна делать эта автоматизация?", + "intro": "И мы попробуем преобразовать её из текста. Например: Turn the lights off when I leave." + } }, "editor": { "actions": { @@ -1131,6 +1160,14 @@ "unsupported_action": "Отсутствует форма ввода для этого действия: {action}" }, "alias": "Название", + "blueprint": { + "blueprint_to_use": "Используемый проект", + "header": "Проект", + "inputs": "Исходные данные", + "manage_blueprints": "Управление проектами", + "no_blueprints": "У Вас еще нет проектов.", + "no_inputs": "Для этого проекта не требуется указание исходных данных." + }, "conditions": { "add": "Добавить условие", "delete": "Удалить", @@ -1373,6 +1410,39 @@ } } }, + "blueprint": { + "add": { + "error_no_url": "Введите URL-адрес проекта.", + "file_name": "Название локального файла проекта", + "header": "Добавить новый проект", + "import_btn": "Импортировать проект", + "import_header": "Импорт проекта \"{name}\" (тип: {domain})", + "import_introduction": "Вы можете импортировать проекты других пользователей из Github и форумов сообщества. Для этого введите в этом окне URL-адрес проекта.", + "importing": "Импортирование проекта...", + "raw_blueprint": "Состав проекта", + "save_btn": "Сохранить проект", + "saving": "Сохранение проекта...", + "unsupported_blueprint": "Этот проект не поддерживается", + "url": "URL-адрес проекта" + }, + "caption": "Проекты", + "description": "Управление проектами", + "overview": { + "add_blueprint": "Импортировать проект", + "confirm_delete_header": "Удалить этот проект?", + "confirm_delete_text": "Вы уверены, что хотите удалить этот проект?", + "delete_blueprint": "Удалить проект", + "header": "Редактор проекта", + "headers": { + "domain": "Домен", + "file_name": "Название файла", + "name": "Название" + }, + "introduction": "С помощью этого редактора Вы можете создавать и редактировать проекты.", + "learn_more": "Узнайте больше о проектах", + "use_blueprint": "Создать автоматизацию" + } + }, "cloud": { "account": { "alexa": { @@ -1610,6 +1680,7 @@ "unknown_condition": "Неизвестное условие" }, "create": "Создать автоматизацию", + "create_disable": "Скрытые устройства нельзя использовать для создания автоматизаций", "no_automations": "Нет автоматизаций", "no_device_automations": "Для этого устройства нет средств автоматизации.", "triggers": { @@ -1638,6 +1709,15 @@ "description": "Управление подключенными устройствами", "device_info": "Устройство", "device_not_found": "Устройство не найдено", + "disabled": "Скрыто", + "disabled_by": { + "config_entry": "Конфигурация", + "integration": "Интеграция", + "user": "Пользователь" + }, + "enabled_cause": "Инициатор: {cause}.", + "enabled_description": "Скрытые устройства и их дочерние объекты не будут доступны в Home Assistant.", + "enabled_label": "Отображать устройство", "entities": { "add_entities_lovelace": "Добавить объекты в Lovelace UI", "disabled_entities": "Показать {count} {count, plural,\n one {скрытый объект}\n other {скрытых объектов}\n}", @@ -1647,14 +1727,25 @@ }, "name": "Название", "no_devices": "Нет устройств", + "picker": { + "filter": { + "filter": "Фильтр", + "hidden_devices": "{number} {number, plural,\n one {скрытое устройство}\n other {скрытых устройств}\n}", + "show_all": "Показать все", + "show_disabled": "Скрытые устройства" + }, + "search": "Поиск устройств" + }, "scene": { "create": "Создать сцену", + "create_disable": "Скрытые устройства нельзя использовать для создания сцен", "no_scenes": "Нет сцен", "scenes": "Сцены" }, "scenes": "Сцены", "script": { "create": "Создать сценарий", + "create_disable": "Скрытые устройства нельзя использовать для создания сценариев", "no_scripts": "Нет сценариев", "scripts": "Сценарии" }, @@ -2336,6 +2427,7 @@ "editor": { "activate_user": "Активировать", "active": "Активен", + "active_tooltip": "Разрешает или запрещает пользователю вход в систему", "admin": "Администратор", "caption": "Просмотр пользователя", "change_password": "Изменить пароль", @@ -2941,7 +3033,8 @@ }, "picture-glance": { "description": "Показывает изображение и состояния объектов в виде значков. Объекты в правой стороне позволяют выполнять действия, остальные объекты при нажатии отображают окно с дополнительной информацией.", - "name": "Picture Glance" + "name": "Picture Glance", + "state_entity": "Объект, определяющий состояние изображения" }, "picture": { "description": "Позволяет установить изображение, которое будет использоваться для навигации по различным путям в Вашем интерфейсе или для вызова службы.", @@ -3353,10 +3446,13 @@ "change_password": { "confirm_new_password": "Подтвердите новый пароль", "current_password": "Текущий пароль", + "error_new_is_old": "Новый пароль должен отличаться от текущего", + "error_new_mismatch": "Введенный новый пароль не совпадает", "error_required": "Обязательное поле", "header": "Изменить пароль", "new_password": "Новый пароль", - "submit": "Подтвердить" + "submit": "Подтвердить", + "success": "Пароль успешно изменён" }, "current_user": "Добро пожаловать, {fullName}! Вы вошли в систему.", "customize_sidebar": { diff --git a/translations/frontend/zh-Hans.json b/translations/frontend/zh-Hans.json index fc3cabb14e..09a5873b84 100644 --- a/translations/frontend/zh-Hans.json +++ b/translations/frontend/zh-Hans.json @@ -2,6 +2,7 @@ "config_entry": { "disabled_by": { "config_entry": "配置条目", + "device": "设备", "integration": "集成", "user": "用户" } @@ -710,6 +711,16 @@ "service-picker": { "service": "服务" }, + "target-picker": { + "add_area_id": "选择区域", + "add_device_id": "选择设备", + "add_entity_id": "选择实体", + "expand_area_id": "在它包含的单独设备和实体中展开此区域。展开后,当区域发生更改时,它不会更新设备和实体。", + "expand_device_id": "在单独的实体中展开此设备。展开后,设备发生变化时不会更新实体。", + "remove_area_id": "删除区域", + "remove_device_id": "删除设备", + "remove_entity_id": "删除实体" + }, "user-picker": { "add_user": "添加用户", "no_user": "没有用户", @@ -733,6 +744,7 @@ "editor": { "confirm_delete": "您确定要删除此条目吗?", "delete": "删除", + "device_disabled": "该实体的设备已禁用。", "enabled_cause": "由于 {cause} 而被禁用", "enabled_delay_confirm": "已启用的实体将在 {delay} 秒后添加到 Home Assistant", "enabled_description": "已禁用的实体不再添加到 Home Assistant。", @@ -743,6 +755,7 @@ "icon_error": "图标的格式应为 prefix:iconname,例如:mdi:home", "name": "名称", "note": "注意:这可能不适用于所有集成。", + "open_device_settings": "打开设备设置", "unavailable": "该实体暂不可用。", "update": "更新" }, @@ -781,7 +794,7 @@ "min": "最小值", "mode": "显示模式", "slider": "滑杆", - "step": "滑杆步长", + "step": "步长", "unit_of_measurement": "单位" }, "input_select": { @@ -1052,7 +1065,7 @@ }, "automation": { "caption": "自动化", - "description": "管理自动化", + "description": "为智能家居制订自动化规则", "dialog_new": { "blueprint": { "use_blueprint": "使用 Blueprint" @@ -1510,7 +1523,7 @@ "title": "Alexa" }, "caption": "Home Assistant Cloud", - "description_features": "整合 Alexa 及 Google 助理,远程控制智能家居。", + "description_features": "远程控制智能家居,还可接入 Alexa 和 Google Assistant", "description_login": "登录为 {email}", "description_not_login": "未登录", "dialog_certificate": { @@ -1605,7 +1618,7 @@ }, "core": { "caption": "通用", - "description": "更改 Home Assistant 的通用配置", + "description": "单位制、位置、时区及其他通用参数", "section": { "core": { "core_config": { @@ -1667,6 +1680,7 @@ "unknown_condition": "未知环境条件" }, "create": "通过设备创建自动化", + "create_disable": "不能通过禁用的设备创建自动化", "no_automations": "没有自动化", "no_device_automations": "该设备没有可用的自动化。", "triggers": { @@ -1695,6 +1709,15 @@ "description": "管理已连接的设备", "device_info": "设备信息", "device_not_found": "未找到设备。", + "disabled": "已禁用", + "disabled_by": { + "config_entry": "配置条目", + "integration": "集成", + "user": "用户" + }, + "enabled_cause": "设备已通过{cause}禁用。", + "enabled_description": "禁用的设备将不会显示,并且属于该设备的实体也将被禁用并且不会添加到 Home Assistant。", + "enabled_label": "启用设备", "entities": { "add_entities_lovelace": "添加到 Lovelace", "disabled_entities": "+{count} {count, plural,\n one {个已禁用实体}\n other {个已禁用实体}\n}", @@ -1704,14 +1727,25 @@ }, "name": "名称", "no_devices": "没有设备", + "picker": { + "filter": { + "filter": "筛选", + "hidden_devices": "{number} 个隐藏设备", + "show_all": "显示全部", + "show_disabled": "显示已禁用的设备" + }, + "search": "搜索设备" + }, "scene": { "create": "通过设备创建场景", + "create_disable": "不能通过禁用的设备创建场景", "no_scenes": "没有场景", "scenes": "场景" }, "scenes": "场景", "script": { "create": "通过设备创建脚本", + "create_disable": "不能通过禁用的设备创建脚本", "no_scripts": "没有脚本", "scripts": "脚本" }, @@ -1777,7 +1811,7 @@ "header": "配置 Home Assistant", "helpers": { "caption": "辅助元素", - "description": "管理辅助构建自动化的元素", + "description": "辅助构建自动化的元素", "dialog": { "add_helper": "添加辅助元素", "add_platform": "添加 {platform}", @@ -1809,7 +1843,7 @@ "copy_github": "用于 GitHub", "copy_raw": "原始文本", "custom_uis": "自定义用户界面:", - "description": "查看关于此 Home Assistant 安装的信息", + "description": "Home Assistant 的版本号、系统状态和各类文档的链接", "developed_by": "由一帮很 Awesome~~~ 的人开发。", "documentation": "文档", "frontend": "前端用户界面", @@ -2000,7 +2034,7 @@ "open": "打开" } }, - "description": "管理 Lovelace 仪表盘", + "description": "自定义卡片布局,让控制设备更方便", "resources": { "cant_edit_yaml": "您正在 YAML 模式下使用 Lovelace,因此无法通过 UI 管理资源。请在 configuration.yaml 中管理它们。", "caption": "资源", @@ -2199,19 +2233,19 @@ "scene": { "activated": "已激活场景 {name}。", "caption": "场景", - "description": "管理场景", + "description": "定格一组设备的状态,日后即可一键恢复", "editor": { "default_name": "新场景", "devices": { "add": "添加设备", "delete": "删除设备", "header": "设备", - "introduction": "添加要包含在场景中的设备。将所有设备设置为该场景所需的状态。" + "introduction": "在此添加要包含在场景中的设备,然后将它们设置成该场景所需的状态。" }, "entities": { "add": "添加实体", "delete": "删除实体", - "device_entities": "如果添加属于设备的实体,则将添加该设备。", + "device_entities": "如果添加的实体属于某设备,仍会添加为设备。", "header": "实体", "introduction": "可在此处设置不属于设备的实体。", "without_device": "无设备关联的实体" @@ -2243,7 +2277,7 @@ }, "script": { "caption": "脚本", - "description": "管理脚本", + "description": "执行一系列动作", "editor": { "alias": "名称", "default_name": "新建脚本", @@ -2354,7 +2388,7 @@ "confirm_remove": "您确定要删除标签 {tag} 吗?", "confirm_remove_title": "删除标签?", "create_automation": "通过标签创建自动化", - "description": "管理标签", + "description": "NFC 标签和二维码也可以触发自动化", "detail": { "companion_apps": "配套应用程序", "create": "创建", @@ -2393,6 +2427,7 @@ "editor": { "activate_user": "激活用户", "active": "激活", + "active_tooltip": "控制用户能否登录", "admin": "管理员", "caption": "用户信息", "change_password": "更改密码", @@ -3411,10 +3446,13 @@ "change_password": { "confirm_new_password": "确认新密码", "current_password": "当前密码", + "error_new_is_old": "新密码不能与当前密码相同", + "error_new_mismatch": "输入的新密码不一致", "error_required": "必填", "header": "更改密码", "new_password": "新密码", - "submit": "提交" + "submit": "提交", + "success": "密码修改成功" }, "current_user": "您目前以 {fullName} 的身份登录。", "customize_sidebar": { diff --git a/translations/frontend/zh-Hant.json b/translations/frontend/zh-Hant.json index 4ec66db6d6..1489c5399b 100644 --- a/translations/frontend/zh-Hant.json +++ b/translations/frontend/zh-Hant.json @@ -2,6 +2,7 @@ "config_entry": { "disabled_by": { "config_entry": "設定實體", + "device": "裝置", "integration": "整合", "user": "使用者" } @@ -710,6 +711,16 @@ "service-picker": { "service": "服務" }, + "target-picker": { + "add_area_id": "選擇區域", + "add_device_id": "選擇裝置", + "add_entity_id": "選擇實體", + "expand_area_id": "在它包含的單獨的裝置和實體中擴展此區域。擴展後,區域更改時將不會更新裝置和實體。", + "expand_device_id": "在它包含的單獨的裝置和實體中擴展此區域。擴展後,區域更改時將不會更新裝置和實體。", + "remove_area_id": "移除區域", + "remove_device_id": "移除裝置", + "remove_entity_id": "移除實體" + }, "user-picker": { "add_user": "新增使用者", "no_user": "沒有使用者", @@ -733,6 +744,7 @@ "editor": { "confirm_delete": "確定要刪除此實體?", "delete": "刪除", + "device_disabled": "該實體目前不可用。", "enabled_cause": "由 {cause} 關閉。", "enabled_delay_confirm": "啟用的實體將會於 {delay} 秒後新增至 Home Assistant", "enabled_description": "關閉的實體將不會新增至 Home Assistant。", @@ -743,6 +755,7 @@ "icon_error": "圖示必須按照格式「prefix:iconname」設定,例如「mdi:home」", "name": "名稱", "note": "注意:可能無法適用所有整合。", + "open_device_settings": "打開裝置設置", "unavailable": "該實體目前不可用。", "update": "更新" }, @@ -829,7 +842,7 @@ "restored": { "confirm_remove_text": "確定要移除此實體?", "confirm_remove_title": "移除實體?", - "not_provided": "此實體目前不可用,屬於獨立可移除、變更或失常的整合或設備。", + "not_provided": "此實體目前不可用,屬於獨立可移除、變更或失常的整合或裝置。", "remove_action": "移除實體", "remove_intro": "假如實體不再使用,可以藉由移除進行清除。" }, @@ -961,7 +974,7 @@ "zigbee_information": "Zigbee 裝置簽章" }, "confirmations": { - "remove": "確定要移除此設備?" + "remove": "確定要移除此裝置?" }, "device_signature": "Zigbee 裝置簽章", "last_seen": "上次出現", @@ -970,9 +983,9 @@ "power_source": "電力來源", "quirk": "Quirk", "services": { - "reconfigure": "重新設定 ZHA Zibgee 設備(健康設備)。假如遇到設備問題,請使用此選項。假如有問題的設備為使用電池的設備,請先確定設備已喚醒並處於接受命令狀態。", + "reconfigure": "重新設定 ZHA Zibgee 裝置(健康裝置)。假如遇到裝置問題,請使用此選項。假如有問題的裝置為使用電池的裝置,請先確定裝置已喚醒並處於接受命令狀態。", "remove": "從 Zigbee 網路移除裝置。", - "updateDeviceName": "於實體 ID 中自訂此設備名稱。", + "updateDeviceName": "於實體 ID 中自訂此裝置名稱。", "zigbee_information": "檢視裝置的 Zigbee 資訊。" }, "unknown": "未知", @@ -1027,10 +1040,10 @@ "devices": "裝置" }, "delete": { - "confirmation_text": "所有該分區所屬設備都將變成未指派狀態。", + "confirmation_text": "所有該分區所屬裝置都將變成未指派狀態。", "confirmation_title": "確定要刪除此分區?" }, - "description": "管理家中所有分區", + "description": "群組分區裝置", "editor": { "area_id": "分區 ID", "create": "建立", @@ -1045,14 +1058,14 @@ "create_area": "新增分區", "header": "分區", "integrations_page": "整合頁面", - "introduction": "分區主要用以管理設備所在位置。此資訊將會於 Home Assistant 中使用以協助您管理介面、權限,並與其他系統進行整合。", - "introduction2": "欲於分區中放置設備,請使用下方連結至整合頁面,並點選設定整合以設定設備面板。", + "introduction": "分區主要用以管理裝置所在位置。此資訊將會於 Home Assistant 中使用以協助您管理介面、權限,並與其他系統進行整合。", + "introduction2": "欲於分區中放置裝置,請使用下方連結至整合頁面,並點選設定整合以設定裝置面板。", "no_areas": "看起來你還沒有建立分區!" } }, "automation": { "caption": "自動化", - "description": "管理自動化", + "description": "為家庭新增自訂自動化", "dialog_new": { "blueprint": { "use_blueprint": "使用 Blueprint" @@ -1438,8 +1451,8 @@ "enable": "開啟", "enable_ha_skill": "開啟 Home Assistant skill for Alexa", "enable_state_reporting": "開啟狀態回報", - "info": "藉由 Home Assistant Cloud 雲服務 Alexa 整合,將能透過 Alexa 支援設備以控制所有 Home Assistant 設備。", - "info_state_reporting": "假如開啟狀態回報,Home Assistant 將會持續傳送所有連結實體的狀態改變至 Amazon。以確保於 Alexa app 中設備永遠保持最新狀態、並藉以創建例行自動化。", + "info": "藉由 Home Assistant Cloud 雲服務 Alexa 整合,將能透過 Alexa 支援裝置以控制所有 Home Assistant 裝置。", + "info_state_reporting": "假如開啟狀態回報,Home Assistant 將會持續傳送所有連結實體的狀態改變至 Amazon。以確保於 Alexa app 中裝置永遠保持最新狀態、並藉以創建例行自動化。", "manage_entities": "管理實體", "state_reporting_error": "無法 {enable_disable} 回報狀態。", "sync_entities": "同步實體", @@ -1455,10 +1468,10 @@ "enable_ha_skill": "啟用 Home Assistant skill for Google Assistant", "enable_state_reporting": "開啟狀態回報", "enter_pin_error": "無法儲存 Pin:", - "enter_pin_hint": "請輸入安全碼以使用加密設備", - "enter_pin_info": "請輸入加密設備 Pin 碼、加密設備為如門、車庫與門鎖。當透過 Google Assistant 與此類設備進行互動時,將需要語音說出/輸入密碼。", - "info": "藉由 Home Assistant Cloud 雲服務 Google Assistant 整合,將能透過 Google Assistant 支援設備以控制所有 Home Assistant 設備。", - "info_state_reporting": "假如開啟狀態回報,Home Assistant 將會持續傳送所有連結實體的狀態改變至 Google。以確保於 Google app 中設備永遠保持最新狀態、並藉以創建例行自動化。", + "enter_pin_hint": "請輸入安全碼以使用加密裝置", + "enter_pin_info": "請輸入加密裝置 Pin 碼、加密裝置為如門、車庫與門鎖。當透過 Google Assistant 與此類裝置進行互動時,將需要語音說出/輸入密碼。", + "info": "藉由 Home Assistant Cloud 雲服務 Google Assistant 整合,將能透過 Google Assistant 支援裝置以控制所有 Home Assistant 裝置。", + "info_state_reporting": "假如開啟狀態回報,Home Assistant 將會持續傳送所有連結實體的狀態改變至 Google。以確保於 Google app 中裝置永遠保持最新狀態、並藉以創建例行自動化。", "manage_entities": "管理實體", "security_devices": "安全裝置", "sync_entities": "與 Google 同步實體", @@ -1476,8 +1489,8 @@ "access_is_being_prepared": "遠端登入準備中,會於就緒時通知您。", "certificate_info": "認證資訊", "info": "Home Assistant Cloud 雲服務提供您離家時、遠端加密連線控制。", - "instance_is_available": "您的設備可透過下方連結使用", - "instance_will_be_available": "您的設備將可透過下方連結使用", + "instance_is_available": "您的裝置可透過下方連結使用", + "instance_will_be_available": "您的裝置將可透過下方連結使用", "link_learn_how_it_works": "了解如何運作", "title": "遠端控制" }, @@ -1510,7 +1523,7 @@ "title": "Alexa" }, "caption": "Home Assistant Cloud", - "description_features": "整合 Alexa 及 Google 助理,遠端控制智慧型家居", + "description_features": "遠端控制家庭與 Alexa 及 Google 助理整合", "description_login": "登入帳號:{email}", "description_not_login": "未登入", "dialog_certificate": { @@ -1605,7 +1618,7 @@ }, "core": { "caption": "一般設定", - "description": "變更 Home Assistant 一般設定", + "description": "單位系統、座標、時區與其他一般設定", "section": { "core": { "core_config": { @@ -1666,9 +1679,10 @@ "no_conditions": "無觸發條件", "unknown_condition": "未知觸發條件" }, - "create": "以設備新增自動化", + "create": "以裝置新增自動化", + "create_disable": "以裝置新增自動化", "no_automations": "沒有自動化", - "no_device_automations": "該設備沒有任何自動化可使用。", + "no_device_automations": "該裝置沒有任何自動化可使用。", "triggers": { "caption": "執行動作、當...", "no_triggers": "無觸發", @@ -1692,9 +1706,18 @@ "no_devices": "沒有任何裝置" }, "delete": "刪除", - "description": "管理已連線的裝置", + "description": "管理已設定裝置", "device_info": "裝置資訊", "device_not_found": "找不到裝置。", + "disabled": "已關閉", + "disabled_by": { + "config_entry": "設定實體", + "integration": "整合類型", + "user": "使用者" + }, + "enabled_cause": "由 {cause} 關閉。", + "enabled_description": "關閉的實體將不會新增至 Home Assistant。", + "enabled_label": "開啟裝置事件", "entities": { "add_entities_lovelace": "新增至 Lovelace UI", "disabled_entities": "{count} {count, plural,\n one {個已關閉實體}\n other {個已關閉實體}\n}", @@ -1704,14 +1727,25 @@ }, "name": "名稱", "no_devices": "沒有任何裝置", + "picker": { + "filter": { + "filter": "過濾器", + "hidden_devices": "{number} 隱藏 {number, plural,\n one {個裝置}\n other {個裝置}\n}", + "show_all": "顯示全部", + "show_disabled": "顯示關閉實體" + }, + "search": "尋找裝置" + }, "scene": { - "create": "以設備新增場景", + "create": "以裝置新增場景", + "create_disable": "以裝置新增場景", "no_scenes": "沒有場景", "scenes": "場景" }, "scenes": "場景", "script": { - "create": "以設備新增腳本", + "create": "以裝置新增腳本", + "create_disable": "以裝置新增腳本", "no_scripts": "沒有腳本", "scripts": "腳本" }, @@ -1777,7 +1811,7 @@ "header": "設定 Home Assistant", "helpers": { "caption": "助手", - "description": "管理可協助建立自動化的元素", + "description": "協助建立自動化的元素", "dialog": { "add_helper": "新增助手", "add_platform": "新增 {platform}", @@ -1809,7 +1843,7 @@ "copy_github": "GitHub", "copy_raw": "原始文字", "custom_uis": "自定介面:", - "description": "檢視 Home Assistant 安裝資訊", + "description": "版本、系統健康度與文件連結", "developed_by": "由一群充滿熱情的人們所開發。", "documentation": "相關文件", "frontend": "frontend-ui", @@ -1875,7 +1909,7 @@ "delete": "刪除", "delete_button": "刪除 {integration}", "delete_confirm": "確定要刪除此整合?", - "device_unavailable": "設備不可用", + "device_unavailable": "裝置不可用", "devices": "{count} {count, plural,\n one {個裝置}\n other {個裝置}\n}", "documentation": "相關文件", "entities": "{count} {count, plural,\n one {個實體}\n other {個實體}\n}", @@ -1915,7 +1949,7 @@ }, "configure": "設定", "configured": "已設定整合", - "description": "管理整合", + "description": "管理服務、裝置整合等", "details": "整合詳細資訊", "discovered": "已掃描", "home_assistant_website": "Home Assistant 網站", @@ -1977,9 +2011,9 @@ "edit_dashboard": "編輯主面板", "icon": "圖示", "new_dashboard": "新增主面板", - "remove_default": "移除此設備預設值", + "remove_default": "移除此裝置預設值", "require_admin": "僅限管理員", - "set_default": "設定為此設備預設值", + "set_default": "設定為此裝置預設值", "show_sidebar": "於側邊列顯示", "title": "標題", "title_required": "必須輸入標題", @@ -2000,7 +2034,7 @@ "open": "開啟" } }, - "description": "管理 Lovelace 主面板", + "description": "創建自訂面板設定以控制家庭", "resources": { "cant_edit_yaml": "正使用 YAML 模式、因此無法藉由 UI 變更 Lovelace 設定。請於「configuration.yaml」進行管理。", "caption": "資源", @@ -2177,7 +2211,7 @@ "confirm_delete_user": "確定要刪除帳號{name}使用者?依舊可以追蹤使用者,但人員將無法進行登入。", "create": "新增", "delete": "刪除", - "device_tracker_intro": "選擇此人員所擁有的設備。", + "device_tracker_intro": "選擇此人員所擁有的裝置。", "device_tracker_pick": "選擇要追蹤的裝置", "device_tracker_picked": "追蹤裝置", "link_integrations_page": "整合頁面", @@ -2186,7 +2220,7 @@ "name": "名稱", "name_error_msg": "必須輸入名稱", "new_person": "新人員", - "no_device_tracker_available_intro": "當有設備顯示有人員在場時、可以將該設備指定為某個人員所有。可以先藉由整合頁面、新增人員偵測整合以加入第一個設備。", + "no_device_tracker_available_intro": "當有裝置顯示有人員在場時、可以將該裝置指定為某個人員所有。可以先藉由整合頁面、新增人員偵測整合以加入第一個裝置。", "update": "更新" }, "introduction": "此處可定義 Home Assistant 中的每一位成員。", @@ -2199,22 +2233,22 @@ "scene": { "activated": "已啟用場景 {name}。", "caption": "場景", - "description": "管理場景", + "description": "獲取裝置狀態及稍候進行調用", "editor": { "default_name": "新場景", "devices": { "add": "新增裝置", "delete": "移除裝置", "header": "裝置", - "introduction": "新增所要包含於場景中的設備,設定所有設備成此場景中所希望的狀態。" + "introduction": "新增所要包含於場景中的裝置,設定所有裝置成此場景中所希望的狀態。" }, "entities": { "add": "新增實體", "delete": "刪除實體", - "device_entities": "假如新增一項屬於設備的實體,設備也將被新增。", + "device_entities": "假如新增一項屬於裝置的實體,裝置也將被新增。", "header": "實體", - "introduction": "不屬於設備的實體可以於此設置。", - "without_device": "無設備實體" + "introduction": "不屬於裝置的實體可以於此設置。", + "without_device": "無裝置實體" }, "icon": "圖示", "introduction": "使用場景來讓你的智慧型家居更有魅力吧。", @@ -2243,7 +2277,7 @@ }, "script": { "caption": "腳本", - "description": "管理腳本", + "description": "執行連續動作腳本", "editor": { "alias": "名稱", "default_name": "新腳本", @@ -2354,7 +2388,7 @@ "confirm_remove": "是否要移除標籤 {tag}?", "confirm_remove_title": "移除標籤?", "create_automation": "以標籤新增自動化", - "description": "管理標籤", + "description": "當 NFC 標籤或 QR Code 掃描時、觸發自動化", "detail": { "companion_apps": "行動程式 App", "create": "新增", @@ -2393,6 +2427,7 @@ "editor": { "activate_user": "啟用使用者", "active": "啟用", + "active_tooltip": "控制用戶是否可以登錄", "admin": "管理員", "caption": "檢視使用者", "change_password": "更改密碼", @@ -2426,19 +2461,19 @@ "users_privileges_note": "使用者群組功能仍在開發中。將無法透過 UI 進行使用者管理,仍在檢視所有管理 API Endpoint 以確保能夠正確符合管理員存取需求。" }, "zha": { - "add_device": "新增設備", + "add_device": "新增裝置", "add_device_page": { "discovered_text": "在探索到裝置後將顯示於此處。", - "discovery_text": "所發現的設備將會顯示於此。跟隨設備的指示並將其設定為配對模式。", - "header": "Zigbee 家庭自動化 - 新增設備", - "no_devices_found": "找不到設備,請確定設備處於配對模式、並於探索時保持喚醒狀態。", - "pairing_mode": "請確定設備處於配對模式中,參閱設備的手冊以了解如何進行操作。", + "discovery_text": "所發現的裝置將會顯示於此。跟隨裝置的指示並將其設定為配對模式。", + "header": "Zigbee 家庭自動化 - 新增裝置", + "no_devices_found": "找不到裝置,請確定裝置處於配對模式、並於探索時保持喚醒狀態。", + "pairing_mode": "請確定裝置處於配對模式中,參閱裝置的手冊以了解如何進行操作。", "search_again": "再次搜尋", - "spinner": "正在搜尋 ZHA Zigbee 設備..." + "spinner": "正在搜尋 ZHA Zigbee 裝置..." }, "add": { "caption": "新增裝置", - "description": "新增設備至 Zigbee 網路" + "description": "新增裝置至 Zigbee 網路" }, "button": "設定", "caption": "ZHA", @@ -2476,24 +2511,24 @@ "CONFIGURED": "設定完成", "CONFIGURED_status_text": "初始化中", "INITIALIZED": "初始化完成", - "INITIALIZED_status_text": "設備已準備就緒", + "INITIALIZED_status_text": "裝置已準備就緒", "INTERVIEW_COMPLETE": "探訪完成", "INTERVIEW_COMPLETE_status_text": "設定中", - "PAIRED": "找到設備", + "PAIRED": "找到裝置", "PAIRED_status_text": "開始探訪" }, "devices": { - "header": "Zigbee 家庭自動化 - 設備" + "header": "Zigbee 家庭自動化 - 裝置" }, "group_binding": { - "bind_button_help": "綁定所選擇之群組至所選擇之設備叢集。", + "bind_button_help": "綁定所選擇之群組至所選擇之裝置叢集。", "bind_button_label": "綁定群組", "cluster_selection_help": "選擇叢集以綁定至所選群組。", "group_picker_help": "選擇群組進行綁定命令。", "group_picker_label": "可綁定群組", "header": "群組綁定", "introduction": "綁定與解除綁定群組。", - "unbind_button_help": "由所選擇之設備叢集中取消綁定所選擇之群組。", + "unbind_button_help": "由所選擇之裝置叢集中取消綁定所選擇之群組。", "unbind_button_label": "解除綁定群組" }, "groups": { @@ -2535,10 +2570,10 @@ }, "node_management": { "header": "裝置管理", - "help_node_dropdown": "選擇設備以檢視該設備選項。", - "hint_battery_devices": "請注意:對設備執行命令時,需喚醒處於睡眠狀態的設備(使用電池供電),通常可以藉由觸發以喚醒設備。", + "help_node_dropdown": "選擇裝置以檢視該裝置選項。", + "hint_battery_devices": "請注意:對裝置執行命令時,需喚醒處於睡眠狀態的裝置(使用電池供電),通常可以藉由觸發以喚醒裝置。", "hint_wakeup": "在您進行互動時某些裝置(例如小米感應器)有喚醒按鈕、可藉由每隔約 5 秒按一下、以保持該裝置處於喚醒狀態。", - "introduction": "執行 ZHA 命命將影響單一設備。選擇設備以檢視該設備可使用之命令。" + "introduction": "執行 ZHA 命命將影響單一裝置。選擇裝置以檢視該裝置可使用之命令。" }, "title": "Zigbee 家庭自動化", "visualization": { @@ -2563,7 +2598,7 @@ "name": "名稱", "new_zone": "新區域", "passive": "被動", - "passive_note": "被動區域將會於前端中隱藏、不會作為設備位置追蹤。使用於僅作為自動化之用相當方便。", + "passive_note": "被動區域將會於前端中隱藏、不會作為裝置位置追蹤。使用於僅作為自動化之用相當方便。", "radius": "半徑", "required_error_msg": "必填欄位", "update": "更新" @@ -2708,7 +2743,7 @@ "attributes": "屬性", "current_entities": "目前實體", "description1": "設定 Home Assistant 裝置代表。", - "description2": "將不會與實際設備進行通訊。", + "description2": "將不會與實際裝置進行通訊。", "entity": "實體", "filter_attributes": "屬性過濾器", "filter_entities": "實體過濾器", @@ -2771,7 +2806,7 @@ "confirm_delete": "確定要刪除此面板?", "empty_state": { "go_to_integrations_page": "轉至整合頁面。", - "no_devices": "此頁面允許進行控制所擁有的設備。看起來您尚未設定任何設備,從設定中的整合頁面開始吧。", + "no_devices": "此頁面允許進行控制所擁有的裝置。看起來您尚未設定任何裝置,從設定中的整合頁面開始吧。", "title": "歡迎回家" }, "entities": { @@ -3125,7 +3160,7 @@ "header": "移動至哪個面板" }, "raw_editor": { - "confirm_remove_config_text": "假如移除 Lovelace UI 設定的話,將自動以區域與設備產生 Lovelace UI 視圖。", + "confirm_remove_config_text": "假如移除 Lovelace UI 設定的話,將自動以區域與裝置產生 Lovelace UI 視圖。", "confirm_remove_config_title": "確定要移除 Lovelace UI 設定?", "confirm_unsaved_changes": "變更尚未儲存,確定要退出?", "confirm_unsaved_comments": "設定包含命令、將不會被儲存。是否要繼續?", @@ -3246,7 +3281,7 @@ "data": { "code": "雙重驗證碼" }, - "description": "開啟設備上的 **{mfa_module_name}** 以獲得雙重驗證碼,並進行驗證:" + "description": "開啟裝置上的 **{mfa_module_name}** 以獲得雙重驗證碼,並進行驗證:" } } }, @@ -3269,7 +3304,7 @@ "data": { "code": "雙重驗證碼" }, - "description": "開啟設備上的 **{mfa_module_name}** 以獲得雙重驗證碼,並進行驗證:" + "description": "開啟裝置上的 **{mfa_module_name}** 以獲得雙重驗證碼,並進行驗證:" } } }, @@ -3293,7 +3328,7 @@ "data": { "code": "雙重驗證碼" }, - "description": "開啟設備上的 **{mfa_module_name}** 以獲得雙重驗證碼,並進行驗證:" + "description": "開啟裝置上的 **{mfa_module_name}** 以獲得雙重驗證碼,並進行驗證:" } } }, @@ -3376,7 +3411,7 @@ }, "integration": { "finish": "完成", - "intro": "將會於 Home Assistant 整合中呈現的設備與服務。可以現在進行設定,或者稍後於設定選單中進行。", + "intro": "將會於 Home Assistant 整合中呈現的裝置與服務。可以現在進行設定,或者稍後於設定選單中進行。", "more_integrations": "更多" }, "intro": "準備喚醒您的智慧型家庭、取得隱私自主權,並加入由全球愛好者共同維護的社群了嗎?", @@ -3411,10 +3446,13 @@ "change_password": { "confirm_new_password": "確認密碼", "current_password": "目前密碼", + "error_new_is_old": "新密碼必須與當前密碼不同", + "error_new_mismatch": "輸入的新密碼值不匹配", "error_required": "必填", "header": "變更密碼", "new_password": "新密碼", - "submit": "傳送" + "submit": "傳送", + "success": "密碼變更成功" }, "current_user": "目前登入身份:{fullName}。", "customize_sidebar": { @@ -3477,7 +3515,7 @@ "push_notifications": { "add_device_prompt": { "input_label": "裝置名稱", - "title": "要幫這個裝置取什麼名子呢?" + "title": "要幫這個裝置取什麼名字呢?" }, "description": "推送通知到這個裝置。", "error_load_platform": "設定 notify.html5。",