diff --git a/hassio/src/dashboard/hassio-update.ts b/hassio/src/dashboard/hassio-update.ts index eec4097e54..a95eafbd76 100644 --- a/hassio/src/dashboard/hassio-update.ts +++ b/hassio/src/dashboard/hassio-update.ts @@ -153,7 +153,7 @@ export class HassioUpdate extends LitElement { item.progress = true; const confirmed = await showConfirmationDialog(this, { title: `Update ${item.name}`, - text: `Are you sure you want to upgrade ${item.name} to version ${item.version}?`, + text: `Are you sure you want to update ${item.name} to version ${item.version}?`, confirmText: "update", dismissText: "cancel", }); diff --git a/hassio/src/snapshots/hassio-snapshots.ts b/hassio/src/snapshots/hassio-snapshots.ts index 3bc9bfcc45..18f2b1d0ed 100644 --- a/hassio/src/snapshots/hassio-snapshots.ts +++ b/hassio/src/snapshots/hassio-snapshots.ts @@ -79,6 +79,7 @@ class HassioSnapshots extends LitElement { }, { slug: "ssl", name: "SSL", checked: true }, { slug: "share", name: "Share", checked: true }, + { slug: "media", name: "Media", checked: true }, { slug: "addons/local", name: "Local add-ons", checked: true }, ]; @@ -241,7 +242,7 @@ class HassioSnapshots extends LitElement { protected firstUpdated(changedProps: PropertyValues) { super.firstUpdated(changedProps); - this._updateSnapshots(); + this.refreshData(); } protected updated(changedProps: PropertyValues) { diff --git a/hassio/src/system/hassio-host-info.ts b/hassio/src/system/hassio-host-info.ts index 5f44703ac3..94400402ae 100644 --- a/hassio/src/system/hassio-host-info.ts +++ b/hassio/src/system/hassio-host-info.ts @@ -14,7 +14,6 @@ import { TemplateResult, } from "lit-element"; import memoizeOne from "memoize-one"; -import { atLeastVersion } from "../../../src/common/config/version"; import "../../../src/components/buttons/ha-progress-button"; import "../../../src/components/ha-button-menu"; import "../../../src/components/ha-card"; @@ -85,8 +84,7 @@ class HassioHostInfo extends LitElement { ` : ""} - ${this.hostInfo.features.includes("network") && - atLeastVersion(this.hass.config.version, 0, 115) + ${this.hostInfo.features.includes("network") ? html` IP address diff --git a/hassio/src/system/hassio-supervisor-info.ts b/hassio/src/system/hassio-supervisor-info.ts index 12af46d091..fcec51d607 100644 --- a/hassio/src/system/hassio-supervisor-info.ts +++ b/hassio/src/system/hassio-supervisor-info.ts @@ -213,7 +213,7 @@ class HassioSupervisorInfo extends LitElement { const confirmed = await showConfirmationDialog(this, { title: "Update supervisor", - text: `Are you sure you want to upgrade supervisor to version ${this.supervisorInfo.version_latest}?`, + text: `Are you sure you want to update supervisor to version ${this.supervisorInfo.version_latest}?`, confirmText: "update", dismissText: "cancel", }); diff --git a/setup.py b/setup.py index 7ee304d284..b7b90326ef 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name="home-assistant-frontend", - version="20200912.0", + version="20200915.0", description="The Home Assistant frontend", url="https://github.com/home-assistant/home-assistant-polymer", author="The Home Assistant Authors", diff --git a/src/common/dom/apply_themes_on_element.ts b/src/common/dom/apply_themes_on_element.ts index f994f0d99d..902a1a196a 100644 --- a/src/common/dom/apply_themes_on_element.ts +++ b/src/common/dom/apply_themes_on_element.ts @@ -1,14 +1,14 @@ -import { derivedStyles, darkStyles } from "../../resources/styles"; +import { darkStyles, derivedStyles } from "../../resources/styles"; import { HomeAssistant, Theme } from "../../types"; import { hex2rgb, + lab2hex, + lab2rgb, rgb2hex, rgb2lab, - lab2rgb, - lab2hex, } from "../color/convert-color"; +import { labBrighten, labDarken } from "../color/lab"; import { rgbContrast } from "../color/rgb"; -import { labDarken, labBrighten } from "../color/lab"; interface ProcessedTheme { keys: { [key: string]: "" }; @@ -105,7 +105,7 @@ const processTheme = ( const keys = {}; for (const key of Object.keys(combinedTheme)) { const prefixedKey = `--${key}`; - const value = combinedTheme[key]!; + const value = String(combinedTheme[key]); styles[prefixedKey] = value; keys[prefixedKey] = ""; diff --git a/src/components/ha-button-menu.ts b/src/components/ha-button-menu.ts index e325925d57..7adc266a56 100644 --- a/src/components/ha-button-menu.ts +++ b/src/components/ha-button-menu.ts @@ -1,17 +1,16 @@ -import { - customElement, - html, - TemplateResult, - LitElement, - CSSResult, - css, - query, - property, -} from "lit-element"; import "@material/mwc-button"; import "@material/mwc-menu"; -import type { Menu, Corner } from "@material/mwc-menu"; - +import type { Corner, Menu } from "@material/mwc-menu"; +import { + css, + CSSResult, + customElement, + html, + LitElement, + property, + query, + TemplateResult, +} from "lit-element"; import "./ha-icon-button"; @customElement("ha-button-menu") @@ -22,6 +21,8 @@ export class HaButtonMenu extends LitElement { @property({ type: Boolean }) public activatable = false; + @property({ type: Boolean }) public disabled = false; + @query("mwc-menu") private _menu?: Menu; public get items() { @@ -48,6 +49,9 @@ export class HaButtonMenu extends LitElement { } private _handleClick(): void { + if (this.disabled) { + return; + } this._menu!.anchor = this; this._menu!.show(); } diff --git a/src/components/ha-camera-stream.ts b/src/components/ha-camera-stream.ts index 7b091055e0..eb9ce99718 100644 --- a/src/components/ha-camera-stream.ts +++ b/src/components/ha-camera-stream.ts @@ -32,6 +32,9 @@ class HaCameraStream extends LitElement { @property({ type: Boolean, attribute: "muted" }) public muted = false; + @property({ type: Boolean, attribute: "allow-exoplayer" }) + public allowExoPlayer = false; + // We keep track if we should force MJPEG with a string // that way it automatically resets if we change entity. @internalProperty() private _forceMJPEG?: string; @@ -61,6 +64,7 @@ class HaCameraStream extends LitElement { { - if (!this.hass!.auth.external) { - return false; - } - const externalConfig = await getExternalConfig(this.hass!.auth.external); - return externalConfig && externalConfig.hasExoPlayer; + return false; } private async _startHls(): Promise { @@ -137,7 +135,10 @@ class HaHLSPlayer extends LitElement { this._videoEl.style.visibility = "hidden"; await this.hass!.auth.external!.sendMessage({ type: "exoplayer/play_hls", - payload: new URL(url, window.location.href).toString(), + payload: { + url: new URL(url, window.location.href).toString(), + muted: this.muted, + }, }); } diff --git a/src/components/ha-sidebar.ts b/src/components/ha-sidebar.ts index 028fe8defd..3266046064 100644 --- a/src/components/ha-sidebar.ts +++ b/src/components/ha-sidebar.ts @@ -159,8 +159,6 @@ const computePanels = memoizeOne( let Sortable; -let sortStyles: CSSResult; - @customElement("ha-sidebar") class HaSidebar extends LitElement { @property({ attribute: false }) public hass!: HomeAssistant; @@ -171,12 +169,12 @@ class HaSidebar extends LitElement { @property({ type: Boolean, reflect: true }) public expanded = false; + @property({ type: Boolean }) public editMode = false; + @internalProperty() private _externalConfig?: ExternalConfig; @internalProperty() private _notifications?: PersistentNotification[]; - @internalProperty() private _editMode = false; - // property used only in css // @ts-ignore @property({ type: Boolean, reflect: true }) public rtl = false; @@ -227,19 +225,12 @@ class HaSidebar extends LitElement { } return html` - ${this._editMode - ? html` - - ` - : ""} @@ -137,6 +138,14 @@ class CloudRegister extends LocalizeMixin(EventsMixin(PolymerElement)) { } } + _computeDocumentationUrlTos(hass) { + return documentationUrl(hass, "/tos/"); + } + + _computeDocumentationUrlPrivacy(hass) { + return documentationUrl(hass, "/privacy/"); + } + _handleRegister() { let invalid = false; diff --git a/src/panels/config/customize/ha-form-customize.js b/src/panels/config/customize/ha-form-customize.js index 4c85d7b27f..2ad523125d 100644 --- a/src/panels/config/customize/ha-form-customize.js +++ b/src/panels/config/customize/ha-form-customize.js @@ -6,10 +6,11 @@ import { html } from "@polymer/polymer/lib/utils/html-tag"; import { PolymerElement } from "@polymer/polymer/polymer-element"; import { computeStateDomain } from "../../../common/entity/compute_state_domain"; import LocalizeMixin from "../../../mixins/localize-mixin"; -import hassAttributeUtil from "../../../util/hass-attributes-util"; -import "./ha-form-customize-attributes"; -import "../ha-form-style"; import "../../../styles/polymer-ha-style"; +import { documentationUrl } from "../../../util/documentation-url"; +import hassAttributeUtil from "../../../util/hass-attributes-util"; +import "../ha-form-style"; +import "./ha-form-customize-attributes"; class HaFormCustomize extends LocalizeMixin(PolymerElement) { static get template() { @@ -30,7 +31,7 @@ class HaFormCustomize extends LocalizeMixin(PolymerElement) {
[[localize('ui.panel.config.customize.warning.include_sentence')]] [[localize('ui.panel.config.customize.warning.include_link')]]

diff --git a/src/panels/config/integrations/integration-panels/ozw/ozw-network-dashboard.ts b/src/panels/config/integrations/integration-panels/ozw/ozw-network-dashboard.ts index 98ae8a28a6..013f2b794b 100644 --- a/src/panels/config/integrations/integration-panels/ozw/ozw-network-dashboard.ts +++ b/src/panels/config/integrations/integration-panels/ozw/ozw-network-dashboard.ts @@ -159,11 +159,13 @@ class OZWNetworkDashboard extends LitElement { } private _generateServiceButton(service: string) { + const serviceData = { instance_id: this.ozwInstance }; return html` ${this.hass!.localize(`ui.panel.config.ozw.services.${service}`)} diff --git a/src/panels/config/integrations/integration-panels/zwave/zwave-network.ts b/src/panels/config/integrations/integration-panels/zwave/zwave-network.ts index 7d220ba93c..b9860c0589 100644 --- a/src/panels/config/integrations/integration-panels/zwave/zwave-network.ts +++ b/src/panels/config/integrations/integration-panels/zwave/zwave-network.ts @@ -1,20 +1,20 @@ -import "../../../../../components/ha-icon-button"; -import "../../../../../components/ha-circular-progress"; import { UnsubscribeFunc } from "home-assistant-js-websocket"; import { css, CSSResult, customElement, html, + internalProperty, LitElement, property, - internalProperty, TemplateResult, } from "lit-element"; import "../../../../../components/buttons/ha-call-api-button"; import "../../../../../components/buttons/ha-call-service-button"; import "../../../../../components/ha-card"; +import "../../../../../components/ha-circular-progress"; import "../../../../../components/ha-icon"; +import "../../../../../components/ha-icon-button"; import "../../../../../components/ha-service-description"; import { fetchNetworkStatus, @@ -26,6 +26,7 @@ import { } from "../../../../../data/zwave"; import { haStyle } from "../../../../../resources/styles"; import { HomeAssistant } from "../../../../../types"; +import { documentationUrl } from "../../../../../util/documentation-url"; import "../../../ha-config-section"; @customElement("zwave-network") @@ -71,7 +72,10 @@ export class ZwaveNetwork extends LitElement { )}

diff --git a/src/panels/config/logs/dialog-system-log-detail.ts b/src/panels/config/logs/dialog-system-log-detail.ts index ad5f28c648..34d05afca9 100644 --- a/src/panels/config/logs/dialog-system-log-detail.ts +++ b/src/panels/config/logs/dialog-system-log-detail.ts @@ -1,14 +1,21 @@ +import "@material/mwc-icon-button/mwc-icon-button"; +import { mdiContentCopy } from "@mdi/js"; import "@polymer/paper-dialog-scrollable/paper-dialog-scrollable"; +import "@polymer/paper-tooltip/paper-tooltip"; +import type { PaperTooltipElement } from "@polymer/paper-tooltip/paper-tooltip"; import { css, CSSResult, html, + internalProperty, LitElement, property, - internalProperty, + query, TemplateResult, } from "lit-element"; +import { fireEvent } from "../../../common/dom/fire_event"; import "../../../components/dialog/ha-paper-dialog"; +import "../../../components/ha-svg-icon"; import { domainToName, fetchIntegrationManifest, @@ -16,12 +23,11 @@ import { IntegrationManifest, } from "../../../data/integration"; import { getLoggedErrorIntegration } from "../../../data/system_log"; -import { PolymerChangedEvent } from "../../../polymer-types"; +import type { PolymerChangedEvent } from "../../../polymer-types"; import { haStyleDialog } from "../../../resources/styles"; -import { HomeAssistant } from "../../../types"; -import { SystemLogDetailDialogParams } from "./show-dialog-system-log-detail"; +import type { HomeAssistant } from "../../../types"; +import type { SystemLogDetailDialogParams } from "./show-dialog-system-log-detail"; import { formatSystemLogTime } from "./util"; -import { fireEvent } from "../../../common/dom/fire_event"; class DialogSystemLogDetail extends LitElement { @property({ attribute: false }) public hass!: HomeAssistant; @@ -30,6 +36,8 @@ class DialogSystemLogDetail extends LitElement { @internalProperty() private _manifest?: IntegrationManifest; + @query("paper-tooltip") private _toolTip?: PaperTooltipElement; + public async showDialog(params: SystemLogDetailDialogParams): Promise { this._params = params; this._manifest = undefined; @@ -66,13 +74,25 @@ class DialogSystemLogDetail extends LitElement { opened @opened-changed="${this._openedChanged}" > -

- ${this.hass.localize( - "ui.panel.config.logs.details", - "level", - item.level - )} -

+
+

+ ${this.hass.localize( + "ui.panel.config.logs.details", + "level", + item.level + )} +

+ + + + ${this.hass.localize("ui.common.copied")} +

Logger: ${item.name}
@@ -148,6 +168,25 @@ class DialogSystemLogDetail extends LitElement { } } + private _copyLog(): void { + const copyElement = this.shadowRoot?.querySelector( + "paper-dialog-scrollable" + ) as HTMLElement; + + const selection = window.getSelection()!; + const range = document.createRange(); + + range.selectNodeContents(copyElement); + selection.removeAllRanges(); + selection.addRange(range); + + document.execCommand("copy"); + window.getSelection()!.removeAllRanges(); + + this._toolTip!.show(); + setTimeout(() => this._toolTip?.hide(), 3000); + } + static get styles(): CSSResult[] { return [ haStyleDialog, @@ -164,6 +203,15 @@ class DialogSystemLogDetail extends LitElement { pre { margin-bottom: 0; } + .heading { + display: flex; + display: flex; + align-items: center; + justify-content: space-between; + } + .heading ha-svg-icon { + cursor: pointer; + } `, ]; } diff --git a/src/panels/config/person/dialog-person-detail.ts b/src/panels/config/person/dialog-person-detail.ts index 94c50807c1..043d407607 100644 --- a/src/panels/config/person/dialog-person-detail.ts +++ b/src/panels/config/person/dialog-person-detail.ts @@ -4,23 +4,24 @@ import { css, CSSResult, html, + internalProperty, LitElement, property, - internalProperty, TemplateResult, } from "lit-element"; import memoizeOne from "memoize-one"; -import "../../../components/ha-picture-upload"; -import type { HaPictureUpload } from "../../../components/ha-picture-upload"; import "../../../components/entity/ha-entities-picker"; import { createCloseHeading } from "../../../components/ha-dialog"; +import "../../../components/ha-picture-upload"; +import type { HaPictureUpload } from "../../../components/ha-picture-upload"; import "../../../components/user/ha-user-picker"; import { PersonMutableParams } from "../../../data/person"; +import { CropOptions } from "../../../dialogs/image-cropper-dialog/show-image-cropper-dialog"; import { PolymerChangedEvent } from "../../../polymer-types"; import { haStyleDialog } from "../../../resources/styles"; import { HomeAssistant } from "../../../types"; +import { documentationUrl } from "../../../util/documentation-url"; import { PersonDetailDialogParams } from "./show-dialog-person-detail"; -import { CropOptions } from "../../../dialogs/image-cropper-dialog/show-image-cropper-dialog"; const includeDomains = ["device_tracker"]; @@ -153,7 +154,10 @@ class DialogPersonDetail extends LitElement {

+ ${this.scriptEntityId + ? html` +
+ + + ${this.hass.localize("ui.card.script.execute")} + +
+ ` + : ``} @@ -209,7 +233,7 @@ export class HaScriptEditor extends LitElement { )}

@@ -301,6 +325,18 @@ export class HaScriptEditor extends LitElement { } } + private async _runScript(ev) { + ev.stopPropagation(); + await triggerScript(this.hass, this.scriptEntityId); + showToast(this, { + message: this.hass.localize( + "ui.notification_toast.triggered", + "name", + this._config!.alias + ), + }); + } + private _modeChanged(ev: CustomEvent) { const mode = ((ev.target as PaperListboxElement)?.selectedItem as any) ?.mode; diff --git a/src/panels/config/script/ha-script-picker.ts b/src/panels/config/script/ha-script-picker.ts index 99b6dce17e..d7b713596c 100644 --- a/src/panels/config/script/ha-script-picker.ts +++ b/src/panels/config/script/ha-script-picker.ts @@ -25,6 +25,7 @@ import { configSections } from "../ha-panel-config"; import "../../../components/ha-svg-icon"; import { mdiPlus } from "@mdi/js"; import { stateIcon } from "../../../common/entity/state_icon"; +import { documentationUrl } from "../../../util/documentation-url"; @customElement("ha-script-picker") class HaScriptPicker extends LitElement { @@ -187,7 +188,7 @@ class HaScriptPicker extends LitElement { ${this.hass.localize("ui.panel.config.script.picker.introduction")}

diff --git a/src/panels/developer-tools/event/developer-tools-event.js b/src/panels/developer-tools/event/developer-tools-event.js index 4466d48f10..ec7526fee9 100644 --- a/src/panels/developer-tools/event/developer-tools-event.js +++ b/src/panels/developer-tools/event/developer-tools-event.js @@ -9,6 +9,7 @@ import "../../../components/ha-code-editor"; import { showAlertDialog } from "../../../dialogs/generic/show-dialog-box"; import { EventsMixin } from "../../../mixins/events-mixin"; import LocalizeMixin from "../../../mixins/localize-mixin"; +import { documentationUrl } from "../../../util/documentation-url"; import "../../../styles/polymer-ha-style"; import "./event-subscribe-card"; import "./events-list"; @@ -61,7 +62,7 @@ class HaPanelDevEvent extends EventsMixin(LocalizeMixin(PolymerElement)) {

[[localize( 'ui.panel.developer-tools.tabs.events.description' )]] @@ -149,6 +150,10 @@ class HaPanelDevEvent extends EventsMixin(LocalizeMixin(PolymerElement)) { } } + _computeDocumentationUrl(hass) { + return documentationUrl(hass, "/docs/configuration/events/"); + } + _computeValidJSON(parsedJSON) { return parsedJSON !== ERROR_SENTINEL; } diff --git a/src/panels/developer-tools/template/developer-tools-template.ts b/src/panels/developer-tools/template/developer-tools-template.ts index c9ca775fbf..d41e8fed1e 100644 --- a/src/panels/developer-tools/template/developer-tools-template.ts +++ b/src/panels/developer-tools/template/developer-tools-template.ts @@ -19,6 +19,7 @@ import { } from "../../../data/ws-templates"; import { haStyle } from "../../../resources/styles"; import { HomeAssistant } from "../../../types"; +import { documentationUrl } from "../../../util/documentation-url"; const DEMO_TEMPLATE = `{## Imitate available variables: ##} {% set my_test_json = { @@ -107,7 +108,10 @@ class HaPanelDevTemplate extends LitElement {

  • diff --git a/src/panels/logbook/ha-logbook.ts b/src/panels/logbook/ha-logbook.ts index 86e61d3535..9c5e85d5df 100644 --- a/src/panels/logbook/ha-logbook.ts +++ b/src/panels/logbook/ha-logbook.ts @@ -285,7 +285,7 @@ class HaLogbook extends LitElement { .narrow .entry { flex-direction: column; line-height: 1.5; - padding: 8px; + padding: 8px 0; } .narrow .icon-message ha-icon { diff --git a/src/panels/lovelace/cards/hui-button-card.ts b/src/panels/lovelace/cards/hui-button-card.ts index 65c045f8ab..2d75c7e33b 100644 --- a/src/panels/lovelace/cards/hui-button-card.ts +++ b/src/panels/lovelace/cards/hui-button-card.ts @@ -63,6 +63,9 @@ export class HuiButtonCard extends LitElement implements LovelaceCard { return { type: "button", + tap_action: { + action: "toggle", + }, entity: foundEntities[0] || "", }; } diff --git a/src/panels/lovelace/cards/hui-entities-card.ts b/src/panels/lovelace/cards/hui-entities-card.ts index 2e55a41b39..90383f3bdb 100644 --- a/src/panels/lovelace/cards/hui-entities-card.ts +++ b/src/panels/lovelace/cards/hui-entities-card.ts @@ -50,7 +50,7 @@ class HuiEntitiesCard extends LitElement implements LovelaceCard { ["light", "switch", "sensor"] ); - return { type: "entities", title: "My Title", entities: foundEntities }; + return { type: "entities", entities: foundEntities }; } @internalProperty() private _config?: EntitiesCardConfig; diff --git a/src/panels/lovelace/cards/hui-error-card.ts b/src/panels/lovelace/cards/hui-error-card.ts index 9da8f631b7..b995c6c04d 100644 --- a/src/panels/lovelace/cards/hui-error-card.ts +++ b/src/panels/lovelace/cards/hui-error-card.ts @@ -43,8 +43,8 @@ export class HuiErrorCard extends LitElement implements LovelaceCard { return css` :host { display: block; - background-color: #ef5350; - color: white; + background-color: var(--error-color); + color: var(--color-on-error, white); padding: 8px; font-weight: 500; user-select: text; diff --git a/src/panels/lovelace/editor/card-editor/hui-dialog-edit-card.ts b/src/panels/lovelace/editor/card-editor/hui-dialog-edit-card.ts index 87d5ea3115..e700cd097b 100755 --- a/src/panels/lovelace/editor/card-editor/hui-dialog-edit-card.ts +++ b/src/panels/lovelace/editor/card-editor/hui-dialog-edit-card.ts @@ -115,7 +115,10 @@ export class HuiDialogEditCard extends LitElement implements HassDialog { const oldConfig = changedProps.get("_cardConfig") as LovelaceCardConfig; if (oldConfig?.type !== this._cardConfig!.type) { - this._documentationURL = getCardDocumentationURL(this._cardConfig!.type); + this._documentationURL = getCardDocumentationURL( + this.hass, + this._cardConfig!.type + ); } } diff --git a/src/panels/lovelace/editor/get-card-documentation-url.ts b/src/panels/lovelace/editor/get-card-documentation-url.ts index 4d1e989a1d..e810f6bb4f 100644 --- a/src/panels/lovelace/editor/get-card-documentation-url.ts +++ b/src/panels/lovelace/editor/get-card-documentation-url.ts @@ -1,14 +1,17 @@ import { - getCustomCardEntry, CUSTOM_TYPE_PREFIX, + getCustomCardEntry, } from "../../../data/lovelace_custom_cards"; +import { HomeAssistant } from "../../../types"; +import { documentationUrl } from "../../../util/documentation-url"; -const coreDocumentationURLBase = "https://www.home-assistant.io/lovelace/"; - -export const getCardDocumentationURL = (type: string): string | undefined => { +export const getCardDocumentationURL = ( + hass: HomeAssistant, + type: string +): string | undefined => { if (type.startsWith(CUSTOM_TYPE_PREFIX)) { return getCustomCardEntry(type)?.documentationURL; } - return `${coreDocumentationURLBase}${type}`; + return `${documentationUrl(hass, "/lovelace/")}${type}`; }; diff --git a/src/panels/lovelace/editor/hui-dialog-save-config.ts b/src/panels/lovelace/editor/hui-dialog-save-config.ts index f056413258..3fd5997ffa 100644 --- a/src/panels/lovelace/editor/hui-dialog-save-config.ts +++ b/src/panels/lovelace/editor/hui-dialog-save-config.ts @@ -1,33 +1,32 @@ import "@material/mwc-button"; import "@material/mwc-icon-button/mwc-icon-button"; +import { mdiHelpCircle } from "@mdi/js"; import { css, CSSResult, customElement, html, + internalProperty, LitElement, property, - internalProperty, TemplateResult, } from "lit-element"; -import { mdiHelpCircle } from "@mdi/js"; import { fireEvent } from "../../../common/dom/fire_event"; +import { computeRTLDirection } from "../../../common/util/compute_rtl"; +import "../../../components/ha-circular-progress"; +import "../../../components/ha-dialog"; +import "../../../components/ha-formfield"; +import "../../../components/ha-svg-icon"; +import "../../../components/ha-switch"; +import "../../../components/ha-yaml-editor"; +import type { HassDialog } from "../../../dialogs/make-dialog-manager"; import { haStyleDialog } from "../../../resources/styles"; import type { HomeAssistant } from "../../../types"; +import { documentationUrl } from "../../../util/documentation-url"; import type { SaveDialogParams } from "./show-save-config-dialog"; -import { computeRTLDirection } from "../../../common/util/compute_rtl"; -import type { HassDialog } from "../../../dialogs/make-dialog-manager"; -import "../../../components/ha-switch"; -import "../../../components/ha-formfield"; -import "../../../components/ha-yaml-editor"; -import "../../../components/ha-svg-icon"; -import "../../../components/ha-dialog"; -import "../../../components/ha-circular-progress"; const EMPTY_CONFIG = { views: [] }; -const coreDocumentationURLBase = "https://www.home-assistant.io/lovelace/"; - @customElement("hui-dialog-save-config") export class HuiSaveConfig extends LitElement implements HassDialog { @property({ attribute: false }) public hass?: HomeAssistant; @@ -68,7 +67,7 @@ export class HuiSaveConfig extends LitElement implements HassDialog { "ui.panel.lovelace.editor.save_config.header" )}
  • -
    ${title || ""}
    +
    ${title || ""}
    ${this.hass.localize("ui.components.media-browser.choose_player")} @@ -95,7 +95,7 @@ class PanelMediaBrowser extends LitElement { ev: HASSDomEvent ): Promise { const item = ev.detail.item; - if (this._entityId === BROWSER_SOURCE) { + if (this._entityId === BROWSER_PLAYER) { const resolvedUrl: any = await this.hass.callWS({ type: "media_source/resolve_media", media_content_id: item.media_content_id, @@ -146,8 +146,7 @@ class PanelMediaBrowser extends LitElement { overflow: hidden; white-space: nowrap; } - .heading .secondary { - color: var(--secondary-text-color); + .heading .secondary-text { font-size: 14px; overflow: hidden; text-overflow: ellipsis; diff --git a/src/panels/media-browser/hui-dialog-select-media-player.ts b/src/panels/media-browser/hui-dialog-select-media-player.ts index 03b53b6a2d..46865415da 100644 --- a/src/panels/media-browser/hui-dialog-select-media-player.ts +++ b/src/panels/media-browser/hui-dialog-select-media-player.ts @@ -1,3 +1,5 @@ +import "@material/mwc-list/mwc-list"; +import "@material/mwc-list/mwc-list-item"; import "@polymer/paper-item/paper-item"; import "@polymer/paper-listbox/paper-listbox"; import { @@ -13,7 +15,8 @@ import { fireEvent } from "../../common/dom/fire_event"; import { computeStateName } from "../../common/entity/compute_state_name"; import { compare } from "../../common/string/compare"; import { createCloseHeading } from "../../components/ha-dialog"; -import { BROWSER_SOURCE } from "../../data/media-player"; +import { UNAVAILABLE_STATES } from "../../data/entity"; +import { BROWSER_PLAYER } from "../../data/media-player"; import { haStyleDialog } from "../../resources/styles"; import type { HomeAssistant } from "../../types"; import type { SelectMediaPlayerDialogParams } from "./show-select-media-source-dialog"; @@ -49,30 +52,31 @@ export class HuiDialogSelectMediaPlayer extends LitElement { )} @closed=${this.closeDialog} > - + ${this.hass.localize( "ui.components.media-browser.web-browser" - )} ${this._params.mediaSources .sort((a, b) => compare(computeStateName(a), computeStateName(b))) .map( (source) => html` - ${computeStateName(source)}${computeStateName(source)} ` )} - + `; } - private _selectSource(ev: CustomEvent): void { - const entityId = ev.detail.item.itemName; + private _selectPlayer(ev: CustomEvent): void { + const entityId = (ev.currentTarget as any).player; this._params!.sourceSelectedCallback(entityId); this.closeDialog(); } @@ -84,8 +88,8 @@ export class HuiDialogSelectMediaPlayer extends LitElement { ha-dialog { --dialog-content-padding: 0 24px 20px; } - paper-item { - cursor: pointer; + mwc-list-item[disabled] { + --mdc-theme-text-primary-on-background: var(--disabled-text-color); } `, ]; diff --git a/src/panels/profile/ha-long-lived-access-tokens-card.ts b/src/panels/profile/ha-long-lived-access-tokens-card.ts index d82e1952b9..99ea0bd7bd 100644 --- a/src/panels/profile/ha-long-lived-access-tokens-card.ts +++ b/src/panels/profile/ha-long-lived-access-tokens-card.ts @@ -1,4 +1,5 @@ import "@material/mwc-button/mwc-button"; +import "@material/mwc-icon-button/mwc-icon-button"; import { mdiDelete } from "@mdi/js"; import { css, @@ -80,14 +81,14 @@ class HaLongLivedTokens extends LitElement { ) )} - - +
    ` )} @@ -185,6 +186,9 @@ class HaLongLivedTokens extends LitElement { mwc-button { --mdc-theme-primary: var(--primary-color); } + mwc-icon-button { + color: var(--primary-text-color); + } `, ]; } diff --git a/src/panels/profile/ha-panel-profile.ts b/src/panels/profile/ha-panel-profile.ts index 458148335c..c26d92b853 100644 --- a/src/panels/profile/ha-panel-profile.ts +++ b/src/panels/profile/ha-panel-profile.ts @@ -201,7 +201,7 @@ class HaPanelProfile extends LitElement { } private _customizeSidebar() { - fireEvent(this, "hass-edit-sidebar"); + fireEvent(this, "hass-edit-sidebar", { editMode: true }); } private async _refreshRefreshTokens() { diff --git a/src/panels/profile/ha-pick-theme-row.ts b/src/panels/profile/ha-pick-theme-row.ts index f78b827553..aeb3f85324 100644 --- a/src/panels/profile/ha-pick-theme-row.ts +++ b/src/panels/profile/ha-pick-theme-row.ts @@ -1,24 +1,25 @@ +import "@material/mwc-button/mwc-button"; +import "@polymer/paper-input/paper-input"; import "@polymer/paper-item/paper-item"; import "@polymer/paper-listbox/paper-listbox"; -import "../../components/ha-paper-dropdown-menu"; -import { TemplateResult, html } from "lit-html"; import { - property, + css, + CSSResult, + customElement, internalProperty, LitElement, - customElement, + property, PropertyValues, - CSSResult, - css, } from "lit-element"; -import { HomeAssistant } from "../../types"; -import "../../components/ha-settings-row"; +import { html, TemplateResult } from "lit-html"; import { fireEvent } from "../../common/dom/fire_event"; import "../../components/ha-formfield"; +import "../../components/ha-paper-dropdown-menu"; import "../../components/ha-radio"; -import "@polymer/paper-input/paper-input"; import type { HaRadio } from "../../components/ha-radio"; -import "@material/mwc-button/mwc-button"; +import "../../components/ha-settings-row"; +import { HomeAssistant } from "../../types"; +import { documentationUrl } from "../../util/documentation-url"; @customElement("ha-pick-theme-row") export class HaPickThemeRow extends LitElement { @@ -45,7 +46,10 @@ export class HaPickThemeRow extends LitElement { ? this.hass.localize("ui.panel.profile.themes.error_no_theme") : ""} diff --git a/src/panels/profile/ha-push-notifications-row.js b/src/panels/profile/ha-push-notifications-row.js index 7f0bbc0af0..528a447298 100644 --- a/src/panels/profile/ha-push-notifications-row.js +++ b/src/panels/profile/ha-push-notifications-row.js @@ -7,6 +7,7 @@ import { isComponentLoaded } from "../../common/config/is_component_loaded"; import { pushSupported } from "../../components/ha-push-notifications-toggle"; import LocalizeMixin from "../../mixins/localize-mixin"; import "../../components/ha-settings-row"; +import { documentationUrl } from "../../util/documentation-url"; /* * @appliesMixin LocalizeMixin @@ -26,7 +27,7 @@ class HaPushNotificationsRow extends LocalizeMixin(PolymerElement) { [[_description(_platformLoaded, _pushSupported)]] [[localize('ui.panel.profile.push_notifications.link_promo')]]` : ""} - - + ` ) @@ -135,8 +135,8 @@ class HaRefreshTokens extends LitElement { ha-settings-row { padding: 0; } - mwc-button { - --mdc-theme-primary: var(--primary-color); + mwc-icon-button { + color: var(--primary-text-color); } `, ]; diff --git a/src/resources/ha-sortable-style.ts b/src/resources/ha-sortable-style.ts index b6e3d377c5..448ca9b7c0 100644 --- a/src/resources/ha-sortable-style.ts +++ b/src/resources/ha-sortable-style.ts @@ -18,8 +18,22 @@ export const sortableStyles = css` animation-duration: 0.33s; } + #sortable a { + height: 48px; + display: flex; + } + #sortable { outline: none; + display: block; + } + + .hidden-panel { + display: flex; + } + + .sortable-fallback { + display: none; } .sortable-ghost { @@ -54,13 +68,25 @@ export const sortableStyles = css` } } + .show-panel, .hide-panel { display: none; position: absolute; + top: 0; right: 0; + --mdc-icon-button-size: 40px; + } + + .hide-panel { + top: 4px; + right: 8px; } :host([expanded]) .hide-panel { + display: block; + } + + :host([expanded]) .show-panel { display: inline-flex; } diff --git a/src/state/sidebar-mixin.ts b/src/state/sidebar-mixin.ts index 5572c23b14..e1f1e7653f 100644 --- a/src/state/sidebar-mixin.ts +++ b/src/state/sidebar-mixin.ts @@ -16,13 +16,11 @@ declare global { interface HASSDomEvents { "hass-dock-sidebar": DockSidebarParams; "hass-default-panel": DefaultPanelParams; - "hass-edit-sidebar": undefined; } // for add event listener interface HTMLElementEventMap { "hass-dock-sidebar": HASSDomEvent; "hass-default-panel": HASSDomEvent; - "hass-edit-sidebar": undefined; } } diff --git a/src/translations/en.json b/src/translations/en.json index 8eadb910a9..5504fd17df 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -278,7 +278,8 @@ "successfully_saved": "Successfully saved", "successfully_deleted": "Successfully deleted", "back": "Back", - "error_required": "Required" + "error_required": "Required", + "copied": "Copied" }, "components": { "logbook": { @@ -373,6 +374,12 @@ "video_not_supported": "Your browser does not support the video element.", "media_not_supported": "The Browser Media Player does not support this type of media", "media_browsing_error": "Media Browsing Error", + "learn_adding_local_media": "Learn more about adding media in the {documentation}.", + "local_media_files": "Place your video, audio and image files in the media directory to be able to browse and play them in the browser or on supported media players.", + "documentation": "documentation", + "no_local_media_found": "No local media found", + "no_media_folder": "It looks like you have not yet created a media directory.", + "setup_local_help": "Check the {documentation} on how to setup local media.", "class": { "album": "Album", "app": "App", @@ -2149,7 +2156,7 @@ "save": "Save", "unsaved_changes": "Unsaved changes", "saved": "Saved", - "confirm_remove_config_title": "Are you sure you want to remove your Lovelace UI configuration? We will automatically generate your Lovelace UI views with your areas and devices.", + "confirm_remove_config_title": "Are you sure you want to remove your Lovelace UI configuration?", "confirm_remove_config_text": "We will automatically generate your Lovelace UI views with your areas and devices if you remove your Lovelace UI configuration.", "confirm_unsaved_changes": "You have unsaved changes, are you sure you want to exit?", "confirm_unsaved_comments": "Your configuration contains comment(s), these will not be saved. Do you want to continue?", diff --git a/src/util/documentation-url.ts b/src/util/documentation-url.ts new file mode 100644 index 0000000000..3ad016be72 --- /dev/null +++ b/src/util/documentation-url.ts @@ -0,0 +1,11 @@ +import { HomeAssistant } from "../types"; + +export const documentationUrl = (hass: HomeAssistant, path: string) => { + return `https://${ + hass.config.version.includes("b") + ? "rc" + : hass.config.version.includes("dev") + ? "next" + : "www" + }.home-assistant.io${path}`; +}; diff --git a/test-mocha/util/generate-documentation-url.spec.ts b/test-mocha/util/generate-documentation-url.spec.ts new file mode 100644 index 0000000000..9e34e61448 --- /dev/null +++ b/test-mocha/util/generate-documentation-url.spec.ts @@ -0,0 +1,19 @@ +import * as assert from "assert"; +import { documentationUrl } from "../../src/util/documentation-url"; + +describe("Generate documentation URL", function () { + it("Generate documentation url for stable", function () { + assert.strictEqual( + // @ts-ignore + documentationUrl({ config: { version: "1.0.0" } }, "/blog"), + "https://www.home-assistant.io/blog" + ); + }); + it("Generate documentation url for rc", function () { + assert.strictEqual( + // @ts-ignore + documentationUrl({ config: { version: "1.0.0b0" } }, "/blog"), + "https://rc.home-assistant.io/blog" + ); + }); +}); diff --git a/translations/frontend/bg.json b/translations/frontend/bg.json index f5703b28f4..68302a4647 100644 --- a/translations/frontend/bg.json +++ b/translations/frontend/bg.json @@ -19,6 +19,7 @@ "logbook": "Дневник", "mailbox": "Пощенска кутия", "map": "Карта", + "media_browser": "Медиен браузър", "profile": "Профил", "shopping_list": "Списък за пазаруване", "states": "Състояние" @@ -455,6 +456,7 @@ }, "common": { "cancel": "Отмени", + "continue": "Продължи", "delete": "Изтриване", "loading": "Зареждане", "save": "Запазване", @@ -466,6 +468,10 @@ "device": "Устройство" }, "entity": { + "entity-attribute-picker": { + "attribute": "Атрибут", + "show_attributes": "Показване на атрибутите" + }, "entity-picker": { "entity": "Обект" } @@ -474,6 +480,18 @@ "loading_history": "Зареждане на история за състоянието...", "no_history_found": "Не е намерена история за състоянието" }, + "logbook": { + "entries_not_found": "Липсват логове в дневника" + }, + "media-browser": { + "audio_not_supported": "Браузърът не поддържа този аудио елемент.", + "choose_player": "Изберете плейър", + "media_browsing_error": "Грешка в медийния браузър", + "media_not_supported": "Плейърът на медийния браузър не поддържа този тип медия", + "media_player": "Медиен плейър", + "video_not_supported": "Браузърът не поддържа този видео елемент.", + "web-browser": "Уеб браузър" + }, "relative_time": { "duration": { "day": "{count}{count, plural,\n one {ден}\n other {дни}\n}", @@ -496,6 +514,9 @@ "enable_new_entities_label": "Активирай новодобавените устройства.", "title": "Системни опции за {integration}" }, + "domain_toggler": { + "reset_entities": "Нулиране на обекти" + }, "entity_registry": { "editor": { "delete": "Изтриване", @@ -515,6 +536,9 @@ "yaml_not_editable": "Настройките на този обект не могат да бъдат редактирани. Могат да се конфигурират само обектите, създадени от потребителския интерфейс." }, "more_info_control": { + "controls": "Контроли", + "details": "Детайли", + "history": "История", "script": { "last_action": "Последно задействане" }, @@ -644,7 +668,13 @@ "label": "Извикване на услуга", "service_data": "Данни за услугата" }, + "wait_for_trigger": { + "continue_timeout": "Продължи след изчакване", + "label": "Изчакайте спусък/тригър", + "timeout": "Време на изчакване (опция)" + }, "wait_template": { + "continue_timeout": "Продължи след изчакване", "label": "Изчакване", "timeout": "Изчакване (по избор)", "wait_template": "Шаблон за изчакване" @@ -692,7 +722,9 @@ "time": { "after": "След", "before": "Преди", - "label": "Време" + "label": "Време", + "type_input": "Стойност на помощника за дата/час", + "type_value": "Фиксирано време" }, "zone": { "entity": "Обект с местоположение", @@ -751,6 +783,7 @@ "value_template": "Шаблон за стойност (незадължително)" }, "state": { + "attribute": "Атрибут (опция)", "for": "За период от", "from": "От", "label": "Състояние", @@ -775,7 +808,9 @@ }, "time": { "at": "В", - "label": "Време" + "label": "Време", + "type_input": "Стойност на помощника за дата/час", + "type_value": "Фиксирано време" }, "webhook": { "label": "Webhook", @@ -796,6 +831,8 @@ }, "picker": { "add_automation": "Добавяне на автоматизация", + "duplicate": "Дублиране", + "duplicate_automation": "Дублиране на автоматизация", "header": "Редактор на автоматизации", "headers": { "name": "Име" @@ -815,10 +852,26 @@ "config_documentation": "Документация за конфигурацията" } }, + "alexa": { + "dont_expose_entity": "Не излагай обекта", + "expose_entity": "Изложи обекта", + "exposed": "{избран} изложен", + "follow_domain": "следван домейн", + "manage_domains": "Управление на домейни", + "not_exposed": "{избран} неизложен" + }, "caption": "Home Assistant Cloud", "description_features": "Контролирайте дома си, и когато не сте вкъщи, активирайте интегрирациите с Alexa и Google Assistant.", "description_login": "Влезли сте като {email}", - "description_not_login": "Не сте влезли" + "description_not_login": "Не сте влезли", + "google": { + "dont_expose_entity": "Не излагай обекта", + "expose_entity": "Изложи обекта", + "exposed": "{избран} изложен", + "follow_domain": "следван домейн", + "manage_domains": "Управление на домейни", + "not_exposed": "{избран} неизложен" + } }, "core": { "caption": "Общи", @@ -882,6 +935,7 @@ }, "integrations": { "add_integration": "Добавяне на интеграция", + "attention": "Задълителна проверка", "caption": "Интеграции", "config_entry": { "delete": "Изтриване", @@ -897,6 +951,7 @@ "options": "Настройки", "rename": "Преименуване", "restart_confirm": "Рестартирайте Home Assistant за да завършите премахването на интеграцията", + "services": "{брой} {число, множествено число,\n една {услуга}\n други {услуги}\n}", "system_options": "Системни настройки" }, "config_flow": { @@ -915,6 +970,7 @@ "none": "Нищо не е конфигурирано към момента", "none_found": "Не са намерени интеграции", "none_found_detail": "Коригирайте критериите си за търсене.", + "reconfigure": "Преконфигурирай", "rename_dialog": "Редактирайте името на този запис в конфигурацията" }, "introduction": "Тук е възможно да конфигурирате Вашите компоненти и Home Assistant. Не всичко е възможно да се конфигурира от Интерфейса, но работим по върпоса.", @@ -942,6 +998,23 @@ "mqtt": { "title": "MQTT" }, + "ozw": { + "node": { + "button": "Детайли за възела", + "not_found": "Възел не е намерен" + }, + "nodes_table": { + "failed": "Неуспешно", + "id": "ID", + "manufacturer": "Производител", + "model": "Модел", + "query_stage": "Етап на заявка", + "zwave_plus": "Z-Wave плюс" + }, + "refresh_node": { + "button": "Обнови възела" + } + }, "person": { "caption": "Хора", "description": "Управлявайте хората, които следите от Home Assistant.", @@ -979,8 +1052,13 @@ "group": "Презареждане на гурпите", "heading": "Презареждане на YAML конфигурацията", "introduction": "Някои части от Home Assistant могат да се презаредят без да е необходимо рестартиране. Натискането на Презареди ще отхвърли настоящата конфигурация и ще зареди новата конфигурация.", + "mqtt": "Презареди mqtt обектите", + "reload": "Презарежди {домейн}", + "rpi_gpio": "Презареди GPIO обектите на Raspberry Pi ", "scene": "Презареди сцените", - "script": "Презареждане на скриптовете" + "script": "Презареждане на скриптовете", + "smtp": "Презареди smtp услугите за уведомяване", + "telegram": "Презареди telegram услугите за уведомяване" }, "server_management": { "confirm_restart": "Сигурни ли сте, че искате да рестартирате Home Assistant?", @@ -1005,6 +1083,8 @@ "create": "Създаване", "name": "Име", "password": "Парола", + "password_confirm": "Потвърди парола", + "password_not_match": "Паролите не съвпадат", "username": "Потребителско име" }, "caption": "Потребители", @@ -1017,6 +1097,8 @@ "deactivate_user": "Деактивиране на потребителя", "delete_user": "Изтриване на потребител", "name": "Име", + "new_password": "Нова парола", + "password_changed": "Паролата е променена!", "system_generated_users_not_editable": "Неуспешно обновяване на системно генерираните потребители" }, "picker": { @@ -1102,6 +1184,11 @@ "title": "Състояния" }, "templates": { + "all_listeners": "Този шаблон следи за всички събития на промяна на състояние.", + "domain": "Домейн", + "entity": "Обект", + "listeners": "Този шаблон следи за събития със следните промени на състояния:", + "no_listeners": "Този шаблон не следи за събития на промяна на състояние и не се актуализира автоматично.", "title": "Шаблон" } } @@ -1144,6 +1231,9 @@ "entities": { "toggle": "Превключване на обекти." }, + "generic": { + "state_color": "Да се оцветят ли иконите спрямо състоянието?" + }, "iframe": { "name": "Уеб страница" }, @@ -1155,6 +1245,10 @@ } }, "cardpicker": { + "by_card": "По карта", + "by_entity": "По обект", + "domain": "Домейн", + "entity": "Обект", "no_description": "Няма налично описание." }, "edit_card": { @@ -1166,6 +1260,7 @@ "move": "Преместване", "options": "Още опции", "pick_card": "Изберете картата, която искате да добавите.", + "search_cards": "Търсене на карти", "toggle_editor": "Превключете редактора" }, "edit_lovelace": { @@ -1419,6 +1514,11 @@ "submit": "Промяна" }, "current_user": "В момента сте влезли като {fullName}.", + "customize_sidebar": { + "button": "Редактиране", + "description": "Може също да се задържи водача на страничната лента, за да се активира режим за редактиране.", + "header": "Промяна на реда и скриване на елементи от страничната лента" + }, "dashboard": { "dropdown_label": "Табло", "header": "Табло" @@ -1438,6 +1538,7 @@ "confirm_delete": "Сигурни ли сте, че искате да изтриете кода за достъп за {name}?", "create": "Създай код", "create_failed": "Възникна грешка при създаването на код за достъп.", + "created": "Създаване {дата}", "created_at": "Създаден на {date}", "delete_failed": "Възникна грешка при изтриването на кода за достъп.", "description": "Създайте дългосрочни кодове за достъп за да могат скриптовете Ви да взаимодействат с Home Assistant. Всеки код е валиден за 10 години от създаването си. Следните дългосрочни кодове са активни в момента.", @@ -1445,6 +1546,7 @@ "header": "Дългосрочни кодове за достъп", "last_used": "Последно използван на {date} от {location}", "learn_auth_requests": "Научете се как да правите оторизирани заявки.", + "name": "Име", "not_used": "Никога не е бил използван", "prompt_copy_token": "Копирайте кода си за достъп. Той няма да бъде показан отново.", "prompt_name": "Име?" @@ -1495,6 +1597,7 @@ } }, "sidebar": { + "done": "Готово", "external_app_configuration": "Конфигурация на приложение" } } diff --git a/translations/frontend/ca.json b/translations/frontend/ca.json index 54945cf396..15df5c0e86 100644 --- a/translations/frontend/ca.json +++ b/translations/frontend/ca.json @@ -507,6 +507,7 @@ "cancel": "Cancel·la", "close": "Tanca", "continue": "Continua", + "copied": "Copiat", "delete": "Elimina", "error_required": "Obligatori", "loading": "Carregant", @@ -574,6 +575,28 @@ "audio_not_supported": "El teu navegador no és compatible amb l'element d'àudio.", "choose_player": "Tria el reproductor", "choose-source": "Tria la font", + "class": { + "album": "Àlbum", + "app": "Aplicació", + "artist": "Artista", + "channel": "Canal", + "composer": "Compositor", + "contributing_artist": "Artista col·laborador", + "directory": "Biblioteca", + "episode": "Episodi", + "game": "Joc", + "genre": "Gènere", + "image": "Imatge", + "movie": "Pel·lícula", + "music": "Música", + "playlist": "Llista de reproducció", + "podcast": "Podcast", + "season": "Temporada", + "track": "Pista", + "tv_show": "Programa de TV", + "url": "URL", + "video": "Vídeo" + }, "content-type": { "album": "Àlbum", "artist": "Artista", @@ -1943,7 +1966,7 @@ }, "introduction": "L'editor de scripts et permet crear i editar scripts. Vés a l'enllaç de sota per veure'n les instruccions i assegurar-te que has configurat Home Assistant correctament.", "learn_more": "Més informació sobre els scripts", - "no_scripts": "No hem trobat cap script editable", + "no_scripts": "No s'ha pogut trobar cap script editable", "show_info": "Mostra informació sobre l'script", "trigger_script": "Dispara l'script" } @@ -2352,9 +2375,14 @@ "title": "Estats" }, "templates": { + "all_listeners": "Aquesta plantilla escolta a tots els esdeveniments de canvi d'estat.", "description": "Les plantilles es renderitzen mitjançant el motor Jinja2 amb algunes extensions específiques de Home Assistant.", + "domain": "Domini", "editor": "Editor de plantilles", + "entity": "Entitat", "jinja_documentation": "Documentació sobre plantilles amb Jinja2", + "listeners": "Aquesta plantilla escolta als següents esdeveniments de canvi d'estat:", + "no_listeners": "Aquesta plantilla no escolta cap esdeveniment de canvi d'estat i no s'actualitza automàticament.", "reset": "Restableix a la plantilla de demostració", "template_extensions": "Extensions de plantilla de Home Assistant", "title": "Plantilla", @@ -2501,7 +2529,7 @@ "no_theme": "Sense tema", "refresh_interval": "Interval d'actualització", "search": "Cerca", - "secondary_info_attribute": "Atribut d’informació secundària", + "secondary_info_attribute": "Atribut d'informació secundària", "show_icon": "Mostra icona?", "show_name": "Mostra nom?", "show_state": "Mostra estat?", @@ -2941,6 +2969,11 @@ "submit": "Envia" }, "current_user": "Has iniciat la sessió com a {fullName}.", + "customize_sidebar": { + "button": "Edita", + "description": "També pots mantenir premuda la capçalera de la barra lateral per activar el mode d'edició.", + "header": "Canvia l'ordre i/o amaga elements de la barra lateral" + }, "dashboard": { "description": "Tria un panell per defecte per a aquest dispositiu.", "dropdown_label": "Panell", @@ -3038,6 +3071,7 @@ } }, "sidebar": { + "done": "Fet", "external_app_configuration": "Configuració de l'aplicació", "sidebar_toggle": "Commutació de la barra lateral" } diff --git a/translations/frontend/cs.json b/translations/frontend/cs.json index 8107413439..5675a163a4 100644 --- a/translations/frontend/cs.json +++ b/translations/frontend/cs.json @@ -507,6 +507,7 @@ "cancel": "Zrušit", "close": "Zavřít", "continue": "Pokračovat", + "copied": "Zkopírováno", "delete": "Smazat", "error_required": "Povinné", "loading": "Načítání", @@ -574,6 +575,28 @@ "audio_not_supported": "Váš prohlížeč nepodporuje element \"audio\".", "choose_player": "Vyberte přehrávač", "choose-source": "Zvolte zdroj", + "class": { + "album": "Album", + "app": "Aplikace", + "artist": "Umělec", + "channel": "Kanál", + "composer": "Skladatel", + "contributing_artist": "Přispívající umělec", + "directory": "Knihovna", + "episode": "Epizoda", + "game": "Hra", + "genre": "Žánr", + "image": "Obrázek", + "movie": "Film", + "music": "Hudba", + "playlist": "Seznam skladeb", + "podcast": "Podcast", + "season": "Sezóna", + "track": "Stopa", + "tv_show": "Televizní pořad", + "url": "Url adresa", + "video": "Video" + }, "content-type": { "album": "Album", "artist": "Umělec", @@ -2352,9 +2375,14 @@ "title": "Stavy" }, "templates": { + "all_listeners": "Tato šablona naslouchá všem změnám stavu.", "description": "Šablony jsou vykreslovány pomocí Jinja2 šablonového enginu s některými specifickými rozšířeními pro Home Assistant.", + "domain": "Doména", "editor": "Editor šablon", + "entity": "Entita", "jinja_documentation": "Dokumentace šablony Jinja2", + "listeners": "Tato šablona naslouchá následujícím změnám stavu:", + "no_listeners": "Tato šablona neposlouchá žádné změny stavu a nebude se automaticky aktualizovat.", "reset": "Obnovit ukázkovou šablonu", "template_extensions": "Rozšíření šablony Home Assistant", "title": "Šablony", @@ -2941,6 +2969,11 @@ "submit": "Odeslat" }, "current_user": "Nyní jste přihlášeni jako {fullName}.", + "customize_sidebar": { + "button": "Upravit", + "description": "Režim úprav můžete aktivovat také stisknutím a podržením záhlaví postranního panelu.", + "header": "Změna pořadí a skrytí položek postranního panelu" + }, "dashboard": { "description": "Vyberte výchozí dashboard pro toto zařízení.", "dropdown_label": "Dashboard", @@ -3038,6 +3071,7 @@ } }, "sidebar": { + "done": "Hotovo", "external_app_configuration": "Konfigurace aplikace", "sidebar_toggle": "Přepínač postranního panelu" } diff --git a/translations/frontend/de.json b/translations/frontend/de.json index 4628cab1cc..be5fda9173 100644 --- a/translations/frontend/de.json +++ b/translations/frontend/de.json @@ -419,6 +419,7 @@ "unlock": "Entriegeln" }, "media_player": { + "media_next_track": "Weiter", "media_play": "Abspielen", "sound_mode": "Sound-Modus", "source": "Quelle", @@ -501,6 +502,8 @@ "back": "Zurück", "cancel": "Abbrechen", "close": "Schließen", + "continue": "Weiter", + "copied": "Kopiert", "delete": "Löschen", "error_required": "Benötigt", "loading": "Laden", @@ -557,8 +560,24 @@ "loading_history": "Lade Zustandsverlauf...", "no_history_found": "Kein Zustandsverlauf gefunden." }, + "logbook": { + "entries_not_found": "Keine Logbucheinträge gefunden." + }, "media-browser": { + "audio_not_supported": "Ihr Browser unterstützt das Audioelement nicht.", "choose-source": "Quelle wählen", + "class": { + "album": "Album", + "app": "App", + "directory": "Bibliothek", + "episode": "Episode", + "game": "Spiel", + "movie": "Film", + "music": "Musik", + "season": "Episode", + "url": "URL", + "video": "Video" + }, "content-type": { "album": "Album", "artist": "Künstler", @@ -566,7 +585,13 @@ "playlist": "Playlist", "server": "Server" }, - "play": "Abspielen" + "no_items": "Keine Einträge", + "play": "Abspielen", + "video_not_supported": "Ihr Browser unterstützt das Videoelement nicht." + }, + "picture-upload": { + "label": "Bild", + "unsupported_format": "Nicht unterstütztes Format, bitte wähle ein JPEG-, PNG- oder GIF-Bild." }, "related-items": { "area": "Bereich", @@ -672,8 +697,10 @@ "yaml_not_editable": "Die Einstellungen dieser Entität können nicht über die Benutzeroberfläche bearbeitet werden. Nur über die Benutzeroberfläche eingerichtete Entitäten können über die Benutzeroberfläche konfiguriert werden." }, "more_info_control": { + "details": "Details", "dismiss": "Dialog ausblenden", "edit": "Entität bearbeiten", + "history": "Verlauf", "person": { "create_zone": "Zone vom aktuellen Standort erstellen" }, @@ -849,7 +876,13 @@ "type_select": "Aktionstyp", "type": { "choose": { - "label": "Auswählen" + "add_option": "Option hinzufügen", + "conditions": "Bedingungen", + "default": "Standard-Aktionen", + "label": "Auswählen", + "option": "Option {number}", + "remove_option": "Option entfernen", + "sequence": "Aktionen" }, "condition": { "label": "Bedingung" @@ -872,6 +905,7 @@ }, "repeat": { "label": "Wiederholen", + "sequence": "Aktionen", "type_select": "Wiederholungstyp", "type": { "count": { @@ -1044,6 +1078,7 @@ "value_template": "Wert-Template (optional)" }, "state": { + "attribute": "Attribut (Optional)", "for": "Für", "from": "Von", "label": "Zustand", @@ -1068,7 +1103,8 @@ }, "time": { "at": "Um", - "label": "Zeit" + "label": "Zeit", + "type_value": "Feste Zeit" }, "webhook": { "label": "Webhook", @@ -1091,6 +1127,8 @@ "add_automation": "Automatisierung hinzufügen", "delete_automation": "Automatisierung löschen", "delete_confirm": "Bist du sicher, dass du diese Automatisierung löschen möchtest?", + "duplicate": "Duplizieren", + "duplicate_automation": "Automatisierung kopieren", "edit_automation": "Automatisierung bearbeiten", "header": "Automatisierungseditor", "headers": { @@ -1314,6 +1352,7 @@ } }, "devices": { + "add_prompt": "Mit diesem Gerät wurden noch keine {name} hinzugefügt. Du kannst eins hinzufügen, indem du auf den + Knopf drückst.", "automation": { "actions": { "caption": "Wenn etwas ausgelöst wird ..." @@ -1477,6 +1516,7 @@ }, "integrations": { "add_integration": "Integration hinzufügen", + "attention": "Aufmerksamkeit erforderlich", "caption": "Integrationen", "config_entry": { "area": "In {area}", @@ -1495,6 +1535,8 @@ "no_device": "Entitäten ohne Geräte", "no_devices": "Diese Integration hat keine Geräte.", "options": "Optionen", + "reload": "Neu laden", + "reload_confirm": "Die Integration wurde neu geladen", "rename": "Umbenennen", "restart_confirm": "Starte Home Assistant neu, um das Entfernen dieser Integration abzuschließen", "settings_button": "Einstellungen für {integration} bearbeiten", @@ -1543,6 +1585,7 @@ "none_found_detail": "Passe deine Suchkriterien an.", "note_about_integrations": "Nicht alle Integrationen können über die Benutzeroberfläche konfiguriert werden.", "note_about_website_reference": "Weitere Informationen findest du auf der ", + "reconfigure": "Neu konfigurieren", "rename_dialog": "Bearbeite den Namen dieses Konfigurationseintrags", "rename_input_label": "Eintragsname", "search": "Such-Integrationen" @@ -1653,8 +1696,11 @@ "topic": "Topic" }, "ozw": { + "button": "Konfigurieren", "common": { - "instance": "Instanz" + "instance": "Instanz", + "network": "Netzwerk", + "zwave": "Z-Wave" }, "device_info": { "zwave_info": "Z-Wave Infos" @@ -1664,12 +1710,27 @@ "select_instance": "Instanz auswählen" }, "network_status": { + "details": { + "driverremoved": "Der Treiber wurde entfernt", + "driverreset": "Der Treiber wurde zurückgesetzt", + "ready": "Bereit zum Verbinden", + "started": "Verbindung mit MQTT hergestellt", + "starting": "Verbinde zu MQTT" + }, "offline": "Offline", "online": "Online", + "starting": "Startet", "unknown": "Unbekannt" }, "network": { "header": "Netzwerkverwaltung" + }, + "nodes_table": { + "failed": "Fehlgeschlagen", + "manufacturer": "Hersteller" + }, + "refresh_node": { + "start_refresh_button": "Aktualisierung starten" } }, "person": { @@ -1798,6 +1859,7 @@ "core": "Ort & Anpassungen neu laden", "group": "Gruppen neu laden", "heading": "Neuladen der YAML-Konfiguration", + "homekit": "HomeKit neu laden", "input_boolean": "Eingabe-Booleans neu laden", "input_datetime": "Eingabe-Datums- und Zeitfelder neu laden", "input_number": "Eingabenummern neu laden", @@ -1807,6 +1869,7 @@ "person": "Personen neu laden", "scene": "Szenen neu laden", "script": "Skripte neu laden", + "telegram": "Telegram-Benachrichtigungsdienste neu laden", "zone": "Zonen neu laden" }, "server_management": { @@ -1828,12 +1891,18 @@ }, "tags": { "detail": { - "name": "Name" + "delete": "Löschen", + "description": "Beschreibung", + "name": "Name", + "update": "Aktualisieren" }, + "edit": "Bearbeiten", "headers": { + "last_scanned": "Zuletzt gescannt", "name": "Name" }, - "never_scanned": "Nie gescannt" + "never_scanned": "Nie gescannt", + "write": "Schreiben" }, "users": { "add_user": { @@ -1841,6 +1910,7 @@ "create": "Benutzerkonto anlegen", "name": "Name", "password": "Passwort", + "password_confirm": "Passwort bestätigen", "username": "Benutzername" }, "caption": "Benutzer", @@ -1857,7 +1927,9 @@ "group": "Gruppe", "id": "ID", "name": "Name", + "new_password": "Neues Passwort", "owner": "Besitzer", + "password_changed": "Das Passwort wurde geändert!", "system_generated": "System generiert", "system_generated_users_not_editable": "Systemgenerierte Benutzer können nicht aktualisiert werden.", "system_generated_users_not_removable": "Vom System generierte Benutzer können nicht entfernt werden.", @@ -2728,6 +2800,9 @@ "submit": "Absenden" }, "current_user": "Sie sind derzeit als {fullName} angemeldet.", + "customize_sidebar": { + "button": "Bearbeiten" + }, "dashboard": { "description": "Wähle ein Standard-Dashboard für dieses Gerät.", "dropdown_label": "Dashboard", @@ -2750,6 +2825,7 @@ "confirm_delete": "Möchten Sie den Zugriffs-Token für {name} wirklich löschen?", "create": "Token erstellen", "create_failed": "Das Zugriffs-Token konnte nicht erstellt werden.", + "created": "Erstellt am {date}", "created_at": "Erstellt am {date}", "delete_failed": "Fehler beim Löschen des Zugriffs-Tokens.", "description": "Erstelle langlebige Zugriffstoken, damit deine Skripte mit deiner Home Assistant-Instanz interagieren können. Jedes Token ist ab der Erstellung für 10 Jahre gültig. Die folgenden langlebigen Zugriffstoken sind derzeit aktiv.", @@ -2757,6 +2833,7 @@ "header": "Langlebige Zugangs-Token", "last_used": "Zuletzt verwendet am {date} in {location}", "learn_auth_requests": "Erfahre, wie du authentifizierte Anfragen stellen kannst.", + "name": "Name", "not_used": "Wurde noch nie benutzt", "prompt_copy_token": "Kopiere deinen Zugangs-Token. Er wird nicht wieder angezeigt werden.", "prompt_name": "Name?" @@ -2808,7 +2885,8 @@ "error_no_theme": "Keine Themen verfügbar.", "header": "Thema", "link_promo": "Erfahre mehr über Themen", - "primary_color": "Primärfarbe" + "primary_color": "Primärfarbe", + "reset": "zurücksetzen" }, "vibrate": { "description": "Aktiviere oder deaktiviere die Vibration an diesem Gerät, wenn du Geräte steuerst.", @@ -2822,6 +2900,7 @@ } }, "sidebar": { + "done": "fertig", "external_app_configuration": "App-Konfiguration", "sidebar_toggle": "Seitenleiste umschalten" } diff --git a/translations/frontend/en.json b/translations/frontend/en.json index fcc53ba406..6d3537f927 100644 --- a/translations/frontend/en.json +++ b/translations/frontend/en.json @@ -507,6 +507,7 @@ "cancel": "Cancel", "close": "Close", "continue": "Continue", + "copied": "Copied", "delete": "Delete", "error_required": "Required", "loading": "Loading", @@ -574,6 +575,28 @@ "audio_not_supported": "Your browser does not support the audio element.", "choose_player": "Choose Player", "choose-source": "Choose Source", + "class": { + "album": "Album", + "app": "App", + "artist": "Artist", + "channel": "Channel", + "composer": "Composer", + "contributing_artist": "Contributing Artist", + "directory": "Library", + "episode": "Episode", + "game": "Game", + "genre": "Genre", + "image": "Image", + "movie": "Movie", + "music": "Music", + "playlist": "Playlist", + "podcast": "Podcast", + "season": "Season", + "track": "Track", + "tv_show": "TV Show", + "url": "Url", + "video": "Video" + }, "content-type": { "album": "Album", "artist": "Artist", @@ -2669,7 +2692,7 @@ }, "raw_editor": { "confirm_remove_config_text": "We will automatically generate your Lovelace UI views with your areas and devices if you remove your Lovelace UI configuration.", - "confirm_remove_config_title": "Are you sure you want to remove your Lovelace UI configuration? We will automatically generate your Lovelace UI views with your areas and devices.", + "confirm_remove_config_title": "Are you sure you want to remove your Lovelace UI configuration?", "confirm_unsaved_changes": "You have unsaved changes, are you sure you want to exit?", "confirm_unsaved_comments": "Your configuration contains comment(s), these will not be saved. Do you want to continue?", "error_invalid_config": "Your configuration is not valid: {error}", diff --git a/translations/frontend/es-419.json b/translations/frontend/es-419.json index ced016f2a1..9f6f2ba0a4 100644 --- a/translations/frontend/es-419.json +++ b/translations/frontend/es-419.json @@ -19,6 +19,7 @@ "logbook": "", "mailbox": "", "map": "", + "media_browser": "Navegador de medios", "profile": "Perfil", "shopping_list": "Lista de compras", "states": "" @@ -106,7 +107,7 @@ }, "automation": { "off": "Desactivado", - "on": "Encendido" + "on": "Activada" }, "binary_sensor": { "battery": { @@ -205,7 +206,7 @@ "fan_only": "Sólo ventilador", "heat": "Calentar", "heat_cool": "Calentar/Enfriar", - "off": "Desactivar" + "off": "Apagado" }, "configurator": { "configure": "Configurar", @@ -237,7 +238,7 @@ "home": "En Casa", "locked": "Cerrado", "not_home": "Fuera de Casa", - "off": "Desactivado", + "off": "Apagado", "ok": "OK", "on": "Encendido", "open": "Abierto", @@ -419,9 +420,16 @@ "unlock": "Desbloquear" }, "media_player": { + "browse_media": "Explorar medios", + "media_next_track": "Siguiente", + "media_play": "Reproducir", + "media_play_pause": "Reproducir/pausa", + "media_previous_track": "Anterior", "sound_mode": "Modo de sonido", "source": "Fuente", - "text_to_speak": "Texto a hablar" + "text_to_speak": "Texto a hablar", + "turn_off": "Apagar", + "turn_on": "Encender" }, "persistent_notification": { "dismiss": "Descartar" @@ -498,6 +506,7 @@ "back": "Atrás", "cancel": "Cancelar", "close": "Cerrar", + "continue": "Continuar", "delete": "Eliminar", "error_required": "Requerido", "loading": "Cargando", @@ -544,6 +553,10 @@ "toggle": "Alternar" }, "entity": { + "entity-attribute-picker": { + "attribute": "Atributo", + "show_attributes": "Mostrar atributos" + }, "entity-picker": { "clear": "Limpiar", "entity": "Entidad", @@ -554,6 +567,58 @@ "loading_history": "Cargando historial de estado...", "no_history_found": "No se encontró historial de estado." }, + "logbook": { + "entries_not_found": "No se encontraron entradas en el libro de registro." + }, + "media-browser": { + "audio_not_supported": "Su navegador no soporta el elemento de audio.", + "choose_player": "Elige el reproductor", + "choose-source": "Elige la fuente", + "class": { + "album": "Álbum", + "app": "Aplicación", + "artist": "Artista", + "channel": "Canal", + "composer": "Compositor", + "contributing_artist": "Artista colaborador", + "directory": "Biblioteca", + "episode": "Episodio", + "game": "Juego", + "genre": "Género", + "image": "Imagen", + "movie": "Película", + "music": "Música", + "playlist": "Lista de reproducción", + "podcast": "Podcast", + "season": "Temporada", + "track": "Pista", + "tv_show": "Programa de TV", + "url": "URL", + "video": "Video" + }, + "content-type": { + "album": "Álbum", + "artist": "Artista", + "library": "Biblioteca", + "playlist": "Lista de reproducción", + "server": "Servidor" + }, + "media_browsing_error": "Error de navegación de medios", + "media_not_supported": "El Reproductor multimedia no es compatible con este tipo de medios", + "media_player": "Reproductor multimedia", + "media-player-browser": "Navegador del reproductor multimedia", + "no_items": "No hay elementos", + "pick": "Elegir", + "pick-media": "Elija medios", + "play": "Reproducir", + "play-media": "Reproducir medios", + "video_not_supported": "Su navegador no soporta el elemento de vídeo.", + "web-browser": "Navegador web" + }, + "picture-upload": { + "label": "Imagen", + "unsupported_format": "Formato no admitido, elija una imagen JPEG, PNG o GIF." + }, "related-items": { "area": "Área", "automation": "Parte de las siguientes automatizaciones", @@ -574,6 +639,7 @@ "week": "{count} {count, plural,\n one {semana}\n other {semanas}\n}" }, "future": "en {time}", + "just_now": "Ahora mismo", "never": "Nunca", "past": "Hace {time}" }, @@ -652,13 +718,19 @@ "pattern": "Patrón de expresiones regulares para la validación del lado del cliente", "text": "Texto" }, - "platform_not_loaded": "La integración {platform} no está cargada. Agregue su configuración agregando 'default_config:' o ''{platform}:''.", + "platform_not_loaded": "La integración {platform} no está cargada. Añádela a su archivo de configuración agregando 'default_config:' o ''{platform}:''.", "required_error_msg": "Este campo es requerido", "yaml_not_editable": "La configuración de esta entidad no se puede editar desde la interfaz de usuario. Solo las entidades configuradas desde la interfaz de usuario se pueden configurar desde la interfaz de usuario." }, + "image_cropper": { + "crop": "Cortar" + }, "more_info_control": { + "controls": "Controles", + "details": "Detalles", "dismiss": "Descartar diálogo", "edit": "Editar entidad", + "history": "Historial", "person": { "create_zone": "Crear zona desde ubicación actual" }, @@ -724,11 +796,11 @@ }, "zha_device_info": { "buttons": { - "add": "Agregar dispositivos", + "add": "Agregar dispositivos usando este dispositivo", "clusters": "Administrar clústeres", "reconfigure": "Reconfigurar dispositivo", "remove": "Eliminar dispositivo", - "zigbee_information": "Información de Zigbee" + "zigbee_information": "Firma del dispositivo Zigbee" }, "confirmations": { "remove": "¿Está seguro de que desea eliminar el dispositivo?" @@ -748,7 +820,7 @@ "unknown": "Desconocido", "zha_device_card": { "area_picker_label": "Área", - "device_name_placeholder": "Nombre de usuario", + "device_name_placeholder": "Cambiar el nombre del dispositivo", "update_name_button": "Actualizar Nombre" } } @@ -798,7 +870,7 @@ "confirmation_text": "Todos los dispositivos en esta área quedarán sin asignar.", "confirmation_title": "¿Está seguro de que desea eliminar esta área?" }, - "description": "Visión general de todas las áreas de su casa.", + "description": "Gestione las áreas de su casa.", "editor": { "area_id": "Identificador del área", "create": "Crear", @@ -859,13 +931,19 @@ "label": "Llamar servico", "service_data": "Datos" }, + "wait_for_trigger": { + "continue_timeout": "Continuar cuando el tiempo venza", + "label": "Esperar por un desencadenador", + "timeout": "Tiempo limite (opcional)" + }, "wait_template": { + "continue_timeout": "Continuar cuando el tiempo venza", "label": "Esperar", "timeout": "Tiempo de espera (opcional)", "wait_template": "Plantilla de espera" } }, - "unsupported_action": "Acción no soportada: {action}" + "unsupported_action": "No hay soporte en la interfaz de usuario para la acción: {action}" }, "alias": "Nombre", "conditions": { @@ -923,7 +1001,9 @@ "time": { "after": "Después de", "before": "Antes de", - "label": "Hora" + "label": "Hora", + "type_input": "Valor de un auxiliar de tipo fecha/tiempo", + "type_value": "Tiempo corregido" }, "zone": { "entity": "Entidad con ubicación", @@ -931,7 +1011,7 @@ "zone": "Zona" } }, - "unsupported_condition": "Condición no soportada: {condition}" + "unsupported_condition": "No hay soporte en la interfaz de usuario para la condición: {condition}" }, "default_name": "Nueva Automatización", "description": { @@ -1000,7 +1080,7 @@ "start": "Inicio" }, "mqtt": { - "label": "", + "label": "MQTT", "payload": "Payload (opcional)", "topic": "Topic" }, @@ -1011,6 +1091,7 @@ "value_template": "Plantilla de valor (opcional)" }, "state": { + "attribute": "Atributo (opcional)", "for": "Por", "from": "De", "label": "Estado", @@ -1023,6 +1104,9 @@ "sunrise": "Salida del sol", "sunset": "Puesta de sol" }, + "tag": { + "label": "Etiqueta" + }, "template": { "label": "Plantilla", "value_template": "Plantilla de valor" @@ -1034,8 +1118,10 @@ "seconds": "Segundos" }, "time": { - "at": "A", - "label": "Hora" + "at": "A las", + "label": "Hora", + "type_input": "Valor de un auxiliar de tipo fecha/tiempo", + "type_value": "Tiempo corregido" }, "webhook": { "label": "Webhook", @@ -1050,7 +1136,7 @@ "zone": "Zona" } }, - "unsupported_platform": "Plataforma no soportada: {platform}" + "unsupported_platform": "No hay soporte en la interfaz de usuario para la plataforma: {platform}" }, "unsaved_confirm": "Tiene cambios sin guardar. ¿Estás seguro que quieres salir?" }, @@ -1058,6 +1144,8 @@ "add_automation": "Agregar automatización", "delete_automation": "Eliminar automatización", "delete_confirm": "¿Está seguro de que desea eliminar esta automatización?", + "duplicate": "Duplicar", + "duplicate_automation": "Duplicar automatización", "edit_automation": "Editar automatización", "header": "Editor de automatizaciones", "headers": { @@ -1139,8 +1227,13 @@ }, "alexa": { "banner": "La edición de las entidades expuestas a través de esta interfaz de usuario está deshabilitada porque ha configurado filtros de entidad en configuration.yaml.", + "dont_expose_entity": "No exponer la entidad", "expose": "Exponer a Alexa", + "expose_entity": "Exponer la entidad", + "exposed": "{selected} expuesto", "exposed_entities": "Entidades expuestas", + "follow_domain": "Seguir dominio", + "not_exposed": "{selected} no expuesto", "not_exposed_entities": "Entidades no expuestas", "title": "Alexa" }, @@ -1178,8 +1271,14 @@ "google": { "banner": "La edición de las entidades expuestas a través de esta interfaz de usuario está deshabilitada porque ha configurado filtros de entidad en configuration.yaml.", "disable_2FA": "Deshabilitar la autenticación de dos factores", + "dont_expose_entity": "No exponer la entidad", "expose": "Exponer al Asistente de Google", + "expose_entity": "Exponer la entidad", + "exposed": "{selected} expuesto", "exposed_entities": "Entidades expuestas", + "follow_domain": "Seguir dominio", + "manage_domains": "Gestionar dominios", + "not_exposed": "{selected} no expuesto", "not_exposed_entities": "Entidades no expuestas", "sync_to_google": "Sincronizar los cambios con Google.", "title": "Asistente de Google" @@ -1281,6 +1380,7 @@ } }, "devices": { + "add_prompt": "Aún no se ha agregado ningún {name} con este dispositivo. Puede agregar uno haciendo clic en el botón + de arriba.", "automation": { "actions": { "caption": "Cuando algo se desencadena..." @@ -1300,6 +1400,7 @@ "caption": "Dispositivos", "confirm_delete": "¿Está seguro de que desea eliminar este dispositivo?", "confirm_rename_entity_ids": "¿También desea cambiar el nombre de la identificación de la entidad de sus entidades?", + "confirm_rename_entity_ids_warning": "Esto no cambiará ninguna configuración (como automatizaciones, scripts, escenas, Lovelace) que esté usando actualmente estas entidades, tendrás que actualizarlas tú mismo.", "data_table": { "area": "Área", "battery": "Batería", @@ -1341,7 +1442,7 @@ }, "entities": { "caption": "Entidades", - "description": "Visión general de todas las entidades conocidas.", + "description": "Gestione todas las entidades conocidas.", "picker": { "disable_selected": { "button": "Deshabilitar selección", @@ -1393,7 +1494,7 @@ "header": "Configurar Home Assistant", "helpers": { "caption": "Auxiliares", - "description": "Elementos que pueden ayudar a construir automatizaciones.", + "description": "Gestionar elementos ayudan a construir automatizaciones", "dialog": { "add_helper": "Agregar auxiliar", "add_platform": "Añadir {platform}", @@ -1444,6 +1545,7 @@ }, "integrations": { "add_integration": "Agregar integración", + "attention": "Atención requerida", "caption": "Integraciones", "config_entry": { "area": "En {area}", @@ -1464,6 +1566,7 @@ "options": "Opciones", "rename": "Renombrar", "restart_confirm": "Reinicie Home Assistant para terminar de eliminar esta integración.", + "services": "{count} {count, plural,\n one {service}\n other {services}\n}", "settings_button": "Editar configuración para {integration}", "system_options": "Opciones de Sistema", "system_options_button": "Opciones del sistema para {integration}", @@ -1486,7 +1589,7 @@ }, "configure": "Configurar", "configured": "Configurado", - "description": "Administrar y configurar integraciones", + "description": "Gestione las integraciones", "details": "Detalles de integración", "discovered": "Descubierto", "home_assistant_website": "Sitio web de Home Assistant", @@ -1510,6 +1613,7 @@ "none_found_detail": "Ajuste sus criterios de búsqueda", "note_about_integrations": "No todas las integraciones se pueden configurar a través de la interfaz de usuario.", "note_about_website_reference": "Hay más disponibles en ", + "reconfigure": "Reconfigurar", "rename_dialog": "Editar el nombre de esta entrada de configuración", "rename_input_label": "Ingresar Nombre", "search": "Buscar integraciones" @@ -1619,13 +1723,84 @@ "title": "", "topic": "tema" }, + "ozw": { + "button": "Configurar", + "common": { + "controller": "Controlador", + "instance": "Instancia", + "network": "Red" + }, + "navigation": { + "network": "Red", + "nodes": "Nodos", + "select_instance": "Seleccione la instancia" + }, + "network_status": { + "details": { + "driverallnodesqueried": "Todos los nodos han sido consultados", + "driverallnodesqueriedsomedead": "Todos los nodos han sido consultados. Algunos nodos fueron encontrados inactivos.", + "driverawakenodesqueries": "Se han consultado todos los nodos activos", + "driverfailed": "No se pudo conectar al controlador Z-Wave", + "driverready": "Iniciando el controlador de Z-Wave", + "driverremoved": "El controlador ha sido eliminado", + "driverreset": "El controlador se ha reiniciado", + "offline": "OZWDaemon fuera de línea", + "ready": "Listo para conectar", + "started": "Conectado a MQTT", + "starting": "Conectando con MQTT", + "stopped": "OpenZWave se detuvo" + }, + "offline": "Fuera de línea", + "online": "En línea", + "starting": "Comenzando", + "unknown": "Desconocido" + }, + "network": { + "header": "Gestión de red", + "introduction": "Gestione las funciones de toda la red." + }, + "node_query_stages": { + "complete": "El proceso de consulta está completo", + "configuration": "Obteniendo los valores de configuración del nodo", + "dynamic": "Obteniendo los valores que cambian con frecuencia del nodo" + }, + "node": { + "button": "Detalles del nodo", + "not_found": "Nodo no encontrado" + }, + "nodes_table": { + "failed": "Fallido", + "id": "ID", + "manufacturer": "Fabricante", + "model": "Modelo", + "query_stage": "Etapa de consulta", + "zwave_plus": "Z-Wave Plus" + }, + "refresh_node": { + "battery_note": "Si el nodo funciona con batería, asegúrese de activarlo antes de continuar.", + "button": "Actualizar nodo", + "complete": "Actualización de nodo completa", + "description": "Esto le indicará a OpenZWave que vuelva a consultar un nodo y actualice las clases de comando, las capacidades y los valores del nodo.", + "node_status": "Estado del nodo", + "refreshing_description": "Actualizando la información del nodo ...", + "start_refresh_button": "Iniciar actualización", + "step": "Paso", + "title": "Actualizar la información del nodos", + "wakeup_header": "Instrucciones de activación para", + "wakeup_instructions_source": "Las instrucciones de activación se obtienen de la base de datos de dispositivos de la comunidad OpenZWave." + }, + "select_instance": { + "header": "Seleccione una instancia OpenZWave", + "introduction": "Tiene más de una instancia de OpenZWave en ejecución. ¿Qué instancia te gustaría gestionar?" + } + }, "person": { "add_person": "Agregar persona", "caption": "Personas", "confirm_delete": "¿Está seguro de que desea eliminar a esta persona?", "confirm_delete2": "Todos los dispositivos que pertenecen a esta persona quedarán sin asignar.", "create_person": "Crear persona", - "description": "Gestiona las personas que rastrea Home Assistant.", + "description": "Gestione las personas que rastrea Home Assistant.", "detail": { "create": "Crear", "delete": "Eliminar", @@ -1648,7 +1823,7 @@ "scene": { "activated": "Escena activada {name}.", "caption": "Escenas", - "description": "Crear y editar escenas", + "description": "Gestionar escenas", "editor": { "default_name": "Nueva escena", "devices": { @@ -1743,7 +1918,7 @@ "reloading": { "automation": "Recargar automatizaciones", "core": "Recargar ubicación y personalizaciones", - "group": "Recargar grupos", + "group": "Recargar grupos, entidades grupales, y servicios de notificación", "heading": "Recarga de configuración YAML", "input_boolean": "Recargar controles booleanos", "input_datetime": "Recargar controles de fechas", @@ -1751,9 +1926,16 @@ "input_select": "Recargar controles de selección", "input_text": "Recargar controles de texto", "introduction": "Algunas partes de Home Assistant pueden recargarse sin requerir un reinicio. Al presionar recargar se descargará su configuración YAML actual y se cargará la nueva.", + "mqtt": "Recargar entidades MQTT", "person": "Recargar personas", + "reload": "Recargar {domain}", + "rest": "Recargar entidades \"rest\" y servicios de notificación.", + "rpi_gpio": "Recargue las entidades GPIO de la Raspberry Pi", "scene": "Recargar escenas", "script": "Recargar scripts", + "smtp": "Recargar servicios de notificación smtp", + "telegram": "Recargar servicios de notificación de telegram", + "template": "Recargar las entidades de la plantilla", "zone": "Recargar zonas" }, "server_management": { @@ -1773,6 +1955,32 @@ } } }, + "tags": { + "add_tag": "Añadir etiqueta", + "automation_title": "La etiqueta {name} ha sido escaneada", + "caption": "Etiquetas", + "create_automation": "Crea automatización con etiqueta", + "description": "Gestionar etiquetas", + "detail": { + "create": "Crear", + "create_and_write": "Crear y escribir", + "delete": "Eliminar", + "description": "Descripción", + "name": "Nombre", + "new_tag": "Nueva etiqueta", + "tag_id": "ID de etiqueta", + "tag_id_placeholder": "Autogenerado cuando se deja vacío", + "update": "Actualizar" + }, + "edit": "Editar", + "headers": { + "last_scanned": "Último escaneado", + "name": "Nombre" + }, + "never_scanned": "Nunca escaneado", + "no_tags": "Sin etiquetas", + "write": "Escribir" + }, "users": { "add_user": { "caption": "Agregar usuario", @@ -1809,7 +2017,7 @@ "system": "Sistema" } }, - "users_privileges_note": "El grupo de usuarios es un trabajo en progreso. El usuario no podrá administrar la instancia a través de la interfaz de usuario. Todavía estamos auditando todos los puntos finales de la API de administración para garantizar que limiten correctamente el acceso a los administradores." + "users_privileges_note": "El grupo de usuarios es un trabajo en progreso. El usuario no podrá administrar la instancia a través de la interfaz de usuario. Todavía estamos auditando todos los puntos finales de la API de administración para garantizar que limiten correctamente el acceso solo a los administradores." }, "zha": { "add_device_page": { @@ -1847,7 +2055,7 @@ "clusters": { "header": "Clústeres", "help_cluster_dropdown": "Seleccione un clúster para ver atributos y comandos.", - "introduction": "Los clústeres son los bloques de construcción para la funcionalidad de Zigbee. Separa la funcionalidad en unidades lógicas. Hay tipos de clientes y servidores que se componen de atributos y comandos." + "introduction": "Los clústeres son los bloques de construcción para la funcionalidad de Zigbee. Ellos separan la funcionalidad en unidades lógicas. Hay tipos de clientes y servidores que se componen de atributos y comandos." }, "common": { "add_devices": "Agregar dispositivos", @@ -1879,7 +2087,7 @@ "create_group": "Zigbee Home Automation - Crear grupo", "create_group_details": "Ingrese los detalles requeridos para crear un nuevo grupo zigbee", "creating_group": "Creando grupo", - "description": "Crear y modificar grupos Zigbee", + "description": "Gestione los grupos Zigbee", "group_details": "Aquí están todos los detalles para el grupo Zigbee seleccionado.", "group_id": "Identificación del grupo", "group_info": "Información del grupo", @@ -2091,9 +2299,14 @@ "title": "Estados" }, "templates": { + "all_listeners": "Esta plantilla escucha todos los eventos de cambio de estado.", "description": "Las plantillas se representan utilizando el motor de plantillas Jinja2 con algunas extensiones específicas de Home Assistant.", + "domain": "Dominio", "editor": "Editor de plantillas", + "entity": "Entidad", "jinja_documentation": "Documentación de plantillas Jinja2", + "listeners": "Esta plantilla escucha los eventos de los siguientes cambios de estado:", + "no_listeners": "Esta plantilla no escucha ningún evento de cambio de estado y no se actualizará automáticamente.", "template_extensions": "Extensiones de plantilla de Home Assistant", "title": "Plantilla", "unknown_error_template": "Error desconocido al mostrar la plantilla" @@ -2335,7 +2548,11 @@ } }, "cardpicker": { + "by_card": "Por Tarjeta", + "by_entity": "Por Entidad", "custom_card": "Personalizado", + "domain": "Dominio", + "entity": "Entidad", "no_description": "No hay descripción disponible." }, "edit_card": { @@ -2349,10 +2566,11 @@ "options": "Mas opciones", "pick_card": "¿Qué tarjeta desea agregar?", "pick_card_view_title": "¿Qué tarjeta le gustaría agregar a su vista de {name} ?", + "search_cards": "Buscar tarjetas", "show_code_editor": "Mostrar editor de código", "show_visual_editor": "Mostrar el editor visual", "toggle_editor": "Cambiar editor", - "typed_header": "{tipo} Configuración de la tarjeta", + "typed_header": "{type} Configuración de la tarjeta", "unsaved_changes": "Tiene cambios no guardados" }, "edit_lovelace": { @@ -2429,7 +2647,7 @@ }, "menu": { "close": "Cerrar", - "configure_ui": "Configurar interfaz de usuario", + "configure_ui": "Editar interfaz de usuario", "exit_edit_mode": "Salir del modo de edición de la interfaz de usuario", "help": "Ayuda", "refresh": "Refrescar", @@ -2661,6 +2879,11 @@ "submit": "Enviar" }, "current_user": "Actualmente estás conectado como {fullName} .", + "customize_sidebar": { + "button": "Editar", + "description": "También puede mantener pulsado el encabezado de la barra lateral para activar el modo de edición.", + "header": "Cambiar el orden y ocultar elementos de la barra lateral" + }, "dashboard": { "description": "Elija un tablero predeterminado para este dispositivo.", "dropdown_label": "Tablero", @@ -2683,6 +2906,7 @@ "confirm_delete": "¿Está seguro de que desea eliminar el token de acceso para {name}?", "create": "Crear Token", "create_failed": "No se pudo crear el token de acceso.", + "created": "Creado {date}", "created_at": "Creado en {date}", "delete_failed": "No se pudo eliminar el token de acceso.", "description": "Cree tokens de acceso de larga duración para permitir que sus secuencias de comandos interactúen con la instancia de su Home Assistant. Cada token tendrá una validez de 10 años a partir de su creación. Los siguientes tokens de acceso de larga duración están activos actualmente.", @@ -2690,9 +2914,10 @@ "header": "Tokens de acceso de larga duración", "last_used": "Utilizado por última vez en {date} desde {location}.", "learn_auth_requests": "Aprenda a realizar solicitudes autenticadas.", + "name": "Nombre", "not_used": "Nunca se ha utilizado", "prompt_copy_token": "Copia tu token de acceso. No se volverá a mostrar", - "prompt_name": "¿Nombre?" + "prompt_name": "Dale un nombre al token" }, "mfa_setup": { "close": "Cerrar", @@ -2748,6 +2973,7 @@ } }, "sidebar": { + "done": "Hecho", "external_app_configuration": "Configuración de la aplicación", "sidebar_toggle": "Alternar barra lateral" } diff --git a/translations/frontend/es.json b/translations/frontend/es.json index 93eaa86477..45f8523416 100644 --- a/translations/frontend/es.json +++ b/translations/frontend/es.json @@ -507,6 +507,7 @@ "cancel": "Cancelar", "close": "Cerrar", "continue": "Continuar", + "copied": "Copiado", "delete": "Eliminar", "error_required": "Obligatorio", "loading": "Cargando", @@ -567,10 +568,35 @@ "loading_history": "Cargando historial de estado...", "no_history_found": "No se encontró historial de estado." }, + "logbook": { + "entries_not_found": "No se han encontrado entradas en el registro." + }, "media-browser": { "audio_not_supported": "Tu navegador no es compatible con el elemento de audio.", "choose_player": "Elige reproductor", "choose-source": "Elige la fuente", + "class": { + "album": "Álbum", + "app": "Aplicación", + "artist": "Artista", + "channel": "Canal", + "composer": "Compositor", + "contributing_artist": "Artista colaborador", + "directory": "Biblioteca", + "episode": "Episodio", + "game": "Juego", + "genre": "Género", + "image": "Imagen", + "movie": "Película", + "music": "Música", + "playlist": "Lista de reproducción", + "podcast": "Podcast", + "season": "Temporada", + "track": "Pista", + "tv_show": "Programa de TV", + "url": "Url", + "video": "Vídeo" + }, "content-type": { "album": "Álbum", "artist": "Artista", @@ -703,6 +729,7 @@ }, "more_info_control": { "controls": "Controles", + "details": "Detalles", "dismiss": "Descartar diálogo", "edit": "Editar entidad", "history": "Historial", @@ -2348,9 +2375,14 @@ "title": "Estados" }, "templates": { + "all_listeners": "Esta plantilla escucha todos los eventos de cambio de estado.", "description": "Las plantillas se muestran utilizando el motor de plantillas Jinja2 con algunas extensiones específicas de Home Assistant.", + "domain": "Dominio", "editor": "Editor de plantillas", + "entity": "Entidad", "jinja_documentation": "Documentación de plantilla Jinja2", + "listeners": "Esta plantilla escucha los siguientes eventos de cambio de estado:", + "no_listeners": "Esta plantilla no escucha ningún evento de cambio de estado y no se actualizará automáticamente.", "reset": "Reiniciar a la plantilla de demostración", "template_extensions": "Extensiones de plantilla de Home Assistant", "title": "Plantillas", @@ -2937,6 +2969,11 @@ "submit": "Enviar" }, "current_user": "Has iniciado sesión como {fullName}.", + "customize_sidebar": { + "button": "Editar", + "description": "También puedes mantener pulsada la cabecera de la barra lateral para activar el modo de edición.", + "header": "Cambiar el orden y ocultar elementos de la barra lateral" + }, "dashboard": { "description": "Selecciona un panel de control predeterminado para este dispositivo.", "dropdown_label": "Panel de control", @@ -2959,6 +2996,7 @@ "confirm_delete": "¿Estás seguro de que quieres eliminar el token de acceso para {name}?", "create": "Crear Token", "create_failed": "No se ha podido crear el token de acceso.", + "created": "Creado en {date}", "created_at": "Creado el {date}", "delete_failed": "Error al eliminar el token de acceso.", "description": "Crea tokens de acceso de larga duración para permitir que tus scripts interactúen con tu instancia de Home Assistant. Cada token será válido por 10 años desde la creación. Los siguientes tokens de acceso de larga duración están actualmente activos.", @@ -2966,9 +3004,10 @@ "header": "Tokens de acceso de larga duración", "last_used": "Último uso el {date} desde {location}", "learn_auth_requests": "Aprende cómo realizar solicitudes autenticadas.", + "name": "Nombre", "not_used": "Nunca ha sido usado", "prompt_copy_token": "Copia tu token de acceso. No se mostrará de nuevo.", - "prompt_name": "¿Nombre?" + "prompt_name": "Dale un nombre al token" }, "mfa_setup": { "close": "Cerrar", @@ -3032,6 +3071,7 @@ } }, "sidebar": { + "done": "Hecho", "external_app_configuration": "Configuración de la aplicación", "sidebar_toggle": "Alternar barra lateral" } diff --git a/translations/frontend/fr.json b/translations/frontend/fr.json index 714fc4320a..0634745577 100644 --- a/translations/frontend/fr.json +++ b/translations/frontend/fr.json @@ -507,6 +507,7 @@ "cancel": "Annuler", "close": "Fermer", "continue": "Continuer", + "copied": "Copié", "delete": "Supprimer", "error_required": "Obligatoire", "loading": "Chargement", @@ -567,10 +568,35 @@ "loading_history": "Chargement de l'historique des valeurs ...", "no_history_found": "Aucun historique des valeurs trouvé." }, + "logbook": { + "entries_not_found": "Aucune entrée trouvée dans le journal." + }, "media-browser": { "audio_not_supported": "Votre navigateur ne prend pas en charge l'élément audio.", "choose_player": "Choisissez le lecteur", "choose-source": "Choisissez la source", + "class": { + "album": "Album", + "app": "App", + "artist": "Artiste", + "channel": "Canal", + "composer": "Compositeur", + "contributing_artist": "Artiste collaborateur", + "directory": "Bibliothèque", + "episode": "Épisode", + "game": "Jeu", + "genre": "Genre", + "image": "Image", + "movie": "Film", + "music": "Musique", + "playlist": "Liste de lecture", + "podcast": "Podcast", + "season": "Saison", + "track": "Piste", + "tv_show": "Émission de télévision", + "url": "Url", + "video": "Vidéo" + }, "content-type": { "album": "Album", "artist": "Artiste", @@ -703,6 +729,7 @@ }, "more_info_control": { "controls": "Contrôles", + "details": "Détails", "dismiss": "Fermer la fenêtre de dialogue", "edit": "Modifier l'entité", "history": "Historique", @@ -934,9 +961,12 @@ "service_data": "Données du service" }, "wait_for_trigger": { - "label": "Attendre le déclencheur" + "continue_timeout": "Continuer à l'expiration du délai", + "label": "Attendre le déclencheur", + "timeout": "Délai d'expiration (optionnel)" }, "wait_template": { + "continue_timeout": "Continuer à l'expiration du délai", "label": "Attendre", "timeout": "Délai d'expiration (optionnel)", "wait_template": "Template d'attente" @@ -1000,7 +1030,9 @@ "time": { "after": "Après", "before": "Avant", - "label": "Heure" + "label": "Heure", + "type_input": "Valeur d'une aide de date/heure", + "type_value": "Temps fixe" }, "zone": { "entity": "Entité avec localisation", @@ -1567,6 +1599,7 @@ "reload_restart_confirm": "Redémarrer Home Assistant pour finaliser le rechargement de cette intégration", "rename": "Renommer", "restart_confirm": "Redémarrer Home Assistant pour terminer la suppression de cette intégration", + "services": "{count} {count, plural,\n one {service}\n other {services}\n}", "settings_button": "Modifier les paramètres pour {integration}", "system_options": "Options système", "system_options_button": "Options système pour {integration}", @@ -2342,9 +2375,14 @@ "title": "États" }, "templates": { + "all_listeners": "Ce modèle écoute tous les événements de changement d'état.", "description": "Les modèles sont rendus à l'aide du moteur de modèles Jinja2 avec certaines extensions spécifiques de Home Assistant.", + "domain": "Domaine", "editor": "Éditeur de modèles", + "entity": "Entité", "jinja_documentation": "Documentation de modèle Jinja2", + "listeners": "Ce modèle écoute les événements de changement d'état suivants:", + "no_listeners": "Ce modèle n'écoute aucun événement de changement d'état et ne sera pas mis à jour automatiquement.", "reset": "Réinitialiser au modèle de démonstration", "template_extensions": "Extensions de modèles de Home Assistant", "title": "Modèle", @@ -2931,6 +2969,11 @@ "submit": "Envoyer" }, "current_user": "Vous êtes actuellement connecté en tant que {fullName}.", + "customize_sidebar": { + "button": "Modifier", + "description": "Vous pouvez également appuyer et maintenir l'en-tête de la barre latérale pour activer le mode d'édition.", + "header": "Modifier l'ordre et masquer les éléments de la barre latérale" + }, "dashboard": { "description": "Choisissez un tableau de bord par défaut pour cet appareil.", "dropdown_label": "Tableau de bord", @@ -2953,6 +2996,7 @@ "confirm_delete": "Êtes-vous sûr de vouloir supprimer le jeton d'accès de {name} ?", "create": "Créer un jeton", "create_failed": "Impossible de créer le jeton d'accès.", + "created": "Créé le {date}", "created_at": "Créé le {date}", "delete_failed": "Impossible de supprimer le jeton d'accès.", "description": "Créez des jetons d'accès de longue durée pour permettre à vos scripts d'interagir avec votre instance de Home Assistant. Chaque jeton sera valable 10 ans à compter de sa création. Les jetons d'accès longue durée suivants sont actuellement actifs.", @@ -2960,6 +3004,7 @@ "header": "Jetons d'accès de longue durée", "last_used": "Dernière utilisation le {date} à partir de {location}", "learn_auth_requests": "Apprenez comment faire des demandes authentifiées.", + "name": "Nom", "not_used": "N'a jamais été utilisé", "prompt_copy_token": "Copiez votre jeton d'accès. Il ne sera plus affiché à nouveau.", "prompt_name": "Nom ?" @@ -3026,6 +3071,7 @@ } }, "sidebar": { + "done": "Terminé", "external_app_configuration": "Configuration de l'application", "sidebar_toggle": "Activer la barre latérale" } diff --git a/translations/frontend/nb.json b/translations/frontend/nb.json index ab4abc249b..dcb6211a8a 100644 --- a/translations/frontend/nb.json +++ b/translations/frontend/nb.json @@ -507,6 +507,7 @@ "cancel": "Avbryt", "close": "Lukk", "continue": "Fortsette", + "copied": "Kopiert", "delete": "Slett", "error_required": "Nødvendig", "loading": "Laster", @@ -574,6 +575,28 @@ "audio_not_supported": "Nettleseren din støtter ikke lydelementet.", "choose_player": "Velg spiller", "choose-source": "Velg kilde", + "class": { + "album": "Album", + "app": "App", + "artist": "Artist", + "channel": "Kanal", + "composer": "Komponist", + "contributing_artist": "Medvirkende artist", + "directory": "Bibliotek", + "episode": "Episode", + "game": "Spill", + "genre": "Sjanger", + "image": "Bilde", + "movie": "Film", + "music": "Musikk", + "playlist": "Spilleliste", + "podcast": "Podcast", + "season": "Sesong", + "track": "Spor", + "tv_show": "TV Serie", + "url": "Url", + "video": "Video" + }, "content-type": { "album": "Album", "artist": "Artist", @@ -2352,9 +2375,14 @@ "title": "Tilstander" }, "templates": { + "all_listeners": "Denne malen lytter etter alle tilstandsfornede hendelser.", "description": "Maler blir rendret ved hjelp av Jinja2-malmotoren med noen spesifikke utvidelser for Home Assistant.", + "domain": "Domene", "editor": "Maleditor", + "entity": "Entitet", "jinja_documentation": "Jinja2 mal dokumentasjon", + "listeners": "Denne malen lytter etter følgende tilstandsfor endrede hendelser:", + "no_listeners": "Denne malen lytter ikke etter eventuelle tilstandsfornedne hendelser og oppdateres ikke automatisk.", "reset": "Tilbakestill til demomal", "template_extensions": "Mal utvidelser for Home Assistant", "title": "Mal", @@ -2941,6 +2969,11 @@ "submit": "Send inn" }, "current_user": "Du er logget inn som {fullName}.", + "customize_sidebar": { + "button": "Redigere", + "description": "Du kan også trykke på og holde nede overskriften på sidefeltet for å aktivere redigeringsmodus.", + "header": "Endre rekkefølgen og skjul elementer fra sidepanelet" + }, "dashboard": { "description": "Velg et standard instrumentbord for denne enheten.", "dropdown_label": "", @@ -2963,6 +2996,7 @@ "confirm_delete": "Er du sikker på at du vil slette tilgangstoken for {name}?", "create": "Opprett Token", "create_failed": "Kunne ikke opprette tilgangstoken.", + "created": "Opprettet {date}", "created_at": "Opprettet den {date}", "delete_failed": "Kan ikke slette tilgangstokenet.", "description": "Opprett langvarige tilgangstokener slik at skriptene dine kan samhandle med din Home Assistant instans. Hver token vil være gyldig i 10 år fra opprettelsen. Følgende langvarige tilgangstokener er for tiden aktive.", @@ -2970,9 +3004,10 @@ "header": "Langvarige tilgangstokener", "last_used": "Sist brukt den {date} fra {location}", "learn_auth_requests": "Lær hvordan du lager godkjente forespørsler.", + "name": "Navn", "not_used": "Har aldri blitt brukt", "prompt_copy_token": "Kopier tilgangstoken. Det blir ikke vist igjen.", - "prompt_name": "Navn?" + "prompt_name": "Gi tokenet et navn" }, "mfa_setup": { "close": "Lukk", @@ -3036,6 +3071,7 @@ } }, "sidebar": { + "done": "Ferdig", "external_app_configuration": "Appkonfigurasjon", "sidebar_toggle": "Vis/Skjul sidepanel" } diff --git a/translations/frontend/nl.json b/translations/frontend/nl.json index 7e36879dae..f11bf23dca 100644 --- a/translations/frontend/nl.json +++ b/translations/frontend/nl.json @@ -507,6 +507,7 @@ "cancel": "Annuleren", "close": "Sluiten", "continue": "Ga verder", + "copied": "Gekopieerd", "delete": "Verwijderen", "error_required": "Verplicht", "loading": "Bezig met laden", @@ -574,6 +575,28 @@ "audio_not_supported": "Uw browser ondersteunt het audio-element niet.", "choose_player": "Kies speler", "choose-source": "Kies bron", + "class": { + "album": "Album", + "app": "App", + "artist": "Artiest", + "channel": "Kanaal", + "composer": "Componist", + "contributing_artist": "Bijdragende artiest", + "directory": "Bibliotheek", + "episode": "Aflevering", + "game": "Spel", + "genre": "Genre", + "image": "Afbeelding", + "movie": "Film", + "music": "Muziek", + "playlist": "Afspeellijst", + "podcast": "Podcast", + "season": "Seizoen", + "track": "Nummer", + "tv_show": "TV-programma", + "url": "Url", + "video": "Video" + }, "content-type": { "album": "Album", "artist": "Artiest", @@ -2352,9 +2375,14 @@ "title": "Toestanden" }, "templates": { + "all_listeners": "Deze template luistert naar alle gebeurtenissen met gewijzigde status.", "description": "Sjablonen worden weergegeven met de Jinja2-sjabloonediter samen met enkele extensies van Home Assistant.", + "domain": "Domein", "editor": "Sjabloonediter", + "entity": "Entiteit", "jinja_documentation": "Jinja2-sjabloondocumentatie", + "listeners": "Deze template luistert naar de volgende gebeurtenissen met gewijzigde status:", + "no_listeners": "Deze template luistert niet naar gebeurtenissen met statuswijziging en wordt niet automatisch bijgewerkt.", "reset": "Resetten naar demosjabloon", "template_extensions": "Home Assistant sjabloon extensiesHome Assistant", "title": "Sjablonen", @@ -2941,6 +2969,11 @@ "submit": "Verzenden" }, "current_user": "Je bent momenteel ingelogd als {fullName}.", + "customize_sidebar": { + "button": "Bewerken", + "description": "U kunt ook de koptekst van de zijbalk ingedrukt houden om de bewerkingsmodus te activeren.", + "header": "Wijzig de volgorde en verberg items van de zijbalk" + }, "dashboard": { "description": "Kies een standaard dashboard voor dit apparaat.", "dropdown_label": "Dashboard", @@ -2963,6 +2996,7 @@ "confirm_delete": "Weet je zeker dat je de toegangstoken voor {name} wilt verwijderen?", "create": "Token aanmaken", "create_failed": "De toegangstoken kon niet worden aangemaakt.", + "created": "Gemaakt op {date}", "created_at": "Gemaakt op {date}", "delete_failed": "Verwijderen van de toegangstoken is mislukt.", "description": "Maak toegangstokens met een lange levensduur zodat je scripts kunnen communiceren met je Home Assistant-instantie. Elk token is tien jaar geldig vanaf de aanmaakdatum. De volgende langlevende toegangstokens zijn momenteel actief.", @@ -2970,9 +3004,10 @@ "header": "Toegangtokens met lange levensduur", "last_used": "Laatst gebruikt op {date} vanaf {location}", "learn_auth_requests": "Kom te weten hoe je geverifieerde verzoeken kunt maken", + "name": "Naam", "not_used": "Is nog nooit gebruikt", "prompt_copy_token": "Kopieer je toegangstoken. Het wordt niet meer getoond.", - "prompt_name": "Naam?" + "prompt_name": "Geef het token een naam" }, "mfa_setup": { "close": "Sluiten", @@ -3036,6 +3071,7 @@ } }, "sidebar": { + "done": "Gedaan", "external_app_configuration": "App configuratie", "sidebar_toggle": "Zijbalk in- en uitschakelen" } diff --git a/translations/frontend/pl.json b/translations/frontend/pl.json index 68d09fa8ae..9bc262d724 100644 --- a/translations/frontend/pl.json +++ b/translations/frontend/pl.json @@ -19,6 +19,7 @@ "logbook": "Dziennik", "mailbox": "Poczta", "map": "Mapa", + "media_browser": "Odtwarzacz mediów", "profile": "Profil", "shopping_list": "Lista zakupów", "states": "Przegląd" @@ -506,6 +507,7 @@ "cancel": "Anuluj", "close": "Zamknij", "continue": "Kontynuuj", + "copied": "Skopiowano", "delete": "Usuń", "error_required": "To pole jest wymagane", "loading": "Ładowanie", @@ -553,6 +555,7 @@ }, "entity": { "entity-attribute-picker": { + "attribute": "Atrybut", "show_attributes": "Pokaż atrybuty" }, "entity-picker": { @@ -565,10 +568,35 @@ "loading_history": "Ładowanie historii...", "no_history_found": "Nie znaleziono historii." }, + "logbook": { + "entries_not_found": "Nie znaleziono wpisów w dzienniku." + }, "media-browser": { "audio_not_supported": "Twoja przeglądarka nie obsługuje elementu audio.", "choose_player": "Wybierz odtwarzacz", "choose-source": "Wybierz źródło", + "class": { + "album": "Album", + "app": "Aplikacja", + "artist": "Artysta", + "channel": "Kanał", + "composer": "Kompozytor", + "contributing_artist": "Artysta współpracujący", + "directory": "Biblioteka", + "episode": "Odcinek", + "game": "Gra", + "genre": "Gatunek", + "image": "Obraz", + "movie": "Film", + "music": "Muzyka", + "playlist": "Playlista", + "podcast": "Podcast", + "season": "Sezon", + "track": "Ścieżka", + "tv_show": "Program telewizyjny", + "url": "URL", + "video": "Wideo" + }, "content-type": { "album": "Album", "artist": "Artysta", @@ -576,6 +604,7 @@ "playlist": "Lista odtwarzania", "server": "Serwer" }, + "media_browsing_error": "Błąd przeglądania multimediów", "media_not_supported": "Przeglądarka odtwarzacza mediów nie obsługuje tego typu mediów", "media_player": "Odtwarzacz mediów", "media-player-browser": "Przeglądarka odtwarzacza mediów", @@ -931,7 +960,13 @@ "label": "Wywołanie usługi", "service_data": "Dane usługi" }, + "wait_for_trigger": { + "continue_timeout": "Kontynuuj po przekroczeniu limitu czasu", + "label": "Czekaj na wyzwalacz", + "timeout": "Limit czasu (opcjonalnie)" + }, "wait_template": { + "continue_timeout": "Kontynuuj po przekroczeniu limitu czasu", "label": "Oczekiwanie", "timeout": "Limit czasu (opcjonalnie)", "wait_template": "Szablon czekania" @@ -995,7 +1030,9 @@ "time": { "after": "Po", "before": "Przed", - "label": "Czas" + "label": "Czas", + "type_input": "Wartość pomocnika typu data/czas", + "type_value": "Ustalony czas" }, "zone": { "entity": "Encja z lokalizacją", @@ -1083,6 +1120,7 @@ "value_template": "Szablon wartości (opcjonalnie)" }, "state": { + "attribute": "Atrybut (opcjonalnie)", "for": "Przez", "from": "Z", "label": "Stan", @@ -1110,7 +1148,9 @@ }, "time": { "at": "O", - "label": "Czas" + "label": "Czas", + "type_input": "Wartość pomocnika typu data/czas", + "type_value": "Ustalony czas" }, "webhook": { "label": "Webhook", @@ -1134,7 +1174,7 @@ "delete_automation": "Usuń automatyzację", "delete_confirm": "Czy na pewno chcesz usunąć tę automatyzację?", "duplicate": "Duplikuj", - "duplicate_automation": "Duplikat automatyzację", + "duplicate_automation": "Duplikuj automatyzację", "edit_automation": "Edytuj automatyzację", "header": "Edytor automatyzacji", "headers": { @@ -1502,7 +1542,7 @@ }, "types": { "input_boolean": "Przełącznik", - "input_datetime": "Data i/lub godzina", + "input_datetime": "Data i/lub czas", "input_number": "Numer", "input_select": "Pole wyboru", "input_text": "Tekst" @@ -1535,6 +1575,7 @@ }, "integrations": { "add_integration": "Dodaj integrację", + "attention": "Wymaga uwagi", "caption": "Integracje", "config_entry": { "area": "obszar: {area}", @@ -1937,7 +1978,7 @@ "reloading": { "automation": "Automatyzacje", "command_line": "Encje komponentu linia komend", - "core": "Lokalizacja i dostosowywanie", + "core": "Lokalizację i dostosowywanie", "filesize": "Encje komponentu wielkość pliku", "filter": "Encje komponentu filtr", "generic": "Encje komponentu kamera IP generic", @@ -2334,9 +2375,14 @@ "title": "Stany" }, "templates": { + "all_listeners": "Ten szablon nasłuchuje wszystkich zdarzeń zmiany stanu.", "description": "Szablony są renderowane przy użyciu silnika szablonów Jinja2 z kilkoma specyficznymi rozszerzeniami Home Assistanta.", + "domain": "Domena", "editor": "Edytor szablonów", + "entity": "Encja", "jinja_documentation": "Dokumentacja szablonów Jinja2", + "listeners": "Ten szablon nasłuchuje następujących zdarzeń zmiany stanu:", + "no_listeners": "Ten szablon nie nasłuchuje żadnych zdarzeń zmiany stanu i nie zostanie zaktualizowany automatycznie.", "reset": "Zresetuj do szablonu demonstracyjnego", "template_extensions": "Rozszerzenia szablonów Home Assistanta", "title": "Szablon", @@ -2923,6 +2969,11 @@ "submit": "Zatwierdź" }, "current_user": "Jesteś obecnie zalogowany jako {fullName}.", + "customize_sidebar": { + "button": "Edytuj", + "description": "Możesz także nacisnąć i przytrzymać nagłówek paska bocznego, aby aktywować tryb edycji.", + "header": "Zmień kolejność i ukryj elementy na pasku bocznym" + }, "dashboard": { "description": "Wybierz domyślny dashboard dla tego urządzenia.", "dropdown_label": "Dashboard", @@ -2945,6 +2996,7 @@ "confirm_delete": "Czy na pewno chcesz usunąć token dla {name}?", "create": "Utwórz token", "create_failed": "Nie udało się utworzyć tokena.", + "created": "Utworzony {date}", "created_at": "Utworzony {date}", "delete_failed": "Nie udało się usunąć tokena.", "description": "Długoterminowe tokeny dostępu umożliwiają skryptom interakcję z Home Assistantem. Każdy token będzie ważny przez 10 lat od utworzenia. Następujące tokeny są obecnie aktywne.", @@ -3019,6 +3071,7 @@ } }, "sidebar": { + "done": "Gotowe", "external_app_configuration": "Konfiguracja aplikacji", "sidebar_toggle": "Przełącz pasek boczny" } diff --git a/translations/frontend/ro.json b/translations/frontend/ro.json index b0bcdb48cd..0262cb7b0d 100644 --- a/translations/frontend/ro.json +++ b/translations/frontend/ro.json @@ -489,6 +489,7 @@ "back": "Înapoi", "cancel": "Revocare", "close": "Închide", + "copied": "Copiat", "delete": "Șterge", "error_required": "Necesar", "loading": "Se încarcă", @@ -544,6 +545,32 @@ "loading_history": "Încărcarea istoricului de stare ...", "no_history_found": "Nici un istoric de stare nu a fost găsit." }, + "logbook": { + "entries_not_found": "Nu s-au găsit intrări în jurnal." + }, + "media-browser": { + "class": { + "album": "Album", + "app": "Aplicație", + "artist": "Artist", + "channel": "Canal", + "composer": "Compozitor", + "contributing_artist": "Artist contribuitor", + "directory": "Bibliotecă", + "episode": "Episod", + "game": "Joc", + "genre": "Gen", + "image": "Imagine", + "movie": "Film", + "music": "Muzică", + "playlist": "Playlist", + "podcast": "Podcast", + "season": "Sezon", + "tv_show": "Emisiune TV", + "url": "Url", + "video": "Video" + } + }, "related-items": { "area": "Zonă", "automation": "Parte din următoarele automatizări", @@ -647,6 +674,7 @@ "yaml_not_editable": "Setările acestei entități nu se pot edita din interfața grafica. Numai entitățile configurate in interfața grafica sunt configurabile din interfața grafica." }, "more_info_control": { + "details": "Detalii", "dismiss": "Se respinge dialogul", "edit": "Editează entitatea", "person": { @@ -850,7 +878,13 @@ "label": "Cheama serviciu", "service_data": "Date serviciu" }, + "wait_for_trigger": { + "continue_timeout": "Continua la timeout", + "label": "Așteptați declanșatorul", + "timeout": "Timeout (optional)" + }, "wait_template": { + "continue_timeout": "Continuați la expirare", "label": "Asteptare", "timeout": "Timeout (opțional)", "wait_template": "Sablon Asteptare" @@ -1260,6 +1294,7 @@ }, "integrations": { "add_integration": "Adăugați integrare", + "attention": "Atenție necesară", "caption": "Integrări", "config_entry": { "delete": "Șterge", @@ -1317,6 +1352,7 @@ "none": "Nimic nu a fost configurat încă", "none_found": "Nu s-au găsit integrări", "none_found_detail": "Ajustați criteriile de căutare.", + "reconfigure": "Reconfigurați", "rename_dialog": "Editați numele acestei intrări de configurare", "rename_input_label": "Introdu nume", "search": "Căutare integrari" @@ -1848,9 +1884,14 @@ "title": "Status" }, "templates": { + "all_listeners": "Acest șablon ascultă următoarele evenimente modificate de stare:", "description": "Șabloanele sunt redate utilizând motorul de șablon Jinja2 cu unele extensii specifice Home Assistant.", + "domain": "Domeniu", "editor": "Editor șabloane", + "entity": "Entitate", "jinja_documentation": "Șablon documentație Jinja2", + "listeners": "Acest șablon ascultă următoarele evenimente modificate de stare:", + "no_listeners": "Acest șablon ascultă următoarele evenimente modificate de stare:", "template_extensions": "Șabloane de extensie pentru Home Assistant", "title": "Sabloane", "unknown_error_template": "Sa produs o eroare de randare necunoscută." @@ -2353,6 +2394,11 @@ "submit": "Trimite" }, "current_user": "În prezent sunteți conectat ca {fullName}.", + "customize_sidebar": { + "button": "Editeaza", + "description": "De asemenea, puteți apăsa și ține apăsat antetul barei laterale pentru a activa modul de editare.", + "header": "Schimbați ordinea și ascundeți elementele din bara laterală" + }, "dashboard": { "description": "Alegeți un tablou de bord implicit pentru acest dispozitiv.", "dropdown_label": "Tablou de bord", @@ -2375,6 +2421,7 @@ "confirm_delete": "Sigur doriti sa stergeti tokenul de acces pentru {name}?", "create": "Creaza un Token", "create_failed": "Crearea tokenului de acces eşuată", + "created": "Creat in {data}", "created_at": "Creat in {date}", "delete_failed": "Ştergerea tokenului de acces eşuată", "description": "Creați tokenuri de acces cu durată lungă de viață pentru a permite script-urilor dvs. să interacționeze cu instanța dvs. Home Assistant. Fiecare token va fi valabil timp de 10 ani de la creatie. Următoarele tokenuri de acces de lungă durată sunt active la ora actuala.", @@ -2382,6 +2429,7 @@ "header": "Tokenuri de acces de lunga durata", "last_used": "Ultima utilizare la {date} din {location}", "learn_auth_requests": "Aflați cum să faceți cereri autentificate.", + "name": "Nume", "not_used": "Nu a fost utilizat niciodata", "prompt_copy_token": "Copia token-ul de acces. Acesta nu va fi afișat din nou.", "prompt_name": "Nume?" @@ -2443,6 +2491,7 @@ } }, "sidebar": { + "done": "Terminat", "external_app_configuration": "Configurație aplicație", "sidebar_toggle": "Schimbati bara laterală" } diff --git a/translations/frontend/ru.json b/translations/frontend/ru.json index 739b8ccc63..04aa43066e 100644 --- a/translations/frontend/ru.json +++ b/translations/frontend/ru.json @@ -507,6 +507,7 @@ "cancel": "Отменить", "close": "Закрыть", "continue": "Продолжить", + "copied": "Скопировано", "delete": "Удалить", "error_required": "Обязательное поле", "loading": "Загрузка", @@ -574,6 +575,28 @@ "audio_not_supported": "Ваш браузер не поддерживает аудио.", "choose_player": "Выберите медиаплеер", "choose-source": "Выбрать источник", + "class": { + "album": "Альбом", + "app": "Приложение", + "artist": "Исполнитель", + "channel": "Канал", + "composer": "Композитор", + "contributing_artist": "Соисполнитель", + "directory": "Библиотека", + "episode": "Эпизод", + "game": "Игра", + "genre": "Жанр", + "image": "Изображение", + "movie": "Фильм", + "music": "Музыка", + "playlist": "Плейлист", + "podcast": "Подкаст", + "season": "Сезон", + "track": "Трек", + "tv_show": "Сериалы", + "url": "URL-адрес", + "video": "Видео" + }, "content-type": { "album": "Альбом", "artist": "Исполнитель", @@ -2352,9 +2375,14 @@ "title": "Состояния" }, "templates": { + "all_listeners": "Этот шаблон отслеживает все события изменения состояния.", "description": "Здесь Вы можете протестировать поведение шаблонов. В Home Assistant используется шаблонизатор Jinja2 с некоторыми специальными расширениями.", + "domain": "Домен", "editor": "Редактор шаблонов", + "entity": "Объект", "jinja_documentation": "Узнайте больше о шаблонизаторе Jinja2", + "listeners": "Этот шаблон отслеживает следующие события изменения состояния:", + "no_listeners": "Этот шаблон не отслеживает события изменения состояния и не обновляется автоматически.", "reset": "Вернуться к демонстрационному шаблону", "template_extensions": "Узнайте больше о шаблонах Home Assistant", "title": "Шаблоны", @@ -2941,6 +2969,11 @@ "submit": "Подтвердить" }, "current_user": "Добро пожаловать, {fullName}! Вы вошли в систему.", + "customize_sidebar": { + "button": "Изменить", + "description": "Режим редактирования можно включить, нажав и удерживая заголовок боковой панели", + "header": "Изменить элементы боковой панели" + }, "dashboard": { "description": "Панель, используемая по умолчанию для этого устройства", "dropdown_label": "Панель", @@ -3038,6 +3071,7 @@ } }, "sidebar": { + "done": "Готово", "external_app_configuration": "Настройки приложения", "sidebar_toggle": "Переключатель в боковой панели" } diff --git a/translations/frontend/zh-Hans.json b/translations/frontend/zh-Hans.json index 611909f0cf..d8bc96cb89 100644 --- a/translations/frontend/zh-Hans.json +++ b/translations/frontend/zh-Hans.json @@ -574,6 +574,28 @@ "audio_not_supported": "您的浏览器不支持音频元素。", "choose_player": "选择播放器", "choose-source": "选择媒体源", + "class": { + "album": "专辑", + "app": "应用", + "artist": "艺术家", + "channel": "频道", + "composer": "作曲家", + "contributing_artist": "参与创作者", + "directory": "媒体库", + "episode": "分集", + "game": "游戏", + "genre": "体裁", + "image": "图片", + "movie": "电影", + "music": "音乐", + "playlist": "播放列表", + "podcast": "播客", + "season": "播出季", + "track": "音轨", + "tv_show": "电视节目", + "url": "网址", + "video": "视频" + }, "content-type": { "album": "专辑", "artist": "艺术家", @@ -2352,9 +2374,14 @@ "title": "状态" }, "templates": { + "all_listeners": "此模板监听所有的状态改变事件。", "description": "模板使用 jinja2 模板引擎和一些 Home Assistant 特定的插件进行渲染。", + "domain": "域", "editor": "模板编辑器", + "entity": "实体", "jinja_documentation": "Jinja2 模板文档", + "listeners": "此模板监听以下状态改变事件:", + "no_listeners": "此模板不监听任何状态改变事件,并且不会自动更新。", "reset": "重置为演示模板", "template_extensions": "Home Assistant 模板插件", "title": "模板", @@ -2941,6 +2968,11 @@ "submit": "提交" }, "current_user": "您目前以 {fullName} 的身份登录。", + "customize_sidebar": { + "button": "编辑", + "description": "您也可以长按侧边栏标题来进入编辑模式。", + "header": "排序和隐藏侧边栏中的项目" + }, "dashboard": { "description": "选择此设备的默认仪表盘。", "dropdown_label": "仪表盘", @@ -3038,6 +3070,7 @@ } }, "sidebar": { + "done": "完成", "external_app_configuration": "应用配置", "sidebar_toggle": "侧边栏切换" } diff --git a/translations/frontend/zh-Hant.json b/translations/frontend/zh-Hant.json index 0fcc924359..452cf1c2e5 100644 --- a/translations/frontend/zh-Hant.json +++ b/translations/frontend/zh-Hant.json @@ -507,6 +507,7 @@ "cancel": "取消", "close": "關閉", "continue": "繼續", + "copied": "已複製", "delete": "刪除", "error_required": "必填", "loading": "讀取中", @@ -574,6 +575,28 @@ "audio_not_supported": "瀏覽器不支援音效元件。", "choose_player": "選擇播放器", "choose-source": "選擇來源", + "class": { + "album": "專輯", + "app": "App", + "artist": "演唱者", + "channel": "頻道", + "composer": "作曲者", + "contributing_artist": "參與藝術家", + "directory": "媒體庫", + "episode": "集", + "game": "遊戲", + "genre": "類型", + "image": "圖像", + "movie": "電影", + "music": "音樂", + "playlist": "播放列表", + "podcast": "Podcast", + "season": "季", + "track": "音軌", + "tv_show": "電視節目", + "url": "網址", + "video": "影片" + }, "content-type": { "album": "專輯", "artist": "演唱者", @@ -1982,7 +2005,7 @@ "smtp": "重新載入 SMTP 通知服務", "statistics": "重新載入統計資訊實體", "telegram": "重新載入 Telegram 通知服務", - "template": "重新載入範例實體", + "template": "重新載入模板實體", "trend": "重新載入趨勢實體", "universal": "重新載入通用媒體播放器實體", "zone": "重新載入區域" @@ -2352,9 +2375,14 @@ "title": "狀態" }, "templates": { + "all_listeners": "此模板監聽所有狀態變更事件。", "description": "模版使用 Jinja2 模板引擎及 Home Assistant 特殊擴充進行模板渲染。", + "domain": "區域", "editor": "模板編輯器", + "entity": "實體", "jinja_documentation": "Jinja2 模版文件", + "listeners": "此模板監聽以下狀態變更事件:", + "no_listeners": "此模板不監聽任何狀態變更事件,將不會自動更新。", "reset": "重置示範範模板", "template_extensions": "Home Assistant 模板擴充", "title": "模板", @@ -2941,6 +2969,11 @@ "submit": "傳送" }, "current_user": "目前登入身份:{fullName}。", + "customize_sidebar": { + "button": "編輯", + "description": "同時也能長按側邊列的標題以啟動編輯模式。", + "header": "自側邊列中變更順序或隱藏項目" + }, "dashboard": { "description": "選擇此設備的預設主面板。", "dropdown_label": "主面板", @@ -2963,6 +2996,7 @@ "confirm_delete": "確定要刪除{name}存取密鑰嗎?", "create": "創建密鑰", "create_failed": "創建存取密鑰失敗。", + "created": "新增日期:{date}", "created_at": "於{date}創建", "delete_failed": "刪除存取密鑰失敗。", "description": "創建長效存取密鑰,可供運用腳本與 Home Assistant 實體進行互動。每個密鑰於創建後,有效期為十年。目前已啟用之永久有效密鑰如下。", @@ -2970,9 +3004,10 @@ "header": "永久有效存取密鑰", "last_used": "上次使用:於{date}、位置{location}", "learn_auth_requests": "學習如何進行驗證請求。", + "name": "名稱", "not_used": "從未使用過", "prompt_copy_token": "複製存取密鑰,將不會再次顯示。", - "prompt_name": "名稱?" + "prompt_name": "為密鑰命名" }, "mfa_setup": { "close": "關閉", @@ -3036,6 +3071,7 @@ } }, "sidebar": { + "done": "完成", "external_app_configuration": "App 設定", "sidebar_toggle": "側邊欄開關" }