Compare commits

..

2 Commits

Author SHA1 Message Date
Bram Kragten
ec36d396d9 Merge pull request #6396 from home-assistant/dev 2020-07-15 16:23:49 +02:00
Bram Kragten
78914091b1 Merge pull request #6389 from home-assistant/dev 2020-07-14 23:53:51 +02:00
117 changed files with 1040 additions and 3391 deletions

View File

@@ -52,6 +52,7 @@ class CastDemoRow extends LitElement implements LovelaceRow {
}); });
mgr.castContext.addEventListener( mgr.castContext.addEventListener(
// eslint-disable-next-line no-undef // eslint-disable-next-line no-undef
// @ts-ignore
cast.framework.CastContextEventType.SESSION_STATE_CHANGED, cast.framework.CastContextEventType.SESSION_STATE_CHANGED,
(ev) => { (ev) => {
// On Android, opening a new session always results in SESSION_RESUMED. // On Android, opening a new session always results in SESSION_RESUMED.

View File

@@ -25,7 +25,6 @@ import { HomeAssistant, Route } from "../../../src/types";
import { showRepositoriesDialog } from "../dialogs/repositories/show-dialog-repositories"; import { showRepositoriesDialog } from "../dialogs/repositories/show-dialog-repositories";
import { supervisorTabs } from "../hassio-tabs"; import { supervisorTabs } from "../hassio-tabs";
import "./hassio-addon-repository"; import "./hassio-addon-repository";
import { ActionDetail } from "@material/mwc-list/mwc-list-foundation";
const sortRepos = (a: HassioAddonRepository, b: HassioAddonRepository) => { const sortRepos = (a: HassioAddonRepository, b: HassioAddonRepository) => {
if (a.slug === "local") { if (a.slug === "local") {
@@ -98,18 +97,14 @@ class HassioAddonStore extends LitElement {
.tabs=${supervisorTabs} .tabs=${supervisorTabs}
> >
<span slot="header">Add-on store</span> <span slot="header">Add-on store</span>
<ha-button-menu <ha-button-menu corner="BOTTOM_START" slot="toolbar-icon">
corner="BOTTOM_START"
slot="toolbar-icon"
@action=${this._handleAction}
>
<mwc-icon-button slot="trigger" alt="menu"> <mwc-icon-button slot="trigger" alt="menu">
<ha-svg-icon path=${mdiDotsVertical}></ha-svg-icon> <ha-svg-icon path=${mdiDotsVertical}></ha-svg-icon>
</mwc-icon-button> </mwc-icon-button>
<mwc-list-item> <mwc-list-item @tap=${this._manageRepositories}>
Repositories Repositories
</mwc-list-item> </mwc-list-item>
<mwc-list-item> <mwc-list-item @tap=${this.refreshData}>
Reload Reload
</mwc-list-item> </mwc-list-item>
</ha-button-menu> </ha-button-menu>
@@ -148,17 +143,6 @@ class HassioAddonStore extends LitElement {
this._loadData(); this._loadData();
} }
private _handleAction(ev: CustomEvent<ActionDetail>) {
switch (ev.detail.index) {
case 0:
this._manageRepositories();
break;
case 1:
this.refreshData();
break;
}
}
private apiCalled(ev) { private apiCalled(ev) {
if (ev.detail.success) { if (ev.detail.success) {
this._loadData(); this._loadData();

View File

@@ -13,7 +13,7 @@
"lint:prettier": "prettier '**/src/**/*.{js,ts,json,css,md}' --check", "lint:prettier": "prettier '**/src/**/*.{js,ts,json,css,md}' --check",
"format:prettier": "prettier '**/src/**/*.{js,ts,json,css,md}' --write", "format:prettier": "prettier '**/src/**/*.{js,ts,json,css,md}' --write",
"lint:types": "tsc", "lint:types": "tsc",
"lint:lit": "lit-analyzer '**/src/**/*.ts' --format markdown --outFile result.md", "lint:lit": "lit-analyzer '**/src/**/*.ts'",
"lint": "npm run lint:eslint && npm run lint:prettier && npm run lint:types", "lint": "npm run lint:eslint && npm run lint:prettier && npm run lint:types",
"format": "npm run format:eslint && npm run format:prettier", "format": "npm run format:eslint && npm run format:prettier",
"mocha": "node_modules/.bin/ts-mocha -p test-mocha/tsconfig.test.json --opts test-mocha/mocha.opts", "mocha": "node_modules/.bin/ts-mocha -p test-mocha/tsconfig.test.json --opts test-mocha/mocha.opts",
@@ -74,7 +74,6 @@
"@polymer/paper-tooltip": "^3.0.1", "@polymer/paper-tooltip": "^3.0.1",
"@polymer/polymer": "3.1.0", "@polymer/polymer": "3.1.0",
"@thomasloven/round-slider": "0.5.0", "@thomasloven/round-slider": "0.5.0",
"@types/chromecast-caf-sender": "^1.0.3",
"@vaadin/vaadin-combo-box": "^5.0.10", "@vaadin/vaadin-combo-box": "^5.0.10",
"@vaadin/vaadin-date-picker": "^4.0.7", "@vaadin/vaadin-date-picker": "^4.0.7",
"@vue/web-component-wrapper": "^1.2.0", "@vue/web-component-wrapper": "^1.2.0",
@@ -108,7 +107,8 @@
"regenerator-runtime": "^0.13.2", "regenerator-runtime": "^0.13.2",
"resize-observer-polyfill": "^1.5.1", "resize-observer-polyfill": "^1.5.1",
"roboto-fontface": "^0.10.0", "roboto-fontface": "^0.10.0",
"superstruct": "^0.10.12", "superstruct": "^0.6.1",
"svg-gauge": "^1.0.6",
"unfetch": "^4.1.0", "unfetch": "^4.1.0",
"vue": "^2.6.11", "vue": "^2.6.11",
"vue2-daterange-picker": "^0.5.1", "vue2-daterange-picker": "^0.5.1",
@@ -171,7 +171,7 @@
"html-minifier": "^4.0.0", "html-minifier": "^4.0.0",
"husky": "^1.3.1", "husky": "^1.3.1",
"lint-staged": "^8.1.5", "lint-staged": "^8.1.5",
"lit-analyzer": "^1.2.0", "lit-analyzer": "^1.1.10",
"lodash.template": "^4.5.0", "lodash.template": "^4.5.0",
"magic-string": "^0.25.7", "magic-string": "^0.25.7",
"map-stream": "^0.0.7", "map-stream": "^0.0.7",
@@ -192,7 +192,7 @@
"source-map-url": "^0.4.0", "source-map-url": "^0.4.0",
"systemjs": "^6.3.2", "systemjs": "^6.3.2",
"terser-webpack-plugin": "^3.0.6", "terser-webpack-plugin": "^3.0.6",
"ts-lit-plugin": "^1.2.0", "ts-lit-plugin": "^1.1.10",
"ts-mocha": "^6.0.0", "ts-mocha": "^6.0.0",
"typescript": "^3.8.3", "typescript": "^3.8.3",
"vinyl-buffer": "^1.0.1", "vinyl-buffer": "^1.0.1",

View File

@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
setup( setup(
name="home-assistant-frontend", name="home-assistant-frontend",
version="20200716.0", version="20200715.0",
description="The Home Assistant frontend", description="The Home Assistant frontend",
url="https://github.com/home-assistant/home-assistant-polymer", url="https://github.com/home-assistant/home-assistant-polymer",
author="The Home Assistant Authors", author="The Home Assistant Authors",

View File

@@ -1,8 +1,4 @@
/* eslint-disable no-undef, no-console */ /* eslint-disable no-undef, no-console */
import {
CastStateEventData,
SessionStateEventData,
} from "chromecast-caf-receiver/cast.framework";
import { Auth } from "home-assistant-js-websocket"; import { Auth } from "home-assistant-js-websocket";
import { castApiAvailable } from "./cast_framework"; import { castApiAvailable } from "./cast_framework";
import { CAST_APP_ID, CAST_DEV, CAST_NS } from "./const"; import { CAST_APP_ID, CAST_DEV, CAST_NS } from "./const";
@@ -44,13 +40,16 @@ export class CastManager {
const context = this.castContext; const context = this.castContext;
context.setOptions({ context.setOptions({
receiverApplicationId: CAST_APP_ID, receiverApplicationId: CAST_APP_ID,
// @ts-ignore
autoJoinPolicy: chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED, autoJoinPolicy: chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED,
}); });
context.addEventListener( context.addEventListener(
// @ts-ignore
cast.framework.CastContextEventType.SESSION_STATE_CHANGED, cast.framework.CastContextEventType.SESSION_STATE_CHANGED,
(ev) => this._sessionStateChanged(ev) (ev) => this._sessionStateChanged(ev)
); );
context.addEventListener( context.addEventListener(
// @ts-ignore
cast.framework.CastContextEventType.CAST_STATE_CHANGED, cast.framework.CastContextEventType.CAST_STATE_CHANGED,
(ev) => this._castStateChanged(ev) (ev) => this._castStateChanged(ev)
); );
@@ -119,7 +118,7 @@ export class CastManager {
} }
} }
private _sessionStateChanged(ev: SessionStateEventData) { private _sessionStateChanged(ev) {
if (__DEV__) { if (__DEV__) {
console.log("Cast session state changed", ev.sessionState); console.log("Cast session state changed", ev.sessionState);
} }
@@ -142,7 +141,7 @@ export class CastManager {
} }
} }
private _castStateChanged(ev: CastStateEventData) { private _castStateChanged(ev) {
if (__DEV__) { if (__DEV__) {
console.log("Cast state changed", ev.castState); console.log("Cast state changed", ev.castState);
} }

View File

@@ -1,10 +1,4 @@
export default function durationToSeconds(duration: string): number { export default function durationToSeconds(duration: string): number {
let days = 0;
if (duration.includes("day")) {
const position = duration.indexOf("day");
days = Number(duration.substr(0, position));
duration = duration.split(",")[1];
}
const parts = duration.split(":").map(Number); const parts = duration.split(":").map(Number);
return (days * 24 + parts[0]) * 3600 + parts[1] * 60 + parts[2]; return parts[0] * 3600 + parts[1] * 60 + parts[2];
} }

View File

@@ -1,14 +0,0 @@
import {
RequestSelectedDetail,
ListItem,
} from "@material/mwc-list/mwc-list-item";
export const shouldHandleRequestSelectedEvent = (
ev: CustomEvent<RequestSelectedDetail>
): boolean => {
if (!ev.detail.selected && ev.detail.source !== "property") {
return false;
}
(ev.target as ListItem).selected = false;
return true;
};

View File

@@ -19,13 +19,7 @@ export const iconColorCSS = css`
ha-icon[data-domain="sun"][data-state="above_horizon"], ha-icon[data-domain="sun"][data-state="above_horizon"],
ha-icon[data-domain="switch"][data-state="on"], ha-icon[data-domain="switch"][data-state="on"],
ha-icon[data-domain="timer"][data-state="active"], ha-icon[data-domain="timer"][data-state="active"],
ha-icon[data-domain="vacuum"][data-state="cleaning"], ha-icon[data-domain="vacuum"][data-state="cleaning"] {
ha-icon[data-domain="group"][data-state="on"],
ha-icon[data-domain="group"][data-state="home"],
ha-icon[data-domain="group"][data-state="open"],
ha-icon[data-domain="group"][data-state="locked"],
ha-icon[data-domain="group"][data-state="problem"]
{
color: var(--paper-item-icon-active-color, #fdd835); color: var(--paper-item-icon-active-color, #fdd835);
} }

View File

@@ -9,9 +9,5 @@ export function computeRTL(hass: HomeAssistant) {
} }
export function computeRTLDirection(hass: HomeAssistant) { export function computeRTLDirection(hass: HomeAssistant) {
return emitRTLDirection(computeRTL(hass)); return computeRTL(hass) ? "rtl" : "ltr";
}
export function emitRTLDirection(rtl: boolean) {
return rtl ? "rtl" : "ltr";
} }

View File

@@ -98,8 +98,6 @@ export class HaDataTable extends LitElement {
@property({ type: String }) public noDataText?: string; @property({ type: String }) public noDataText?: string;
@property({ type: String }) public searchLabel?: string;
@property({ type: String }) public filter = ""; @property({ type: String }) public filter = "";
@internalProperty() private _filterable = false; @internalProperty() private _filterable = false;
@@ -204,7 +202,6 @@ export class HaDataTable extends LitElement {
<div class="table-header"> <div class="table-header">
<search-input <search-input
@value-changed=${this._handleSearchChange} @value-changed=${this._handleSearchChange}
.label=${this.searchLabel}
></search-input> ></search-input>
</div> </div>
` `

View File

@@ -117,7 +117,11 @@ export abstract class HaDeviceAutomationPicker<
> >
${this.NO_AUTOMATION_TEXT} ${this.NO_AUTOMATION_TEXT}
</paper-item> </paper-item>
<paper-item key=${UNKNOWN_AUTOMATION_KEY} hidden> <paper-item
key=${UNKNOWN_AUTOMATION_KEY}
.automation=${this.value}
hidden
>
${this.UNKNOWN_AUTOMATION_TEXT} ${this.UNKNOWN_AUTOMATION_TEXT}
</paper-item> </paper-item>
${this._automations.map( ${this._automations.map(
@@ -171,17 +175,18 @@ export abstract class HaDeviceAutomationPicker<
} }
private _automationChanged(ev) { private _automationChanged(ev) {
if (ev.detail.item.automation) { this._setValue(ev.detail.item.automation);
this._setValue(ev.detail.item.automation);
}
} }
private _setValue(automation: T) { private _setValue(automation: T) {
if (this.value && deviceAutomationsEqual(automation, this.value)) { if (this.value && deviceAutomationsEqual(automation, this.value)) {
return; return;
} }
fireEvent(this, "change"); this.value = automation;
fireEvent(this, "value-changed", { value: automation }); setTimeout(() => {
fireEvent(this, "change");
fireEvent(this, "value-changed", { value: automation });
}, 0);
} }
static get styles(): CSSResult { static get styles(): CSSResult {

View File

@@ -10,6 +10,7 @@ import {
} from "lit-element"; } from "lit-element";
import "@material/mwc-button"; import "@material/mwc-button";
import "@material/mwc-menu"; import "@material/mwc-menu";
import "@material/mwc-list/mwc-list-item";
import type { Menu, Corner } from "@material/mwc-menu"; import type { Menu, Corner } from "@material/mwc-menu";
import "./ha-icon-button"; import "./ha-icon-button";
@@ -18,30 +19,14 @@ import "./ha-icon-button";
export class HaButtonMenu extends LitElement { export class HaButtonMenu extends LitElement {
@property() public corner: Corner = "TOP_START"; @property() public corner: Corner = "TOP_START";
@property({ type: Boolean }) public multi = false;
@property({ type: Boolean }) public activatable = false;
@query("mwc-menu") private _menu?: Menu; @query("mwc-menu") private _menu?: Menu;
public get items() {
return this._menu?.items;
}
public get selected() {
return this._menu?.selected;
}
protected render(): TemplateResult { protected render(): TemplateResult {
return html` return html`
<div @click=${this._handleClick}> <div @click=${this._handleClick}>
<slot name="trigger"></slot> <slot name="trigger"></slot>
</div> </div>
<mwc-menu <mwc-menu .corner=${this.corner}>
.corner=${this.corner}
.multi=${this.multi}
.activatable=${this.activatable}
>
<slot></slot> <slot></slot>
</mwc-menu> </mwc-menu>
`; `;

View File

@@ -9,7 +9,7 @@ import {
} from "lit-element"; } from "lit-element";
@customElement("ha-card") @customElement("ha-card")
export class HaCard extends LitElement { class HaCard extends LitElement {
@property() public header?: string; @property() public header?: string;
@property({ type: Boolean, reflect: true }) public outlined = false; @property({ type: Boolean, reflect: true }) public outlined = false;

View File

@@ -17,8 +17,6 @@ import "./ha-svg-icon";
import "@polymer/paper-input/paper-input"; import "@polymer/paper-input/paper-input";
import "@material/mwc-list/mwc-list"; import "@material/mwc-list/mwc-list";
import "./date-range-picker"; import "./date-range-picker";
import { computeRTLDirection } from "../common/util/compute_rtl";
import { ActionDetail } from "@material/mwc-list/mwc-list-foundation";
export interface DateRangePickerRanges { export interface DateRangePickerRanges {
[key: string]: [Date, Date]; [key: string]: [Date, Date];
@@ -38,14 +36,11 @@ export class HaDateRangePicker extends LitElement {
@property({ type: Boolean }) private _hour24format = false; @property({ type: Boolean }) private _hour24format = false;
@property({ type: String }) private _rtlDirection = "ltr";
protected updated(changedProps: PropertyValues) { protected updated(changedProps: PropertyValues) {
if (changedProps.has("hass")) { if (changedProps.has("hass")) {
const oldHass = changedProps.get("hass") as HomeAssistant | undefined; const oldHass = changedProps.get("hass") as HomeAssistant | undefined;
if (!oldHass || oldHass.language !== this.hass.language) { if (!oldHass || oldHass.language !== this.hass.language) {
this._hour24format = this._compute24hourFormat(); this._hour24format = this._compute24hourFormat();
this._rtlDirection = computeRTLDirection(this.hass);
} }
} }
} }
@@ -81,14 +76,16 @@ export class HaDateRangePicker extends LitElement {
></paper-input> ></paper-input>
</div> </div>
${this.ranges ${this.ranges
? html`<div ? html`<div slot="ranges" class="date-range-ranges">
slot="ranges" <mwc-list @click=${this._setDateRange}>
class="date-range-ranges" ${Object.entries(this.ranges).map(
.dir=${this._rtlDirection} ([name, dates]) => html`<mwc-list-item
> .activated=${this.startDate.getTime() ===
<mwc-list @action=${this._setDateRange} activatable> dates[0].getTime() &&
${Object.keys(this.ranges).map( this.endDate.getTime() === dates[1].getTime()}
(name) => html`<mwc-list-item> .startDate=${dates[0]}
.endDate=${dates[1]}
>
${name} ${name}
</mwc-list-item>` </mwc-list-item>`
)} )}
@@ -119,10 +116,12 @@ export class HaDateRangePicker extends LitElement {
); );
} }
private _setDateRange(ev: CustomEvent<ActionDetail>) { private _setDateRange(ev: Event) {
const dateRange = Object.values(this.ranges!)[ev.detail.index]; const target = ev.target as any;
const startDate = target.startDate;
const endDate = target.endDate;
const dateRangePicker = this._dateRangePicker; const dateRangePicker = this._dateRangePicker;
dateRangePicker.clickRange(dateRange); dateRangePicker.clickRange([startDate, endDate]);
dateRangePicker.clickedApply(); dateRangePicker.clickedApply();
} }

View File

@@ -5,7 +5,7 @@ import "./ha-icon-button";
import { css, CSSResult, customElement, html } from "lit-element"; import { css, CSSResult, customElement, html } from "lit-element";
import type { Constructor, HomeAssistant } from "../types"; import type { Constructor, HomeAssistant } from "../types";
import { mdiClose } from "@mdi/js"; import { mdiClose } from "@mdi/js";
import { computeRTLDirection } from "../common/util/compute_rtl"; import { computeRTL } from "../common/util/compute_rtl";
const MwcDialog = customElements.get("mwc-dialog") as Constructor<Dialog>; const MwcDialog = customElements.get("mwc-dialog") as Constructor<Dialog>;
@@ -14,8 +14,8 @@ export const createCloseHeading = (hass: HomeAssistant, title: string) => html`
<mwc-icon-button <mwc-icon-button
aria-label=${hass.localize("ui.dialogs.generic.close")} aria-label=${hass.localize("ui.dialogs.generic.close")}
dialogAction="close" dialogAction="close"
?rtl=${computeRTL(hass)}
class="header_button" class="header_button"
dir=${computeRTLDirection(hass)}
> >
<ha-svg-icon path=${mdiClose}></ha-svg-icon> <ha-svg-icon path=${mdiClose}></ha-svg-icon>
</mwc-icon-button> </mwc-icon-button>
@@ -61,7 +61,7 @@ export class HaDialog extends MwcDialog {
text-decoration: none; text-decoration: none;
color: inherit; color: inherit;
} }
[dir="rtl"].header_button { mwc-icon-button[rtl].header_button {
right: auto; right: auto;
left: 16px; left: 16px;
} }

View File

@@ -1,130 +0,0 @@
import {
LitElement,
svg,
customElement,
css,
property,
internalProperty,
PropertyValues,
} from "lit-element";
import { styleMap } from "lit-html/directives/style-map";
import { afterNextRender } from "../common/util/render-status";
const getAngle = (value: number, min: number, max: number) => {
const percentage = getValueInPercentage(normalize(value, min, max), min, max);
return (percentage * 180) / 100;
};
const normalize = (value: number, min: number, max: number) => {
if (value > max) return max;
if (value < min) return min;
return value;
};
const getValueInPercentage = (value: number, min: number, max: number) => {
const newMax = max - min;
const newVal = value - min;
return (100 * newVal) / newMax;
};
@customElement("ha-gauge")
export class Gauge extends LitElement {
@property({ type: Number }) public min = 0;
@property({ type: Number }) public max = 100;
@property({ type: Number }) public value = 0;
@property() public label = "";
@internalProperty() private _angle = 0;
@internalProperty() private _updated = false;
protected firstUpdated(changedProperties: PropertyValues) {
super.firstUpdated(changedProperties);
// Wait for the first render for the initial animation to work
afterNextRender(() => {
this._updated = true;
this._angle = getAngle(this.value, this.min, this.max);
this._rescale_svg();
});
}
protected updated(changedProperties: PropertyValues) {
super.updated(changedProperties);
if (!this._updated || !changedProperties.has("value")) {
return;
}
this._angle = getAngle(this.value, this.min, this.max);
this._rescale_svg();
}
protected render() {
return svg`
<svg viewBox="0 0 100 50" class="gauge">
<path
class="dial"
d="M 10 50 A 40 40 0 0 1 90 50"
></path>
<path
class="value"
style=${styleMap({ transform: `rotate(${this._angle}deg)` })}
d="M 90 50.001 A 40 40 0 0 1 10 50"
></path>
</svg>
<svg class="text">
<text class="value-text">
${this.value} ${this.label}
</text>
</svg>`;
}
private _rescale_svg() {
// Set the viewbox of the SVG containing the value to perfectly
// fit the text
// That way it will auto-scale correctly
const svgRoot = this.shadowRoot!.querySelector(".text")!;
const box = svgRoot.querySelector("text")!.getBBox()!;
svgRoot.setAttribute(
"viewBox",
`${box.x} ${box!.y} ${box.width} ${box.height}`
);
}
static get styles() {
return css`
:host {
position: relative;
}
.dial {
fill: none;
stroke: var(--primary-background-color);
stroke-width: 15;
}
.value {
fill: none;
stroke-width: 15;
stroke: var(--gauge-color);
transition: all 1000ms ease 0s;
transform-origin: 50% 100%;
}
.gauge {
display: block;
}
.text {
position: absolute;
max-height: 40%;
max-width: 55%;
left: 50%;
bottom: -6%;
transform: translate(-50%, 0%);
}
.value-text {
font-size: 50px;
fill: var(--primary-text-color);
text-anchor: middle;
}
`;
}
}

View File

@@ -89,7 +89,7 @@ const mdiRenameMapping = {
"library-movie": "filmstrip-box-multiple", "library-movie": "filmstrip-box-multiple",
"library-music": "music-box-multiple", "library-music": "music-box-multiple",
"library-music-outline": "music-box-multiple-outline", "library-music-outline": "music-box-multiple-outline",
"library-video": "play-box-multiple", "library-video": "play-box-mutiple",
markdown: "language-markdown", markdown: "language-markdown",
"markdown-outline": "language-markdown-outline", "markdown-outline": "language-markdown-outline",
"message-settings-variant": "message-cog", "message-settings-variant": "message-cog",
@@ -151,8 +151,6 @@ const mdiRenameMapping = {
"textbox-lock": "form-textbox-lock", "textbox-lock": "form-textbox-lock",
"textbox-password": "form-textbox-password", "textbox-password": "form-textbox-password",
"syllabary-katakana-half-width": "syllabary-katakana-halfwidth", "syllabary-katakana-half-width": "syllabary-katakana-halfwidth",
"visual-studio-code": "microsoft-visual-studio-code",
"visual-studio": "microsoft-visual-studio",
}; };
const mdiRemovedIcons = new Set([ const mdiRemovedIcons = new Set([

View File

@@ -46,8 +46,8 @@ export interface MqttTrigger {
export interface GeoLocationTrigger { export interface GeoLocationTrigger {
platform: "geo_location"; platform: "geo_location";
source: string; source: "string";
zone: string; zone: "string";
event: "enter" | "leave"; event: "enter" | "leave";
} }

View File

@@ -15,8 +15,7 @@ declare global {
} }
} }
export interface HassDialog<T = HASSDomEvents[ValidHassDomEvent]> interface HassDialog<T = HASSDomEvents[ValidHassDomEvent]> extends HTMLElement {
extends HTMLElement {
showDialog(params: T); showDialog(params: T);
closeDialog?: () => boolean | void; closeDialog?: () => boolean | void;
} }

View File

@@ -302,14 +302,12 @@ export class MoreInfoDialog extends LitElement {
} }
} }
ha-dialog[data-domain="camera"] { state-history-charts {
--dialog-content-padding: 0; margin-top: 16px 0;
} }
state-card-content, ha-dialog[data-domain="camera"] {
state-history-charts { --dialog-content-padding: 0;
display: block;
margin-bottom: 16px;
} }
`, `,
]; ];

View File

@@ -29,9 +29,6 @@ import "./types/ha-automation-action-event";
import "./types/ha-automation-action-scene"; import "./types/ha-automation-action-scene";
import "./types/ha-automation-action-service"; import "./types/ha-automation-action-service";
import "./types/ha-automation-action-wait_template"; import "./types/ha-automation-action-wait_template";
import { handleStructError } from "../../../lovelace/common/structs/handle-errors";
import { ActionDetail } from "@material/mwc-list/mwc-list-foundation";
import { haStyle } from "../../../../resources/styles";
const OPTIONS = [ const OPTIONS = [
"condition", "condition",
@@ -90,16 +87,12 @@ export default class HaAutomationActionRow extends LitElement {
@property() public totalActions!: number; @property() public totalActions!: number;
@internalProperty() private _warnings?: string[];
@internalProperty() private _uiModeAvailable = true;
@internalProperty() private _yamlMode = false; @internalProperty() private _yamlMode = false;
protected render() { protected render() {
const type = getType(this.action); const type = getType(this.action);
const selected = type ? OPTIONS.indexOf(type) : -1; const selected = type ? OPTIONS.indexOf(type) : -1;
const yamlMode = this._yamlMode; const yamlMode = this._yamlMode || selected === -1;
return html` return html`
<ha-card> <ha-card>
@@ -135,14 +128,17 @@ export default class HaAutomationActionRow extends LitElement {
</mwc-icon-button> </mwc-icon-button>
` `
: ""} : ""}
<ha-button-menu corner="BOTTOM_START" @action=${this._handleAction}> <ha-button-menu corner="BOTTOM_START">
<mwc-icon-button <mwc-icon-button
slot="trigger" slot="trigger"
.title=${this.hass.localize("ui.common.menu")} .title=${this.hass.localize("ui.common.menu")}
.label=${this.hass.localize("ui.common.overflow_menu")} .label=${this.hass.localize("ui.common.overflow_menu")}
><ha-svg-icon path=${mdiDotsVertical}></ha-svg-icon> ><ha-svg-icon path=${mdiDotsVertical}></ha-svg-icon>
</mwc-icon-button> </mwc-icon-button>
<mwc-list-item .disabled=${!this._uiModeAvailable}> <mwc-list-item
@tap=${this._switchYamlMode}
.disabled=${selected === -1}
>
${yamlMode ${yamlMode
? this.hass.localize( ? this.hass.localize(
"ui.panel.config.automation.editor.edit_ui" "ui.panel.config.automation.editor.edit_ui"
@@ -156,39 +152,30 @@ export default class HaAutomationActionRow extends LitElement {
"ui.panel.config.automation.editor.actions.duplicate" "ui.panel.config.automation.editor.actions.duplicate"
)} )}
</mwc-list-item> </mwc-list-item>
<mwc-list-item> <mwc-list-item @tap=${this._onDelete}>
${this.hass.localize( ${this.hass.localize(
"ui.panel.config.automation.editor.actions.delete" "ui.panel.config.automation.editor.actions.delete"
)} )}
</mwc-list-item> </mwc-list-item>
</ha-button-menu> </ha-button-menu>
</div> </div>
${this._warnings
? html`<div class="warning">
UI editor is not supported for this config:
<br />
<ul>
${this._warnings.map((warning) => html`<li>${warning}</li>`)}
</ul>
You can still edit your config in yaml.
</div>`
: ""}
${yamlMode ${yamlMode
? html` ? html`
${selected === -1 <div style="margin-right: 24px;">
? html` ${selected === -1
${this.hass.localize( ? html`
"ui.panel.config.automation.editor.actions.unsupported_action", ${this.hass.localize(
"action", "ui.panel.config.automation.editor.actions.unsupported_action",
type "action",
)} type
` )}
: ""} `
<h2>Edit in YAML</h2> : ""}
<ha-yaml-editor <ha-yaml-editor
.defaultValue=${this.action} .defaultValue=${this.action}
@value-changed=${this._onYamlChange} @value-changed=${this._onYamlChange}
></ha-yaml-editor> ></ha-yaml-editor>
</div>
` `
: html` : html`
<paper-dropdown-menu-light <paper-dropdown-menu-light
@@ -213,7 +200,7 @@ export default class HaAutomationActionRow extends LitElement {
)} )}
</paper-listbox> </paper-listbox>
</paper-dropdown-menu-light> </paper-dropdown-menu-light>
<div @ui-mode-not-available=${this._handleUiModeNotAvailable}> <div>
${dynamicElement(`ha-automation-action-${type}`, { ${dynamicElement(`ha-automation-action-${type}`, {
hass: this.hass, hass: this.hass,
action: this.action, action: this.action,
@@ -225,13 +212,6 @@ export default class HaAutomationActionRow extends LitElement {
`; `;
} }
private _handleUiModeNotAvailable(ev: CustomEvent) {
this._warnings = handleStructError(ev.detail);
if (!this._yamlMode) {
this._yamlMode = true;
}
}
private _moveUp() { private _moveUp() {
fireEvent(this, "move-action", { direction: "up" }); fireEvent(this, "move-action", { direction: "up" });
} }
@@ -240,19 +220,6 @@ export default class HaAutomationActionRow extends LitElement {
fireEvent(this, "move-action", { direction: "down" }); fireEvent(this, "move-action", { direction: "down" });
} }
private _handleAction(ev: CustomEvent<ActionDetail>) {
switch (ev.detail.index) {
case 0:
this._switchYamlMode();
break;
case 1:
break;
case 2:
this._onDelete();
break;
}
}
private _onDelete() { private _onDelete() {
showConfirmationDialog(this, { showConfirmationDialog(this, {
text: this.hass.localize( text: this.hass.localize(
@@ -274,11 +241,6 @@ export default class HaAutomationActionRow extends LitElement {
return; return;
} }
this._uiModeAvailable = OPTIONS.includes(type);
if (!this._uiModeAvailable && !this._yamlMode) {
this._yamlMode = false;
}
if (type !== getType(this.action)) { if (type !== getType(this.action)) {
const elClass = customElements.get(`ha-automation-action-${type}`); const elClass = customElements.get(`ha-automation-action-${type}`);
@@ -302,30 +264,26 @@ export default class HaAutomationActionRow extends LitElement {
this._yamlMode = !this._yamlMode; this._yamlMode = !this._yamlMode;
} }
static get styles(): CSSResult[] { static get styles(): CSSResult {
return [ return css`
haStyle, .card-menu {
css` position: absolute;
.card-menu { top: 0;
float: right; right: 0;
z-index: 3; z-index: 3;
--mdc-theme-text-primary-on-background: var(--primary-text-color); --mdc-theme-text-primary-on-background: var(--primary-text-color);
} }
.rtl .card-menu { .rtl .card-menu {
float: left; right: auto;
} left: 0;
mwc-list-item[disabled] { }
--mdc-theme-text-primary-on-background: var(--disabled-text-color); ha-button-menu {
} margin: 8px;
.warning { }
color: var(--warning-color); mwc-list-item[disabled] {
margin-bottom: 8px; --mdc-theme-text-primary-on-background: var(--disabled-text-color);
} }
.warning ul { `;
margin: 4px 0;
}
`,
];
} }
} }

View File

@@ -97,7 +97,6 @@ export class HaDeviceAction extends LitElement {
protected updated(changedPros) { protected updated(changedPros) {
const prevAction = changedPros.get("action"); const prevAction = changedPros.get("action");
if (prevAction && !deviceAutomationsEqual(prevAction, this.action)) { if (prevAction && !deviceAutomationsEqual(prevAction, this.action)) {
this._deviceId = undefined;
this._getCapabilities(); this._getCapabilities();
} }
} }

View File

@@ -19,20 +19,12 @@ import { ServiceAction } from "../../../../../data/script";
import type { PolymerChangedEvent } from "../../../../../polymer-types"; import type { PolymerChangedEvent } from "../../../../../polymer-types";
import type { HomeAssistant } from "../../../../../types"; import type { HomeAssistant } from "../../../../../types";
import { ActionElement, handleChangeEvent } from "../ha-automation-action-row"; import { ActionElement, handleChangeEvent } from "../ha-automation-action-row";
import { assert, optional, object, string } from "superstruct";
import { EntityId } from "../../../../lovelace/common/structs/is-entity-id";
const actionStruct = object({
service: optional(string()),
entity_id: optional(EntityId),
data: optional(object()),
});
@customElement("ha-automation-action-service") @customElement("ha-automation-action-service")
export class HaServiceAction extends LitElement implements ActionElement { export class HaServiceAction extends LitElement implements ActionElement {
@property({ attribute: false }) public hass!: HomeAssistant; @property({ attribute: false }) public hass!: HomeAssistant;
@property({ attribute: false }) public action!: ServiceAction; @property() public action!: ServiceAction;
@query("ha-yaml-editor") private _yamlEditor?: HaYamlEditor; @query("ha-yaml-editor") private _yamlEditor?: HaYamlEditor;
@@ -68,11 +60,6 @@ export class HaServiceAction extends LitElement implements ActionElement {
if (!changedProperties.has("action")) { if (!changedProperties.has("action")) {
return; return;
} }
try {
assert(this.action, actionStruct);
} catch (error) {
fireEvent(this, "ui-mode-not-available", error);
}
if (this._actionData && this._actionData !== this.action.data) { if (this._actionData && this._actionData !== this.action.data) {
if (this._yamlEditor) { if (this._yamlEditor) {
this._yamlEditor.setValue(this.action.data); this._yamlEditor.setValue(this.action.data);

View File

@@ -2,13 +2,7 @@ import "@polymer/paper-dropdown-menu/paper-dropdown-menu-light";
import "@polymer/paper-item/paper-item"; import "@polymer/paper-item/paper-item";
import "@polymer/paper-listbox/paper-listbox"; import "@polymer/paper-listbox/paper-listbox";
import type { PaperListboxElement } from "@polymer/paper-listbox/paper-listbox"; import type { PaperListboxElement } from "@polymer/paper-listbox/paper-listbox";
import { import { customElement, html, LitElement, property } from "lit-element";
customElement,
html,
LitElement,
property,
CSSResult,
} from "lit-element";
import { dynamicElement } from "../../../../common/dom/dynamic-element-directive"; import { dynamicElement } from "../../../../common/dom/dynamic-element-directive";
import { fireEvent } from "../../../../common/dom/fire_event"; import { fireEvent } from "../../../../common/dom/fire_event";
import "../../../../components/ha-card"; import "../../../../components/ha-card";
@@ -25,7 +19,6 @@ import "./types/ha-automation-condition-sun";
import "./types/ha-automation-condition-template"; import "./types/ha-automation-condition-template";
import "./types/ha-automation-condition-time"; import "./types/ha-automation-condition-time";
import "./types/ha-automation-condition-zone"; import "./types/ha-automation-condition-zone";
import { haStyle } from "../../../../resources/styles";
const OPTIONS = [ const OPTIONS = [
"device", "device",
@@ -54,20 +47,21 @@ export default class HaAutomationConditionEditor extends LitElement {
return html` return html`
${yamlMode ${yamlMode
? html` ? html`
${selected === -1 <div style="margin-right: 24px;">
? html` ${selected === -1
${this.hass.localize( ? html`
"ui.panel.config.automation.editor.conditions.unsupported_condition", ${this.hass.localize(
"condition", "ui.panel.config.automation.editor.conditions.unsupported_condition",
this.condition.condition "condition",
)} this.condition.condition
` )}
: ""} `
<h2>Edit in YAML</h2> : ""}
<ha-yaml-editor <ha-yaml-editor
.defaultValue=${this.condition} .defaultValue=${this.condition}
@value-changed=${this._onYamlChange} @value-changed=${this._onYamlChange}
></ha-yaml-editor> ></ha-yaml-editor>
</div>
` `
: html` : html`
<paper-dropdown-menu-light <paper-dropdown-menu-light
@@ -129,10 +123,6 @@ export default class HaAutomationConditionEditor extends LitElement {
} }
fireEvent(this, "value-changed", { value: ev.detail.value }); fireEvent(this, "value-changed", { value: ev.detail.value });
} }
static get styles(): CSSResult {
return haStyle;
}
} }
declare global { declare global {

View File

@@ -18,7 +18,6 @@ import { Condition } from "../../../../data/automation";
import { showConfirmationDialog } from "../../../../dialogs/generic/show-dialog-box"; import { showConfirmationDialog } from "../../../../dialogs/generic/show-dialog-box";
import { HomeAssistant } from "../../../../types"; import { HomeAssistant } from "../../../../types";
import "./ha-automation-condition-editor"; import "./ha-automation-condition-editor";
import { ActionDetail } from "@material/mwc-list/mwc-list-foundation";
export interface ConditionElement extends LitElement { export interface ConditionElement extends LitElement {
condition: Condition; condition: Condition;
@@ -65,14 +64,14 @@ export default class HaAutomationConditionRow extends LitElement {
<ha-card> <ha-card>
<div class="card-content"> <div class="card-content">
<div class="card-menu"> <div class="card-menu">
<ha-button-menu corner="BOTTOM_START" @action=${this._handleAction}> <ha-button-menu corner="BOTTOM_START">
<mwc-icon-button <mwc-icon-button
.title=${this.hass.localize("ui.common.menu")} .title=${this.hass.localize("ui.common.menu")}
.label=${this.hass.localize("ui.common.overflow_menu")} .label=${this.hass.localize("ui.common.overflow_menu")}
slot="trigger" slot="trigger"
><ha-svg-icon path=${mdiDotsVertical}></ha-svg-icon ><ha-svg-icon path=${mdiDotsVertical}></ha-svg-icon
></mwc-icon-button> ></mwc-icon-button>
<mwc-list-item> <mwc-list-item @tap=${this._switchYamlMode}>
${this._yamlMode ${this._yamlMode
? this.hass.localize( ? this.hass.localize(
"ui.panel.config.automation.editor.edit_ui" "ui.panel.config.automation.editor.edit_ui"
@@ -86,7 +85,7 @@ export default class HaAutomationConditionRow extends LitElement {
"ui.panel.config.automation.editor.actions.duplicate" "ui.panel.config.automation.editor.actions.duplicate"
)} )}
</mwc-list-item> </mwc-list-item>
<mwc-list-item> <mwc-list-item @tap=${this._onDelete}>
${this.hass.localize( ${this.hass.localize(
"ui.panel.config.automation.editor.actions.delete" "ui.panel.config.automation.editor.actions.delete"
)} )}
@@ -103,19 +102,6 @@ export default class HaAutomationConditionRow extends LitElement {
`; `;
} }
private _handleAction(ev: CustomEvent<ActionDetail>) {
switch (ev.detail.index) {
case 0:
this._switchYamlMode();
break;
case 1:
break;
case 2:
this._onDelete();
break;
}
}
private _onDelete() { private _onDelete() {
showConfirmationDialog(this, { showConfirmationDialog(this, {
text: this.hass.localize( text: this.hass.localize(
@@ -136,12 +122,18 @@ export default class HaAutomationConditionRow extends LitElement {
static get styles(): CSSResult { static get styles(): CSSResult {
return css` return css`
.card-menu { .card-menu {
float: right; position: absolute;
top: 0;
right: 0;
z-index: 3; z-index: 3;
--mdc-theme-text-primary-on-background: var(--primary-text-color); --mdc-theme-text-primary-on-background: var(--primary-text-color);
} }
.rtl .card-menu { .rtl .card-menu {
float: left; right: auto;
left: 0;
}
ha-button-menu {
margin: 8px;
} }
mwc-list-item[disabled] { mwc-list-item[disabled] {
--mdc-theme-text-primary-on-background: var(--disabled-text-color); --mdc-theme-text-primary-on-background: var(--disabled-text-color);

View File

@@ -47,16 +47,9 @@ import { HaDeviceTrigger } from "./trigger/types/ha-automation-trigger-device";
import { mdiContentSave } from "@mdi/js"; import { mdiContentSave } from "@mdi/js";
import { PaperListboxElement } from "@polymer/paper-listbox"; import { PaperListboxElement } from "@polymer/paper-listbox";
const MODES = ["single", "restart", "queued", "parallel"]; const MODES = ["parallel", "single", "restart", "queued"];
const MODES_MAX = ["queued", "parallel"]; const MODES_MAX = ["queued", "parallel"];
declare global {
// for fire event
interface HASSDomEvents {
"ui-mode-not-available": Error;
}
}
export class HaAutomationEditor extends LitElement { export class HaAutomationEditor extends LitElement {
@property({ attribute: false }) public hass!: HomeAssistant; @property({ attribute: false }) public hass!: HomeAssistant;
@@ -541,7 +534,7 @@ export class HaAutomationEditor extends LitElement {
position: fixed; position: fixed;
bottom: 16px; bottom: 16px;
right: 16px; right: 16px;
z-index: 3; z-index: 1;
margin-bottom: -80px; margin-bottom: -80px;
transition: margin-bottom 0.3s; transition: margin-bottom 0.3s;
} }

View File

@@ -34,8 +34,6 @@ import "./types/ha-automation-trigger-time";
import "./types/ha-automation-trigger-time_pattern"; import "./types/ha-automation-trigger-time_pattern";
import "./types/ha-automation-trigger-webhook"; import "./types/ha-automation-trigger-webhook";
import "./types/ha-automation-trigger-zone"; import "./types/ha-automation-trigger-zone";
import { ActionDetail } from "@material/mwc-list/mwc-list-foundation";
import { haStyle } from "../../../../resources/styles";
const OPTIONS = [ const OPTIONS = [
"device", "device",
@@ -95,14 +93,17 @@ export default class HaAutomationTriggerRow extends LitElement {
<ha-card> <ha-card>
<div class="card-content"> <div class="card-content">
<div class="card-menu"> <div class="card-menu">
<ha-button-menu corner="BOTTOM_START" @action=${this._handleAction}> <ha-button-menu corner="BOTTOM_START">
<mwc-icon-button <mwc-icon-button
slot="trigger" slot="trigger"
.title=${this.hass.localize("ui.common.menu")} .title=${this.hass.localize("ui.common.menu")}
.label=${this.hass.localize("ui.common.overflow_menu")} .label=${this.hass.localize("ui.common.overflow_menu")}
><ha-svg-icon path=${mdiDotsVertical}></ha-svg-icon ><ha-svg-icon path=${mdiDotsVertical}></ha-svg-icon
></mwc-icon-button> ></mwc-icon-button>
<mwc-list-item .disabled=${selected === -1}> <mwc-list-item
@tap=${this._switchYamlMode}
.disabled=${selected === -1}
>
${yamlMode ${yamlMode
? this.hass.localize( ? this.hass.localize(
"ui.panel.config.automation.editor.edit_ui" "ui.panel.config.automation.editor.edit_ui"
@@ -116,7 +117,7 @@ export default class HaAutomationTriggerRow extends LitElement {
"ui.panel.config.automation.editor.actions.duplicate" "ui.panel.config.automation.editor.actions.duplicate"
)} )}
</mwc-list-item> </mwc-list-item>
<mwc-list-item> <mwc-list-item @tap=${this._onDelete}>
${this.hass.localize( ${this.hass.localize(
"ui.panel.config.automation.editor.actions.delete" "ui.panel.config.automation.editor.actions.delete"
)} )}
@@ -125,20 +126,21 @@ export default class HaAutomationTriggerRow extends LitElement {
</div> </div>
${yamlMode ${yamlMode
? html` ? html`
${selected === -1 <div style="margin-right: 24px;">
? html` ${selected === -1
${this.hass.localize( ? html`
"ui.panel.config.automation.editor.triggers.unsupported_platform", ${this.hass.localize(
"platform", "ui.panel.config.automation.editor.triggers.unsupported_platform",
this.trigger.platform "platform",
)} this.trigger.platform
` )}
: ""} `
<h2>Edit in YAML</h2> : ""}
<ha-yaml-editor <ha-yaml-editor
.defaultValue=${this.trigger} .defaultValue=${this.trigger}
@value-changed=${this._onYamlChange} @value-changed=${this._onYamlChange}
></ha-yaml-editor> ></ha-yaml-editor>
</div>
` `
: html` : html`
<paper-dropdown-menu-light <paper-dropdown-menu-light
@@ -175,19 +177,6 @@ export default class HaAutomationTriggerRow extends LitElement {
`; `;
} }
private _handleAction(ev: CustomEvent<ActionDetail>) {
switch (ev.detail.index) {
case 0:
this._switchYamlMode();
break;
case 1:
break;
case 2:
this._onDelete();
break;
}
}
private _onDelete() { private _onDelete() {
showConfirmationDialog(this, { showConfirmationDialog(this, {
text: this.hass.localize( text: this.hass.localize(
@@ -233,23 +222,26 @@ export default class HaAutomationTriggerRow extends LitElement {
this._yamlMode = !this._yamlMode; this._yamlMode = !this._yamlMode;
} }
static get styles(): CSSResult[] { static get styles(): CSSResult {
return [ return css`
haStyle, .card-menu {
css` position: absolute;
.card-menu { top: 0;
float: right; right: 0;
z-index: 3; z-index: 3;
--mdc-theme-text-primary-on-background: var(--primary-text-color); --mdc-theme-text-primary-on-background: var(--primary-text-color);
} }
.rtl .card-menu { .rtl .card-menu {
float: left; right: auto;
} left: 0;
mwc-list-item[disabled] { }
--mdc-theme-text-primary-on-background: var(--disabled-text-color); ha-button-menu {
} margin: 8px;
`, }
]; mwc-list-item[disabled] {
--mdc-theme-text-primary-on-background: var(--disabled-text-color);
}
`;
} }
} }

View File

@@ -45,13 +45,9 @@ class CloudForgotPassword extends LocalizeMixin(EventsMixin(PolymerElement)) {
display: none; display: none;
} }
</style> </style>
<hass-subpage <hass-subpage header=[[localize('ui.panel.config.cloud.forgot_password.title')]]>
header="[[localize('ui.panel.config.cloud.forgot_password.title')]]"
>
<div class="content"> <div class="content">
<ha-card <ha-card header=[[localize('ui.panel.config.cloud.forgot_password.subtitle')]]>
header="[[localize('ui.panel.config.cloud.forgot_password.subtitle')]]"
>
<div class="card-content"> <div class="card-content">
<p> <p>
[[localize('ui.panel.config.cloud.forgot_password.instructions')]] [[localize('ui.panel.config.cloud.forgot_password.instructions')]]

View File

@@ -57,7 +57,6 @@ import {
showEntityEditorDialog, showEntityEditorDialog,
} from "./show-dialog-entity-editor"; } from "./show-dialog-entity-editor";
import { mdiFilterVariant } from "@mdi/js"; import { mdiFilterVariant } from "@mdi/js";
import type { RequestSelectedDetail } from "@material/mwc-list/mwc-list-item";
export interface StateEntity extends EntityRegistryEntry { export interface StateEntity extends EntityRegistryEntry {
readonly?: boolean; readonly?: boolean;
@@ -450,7 +449,7 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) {
> >
</div>` </div>`
: ""} : ""}
<ha-button-menu corner="BOTTOM_START" multi> <ha-button-menu corner="BOTTOM_START">
<mwc-icon-button <mwc-icon-button
slot="trigger" slot="trigger"
.label=${this.hass!.localize( .label=${this.hass!.localize(
@@ -463,9 +462,8 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) {
<ha-svg-icon path=${mdiFilterVariant}></ha-svg-icon> <ha-svg-icon path=${mdiFilterVariant}></ha-svg-icon>
</mwc-icon-button> </mwc-icon-button>
<mwc-list-item <mwc-list-item
@request-selected="${this._showDisabledChanged}" @click="${this._showDisabledChanged}"
graphic="control" graphic="control"
.selected=${this._showDisabled}
> >
<ha-checkbox <ha-checkbox
slot="graphic" slot="graphic"
@@ -476,9 +474,8 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) {
)} )}
</mwc-list-item> </mwc-list-item>
<mwc-list-item <mwc-list-item
@request-selected="${this._showRestoredChanged}" @click="${this._showRestoredChanged}"
graphic="control" graphic="control"
.selected=${this._showUnavailable}
> >
<ha-checkbox <ha-checkbox
slot="graphic" slot="graphic"
@@ -489,9 +486,8 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) {
)} )}
</mwc-list-item> </mwc-list-item>
<mwc-list-item <mwc-list-item
@request-selected="${this._showReadOnlyChanged}" @click="${this._showReadOnlyChanged}"
graphic="control" graphic="control"
.selected=${this._showReadOnly}
> >
<ha-checkbox <ha-checkbox
slot="graphic" slot="graphic"
@@ -583,25 +579,16 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) {
} }
} }
private _showDisabledChanged(ev: CustomEvent<RequestSelectedDetail>) { private _showDisabledChanged() {
if (ev.detail.source !== "property") { this._showDisabled = !this._showDisabled;
return;
}
this._showDisabled = ev.detail.selected;
} }
private _showRestoredChanged(ev: CustomEvent<RequestSelectedDetail>) { private _showRestoredChanged() {
if (ev.detail.source !== "property") { this._showUnavailable = !this._showUnavailable;
return;
}
this._showUnavailable = ev.detail.selected;
} }
private _showReadOnlyChanged(ev: CustomEvent<RequestSelectedDetail>) { private _showReadOnlyChanged() {
if (ev.detail.source !== "property") { this._showReadOnly = !this._showReadOnly;
return;
}
this._showReadOnly = ev.detail.selected;
} }
private _handleSearchChange(ev: CustomEvent) { private _handleSearchChange(ev: CustomEvent) {

View File

@@ -276,11 +276,7 @@ class HaConfigIntegrations extends SubscribeMixin(LitElement) {
</div> </div>
` `
: ""} : ""}
<ha-button-menu <ha-button-menu corner="BOTTOM_START" slot="toolbar-icon">
corner="BOTTOM_START"
slot="toolbar-icon"
@action=${this._toggleShowIgnored}
>
<mwc-icon-button <mwc-icon-button
.title=${this.hass.localize("ui.common.menu")} .title=${this.hass.localize("ui.common.menu")}
.label=${this.hass.localize("ui.common.overflow_menu")} .label=${this.hass.localize("ui.common.overflow_menu")}
@@ -288,7 +284,7 @@ class HaConfigIntegrations extends SubscribeMixin(LitElement) {
> >
<ha-svg-icon path=${mdiDotsVertical}></ha-svg-icon> <ha-svg-icon path=${mdiDotsVertical}></ha-svg-icon>
</mwc-icon-button> </mwc-icon-button>
<mwc-list-item> <mwc-list-item @click=${this._toggleShowIgnored}>
${this.hass.localize( ${this.hass.localize(
this._showIgnored this._showIgnored
? "ui.panel.config.integrations.ignore.hide_ignored" ? "ui.panel.config.integrations.ignore.hide_ignored"

View File

@@ -28,7 +28,6 @@ import { haStyle } from "../../../resources/styles";
import "../../../components/ha-icon-next"; import "../../../components/ha-icon-next";
import { fireEvent } from "../../../common/dom/fire_event"; import { fireEvent } from "../../../common/dom/fire_event";
import { mdiDotsVertical, mdiOpenInNew } from "@mdi/js"; import { mdiDotsVertical, mdiOpenInNew } from "@mdi/js";
import { ActionDetail } from "@material/mwc-list/mwc-list-foundation";
export interface ConfigEntryUpdatedEvent { export interface ConfigEntryUpdatedEvent {
entry: ConfigEntry; entry: ConfigEntry;
@@ -224,7 +223,7 @@ export class HaIntegrationCard extends LitElement {
` `
: ""} : ""}
</div> </div>
<ha-button-menu corner="BOTTOM_START" @action=${this._handleAction}> <ha-button-menu corner="BOTTOM_START">
<mwc-icon-button <mwc-icon-button
.title=${this.hass.localize("ui.common.menu")} .title=${this.hass.localize("ui.common.menu")}
.label=${this.hass.localize("ui.common.overflow_menu")} .label=${this.hass.localize("ui.common.overflow_menu")}
@@ -232,7 +231,7 @@ export class HaIntegrationCard extends LitElement {
> >
<ha-svg-icon path=${mdiDotsVertical}></ha-svg-icon> <ha-svg-icon path=${mdiDotsVertical}></ha-svg-icon>
</mwc-icon-button> </mwc-icon-button>
<mwc-list-item> <mwc-list-item @click=${this._showSystemOptions}>
${this.hass.localize( ${this.hass.localize(
"ui.panel.config.integrations.config_entry.system_options" "ui.panel.config.integrations.config_entry.system_options"
)} )}
@@ -241,6 +240,7 @@ export class HaIntegrationCard extends LitElement {
? "" ? ""
: html` : html`
<a <a
class="documentation"
href=${this.manifest.documentation} href=${this.manifest.documentation}
rel="noreferrer" rel="noreferrer"
target="_blank" target="_blank"
@@ -255,7 +255,7 @@ export class HaIntegrationCard extends LitElement {
</mwc-list-item> </mwc-list-item>
</a> </a>
`} `}
<mwc-list-item class="warning"> <mwc-list-item class="warning" @click=${this._removeIntegration}>
${this.hass.localize( ${this.hass.localize(
"ui.panel.config.integrations.config_entry.delete" "ui.panel.config.integrations.config_entry.delete"
)} )}
@@ -305,27 +305,32 @@ export class HaIntegrationCard extends LitElement {
showOptionsFlowDialog(this, ev.target.closest("ha-card").configEntry); showOptionsFlowDialog(this, ev.target.closest("ha-card").configEntry);
} }
private _handleAction(ev: CustomEvent<ActionDetail>) { private _showSystemOptions(ev) {
const configEntry = ((ev.target as HTMLElement).closest("ha-card") as any)
.configEntry;
switch (ev.detail.index) {
case 0:
this._showSystemOptions(configEntry);
break;
case 1:
this._removeIntegration(configEntry);
break;
}
}
private _showSystemOptions(configEntry: ConfigEntry) {
showConfigEntrySystemOptionsDialog(this, { showConfigEntrySystemOptionsDialog(this, {
entry: configEntry, entry: ev.target.closest("ha-card").configEntry,
}); });
} }
private async _removeIntegration(configEntry: ConfigEntry) { private async _editEntryName(ev) {
const entryId = configEntry.entry_id; const configEntry = ev.target.closest("ha-card").configEntry;
const newName = await showPromptDialog(this, {
title: this.hass.localize("ui.panel.config.integrations.rename_dialog"),
defaultValue: configEntry.title,
inputLabel: this.hass.localize(
"ui.panel.config.integrations.rename_input_label"
),
});
if (newName === null) {
return;
}
const newEntry = await updateConfigEntry(this.hass, configEntry.entry_id, {
title: newName,
});
fireEvent(this, "entry-updated", { entry: newEntry });
}
private async _removeIntegration(ev) {
const entryId = ev.target.closest("ha-card").configEntry.entry_id;
const confirmed = await showConfirmationDialog(this, { const confirmed = await showConfirmationDialog(this, {
text: this.hass.localize( text: this.hass.localize(
@@ -349,24 +354,6 @@ export class HaIntegrationCard extends LitElement {
}); });
} }
private async _editEntryName(ev) {
const configEntry = ev.target.closest("ha-card").configEntry;
const newName = await showPromptDialog(this, {
title: this.hass.localize("ui.panel.config.integrations.rename_dialog"),
defaultValue: configEntry.title,
inputLabel: this.hass.localize(
"ui.panel.config.integrations.rename_input_label"
),
});
if (newName === null) {
return;
}
const newEntry = await updateConfigEntry(this.hass, configEntry.entry_id, {
title: newName,
});
fireEvent(this, "entry-updated", { entry: newEntry });
}
static get styles(): CSSResult[] { static get styles(): CSSResult[] {
return [ return [
haStyle, haStyle,
@@ -399,6 +386,9 @@ export class HaIntegrationCard extends LitElement {
align-items: center; align-items: center;
padding-right: 5px; padding-right: 5px;
} }
.card-actions .documentation {
color: var(--primary-text-color);
}
.group-header { .group-header {
display: flex; display: flex;
align-items: center; align-items: center;

View File

@@ -93,8 +93,6 @@ export class ZHAClustersDataTable extends LitElement {
selectable selectable
auto-height auto-height
.dir=${computeRTLDirection(this.hass)} .dir=${computeRTLDirection(this.hass)}
.searchLabel=${this.hass.localize("ui.components.data-table.search")}
.noDataText=${this.hass.localize("ui.components.data-table.no-data")}
></ha-data-table> ></ha-data-table>
`; `;
} }

View File

@@ -149,8 +149,6 @@ export class ZHADeviceEndpointDataTable extends LitElement {
.selectable=${this.selectable} .selectable=${this.selectable}
auto-height auto-height
.dir=${computeRTLDirection(this.hass)} .dir=${computeRTLDirection(this.hass)}
.searchLabel=${this.hass.localize("ui.components.data-table.search")}
.noDataText=${this.hass.localize("ui.components.data-table.no-data")}
></ha-data-table> ></ha-data-table>
`; `;
} }

View File

@@ -440,7 +440,7 @@ export class HaScriptEditor extends LitElement {
position: fixed; position: fixed;
bottom: 16px; bottom: 16px;
right: 16px; right: 16px;
z-index: 3; z-index: 1;
margin-bottom: -80px; margin-bottom: -80px;
transition: margin-bottom 0.3s; transition: margin-bottom 0.3s;
} }

View File

@@ -29,6 +29,7 @@ class HaPanelDevEvent extends EventsMixin(LocalizeMixin(PolymerElement)) {
-moz-user-select: initial; -moz-user-select: initial;
@apply --paper-font-body1; @apply --paper-font-body1;
padding: 16px; padding: 16px;
direction: ltr;
display: block; display: block;
} }

View File

@@ -11,7 +11,6 @@ import { showAlertDialog } from "../../../dialogs/generic/show-dialog-box";
import LocalizeMixin from "../../../mixins/localize-mixin"; import LocalizeMixin from "../../../mixins/localize-mixin";
import "../../../styles/polymer-ha-style"; import "../../../styles/polymer-ha-style";
import "../../../util/app-localstorage-document"; import "../../../util/app-localstorage-document";
import { computeRTL } from "../../../common/util/compute_rtl";
const ERROR_SENTINEL = {}; const ERROR_SENTINEL = {};
/* /*
@@ -27,6 +26,7 @@ class HaPanelDevService extends LocalizeMixin(PolymerElement) {
-moz-user-select: initial; -moz-user-select: initial;
display: block; display: block;
padding: 16px; padding: 16px;
direction: ltr;
} }
.ha-form { .ha-form {
@@ -51,13 +51,8 @@ class HaPanelDevService extends LocalizeMixin(PolymerElement) {
text-align: left; text-align: left;
} }
:host([rtl]) .attributes th {
text-align: right;
}
.attributes tr { .attributes tr {
vertical-align: top; vertical-align: top;
direction: ltr;
} }
.attributes tr:nth-child(odd) { .attributes tr:nth-child(odd) {
@@ -88,14 +83,6 @@ class HaPanelDevService extends LocalizeMixin(PolymerElement) {
.error { .error {
color: var(--error-color); color: var(--error-color);
} }
:host([rtl]) .desc-container {
text-align: right;
}
:host([rtl]) .desc-container h3 {
direction: ltr;
}
</style> </style>
<app-localstorage-document <app-localstorage-document
@@ -154,9 +141,7 @@ class HaPanelDevService extends LocalizeMixin(PolymerElement) {
</h1> </h1>
</template> </template>
<template is="dom-if" if="[[_description]]"> <template is="dom-if" if="[[_description]]">
<div class="desc-container"> <h3>[[_description]]</h3>
<h3>[[_description]]</h3>
</div>
<table class="attributes"> <table class="attributes">
<tr> <tr>
@@ -242,10 +227,6 @@ class HaPanelDevService extends LocalizeMixin(PolymerElement) {
type: String, type: String,
computed: "_computeDescription(hass, _domain, _service)", computed: "_computeDescription(hass, _domain, _service)",
}, },
rtl: {
reflectToAttribute: true,
computed: "_computeRTL(hass)",
},
}; };
} }
@@ -348,10 +329,6 @@ class HaPanelDevService extends LocalizeMixin(PolymerElement) {
_yamlChanged(ev) { _yamlChanged(ev) {
this.serviceData = ev.detail.value; this.serviceData = ev.detail.value;
} }
_computeRTL(hass) {
return computeRTL(hass);
}
} }
customElements.define("developer-tools-service", HaPanelDevService); customElements.define("developer-tools-service", HaPanelDevService);

View File

@@ -13,7 +13,6 @@ import { EventsMixin } from "../../../mixins/events-mixin";
import LocalizeMixin from "../../../mixins/localize-mixin"; import LocalizeMixin from "../../../mixins/localize-mixin";
import "../../../styles/polymer-ha-style"; import "../../../styles/polymer-ha-style";
import { mdiInformationOutline } from "@mdi/js"; import { mdiInformationOutline } from "@mdi/js";
import { computeRTL } from "../../../common/util/compute_rtl";
const ERROR_SENTINEL = {}; const ERROR_SENTINEL = {};
/* /*
@@ -30,6 +29,7 @@ class HaPanelDevState extends EventsMixin(LocalizeMixin(PolymerElement)) {
-moz-user-select: initial; -moz-user-select: initial;
display: block; display: block;
padding: 16px; padding: 16px;
direction: ltr;
} }
.inputs { .inputs {
@@ -44,13 +44,8 @@ class HaPanelDevState extends EventsMixin(LocalizeMixin(PolymerElement)) {
text-align: left; text-align: left;
} }
:host([rtl]) .entities th {
text-align: right;
}
.entities tr { .entities tr {
vertical-align: top; vertical-align: top;
direction: ltr;
} }
.entities tr:nth-child(odd) { .entities tr:nth-child(odd) {
@@ -237,10 +232,6 @@ class HaPanelDevState extends EventsMixin(LocalizeMixin(PolymerElement)) {
computed: computed:
"computeEntities(hass, _entityFilter, _stateFilter, _attributeFilter)", "computeEntities(hass, _entityFilter, _stateFilter, _attributeFilter)",
}, },
rtl: {
reflectToAttribute: true,
computed: "_computeRTL(hass)",
},
}; };
} }
@@ -405,10 +396,6 @@ class HaPanelDevState extends EventsMixin(LocalizeMixin(PolymerElement)) {
_yamlChanged(ev) { _yamlChanged(ev) {
this._stateAttributes = ev.detail.value; this._stateAttributes = ev.detail.value;
} }
_computeRTL(hass) {
return computeRTL(hass);
}
} }
customElements.define("developer-tools-state", HaPanelDevState); customElements.define("developer-tools-state", HaPanelDevState);

View File

@@ -14,7 +14,7 @@ import { formatTimeWithSeconds } from "../../common/datetime/format_time";
import { fireEvent } from "../../common/dom/fire_event"; import { fireEvent } from "../../common/dom/fire_event";
import { domainIcon } from "../../common/entity/domain_icon"; import { domainIcon } from "../../common/entity/domain_icon";
import { stateIcon } from "../../common/entity/state_icon"; import { stateIcon } from "../../common/entity/state_icon";
import { computeRTL, emitRTLDirection } from "../../common/util/compute_rtl"; import { computeRTL } from "../../common/util/compute_rtl";
import "../../components/ha-icon"; import "../../components/ha-icon";
import { LogbookEntry } from "../../data/logbook"; import { LogbookEntry } from "../../data/logbook";
import { HomeAssistant } from "../../types"; import { HomeAssistant } from "../../types";
@@ -28,6 +28,7 @@ class HaLogbook extends LitElement {
@property() public entries: LogbookEntry[] = []; @property() public entries: LogbookEntry[] = [];
@property({ attribute: "rtl", type: Boolean, reflect: true }) @property({ attribute: "rtl", type: Boolean, reflect: true })
// @ts-ignore
private _rtl = false; private _rtl = false;
// @ts-ignore // @ts-ignore
@@ -37,22 +38,17 @@ class HaLogbook extends LitElement {
const oldHass = changedProps.get("hass") as HomeAssistant | undefined; const oldHass = changedProps.get("hass") as HomeAssistant | undefined;
const languageChanged = const languageChanged =
oldHass === undefined || oldHass.language !== this.hass.language; oldHass === undefined || oldHass.language !== this.hass.language;
return changedProps.has("entries") || languageChanged; return changedProps.has("entries") || languageChanged;
} }
protected updated(_changedProps: PropertyValues) { protected updated(_changedProps: PropertyValues) {
const oldHass = _changedProps.get("hass") as HomeAssistant | undefined; this._rtl = computeRTL(this.hass);
if (oldHass === undefined || oldHass.language !== this.hass.language) {
this._rtl = computeRTL(this.hass);
}
} }
protected render(): TemplateResult { protected render(): TemplateResult {
if (!this.entries?.length) { if (!this.entries?.length) {
return html` return html`
<div class="container" .dir=${emitRTLDirection(this._rtl)}> <div class="container">
${this.hass.localize("ui.panel.logbook.entries_not_found")} ${this.hass.localize("ui.panel.logbook.entries_not_found")}
</div> </div>
`; `;
@@ -110,8 +106,9 @@ class HaLogbook extends LitElement {
@click=${this._entityClicked} @click=${this._entityClicked}
.entityId=${item.entity_id} .entityId=${item.entity_id}
class="name" class="name"
>${item.name}</a
> >
${item.name}
</a>
`} `}
<span <span
>${item.message}${item_username >${item.message}${item_username

View File

@@ -191,7 +191,7 @@ class HuiAlarmPanelCard extends LitElement implements LovelaceCard {
: html` : html`
<paper-input <paper-input
id="alarmCode" id="alarmCode"
.label=${this.hass.localize('ui.card.alarm_control_panel.code')} label="Alarm Code"
type="password" type="password"
></paper-input> ></paper-input>
`} `}

View File

@@ -1,4 +1,5 @@
import { HassEntity } from "home-assistant-js-websocket/dist/types"; import { HassEntity } from "home-assistant-js-websocket/dist/types";
import Gauge from "svg-gauge";
import { import {
css, css,
CSSResult, CSSResult,
@@ -9,6 +10,7 @@ import {
internalProperty, internalProperty,
PropertyValues, PropertyValues,
TemplateResult, TemplateResult,
query,
} from "lit-element"; } from "lit-element";
import { applyThemesOnElement } from "../../../common/dom/apply_themes_on_element"; import { applyThemesOnElement } from "../../../common/dom/apply_themes_on_element";
@@ -22,8 +24,6 @@ import { hasConfigOrEntityChanged } from "../common/has-changed";
import { createEntityNotFoundWarning } from "../components/hui-warning"; import { createEntityNotFoundWarning } from "../components/hui-warning";
import type { LovelaceCard, LovelaceCardEditor } from "../types"; import type { LovelaceCard, LovelaceCardEditor } from "../types";
import type { GaugeCardConfig } from "./types"; import type { GaugeCardConfig } from "./types";
import "../../../components/ha-gauge";
import { styleMap } from "lit-html/directives/style-map";
export const severityMap = { export const severityMap = {
red: "var(--label-badge-red)", red: "var(--label-badge-red)",
@@ -68,6 +68,10 @@ class HuiGaugeCard extends LitElement implements LovelaceCard {
@internalProperty() private _config?: GaugeCardConfig; @internalProperty() private _config?: GaugeCardConfig;
@internalProperty() private _gauge?: any;
@query("#gauge") private _gaugeElement!: HTMLDivElement;
public getCardSize(): number { public getCardSize(): number {
return 2; return 2;
} }
@@ -80,6 +84,7 @@ class HuiGaugeCard extends LitElement implements LovelaceCard {
throw new Error("Invalid Entity"); throw new Error("Invalid Entity");
} }
this._config = { min: 0, max: 100, ...config }; this._config = { min: 0, max: 100, ...config };
this._initGauge();
} }
protected render(): TemplateResult { protected render(): TemplateResult {
@@ -113,18 +118,7 @@ class HuiGaugeCard extends LitElement implements LovelaceCard {
return html` return html`
<ha-card @click=${this._handleClick} tabindex="0"> <ha-card @click=${this._handleClick} tabindex="0">
<ha-gauge <div id="gauge"></div>
.min=${this._config.min!}
.max=${this._config.max!}
.value=${state}
.label=${this._config!.unit ||
this.hass?.states[this._config!.entity].attributes
.unit_of_measurement ||
""}
style=${styleMap({
"--gauge-color": this._computeSeverity(state),
})}
></ha-gauge>
<div class="name"> <div class="name">
${this._config.name || computeStateName(stateObj)} ${this._config.name || computeStateName(stateObj)}
</div> </div>
@@ -136,6 +130,13 @@ class HuiGaugeCard extends LitElement implements LovelaceCard {
return hasConfigOrEntityChanged(this, changedProps); return hasConfigOrEntityChanged(this, changedProps);
} }
protected firstUpdated(changedProps: PropertyValues): void {
super.firstUpdated(changedProps);
if (!this._gauge) {
this._initGauge();
}
}
protected updated(changedProps: PropertyValues): void { protected updated(changedProps: PropertyValues): void {
super.updated(changedProps); super.updated(changedProps);
if (!this._config || !this.hass) { if (!this._config || !this.hass) {
@@ -155,38 +156,66 @@ class HuiGaugeCard extends LitElement implements LovelaceCard {
) { ) {
applyThemesOnElement(this, this.hass.themes, this._config.theme); applyThemesOnElement(this, this.hass.themes, this._config.theme);
} }
const oldState = oldHass?.states[this._config.entity];
const stateObj = this.hass.states[this._config.entity];
if (oldState?.state !== stateObj.state) {
this._gauge.setValueAnimated(stateObj.state, 1);
}
} }
private _computeSeverity(numberValue: number): string { private _initGauge() {
const sections = this._config!.severity; if (!this._gaugeElement || !this._config || !this.hass) {
return;
if (!sections) {
return severityMap.normal;
} }
if (this._gauge) {
this._gaugeElement.removeChild(this._gaugeElement.lastChild!);
this._gauge = undefined;
}
this._gauge = Gauge(this._gaugeElement, {
min: this._config.min,
max: this._config.max,
dialStartAngle: 180,
dialEndAngle: 0,
viewBox: "0 0 100 55",
label: (value) => `${Math.round(value)}
${
this._config!.unit ||
this.hass?.states[this._config!.entity].attributes
.unit_of_measurement ||
""
}`,
color: (value) => {
const sections = this._config!.severity;
const sectionsArray = Object.keys(sections); if (!sections) {
const sortable = sectionsArray.map((severity) => [ return severityMap.normal;
severity, }
sections[severity],
]);
for (const severity of sortable) { const sectionsArray = Object.keys(sections);
if (severityMap[severity[0]] == null || isNaN(severity[1])) { const sortable = sectionsArray.map((severity) => [
severity,
sections[severity],
]);
for (const severity of sortable) {
if (severityMap[severity[0]] == null || isNaN(severity[1])) {
return severityMap.normal;
}
}
sortable.sort((a, b) => a[1] - b[1]);
if (value >= sortable[0][1] && value < sortable[1][1]) {
return severityMap[sortable[0][0]];
}
if (value >= sortable[1][1] && value < sortable[2][1]) {
return severityMap[sortable[1][0]];
}
if (value >= sortable[2][1]) {
return severityMap[sortable[2][0]];
}
return severityMap.normal; return severityMap.normal;
} },
} });
sortable.sort((a, b) => a[1] - b[1]);
if (numberValue >= sortable[0][1] && numberValue < sortable[1][1]) {
return severityMap[sortable[0][0]];
}
if (numberValue >= sortable[1][1] && numberValue < sortable[2][1]) {
return severityMap[sortable[1][0]];
}
if (numberValue >= sortable[2][1]) {
return severityMap[sortable[2][0]];
}
return severityMap.normal;
} }
private _handleClick(): void { private _handleClick(): void {
@@ -215,20 +244,31 @@ class HuiGaugeCard extends LitElement implements LovelaceCard {
outline: none; outline: none;
background: var(--divider-color); background: var(--divider-color);
} }
#gauge {
ha-gauge {
--gauge-color: var(--label-badge-blue);
width: 100%; width: 100%;
max-width: 250px; max-width: 300px;
}
.dial {
stroke: #ccc;
stroke-width: 15;
}
.value {
stroke-width: 15;
}
.value-text {
fill: var(--primary-text-color);
font-size: var(--gauge-value-font-size, 1.1em);
transform: translate(0, -5px);
font-family: inherit;
} }
.name { .name {
text-align: center; text-align: center;
line-height: initial; line-height: initial;
color: var(--primary-text-color); color: var(--primary-text-color);
width: 100%; width: 100%;
font-size: 15px; font-size: 15px;
margin-top: 8px; }
} }
`; `;
} }

View File

@@ -61,8 +61,6 @@ export class HuiHistoryGraphCard extends LitElement implements LovelaceCard {
private _interval?: number; private _interval?: number;
private _fetching = false;
public getCardSize(): number { public getCardSize(): number {
return 4; return 4;
} }
@@ -140,7 +138,6 @@ export class HuiHistoryGraphCard extends LitElement implements LovelaceCard {
> >
<state-history-charts <state-history-charts
.hass=${this.hass} .hass=${this.hass}
.isLoadingData=${!this._stateHistory}
.historyData=${this._stateHistory} .historyData=${this._stateHistory}
.names=${this._names} .names=${this._names}
.upToNow=${true} .upToNow=${true}
@@ -152,21 +149,13 @@ export class HuiHistoryGraphCard extends LitElement implements LovelaceCard {
} }
private async _getStateHistory(): Promise<void> { private async _getStateHistory(): Promise<void> {
if (this._fetching) { this._stateHistory = await getRecentWithCache(
return; this.hass!,
} this._cacheConfig!.cacheKey,
this._fetching = true; this._cacheConfig!,
try { this.hass!.localize,
this._stateHistory = await getRecentWithCache( this.hass!.language
this.hass!, );
this._cacheConfig!.cacheKey,
this._cacheConfig!,
this.hass!.localize,
this.hass!.language
);
} finally {
this._fetching = false;
}
} }
private _clearInterval(): void { private _clearInterval(): void {

View File

@@ -105,7 +105,7 @@ export class HuiHumidifierCard extends LitElement implements LovelaceCard {
.min=${stateObj.attributes.min_humidity} .min=${stateObj.attributes.min_humidity}
.max=${stateObj.attributes.max_humidity} .max=${stateObj.attributes.max_humidity}
.rtl=${rtlDirection === "rtl"} .rtl=${rtlDirection === "rtl"}
step="1" .step="1"
@value-changing=${this._dragEvent} @value-changing=${this._dragEvent}
@value-changed=${this._setHumidity} @value-changed=${this._setHumidity}
></round-slider> ></round-slider>

View File

@@ -12,7 +12,6 @@ import {
PropertyValues, PropertyValues,
svg, svg,
TemplateResult, TemplateResult,
query,
} from "lit-element"; } from "lit-element";
import { classMap } from "lit-html/directives/class-map"; import { classMap } from "lit-html/directives/class-map";
import { UNIT_F } from "../../../common/const"; import { UNIT_F } from "../../../common/const";
@@ -34,7 +33,6 @@ import { hasConfigOrEntityChanged } from "../common/has-changed";
import { createEntityNotFoundWarning } from "../components/hui-warning"; import { createEntityNotFoundWarning } from "../components/hui-warning";
import { LovelaceCard, LovelaceCardEditor } from "../types"; import { LovelaceCard, LovelaceCardEditor } from "../types";
import { ThermostatCardConfig } from "./types"; import { ThermostatCardConfig } from "./types";
import type { HaCard } from "../../../components/ha-card";
const modeIcons: { [mode in HvacMode]: string } = { const modeIcons: { [mode in HvacMode]: string } = {
auto: "hass:calendar-sync", auto: "hass:calendar-sync",
@@ -79,8 +77,6 @@ export class HuiThermostatCard extends LitElement implements LovelaceCard {
@internalProperty() private _setTemp?: number | number[]; @internalProperty() private _setTemp?: number | number[];
@query("ha-card") private _card?: HaCard;
public getCardSize(): number { public getCardSize(): number {
return 5; return 5;
} }
@@ -294,17 +290,18 @@ export class HuiThermostatCard extends LitElement implements LovelaceCard {
// That way it will auto-scale correctly // That way it will auto-scale correctly
// This is not done to the SVG containing the current temperature, because // This is not done to the SVG containing the current temperature, because
// it should not be centered on the text, but only on the value // it should not be centered on the text, but only on the value
const card = this._card; if (this.shadowRoot && this.shadowRoot.querySelector("ha-card")) {
if (card) { (this.shadowRoot.querySelector(
card.updateComplete.then(() => { "ha-card"
const svgRoot = this.shadowRoot!.querySelector("#set-values")!; ) as LitElement).updateComplete.then(() => {
const box = svgRoot.querySelector("g")!.getBBox()!; const svgRoot = this.shadowRoot!.querySelector("#set-values");
svgRoot.setAttribute( const box = svgRoot!.querySelector("g")!.getBBox();
svgRoot!.setAttribute(
"viewBox", "viewBox",
`${box.x} ${box!.y} ${box.width} ${box.height}` `${box!.x} ${box!.y} ${box!.width} ${box!.height}`
); );
svgRoot.setAttribute("width", `${box.width}`); svgRoot!.setAttribute("width", `${box!.width}`);
svgRoot.setAttribute("height", `${box.height}`); svgRoot!.setAttribute("height", `${box!.height}`);
}); });
} }
} }

View File

@@ -1,24 +0,0 @@
import { StructError } from "superstruct";
export const handleStructError = (err: Error): string[] => {
if (!(err instanceof StructError)) {
return [err.message];
}
const errors: string[] = [];
for (const failure of err.failures()) {
if (failure.type === "never") {
errors.push(
`Key "${failure.path[0]}" is not supported by the UI editor.`
);
} else {
errors.push(
`The value of "${failure.path.join(
"."
)}" is not supported by the UI editor, we support "${
failure.type
}" but received "${JSON.stringify(failure.value)}".`
);
}
}
return errors;
};

View File

@@ -1,17 +1,9 @@
import { StructResult, StructContext, struct } from "superstruct"; export function isEntityId(value: any): string | boolean {
const isEntityId = (value: unknown, context: StructContext): StructResult => {
if (typeof value !== "string") { if (typeof value !== "string") {
return [context.fail({ type: "string" })]; return "entity id should be a string";
} }
if (!value.includes(".")) { if (!value.includes(".")) {
return [ return "entity id should be in the format 'domain.entity'";
context.fail({
type: "entity id should be in the format 'domain.entity'",
}),
];
} }
return true; return true;
}; }
export const EntityId = struct("entity-id", isEntityId);

View File

@@ -1,17 +1,9 @@
import { StructContext, StructResult, struct } from "superstruct"; export function isIcon(value: any): string | boolean {
const isIcon = (value: unknown, context: StructContext): StructResult => {
if (typeof value !== "string") { if (typeof value !== "string") {
return [context.fail({ type: "string" })]; return "icon should be a string";
} }
if (!value.includes(":")) { if (!value.includes(":")) {
return [ return "icon should be in the format 'mdi:icon'";
context.fail({
type: "icon should be in the format 'mdi:icon'",
}),
];
} }
return true; return true;
}; }
export const Icon = struct("icon", isIcon);

View File

@@ -0,0 +1,10 @@
import { superstruct } from "superstruct";
import { isEntityId } from "./is-entity-id";
import { isIcon } from "./is-icon";
export const struct = superstruct({
types: {
"entity-id": isEntityId,
icon: isIcon,
},
});

View File

@@ -20,7 +20,6 @@ import { confDeleteCard } from "../editor/delete-card";
import { Lovelace, LovelaceCard } from "../types"; import { Lovelace, LovelaceCard } from "../types";
import { computeCardSize } from "../common/compute-card-size"; import { computeCardSize } from "../common/compute-card-size";
import { mdiDotsVertical, mdiArrowDown, mdiArrowUp } from "@mdi/js"; import { mdiDotsVertical, mdiArrowDown, mdiArrowUp } from "@mdi/js";
import { ActionDetail } from "@material/mwc-list/mwc-list-foundation";
@customElement("hui-card-options") @customElement("hui-card-options")
export class HuiCardOptions extends LitElement { export class HuiCardOptions extends LitElement {
@@ -66,7 +65,7 @@ export class HuiCardOptions extends LitElement {
?disabled=${this.path![1] === 0} ?disabled=${this.path![1] === 0}
><ha-svg-icon path=${mdiArrowUp}></ha-svg-icon ><ha-svg-icon path=${mdiArrowUp}></ha-svg-icon
></mwc-icon-button> ></mwc-icon-button>
<ha-button-menu corner="BOTTOM_START" @action=${this._handleAction}> <ha-button-menu corner="BOTTOM_START">
<mwc-icon-button <mwc-icon-button
slot="trigger" slot="trigger"
aria-label=${this.hass!.localize( aria-label=${this.hass!.localize(
@@ -79,17 +78,17 @@ export class HuiCardOptions extends LitElement {
<ha-svg-icon path=${mdiDotsVertical}></ha-svg-icon> <ha-svg-icon path=${mdiDotsVertical}></ha-svg-icon>
</mwc-icon-button> </mwc-icon-button>
<mwc-list-item> <mwc-list-item @tap=${this._moveCard}>
${this.hass!.localize( ${this.hass!.localize(
"ui.panel.lovelace.editor.edit_card.move" "ui.panel.lovelace.editor.edit_card.move"
)}</mwc-list-item )}</mwc-list-item
> >
<mwc-list-item <mwc-list-item @tap=${this._duplicateCard}
>${this.hass!.localize( >${this.hass!.localize(
"ui.panel.lovelace.editor.edit_card.duplicate" "ui.panel.lovelace.editor.edit_card.duplicate"
)}</mwc-list-item )}</mwc-list-item
> >
<mwc-list-item class="delete-item"> <mwc-list-item class="delete-item" @tap=${this._deleteCard}>
${this.hass!.localize( ${this.hass!.localize(
"ui.panel.lovelace.editor.edit_card.delete" "ui.panel.lovelace.editor.edit_card.delete"
)}</mwc-list-item )}</mwc-list-item
@@ -148,20 +147,6 @@ export class HuiCardOptions extends LitElement {
`; `;
} }
private _handleAction(ev: CustomEvent<ActionDetail>) {
switch (ev.detail.index) {
case 0:
this._moveCard();
break;
case 1:
this._duplicateCard();
break;
case 2:
this._deleteCard();
break;
}
}
private _duplicateCard(): void { private _duplicateCard(): void {
const path = this.path!; const path = this.path!;
const cardConfig = this.lovelace!.config.views[path[0]].cards![path[1]]; const cardConfig = this.lovelace!.config.views[path[0]].cards![path[1]];

View File

@@ -26,8 +26,6 @@ import type { LovelaceCardEditor } from "../../types";
import type { GUIModeChangedEvent } from "../types"; import type { GUIModeChangedEvent } from "../types";
import "../../../../components/ha-circular-progress"; import "../../../../components/ha-circular-progress";
import { deepEqual } from "../../../../common/util/deep-equal"; import { deepEqual } from "../../../../common/util/deep-equal";
import { handleStructError } from "../../common/structs/handle-errors";
import { GUISupportError } from "../gui-support-error";
export interface ConfigChangedEvent { export interface ConfigChangedEvent {
config: LovelaceCardConfig; config: LovelaceCardConfig;
@@ -71,7 +69,7 @@ export class HuiCardEditor extends LitElement {
@internalProperty() private _error?: string; @internalProperty() private _error?: string;
// Warning: GUI editor can't handle configuration - ok to save // Warning: GUI editor can't handle configuration - ok to save
@internalProperty() private _warnings?: string[]; @internalProperty() private _warning?: string;
@internalProperty() private _loading = false; @internalProperty() private _loading = false;
@@ -123,7 +121,7 @@ export class HuiCardEditor extends LitElement {
} }
public get hasWarning(): boolean { public get hasWarning(): boolean {
return this._warnings !== undefined; return this._warning !== undefined;
} }
public get hasError(): boolean { public get hasError(): boolean {
@@ -196,15 +194,10 @@ export class HuiCardEditor extends LitElement {
</div> </div>
` `
: ""} : ""}
${this._warnings ${this._warning
? html` ? html`
<div class="warning"> <div class="warning">
UI editor is not supported for this config: ${this._warning}
<br />
<ul>
${this._warnings.map((warning) => html`<li>${warning}</li>`)}
</ul>
You can still edit your config in yaml.
</div> </div>
` `
: ""} : ""}
@@ -245,7 +238,7 @@ export class HuiCardEditor extends LitElement {
let configElement = this._configElement; let configElement = this._configElement;
try { try {
this._error = undefined; this._error = undefined;
this._warnings = undefined; this._warning = undefined;
if (this._configElType !== cardType) { if (this._configElType !== cardType) {
// If the card type has changed, we need to load a new GUI editor // If the card type has changed, we need to load a new GUI editor
@@ -261,9 +254,7 @@ export class HuiCardEditor extends LitElement {
configElement = await elClass.getConfigElement(); configElement = await elClass.getConfigElement();
} else { } else {
configElement = undefined; configElement = undefined;
throw new GUISupportError( throw Error(`WARNING: No visual editor available for: ${cardType}`);
`No visual editor available for: ${cardType}`
);
} }
this._configElement = configElement; this._configElement = configElement;
@@ -281,14 +272,11 @@ export class HuiCardEditor extends LitElement {
try { try {
this._configElement!.setConfig(this.value); this._configElement!.setConfig(this.value);
} catch (err) { } catch (err) {
throw new GUISupportError( throw Error(`WARNING: ${err.message}`);
"Config is not supported",
handleStructError(err)
);
} }
} catch (err) { } catch (err) {
if (err instanceof GUISupportError) { if (err.message.startsWith("WARNING:")) {
this._warnings = err.warnings ?? [err.message]; this._warning = err.message.substr(8);
} else { } else {
this._error = err; this._error = err;
} }
@@ -314,19 +302,12 @@ export class HuiCardEditor extends LitElement {
.yaml-editor { .yaml-editor {
padding: 8px 0px; padding: 8px 0px;
} }
.error,
.warning {
word-break: break-word;
}
.error { .error {
color: var(--error-color); color: var(--error-color);
} }
.warning { .warning {
color: var(--warning-color); color: var(--warning-color);
} }
.warning ul {
margin: 4px 0;
}
ha-circular-progress { ha-circular-progress {
display: block; display: block;
margin: auto; margin: auto;

View File

@@ -1,4 +1,3 @@
import "@polymer/paper-dialog-scrollable/paper-dialog-scrollable";
import deepFreeze from "deep-freeze"; import deepFreeze from "deep-freeze";
import { import {
css, css,

View File

@@ -11,7 +11,7 @@ import {
TemplateResult, TemplateResult,
PropertyValues, PropertyValues,
} from "lit-element"; } from "lit-element";
import { HASSDomEvent, fireEvent } from "../../../../common/dom/fire_event"; import type { HASSDomEvent } from "../../../../common/dom/fire_event";
import "../../../../components/ha-dialog"; import "../../../../components/ha-dialog";
import type { import type {
LovelaceCardConfig, LovelaceCardConfig,
@@ -30,9 +30,6 @@ import "./hui-card-preview";
import type { EditCardDialogParams } from "./show-edit-card-dialog"; import type { EditCardDialogParams } from "./show-edit-card-dialog";
import { getCardDocumentationURL } from "../get-card-documentation-url"; import { getCardDocumentationURL } from "../get-card-documentation-url";
import { mdiHelpCircle } from "@mdi/js"; import { mdiHelpCircle } from "@mdi/js";
import { computeRTLDirection } from "../../../../common/util/compute_rtl";
import { HassDialog } from "../../../../dialogs/make-dialog-manager";
import { showConfirmationDialog } from "../../../../dialogs/generic/show-dialog-box";
declare global { declare global {
// for fire event // for fire event
@@ -46,7 +43,7 @@ declare global {
} }
@customElement("hui-dialog-edit-card") @customElement("hui-dialog-edit-card")
export class HuiDialogEditCard extends LitElement implements HassDialog { export class HuiDialogEditCard extends LitElement {
@property() protected hass!: HomeAssistant; @property() protected hass!: HomeAssistant;
@internalProperty() private _params?: EditCardDialogParams; @internalProperty() private _params?: EditCardDialogParams;
@@ -67,8 +64,6 @@ export class HuiDialogEditCard extends LitElement implements HassDialog {
@internalProperty() private _documentationURL?: string; @internalProperty() private _documentationURL?: string;
@internalProperty() private _dirty = false;
public async showDialog(params: EditCardDialogParams): Promise<void> { public async showDialog(params: EditCardDialogParams): Promise<void> {
this._params = params; this._params = params;
this._GUImode = true; this._GUImode = true;
@@ -82,20 +77,6 @@ export class HuiDialogEditCard extends LitElement implements HassDialog {
} }
} }
public closeDialog(): boolean {
if (this._dirty) {
this._confirmCancel();
return false;
}
this._params = undefined;
this._cardConfig = undefined;
this._error = undefined;
this._documentationURL = undefined;
this._dirty = false;
fireEvent(this, "dialog-closed", { dialog: this.localName });
return true;
}
protected updated(changedProps: PropertyValues): void { protected updated(changedProps: PropertyValues): void {
if ( if (
!this._cardConfig || !this._cardConfig ||
@@ -119,13 +100,9 @@ export class HuiDialogEditCard extends LitElement implements HassDialog {
let heading: string; let heading: string;
if (this._cardConfig && this._cardConfig.type) { if (this._cardConfig && this._cardConfig.type) {
heading = this.hass!.localize( heading = `${this.hass!.localize(
"ui.panel.lovelace.editor.edit_card.typed_header", `ui.panel.lovelace.editor.card.${this._cardConfig.type}.name`
"type", )} ${this.hass!.localize("ui.panel.lovelace.editor.edit_card.header")}`;
this.hass!.localize(
`ui.panel.lovelace.editor.card.${this._cardConfig.type}.name`
)
);
} else if (!this._cardConfig) { } else if (!this._cardConfig) {
heading = this._viewConfig.title heading = this._viewConfig.title
? this.hass!.localize( ? this.hass!.localize(
@@ -145,7 +122,7 @@ export class HuiDialogEditCard extends LitElement implements HassDialog {
open open
scrimClickAction scrimClickAction
@keydown=${this._ignoreKeydown} @keydown=${this._ignoreKeydown}
@closed=${this._cancel} @closed=${this._close}
@opened=${this._opened} @opened=${this._opened}
.heading=${html`${heading} .heading=${html`${heading}
${this._documentationURL !== undefined ${this._documentationURL !== undefined
@@ -156,7 +133,6 @@ export class HuiDialogEditCard extends LitElement implements HassDialog {
title=${this.hass!.localize("ui.panel.lovelace.menu.help")} title=${this.hass!.localize("ui.panel.lovelace.menu.help")}
target="_blank" target="_blank"
rel="noreferrer" rel="noreferrer"
dir=${computeRTLDirection(this.hass)}
> >
<mwc-icon-button> <mwc-icon-button>
<ha-svg-icon path=${mdiHelpCircle}></ha-svg-icon> <ha-svg-icon path=${mdiHelpCircle}></ha-svg-icon>
@@ -221,7 +197,7 @@ export class HuiDialogEditCard extends LitElement implements HassDialog {
` `
: ""} : ""}
<div slot="primaryAction" @click=${this._save}> <div slot="primaryAction" @click=${this._save}>
<mwc-button @click=${this._cancel}> <mwc-button @click=${this._close}>
${this.hass!.localize("ui.common.cancel")} ${this.hass!.localize("ui.common.cancel")}
</mwc-button> </mwc-button>
${this._cardConfig !== undefined ${this._cardConfig !== undefined
@@ -238,9 +214,7 @@ export class HuiDialogEditCard extends LitElement implements HassDialog {
size="small" size="small"
></ha-circular-progress> ></ha-circular-progress>
` `
: this._dirty : this.hass!.localize("ui.common.save")}
? this.hass!.localize("ui.common.save")
: this.hass!.localize("ui.common.close")}
</mwc-button> </mwc-button>
` `
: ``} : ``}
@@ -370,14 +344,12 @@ export class HuiDialogEditCard extends LitElement implements HassDialog {
} }
this._cardConfig = deepFreeze(config); this._cardConfig = deepFreeze(config);
this._error = ev.detail.error; this._error = ev.detail.error;
this._dirty = true;
} }
private _handleConfigChanged(ev: HASSDomEvent<ConfigChangedEvent>) { private _handleConfigChanged(ev: HASSDomEvent<ConfigChangedEvent>) {
this._cardConfig = deepFreeze(ev.detail.config); this._cardConfig = deepFreeze(ev.detail.config);
this._error = ev.detail.error; this._error = ev.detail.error;
this._guiModeAvailable = ev.detail.guiModeAvailable; this._guiModeAvailable = ev.detail.guiModeAvailable;
this._dirty = true;
} }
private _handleGUIModeChanged(ev: HASSDomEvent<GUIModeChangedEvent>): void { private _handleGUIModeChanged(ev: HASSDomEvent<GUIModeChangedEvent>): void {
@@ -394,6 +366,13 @@ export class HuiDialogEditCard extends LitElement implements HassDialog {
this._cardEditorEl?.refreshYamlEditor(); this._cardEditorEl?.refreshYamlEditor();
} }
private _close(): void {
this._params = undefined;
this._cardConfig = undefined;
this._error = undefined;
this._documentationURL = undefined;
}
private get _canSave(): boolean { private get _canSave(): boolean {
if (this._saving) { if (this._saving) {
return false; return false;
@@ -407,38 +386,8 @@ export class HuiDialogEditCard extends LitElement implements HassDialog {
return true; return true;
} }
private async _confirmCancel() {
// Make sure the open state of this dialog is handled before the open state of confirm dialog
await new Promise((resolve) => setTimeout(resolve, 0));
const confirm = await showConfirmationDialog(this, {
title: this.hass!.localize(
"ui.panel.lovelace.editor.edit_card.unsaved_changes"
),
text: this.hass!.localize(
"ui.panel.lovelace.editor.edit_card.confirm_cancel"
),
dismissText: this.hass!.localize("ui.common.no"),
confirmText: this.hass!.localize("ui.common.yes"),
});
if (confirm) {
this._cancel();
}
}
private _cancel(ev?: Event) {
if (ev) {
ev.stopPropagation();
}
this._dirty = false;
this.closeDialog();
}
private async _save(): Promise<void> { private async _save(): Promise<void> {
if (!this._canSave) { if (!this._canSave || this._saving) {
return;
}
if (!this._dirty) {
this.closeDialog();
return; return;
} }
this._saving = true; this._saving = true;
@@ -456,9 +405,8 @@ export class HuiDialogEditCard extends LitElement implements HassDialog {
) )
); );
this._saving = false; this._saving = false;
this._dirty = false;
showSaveSuccessToast(this, this.hass); showSaveSuccessToast(this, this.hass);
this.closeDialog(); this._close();
} }
} }

View File

@@ -1,4 +1,3 @@
import "@polymer/paper-dialog-scrollable/paper-dialog-scrollable";
import deepFreeze from "deep-freeze"; import deepFreeze from "deep-freeze";
import { import {
css, css,

View File

@@ -16,18 +16,18 @@ import "../../../../components/entity/ha-entity-picker";
import "../../../../components/ha-icon"; import "../../../../components/ha-icon";
import { HomeAssistant } from "../../../../types"; import { HomeAssistant } from "../../../../types";
import { AlarmPanelCardConfig } from "../../cards/types"; import { AlarmPanelCardConfig } from "../../cards/types";
import { struct } from "../../common/structs/struct";
import "../../components/hui-theme-select-editor"; import "../../components/hui-theme-select-editor";
import { LovelaceCardEditor } from "../../types"; import { LovelaceCardEditor } from "../../types";
import { EditorTarget, EntitiesEditorEvent } from "../types"; import { EditorTarget, EntitiesEditorEvent } from "../types";
import { configElementStyle } from "./config-elements-style"; import { configElementStyle } from "./config-elements-style";
import { assert, object, string, optional, array } from "superstruct";
const cardConfigStruct = object({ const cardConfigStruct = struct({
type: string(), type: "string",
entity: optional(string()), entity: "string?",
name: optional(string()), name: "string?",
states: optional(array()), states: "array?",
theme: optional(string()), theme: "string?",
}); });
const includeDomains = ["alarm_control_panel"]; const includeDomains = ["alarm_control_panel"];
@@ -40,7 +40,7 @@ export class HuiAlarmPanelCardEditor extends LitElement
@internalProperty() private _config?: AlarmPanelCardConfig; @internalProperty() private _config?: AlarmPanelCardConfig;
public setConfig(config: AlarmPanelCardConfig): void { public setConfig(config: AlarmPanelCardConfig): void {
assert(config, cardConfigStruct); config = cardConfigStruct(config);
this._config = config; this._config = config;
} }
@@ -194,7 +194,6 @@ export class HuiAlarmPanelCardEditor extends LitElement
} }
if (target.configValue) { if (target.configValue) {
if (target.value === "") { if (target.value === "") {
this._config = { ...this._config };
delete this._config[target.configValue!]; delete this._config[target.configValue!];
} else { } else {
this._config = { this._config = {

View File

@@ -13,6 +13,7 @@ import "../../../../components/ha-icon-input";
import { ActionConfig } from "../../../../data/lovelace"; import { ActionConfig } from "../../../../data/lovelace";
import { HomeAssistant } from "../../../../types"; import { HomeAssistant } from "../../../../types";
import { ButtonCardConfig } from "../../cards/types"; import { ButtonCardConfig } from "../../cards/types";
import { struct } from "../../common/structs/struct";
import "../../components/hui-action-editor"; import "../../components/hui-action-editor";
import "../../components/hui-entity-editor"; import "../../components/hui-entity-editor";
import "../../components/hui-theme-select-editor"; import "../../components/hui-theme-select-editor";
@@ -26,20 +27,19 @@ import "../../../../components/ha-switch";
import "../../../../components/ha-formfield"; import "../../../../components/ha-formfield";
import { configElementStyle } from "./config-elements-style"; import { configElementStyle } from "./config-elements-style";
import { computeRTLDirection } from "../../../../common/util/compute_rtl"; import { computeRTLDirection } from "../../../../common/util/compute_rtl";
import { assert, object, string, optional, boolean } from "superstruct";
const cardConfigStruct = object({ const cardConfigStruct = struct({
type: string(), type: "string",
entity: optional(string()), entity: "string?",
name: optional(string()), name: "string?",
show_name: optional(boolean()), show_name: "boolean?",
icon: optional(string()), icon: "string?",
show_icon: optional(boolean()), show_icon: "boolean?",
icon_height: optional(string()), icon_height: "string?",
tap_action: optional(actionConfigStruct), tap_action: struct.optional(actionConfigStruct),
hold_action: optional(actionConfigStruct), hold_action: struct.optional(actionConfigStruct),
theme: optional(string()), theme: "string?",
show_state: optional(boolean()), show_state: "boolean?",
}); });
@customElement("hui-button-card-editor") @customElement("hui-button-card-editor")
@@ -50,7 +50,7 @@ export class HuiButtonCardEditor extends LitElement
@internalProperty() private _config?: ButtonCardConfig; @internalProperty() private _config?: ButtonCardConfig;
public setConfig(config: ButtonCardConfig): void { public setConfig(config: ButtonCardConfig): void {
assert(config, cardConfigStruct); config = cardConfigStruct(config);
this._config = config; this._config = config;
} }
@@ -258,7 +258,6 @@ export class HuiButtonCardEditor extends LitElement
} }
if (target.configValue) { if (target.configValue) {
if (target.value === "") { if (target.value === "") {
this._config = { ...this._config };
delete this._config[target.configValue!]; delete this._config[target.configValue!];
} else { } else {
let newValue: string | undefined; let newValue: string | undefined;

View File

@@ -16,6 +16,7 @@ import "../../../../components/entity/ha-entity-picker";
import { LovelaceConfig } from "../../../../data/lovelace"; import { LovelaceConfig } from "../../../../data/lovelace";
import { HomeAssistant } from "../../../../types"; import { HomeAssistant } from "../../../../types";
import { ConditionalCardConfig } from "../../cards/types"; import { ConditionalCardConfig } from "../../cards/types";
import { struct } from "../../common/structs/struct";
import { LovelaceCardEditor } from "../../types"; import { LovelaceCardEditor } from "../../types";
import { import {
ConfigChangedEvent, ConfigChangedEvent,
@@ -23,17 +24,16 @@ import {
} from "../card-editor/hui-card-editor"; } from "../card-editor/hui-card-editor";
import "../card-editor/hui-card-picker"; import "../card-editor/hui-card-picker";
import { GUIModeChangedEvent } from "../types"; import { GUIModeChangedEvent } from "../types";
import { string, any, object, optional, array, assert } from "superstruct";
const conditionStruct = object({ const conditionStruct = struct({
entity: string(), entity: "string",
state: optional(string()), state: "string?",
state_not: optional(string()), state_not: "string?",
}); });
const cardConfigStruct = object({ const cardConfigStruct = struct({
type: string(), type: "string",
card: any(), card: "any",
conditions: optional(array(conditionStruct)), conditions: struct.optional([conditionStruct]),
}); });
@customElement("hui-conditional-card-editor") @customElement("hui-conditional-card-editor")
@@ -54,8 +54,7 @@ export class HuiConditionalCardEditor extends LitElement
@query("hui-card-editor") private _cardEditorEl?: HuiCardEditor; @query("hui-card-editor") private _cardEditorEl?: HuiCardEditor;
public setConfig(config: ConditionalCardConfig): void { public setConfig(config: ConditionalCardConfig): void {
assert(config, cardConfigStruct); this._config = cardConfigStruct(config);
this._config = config;
} }
public refreshYamlEditor(focus) { public refreshYamlEditor(focus) {
@@ -218,7 +217,7 @@ export class HuiConditionalCardEditor extends LitElement
} }
this._setMode(true); this._setMode(true);
this._guiModeAvailable = true; this._guiModeAvailable = true;
this._config = { ...this._config, card: ev.detail.config }; this._config.card = ev.detail.config;
fireEvent(this, "config-changed", { config: this._config }); fireEvent(this, "config-changed", { config: this._config });
} }
@@ -227,7 +226,7 @@ export class HuiConditionalCardEditor extends LitElement
if (!this._config) { if (!this._config) {
return; return;
} }
this._config = { ...this._config, card: ev.detail.config }; this._config.card = ev.detail.config;
this._guiModeAvailable = ev.detail.guiModeAvailable; this._guiModeAvailable = ev.detail.guiModeAvailable;
fireEvent(this, "config-changed", { config: this._config }); fireEvent(this, "config-changed", { config: this._config });
} }
@@ -237,8 +236,7 @@ export class HuiConditionalCardEditor extends LitElement
return; return;
} }
// @ts-ignore // @ts-ignore
this._config = { ...this._config, card: {} }; this._config.card = {};
// @ts-ignore
fireEvent(this, "config-changed", { config: this._config }); fireEvent(this, "config-changed", { config: this._config });
} }
@@ -247,12 +245,10 @@ export class HuiConditionalCardEditor extends LitElement
if (target.value === "" || !this._config) { if (target.value === "" || !this._config) {
return; return;
} }
const conditions = [...this._config.conditions]; this._config.conditions.push({
conditions.push({
entity: target.value, entity: target.value,
state: "", state: "",
}); });
this._config = { ...this._config, conditions };
target.value = ""; target.value = "";
fireEvent(this, "config-changed", { config: this._config }); fireEvent(this, "config-changed", { config: this._config });
} }
@@ -262,11 +258,10 @@ export class HuiConditionalCardEditor extends LitElement
if (!this._config || !target) { if (!this._config || !target) {
return; return;
} }
const conditions = [...this._config.conditions];
if (target.configValue === "entity" && target.value === "") { if (target.configValue === "entity" && target.value === "") {
conditions.splice(target.index, 1); this._config.conditions.splice(target.index, 1);
} else { } else {
const condition = { ...conditions[target.index] }; const condition = this._config.conditions[target.index];
if (target.configValue === "entity") { if (target.configValue === "entity") {
condition.entity = target.value; condition.entity = target.value;
} else if (target.configValue === "state") { } else if (target.configValue === "state") {
@@ -286,9 +281,8 @@ export class HuiConditionalCardEditor extends LitElement
delete condition.state_not; delete condition.state_not;
} }
} }
conditions[target.index] = condition; this._config.conditions[target.index] = condition;
} }
this._config = { ...this._config, conditions };
fireEvent(this, "config-changed", { config: this._config }); fireEvent(this, "config-changed", { config: this._config });
} }

View File

@@ -20,6 +20,7 @@ import {
EntitiesCardConfig, EntitiesCardConfig,
EntitiesCardEntityConfig, EntitiesCardEntityConfig,
} from "../../cards/types"; } from "../../cards/types";
import { struct } from "../../common/structs/struct";
import "../../components/hui-entity-editor"; import "../../components/hui-entity-editor";
import "../../components/hui-theme-select-editor"; import "../../components/hui-theme-select-editor";
import { headerFooterConfigStructs } from "../../header-footer/types"; import { headerFooterConfigStructs } from "../../header-footer/types";
@@ -32,24 +33,15 @@ import {
} from "../types"; } from "../types";
import { configElementStyle } from "./config-elements-style"; import { configElementStyle } from "./config-elements-style";
import { computeRTLDirection } from "../../../../common/util/compute_rtl"; import { computeRTLDirection } from "../../../../common/util/compute_rtl";
import {
string,
optional,
object,
boolean,
array,
union,
assert,
} from "superstruct";
const cardConfigStruct = object({ const cardConfigStruct = struct({
type: string(), type: "string",
title: optional(union([string(), boolean()])), title: "string|number?",
theme: optional(string()), theme: "string?",
show_header_toggle: optional(boolean()), show_header_toggle: "boolean?",
entities: array(entitiesConfigStruct), entities: [entitiesConfigStruct],
header: optional(headerFooterConfigStructs), header: struct.optional(headerFooterConfigStructs),
footer: optional(headerFooterConfigStructs), footer: struct.optional(headerFooterConfigStructs),
}); });
@customElement("hui-entities-card-editor") @customElement("hui-entities-card-editor")
@@ -62,7 +54,7 @@ export class HuiEntitiesCardEditor extends LitElement
@internalProperty() private _configEntities?: EntitiesCardEntityConfig[]; @internalProperty() private _configEntities?: EntitiesCardEntityConfig[];
public setConfig(config: EntitiesCardConfig): void { public setConfig(config: EntitiesCardConfig): void {
assert(config, cardConfigStruct); config = cardConfigStruct(config);
this._config = config; this._config = config;
this._configEntities = processEditorEntities(config.entities); this._configEntities = processEditorEntities(config.entities);
} }
@@ -135,12 +127,10 @@ export class HuiEntitiesCardEditor extends LitElement
} }
if (ev.detail && ev.detail.entities) { if (ev.detail && ev.detail.entities) {
this._config = { ...this._config, entities: ev.detail.entities }; this._config.entities = ev.detail.entities;
this._configEntities = processEditorEntities(this._config.entities); this._configEntities = processEditorEntities(this._config.entities);
} else if (target.configValue) { } else if (target.configValue) {
if (target.value === "") { if (target.value === "") {
this._config = { ...this._config };
delete this._config[target.configValue!]; delete this._config[target.configValue!];
} else { } else {
this._config = { this._config = {

View File

@@ -12,6 +12,7 @@ import { stateIcon } from "../../../../common/entity/state_icon";
import "../../../../components/ha-icon-input"; import "../../../../components/ha-icon-input";
import { HomeAssistant } from "../../../../types"; import { HomeAssistant } from "../../../../types";
import { EntityCardConfig } from "../../cards/types"; import { EntityCardConfig } from "../../cards/types";
import { struct } from "../../common/structs/struct";
import "../../components/hui-action-editor"; import "../../components/hui-action-editor";
import "../../components/hui-entity-editor"; import "../../components/hui-entity-editor";
import "../../components/hui-theme-select-editor"; import "../../components/hui-theme-select-editor";
@@ -19,17 +20,16 @@ import { headerFooterConfigStructs } from "../../header-footer/types";
import { LovelaceCardEditor } from "../../types"; import { LovelaceCardEditor } from "../../types";
import { EditorTarget, EntitiesEditorEvent } from "../types"; import { EditorTarget, EntitiesEditorEvent } from "../types";
import { configElementStyle } from "./config-elements-style"; import { configElementStyle } from "./config-elements-style";
import { string, object, optional, assert } from "superstruct";
const cardConfigStruct = object({ const cardConfigStruct = struct({
type: string(), type: "string",
entity: optional(string()), entity: "string?",
name: optional(string()), name: "string?",
icon: optional(string()), icon: "string?",
attribute: optional(string()), attribute: "string?",
unit: optional(string()), unit: "string?",
theme: optional(string()), theme: "string?",
footer: optional(headerFooterConfigStructs), footer: struct.optional(headerFooterConfigStructs),
}); });
@customElement("hui-entity-card-editor") @customElement("hui-entity-card-editor")
@@ -40,7 +40,7 @@ export class HuiEntityCardEditor extends LitElement
@internalProperty() private _config?: EntityCardConfig; @internalProperty() private _config?: EntityCardConfig;
public setConfig(config: EntityCardConfig): void { public setConfig(config: EntityCardConfig): void {
assert(config, cardConfigStruct); config = cardConfigStruct(config);
this._config = config; this._config = config;
} }
@@ -158,7 +158,6 @@ export class HuiEntityCardEditor extends LitElement
} }
if (target.configValue) { if (target.configValue) {
if (target.value === "") { if (target.value === "") {
this._config = { ...this._config };
delete this._config[target.configValue!]; delete this._config[target.configValue!];
} else { } else {
let newValue: string | undefined; let newValue: string | undefined;

View File

@@ -14,23 +14,23 @@ import "../../../../components/ha-switch";
import "../../../../components/ha-formfield"; import "../../../../components/ha-formfield";
import { HomeAssistant } from "../../../../types"; import { HomeAssistant } from "../../../../types";
import { GaugeCardConfig, SeverityConfig } from "../../cards/types"; import { GaugeCardConfig, SeverityConfig } from "../../cards/types";
import { struct } from "../../common/structs/struct";
import "../../components/hui-entity-editor"; import "../../components/hui-entity-editor";
import "../../components/hui-theme-select-editor"; import "../../components/hui-theme-select-editor";
import { LovelaceCardEditor } from "../../types"; import { LovelaceCardEditor } from "../../types";
import { EditorTarget, EntitiesEditorEvent } from "../types"; import { EditorTarget, EntitiesEditorEvent } from "../types";
import { configElementStyle } from "./config-elements-style"; import { configElementStyle } from "./config-elements-style";
import { computeRTLDirection } from "../../../../common/util/compute_rtl"; import { computeRTLDirection } from "../../../../common/util/compute_rtl";
import { assert, object, string, optional, number } from "superstruct";
const cardConfigStruct = object({ const cardConfigStruct = struct({
type: string(), type: "string",
name: optional(string()), name: "string?",
entity: optional(string()), entity: "string?",
unit: optional(string()), unit: "string?",
min: optional(number()), min: "number?",
max: optional(number()), max: "number?",
severity: optional(object()), severity: "object?",
theme: optional(string()), theme: "string?",
}); });
const includeDomains = ["sensor"]; const includeDomains = ["sensor"];
@@ -43,7 +43,7 @@ export class HuiGaugeCardEditor extends LitElement
@internalProperty() private _config?: GaugeCardConfig; @internalProperty() private _config?: GaugeCardConfig;
public setConfig(config: GaugeCardConfig): void { public setConfig(config: GaugeCardConfig): void {
assert(config, cardConfigStruct); config = cardConfigStruct(config);
this._config = config; this._config = config;
} }
@@ -260,7 +260,6 @@ export class HuiGaugeCardEditor extends LitElement
target.value === "" || target.value === "" ||
(target.type === "number" && isNaN(Number(target.value))) (target.type === "number" && isNaN(Number(target.value)))
) { ) {
this._config = { ...this._config };
delete this._config[target.configValue!]; delete this._config[target.configValue!];
} else { } else {
let value: any = target.value; let value: any = target.value;

View File

@@ -17,6 +17,7 @@ import "../../../../components/ha-switch";
import "../../../../components/ha-formfield"; import "../../../../components/ha-formfield";
import { HomeAssistant } from "../../../../types"; import { HomeAssistant } from "../../../../types";
import { ConfigEntity, GlanceCardConfig } from "../../cards/types"; import { ConfigEntity, GlanceCardConfig } from "../../cards/types";
import { struct } from "../../common/structs/struct";
import "../../components/hui-entity-editor"; import "../../components/hui-entity-editor";
import "../../components/hui-theme-select-editor"; import "../../components/hui-theme-select-editor";
import { LovelaceCardEditor } from "../../types"; import { LovelaceCardEditor } from "../../types";
@@ -28,26 +29,16 @@ import {
} from "../types"; } from "../types";
import { configElementStyle } from "./config-elements-style"; import { configElementStyle } from "./config-elements-style";
import { computeRTLDirection } from "../../../../common/util/compute_rtl"; import { computeRTLDirection } from "../../../../common/util/compute_rtl";
import {
string,
union,
object,
optional,
number,
boolean,
assert,
array,
} from "superstruct";
const cardConfigStruct = object({ const cardConfigStruct = struct({
type: string(), type: "string",
title: optional(union([string(), number()])), title: "string|number?",
theme: optional(string()), theme: "string?",
columns: optional(number()), columns: "number?",
show_name: optional(boolean()), show_name: "boolean?",
show_state: optional(boolean()), show_state: "boolean?",
show_icon: optional(boolean()), show_icon: "boolean?",
entities: array(entitiesConfigStruct), entities: [entitiesConfigStruct],
}); });
@customElement("hui-glance-card-editor") @customElement("hui-glance-card-editor")
@@ -60,7 +51,7 @@ export class HuiGlanceCardEditor extends LitElement
@internalProperty() private _configEntities?: ConfigEntity[]; @internalProperty() private _configEntities?: ConfigEntity[];
public setConfig(config: GlanceCardConfig): void { public setConfig(config: GlanceCardConfig): void {
assert(config, cardConfigStruct); config = cardConfigStruct(config);
this._config = config; this._config = config;
this._configEntities = processEditorEntities(config.entities); this._configEntities = processEditorEntities(config.entities);
} }
@@ -193,15 +184,13 @@ export class HuiGlanceCardEditor extends LitElement
return; return;
} }
if (ev.detail && ev.detail.entities) { if (ev.detail && ev.detail.entities) {
this._config = { ...this._config, entities: ev.detail.entities }; this._config.entities = ev.detail.entities;
this._configEntities = processEditorEntities(this._config.entities); this._configEntities = processEditorEntities(this._config.entities);
} else if (target.configValue) { } else if (target.configValue) {
if ( if (
target.value === "" || target.value === "" ||
(target.type === "number" && isNaN(Number(target.value))) (target.type === "number" && isNaN(Number(target.value)))
) { ) {
this._config = { ...this._config };
delete this._config[target.configValue!]; delete this._config[target.configValue!];
} else { } else {
let value: any = target.value; let value: any = target.value;

View File

@@ -10,37 +10,28 @@ import {
import { fireEvent } from "../../../../common/dom/fire_event"; import { fireEvent } from "../../../../common/dom/fire_event";
import { HomeAssistant } from "../../../../types"; import { HomeAssistant } from "../../../../types";
import { HistoryGraphCardConfig } from "../../cards/types"; import { HistoryGraphCardConfig } from "../../cards/types";
import { struct } from "../../common/structs/struct";
import "../../components/hui-entity-editor"; import "../../components/hui-entity-editor";
import { EntityConfig } from "../../entity-rows/types"; import { EntityConfig } from "../../entity-rows/types";
import { LovelaceCardEditor } from "../../types"; import { LovelaceCardEditor } from "../../types";
import { processEditorEntities } from "../process-editor-entities"; import { processEditorEntities } from "../process-editor-entities";
import { EditorTarget, EntitiesEditorEvent } from "../types"; import { EditorTarget, EntitiesEditorEvent } from "../types";
import { configElementStyle } from "./config-elements-style"; import { configElementStyle } from "./config-elements-style";
import {
assert,
union,
optional,
string,
object,
array,
number,
} from "superstruct";
import { EntityId } from "../../common/structs/is-entity-id";
const entitiesConfigStruct = union([ const entitiesConfigStruct = struct.union([
object({ {
entity: EntityId, entity: "entity-id",
name: optional(string()), name: "string?",
}), },
EntityId, "entity-id",
]); ]);
const cardConfigStruct = object({ const cardConfigStruct = struct({
type: string(), type: "string",
entities: array(entitiesConfigStruct), entities: [entitiesConfigStruct],
title: optional(string()), title: "string?",
hours_to_show: optional(number()), hours_to_show: "number?",
refresh_interval: optional(number()), refresh_interval: "number?",
}); });
@customElement("hui-history-graph-card-editor") @customElement("hui-history-graph-card-editor")
@@ -53,7 +44,7 @@ export class HuiHistoryGraphCardEditor extends LitElement
@internalProperty() private _configEntities?: EntityConfig[]; @internalProperty() private _configEntities?: EntityConfig[];
public setConfig(config: HistoryGraphCardConfig): void { public setConfig(config: HistoryGraphCardConfig): void {
assert(config, cardConfigStruct); config = cardConfigStruct(config);
this._config = config; this._config = config;
this._configEntities = processEditorEntities(config.entities); this._configEntities = processEditorEntities(config.entities);
} }
@@ -136,11 +127,10 @@ export class HuiHistoryGraphCardEditor extends LitElement
} }
if (ev.detail && ev.detail.entities) { if (ev.detail && ev.detail.entities) {
this._config = { ...this._config, entities: ev.detail.entities }; this._config.entities = ev.detail.entities;
this._configEntities = processEditorEntities(this._config.entities); this._configEntities = processEditorEntities(this._config.entities);
} else if (target.configValue) { } else if (target.configValue) {
if (target.value === "") { if (target.value === "") {
this._config = { ...this._config };
delete this._config[target.configValue!]; delete this._config[target.configValue!];
} else { } else {
let value: any = target.value; let value: any = target.value;

View File

@@ -11,17 +11,17 @@ import { fireEvent } from "../../../../common/dom/fire_event";
import "../../../../components/entity/ha-entity-picker"; import "../../../../components/entity/ha-entity-picker";
import { HomeAssistant } from "../../../../types"; import { HomeAssistant } from "../../../../types";
import { HumidifierCardConfig } from "../../cards/types"; import { HumidifierCardConfig } from "../../cards/types";
import { struct } from "../../common/structs/struct";
import "../../components/hui-theme-select-editor"; import "../../components/hui-theme-select-editor";
import { LovelaceCardEditor } from "../../types"; import { LovelaceCardEditor } from "../../types";
import { EditorTarget, EntitiesEditorEvent } from "../types"; import { EditorTarget, EntitiesEditorEvent } from "../types";
import { configElementStyle } from "./config-elements-style"; import { configElementStyle } from "./config-elements-style";
import { string, object, optional, assert } from "superstruct";
const cardConfigStruct = object({ const cardConfigStruct = struct({
type: string(), type: "string",
entity: string(), entity: "string",
name: optional(string()), name: "string?",
theme: optional(string()), theme: "string?",
}); });
const includeDomains = ["humidifier"]; const includeDomains = ["humidifier"];
@@ -34,7 +34,7 @@ export class HuiHumidifierCardEditor extends LitElement
@internalProperty() private _config?: HumidifierCardConfig; @internalProperty() private _config?: HumidifierCardConfig;
public setConfig(config: HumidifierCardConfig): void { public setConfig(config: HumidifierCardConfig): void {
assert(config, cardConfigStruct); config = cardConfigStruct(config);
this._config = config; this._config = config;
} }
@@ -102,7 +102,6 @@ export class HuiHumidifierCardEditor extends LitElement
} }
if (target.configValue) { if (target.configValue) {
if (target.value === "") { if (target.value === "") {
this._config = { ...this._config };
delete this._config[target.configValue!]; delete this._config[target.configValue!];
} else { } else {
this._config = { ...this._config, [target.configValue!]: target.value }; this._config = { ...this._config, [target.configValue!]: target.value };

View File

@@ -10,16 +10,16 @@ import {
import { fireEvent } from "../../../../common/dom/fire_event"; import { fireEvent } from "../../../../common/dom/fire_event";
import { HomeAssistant } from "../../../../types"; import { HomeAssistant } from "../../../../types";
import { IframeCardConfig } from "../../cards/types"; import { IframeCardConfig } from "../../cards/types";
import { struct } from "../../common/structs/struct";
import { LovelaceCardEditor } from "../../types"; import { LovelaceCardEditor } from "../../types";
import { EditorTarget, EntitiesEditorEvent } from "../types"; import { EditorTarget, EntitiesEditorEvent } from "../types";
import { configElementStyle } from "./config-elements-style"; import { configElementStyle } from "./config-elements-style";
import { string, assert, object, optional } from "superstruct";
const cardConfigStruct = object({ const cardConfigStruct = struct({
type: string(), type: "string",
title: optional(string()), title: "string?",
url: optional(string()), url: "string?",
aspect_ratio: optional(string()), aspect_ratio: "string?",
}); });
@customElement("hui-iframe-card-editor") @customElement("hui-iframe-card-editor")
@@ -30,7 +30,7 @@ export class HuiIframeCardEditor extends LitElement
@internalProperty() private _config?: IframeCardConfig; @internalProperty() private _config?: IframeCardConfig;
public setConfig(config: IframeCardConfig): void { public setConfig(config: IframeCardConfig): void {
assert(config, cardConfigStruct); config = cardConfigStruct(config);
this._config = config; this._config = config;
} }
@@ -102,7 +102,6 @@ export class HuiIframeCardEditor extends LitElement
} }
if (target.configValue) { if (target.configValue) {
if (value === "") { if (value === "") {
this._config = { ...this._config };
delete this._config[target.configValue!]; delete this._config[target.configValue!];
} else { } else {
this._config = { ...this._config, [target.configValue!]: value }; this._config = { ...this._config, [target.configValue!]: value };

View File

@@ -13,6 +13,7 @@ import "../../../../components/ha-icon-input";
import { ActionConfig } from "../../../../data/lovelace"; import { ActionConfig } from "../../../../data/lovelace";
import { HomeAssistant } from "../../../../types"; import { HomeAssistant } from "../../../../types";
import { LightCardConfig } from "../../cards/types"; import { LightCardConfig } from "../../cards/types";
import { struct } from "../../common/structs/struct";
import "../../components/hui-action-editor"; import "../../components/hui-action-editor";
import "../../components/hui-entity-editor"; import "../../components/hui-entity-editor";
import "../../components/hui-theme-select-editor"; import "../../components/hui-theme-select-editor";
@@ -23,16 +24,15 @@ import {
EntitiesEditorEvent, EntitiesEditorEvent,
} from "../types"; } from "../types";
import { configElementStyle } from "./config-elements-style"; import { configElementStyle } from "./config-elements-style";
import { string, object, optional, assert } from "superstruct";
const cardConfigStruct = object({ const cardConfigStruct = struct({
type: string(), type: "string",
name: optional(string()), name: "string?",
entity: optional(string()), entity: "string?",
theme: optional(string()), theme: "string?",
icon: optional(string()), icon: "string?",
hold_action: optional(actionConfigStruct), hold_action: struct.optional(actionConfigStruct),
double_tap_action: optional(actionConfigStruct), double_tap_action: struct.optional(actionConfigStruct),
}); });
const includeDomains = ["light"]; const includeDomains = ["light"];
@@ -45,8 +45,7 @@ export class HuiLightCardEditor extends LitElement
@internalProperty() private _config?: LightCardConfig; @internalProperty() private _config?: LightCardConfig;
public setConfig(config: LightCardConfig): void { public setConfig(config: LightCardConfig): void {
assert(config, cardConfigStruct); this._config = cardConfigStruct(config);
this._config = config;
} }
get _name(): string { get _name(): string {
@@ -178,7 +177,6 @@ export class HuiLightCardEditor extends LitElement
} }
if (target.configValue) { if (target.configValue) {
if (target.value === "") { if (target.value === "") {
this._config = { ...this._config };
delete this._config[target.configValue!]; delete this._config[target.configValue!];
} else { } else {
this._config = { this._config = {

View File

@@ -13,6 +13,7 @@ import { fireEvent } from "../../../../common/dom/fire_event";
import { PolymerChangedEvent } from "../../../../polymer-types"; import { PolymerChangedEvent } from "../../../../polymer-types";
import { HomeAssistant } from "../../../../types"; import { HomeAssistant } from "../../../../types";
import { MapCardConfig } from "../../cards/types"; import { MapCardConfig } from "../../cards/types";
import { struct } from "../../common/structs/struct";
import "../../components/hui-entity-editor"; import "../../components/hui-entity-editor";
import "../../components/hui-input-list-editor"; import "../../components/hui-input-list-editor";
import { EntityConfig } from "../../entity-rows/types"; import { EntityConfig } from "../../entity-rows/types";
@@ -27,25 +28,16 @@ import "../../../../components/ha-switch";
import "../../../../components/ha-formfield"; import "../../../../components/ha-formfield";
import { configElementStyle } from "./config-elements-style"; import { configElementStyle } from "./config-elements-style";
import { computeRTLDirection } from "../../../../common/util/compute_rtl"; import { computeRTLDirection } from "../../../../common/util/compute_rtl";
import {
string,
optional,
object,
number,
boolean,
array,
assert,
} from "superstruct";
const cardConfigStruct = object({ const cardConfigStruct = struct({
type: string(), type: "string",
title: optional(string()), title: "string?",
aspect_ratio: optional(string()), aspect_ratio: "string?",
default_zoom: optional(number()), default_zoom: "number?",
dark_mode: optional(boolean()), dark_mode: "boolean?",
entities: array(entitiesConfigStruct), entities: [entitiesConfigStruct],
hours_to_show: optional(number()), hours_to_show: "number?",
geo_location_sources: optional(array()), geo_location_sources: "array?",
}); });
@customElement("hui-map-card-editor") @customElement("hui-map-card-editor")
@@ -57,7 +49,7 @@ export class HuiMapCardEditor extends LitElement implements LovelaceCardEditor {
@internalProperty() private _configEntities?: EntityConfig[]; @internalProperty() private _configEntities?: EntityConfig[];
public setConfig(config: MapCardConfig): void { public setConfig(config: MapCardConfig): void {
assert(config, cardConfigStruct); config = cardConfigStruct(config);
this._config = config; this._config = config;
this._configEntities = config.entities this._configEntities = config.entities
? processEditorEntities(config.entities) ? processEditorEntities(config.entities)
@@ -184,8 +176,7 @@ export class HuiMapCardEditor extends LitElement implements LovelaceCardEditor {
return; return;
} }
if (ev.detail && ev.detail.entities) { if (ev.detail && ev.detail.entities) {
this._config = { ...this._config, entities: ev.detail.entities }; this._config.entities = ev.detail.entities;
this._configEntities = processEditorEntities(this._config.entities); this._configEntities = processEditorEntities(this._config.entities);
fireEvent(this, "config-changed", { config: this._config }); fireEvent(this, "config-changed", { config: this._config });
} }
@@ -204,7 +195,6 @@ export class HuiMapCardEditor extends LitElement implements LovelaceCardEditor {
value = Number(value); value = Number(value);
} }
if (target.value === "" || (target.type === "number" && isNaN(value))) { if (target.value === "" || (target.type === "number" && isNaN(value))) {
this._config = { ...this._config };
delete this._config[target.configValue!]; delete this._config[target.configValue!];
} else if (target.configValue) { } else if (target.configValue) {
this._config = { this._config = {

View File

@@ -11,17 +11,17 @@ import {
import { fireEvent } from "../../../../common/dom/fire_event"; import { fireEvent } from "../../../../common/dom/fire_event";
import { HomeAssistant } from "../../../../types"; import { HomeAssistant } from "../../../../types";
import { MarkdownCardConfig } from "../../cards/types"; import { MarkdownCardConfig } from "../../cards/types";
import { struct } from "../../common/structs/struct";
import "../../components/hui-theme-select-editor"; import "../../components/hui-theme-select-editor";
import { LovelaceCardEditor } from "../../types"; import { LovelaceCardEditor } from "../../types";
import { EditorTarget, EntitiesEditorEvent } from "../types"; import { EditorTarget, EntitiesEditorEvent } from "../types";
import { configElementStyle } from "./config-elements-style"; import { configElementStyle } from "./config-elements-style";
import { string, assert, object, optional } from "superstruct";
const cardConfigStruct = object({ const cardConfigStruct = struct({
type: string(), type: "string",
title: optional(string()), title: "string?",
content: string(), content: "string",
theme: optional(string()), theme: "string?",
}); });
@customElement("hui-markdown-card-editor") @customElement("hui-markdown-card-editor")
@@ -32,7 +32,7 @@ export class HuiMarkdownCardEditor extends LitElement
@internalProperty() private _config?: MarkdownCardConfig; @internalProperty() private _config?: MarkdownCardConfig;
public setConfig(config: MarkdownCardConfig): void { public setConfig(config: MarkdownCardConfig): void {
assert(config, cardConfigStruct); config = cardConfigStruct(config);
this._config = config; this._config = config;
} }
@@ -100,7 +100,6 @@ export class HuiMarkdownCardEditor extends LitElement
} }
if (target.configValue) { if (target.configValue) {
if (target.value === "" && target.configValue !== "content") { if (target.value === "" && target.configValue !== "content") {
this._config = { ...this._config };
delete this._config[target.configValue!]; delete this._config[target.configValue!];
} else { } else {
this._config = { this._config = {

View File

@@ -10,13 +10,13 @@ import { fireEvent } from "../../../../common/dom/fire_event";
import "../../../../components/entity/ha-entity-picker"; import "../../../../components/entity/ha-entity-picker";
import { HomeAssistant } from "../../../../types"; import { HomeAssistant } from "../../../../types";
import { MediaControlCardConfig } from "../../cards/types"; import { MediaControlCardConfig } from "../../cards/types";
import { struct } from "../../common/structs/struct";
import { LovelaceCardEditor } from "../../types"; import { LovelaceCardEditor } from "../../types";
import { EditorTarget, EntitiesEditorEvent } from "../types"; import { EditorTarget, EntitiesEditorEvent } from "../types";
import { assert, object, string, optional } from "superstruct";
const cardConfigStruct = object({ const cardConfigStruct = struct({
type: string(), type: "string",
entity: optional(string()), entity: "string?",
}); });
const includeDomains = ["media_player"]; const includeDomains = ["media_player"];
@@ -29,7 +29,7 @@ export class HuiMediaControlCardEditor extends LitElement
@internalProperty() private _config?: MediaControlCardConfig; @internalProperty() private _config?: MediaControlCardConfig;
public setConfig(config: MediaControlCardConfig): void { public setConfig(config: MediaControlCardConfig): void {
assert(config, cardConfigStruct); config = cardConfigStruct(config);
this._config = config; this._config = config;
} }
@@ -71,7 +71,6 @@ export class HuiMediaControlCardEditor extends LitElement
} }
if (target.configValue) { if (target.configValue) {
if (target.value === "") { if (target.value === "") {
this._config = { ...this._config };
delete this._config[target.configValue!]; delete this._config[target.configValue!];
} else { } else {
this._config = { this._config = {

View File

@@ -11,6 +11,7 @@ import { fireEvent } from "../../../../common/dom/fire_event";
import { ActionConfig } from "../../../../data/lovelace"; import { ActionConfig } from "../../../../data/lovelace";
import { HomeAssistant } from "../../../../types"; import { HomeAssistant } from "../../../../types";
import { PictureCardConfig } from "../../cards/types"; import { PictureCardConfig } from "../../cards/types";
import { struct } from "../../common/structs/struct";
import "../../components/hui-action-editor"; import "../../components/hui-action-editor";
import "../../components/hui-theme-select-editor"; import "../../components/hui-theme-select-editor";
import { LovelaceCardEditor } from "../../types"; import { LovelaceCardEditor } from "../../types";
@@ -20,14 +21,13 @@ import {
EntitiesEditorEvent, EntitiesEditorEvent,
} from "../types"; } from "../types";
import { configElementStyle } from "./config-elements-style"; import { configElementStyle } from "./config-elements-style";
import { string, object, optional, assert } from "superstruct";
const cardConfigStruct = object({ const cardConfigStruct = struct({
type: string(), type: "string",
image: optional(string()), image: "string?",
tap_action: optional(actionConfigStruct), tap_action: struct.optional(actionConfigStruct),
hold_action: optional(actionConfigStruct), hold_action: struct.optional(actionConfigStruct),
theme: optional(string()), theme: "string?",
}); });
@customElement("hui-picture-card-editor") @customElement("hui-picture-card-editor")
@@ -38,7 +38,7 @@ export class HuiPictureCardEditor extends LitElement
@internalProperty() private _config?: PictureCardConfig; @internalProperty() private _config?: PictureCardConfig;
public setConfig(config: PictureCardConfig): void { public setConfig(config: PictureCardConfig): void {
assert(config, cardConfigStruct); config = cardConfigStruct(config);
this._config = config; this._config = config;
} }
@@ -128,7 +128,6 @@ export class HuiPictureCardEditor extends LitElement
} }
if (target.configValue) { if (target.configValue) {
if (target.value === "") { if (target.value === "") {
this._config = { ...this._config };
delete this._config[target.configValue!]; delete this._config[target.configValue!];
} else { } else {
this._config = { this._config = {

View File

@@ -16,6 +16,7 @@ import "../../../../components/ha-formfield";
import { ActionConfig } from "../../../../data/lovelace"; import { ActionConfig } from "../../../../data/lovelace";
import { HomeAssistant } from "../../../../types"; import { HomeAssistant } from "../../../../types";
import { PictureEntityCardConfig } from "../../cards/types"; import { PictureEntityCardConfig } from "../../cards/types";
import { struct } from "../../common/structs/struct";
import "../../components/hui-action-editor"; import "../../components/hui-action-editor";
import "../../components/hui-entity-editor"; import "../../components/hui-entity-editor";
import "../../components/hui-theme-select-editor"; import "../../components/hui-theme-select-editor";
@@ -27,21 +28,20 @@ import {
} from "../types"; } from "../types";
import { configElementStyle } from "./config-elements-style"; import { configElementStyle } from "./config-elements-style";
import { computeRTLDirection } from "../../../../common/util/compute_rtl"; import { computeRTLDirection } from "../../../../common/util/compute_rtl";
import { assert, object, string, optional, boolean } from "superstruct";
const cardConfigStruct = object({ const cardConfigStruct = struct({
type: string(), type: "string",
entity: string(), entity: "string",
image: optional(string()), image: "string?",
name: optional(string()), name: "string?",
camera_image: optional(string()), camera_image: "string?",
camera_view: optional(string()), camera_view: "string?",
aspect_ratio: optional(string()), aspect_ratio: "string?",
tap_action: optional(actionConfigStruct), tap_action: struct.optional(actionConfigStruct),
hold_action: optional(actionConfigStruct), hold_action: struct.optional(actionConfigStruct),
show_name: optional(boolean()), show_name: "boolean?",
show_state: optional(boolean()), show_state: "boolean?",
theme: optional(string()), theme: "string?",
}); });
const includeDomains = ["camera"]; const includeDomains = ["camera"];
@@ -54,7 +54,7 @@ export class HuiPictureEntityCardEditor extends LitElement
@internalProperty() private _config?: PictureEntityCardConfig; @internalProperty() private _config?: PictureEntityCardConfig;
public setConfig(config: PictureEntityCardConfig): void { public setConfig(config: PictureEntityCardConfig): void {
assert(config, cardConfigStruct); config = cardConfigStruct(config);
this._config = config; this._config = config;
} }
@@ -275,7 +275,6 @@ export class HuiPictureEntityCardEditor extends LitElement
} }
if (target.configValue) { if (target.configValue) {
if (value === "") { if (value === "") {
this._config = { ...this._config };
delete this._config[target.configValue!]; delete this._config[target.configValue!];
} else { } else {
this._config = { this._config = {

View File

@@ -15,6 +15,7 @@ import "../../../../components/entity/ha-entity-picker";
import { ActionConfig } from "../../../../data/lovelace"; import { ActionConfig } from "../../../../data/lovelace";
import { HomeAssistant } from "../../../../types"; import { HomeAssistant } from "../../../../types";
import { PictureGlanceCardConfig } from "../../cards/types"; import { PictureGlanceCardConfig } from "../../cards/types";
import { struct } from "../../common/structs/struct";
import "../../components/hui-action-editor"; import "../../components/hui-action-editor";
import "../../components/hui-entity-editor"; import "../../components/hui-entity-editor";
import "../../components/hui-theme-select-editor"; import "../../components/hui-theme-select-editor";
@@ -28,20 +29,19 @@ import {
EntitiesEditorEvent, EntitiesEditorEvent,
} from "../types"; } from "../types";
import { configElementStyle } from "./config-elements-style"; import { configElementStyle } from "./config-elements-style";
import { assert, string, object, optional, array } from "superstruct";
const cardConfigStruct = object({ const cardConfigStruct = struct({
type: string(), type: "string",
title: optional(string()), title: "string?",
entity: optional(string()), entity: "string?",
image: optional(string()), image: "string?",
camera_image: optional(string()), camera_image: "string?",
camera_view: optional(string()), camera_view: "string?",
aspect_ratio: optional(string()), aspect_ratio: "string?",
tap_action: optional(actionConfigStruct), tap_action: struct.optional(actionConfigStruct),
hold_action: optional(actionConfigStruct), hold_action: struct.optional(actionConfigStruct),
entities: array(entitiesConfigStruct), entities: [entitiesConfigStruct],
theme: optional(string()), theme: "string?",
}); });
const includeDomains = ["camera"]; const includeDomains = ["camera"];
@@ -56,7 +56,7 @@ export class HuiPictureGlanceCardEditor extends LitElement
@internalProperty() private _configEntities?: EntityConfig[]; @internalProperty() private _configEntities?: EntityConfig[];
public setConfig(config: PictureGlanceCardConfig): void { public setConfig(config: PictureGlanceCardConfig): void {
assert(config, cardConfigStruct); config = cardConfigStruct(config);
this._config = config; this._config = config;
this._configEntities = processEditorEntities(config.entities); this._configEntities = processEditorEntities(config.entities);
} }
@@ -251,8 +251,7 @@ export class HuiPictureGlanceCardEditor extends LitElement
} }
if (ev.detail && ev.detail.entities) { if (ev.detail && ev.detail.entities) {
this._config = { ...this._config, entities: ev.detail.entities }; this._config.entities = ev.detail.entities;
this._configEntities = processEditorEntities(this._config.entities); this._configEntities = processEditorEntities(this._config.entities);
} else if (target.configValue) { } else if (target.configValue) {
if ( if (
@@ -263,7 +262,6 @@ export class HuiPictureGlanceCardEditor extends LitElement
} }
if (value === "") { if (value === "") {
this._config = { ...this._config };
delete this._config[target.configValue!]; delete this._config[target.configValue!];
} else { } else {
this._config = { this._config = {

View File

@@ -12,17 +12,17 @@ import "../../../../components/entity/ha-entity-picker";
import "../../../../components/ha-icon"; import "../../../../components/ha-icon";
import { HomeAssistant } from "../../../../types"; import { HomeAssistant } from "../../../../types";
import { PlantStatusCardConfig } from "../../cards/types"; import { PlantStatusCardConfig } from "../../cards/types";
import { struct } from "../../common/structs/struct";
import "../../components/hui-theme-select-editor"; import "../../components/hui-theme-select-editor";
import { LovelaceCardEditor } from "../../types"; import { LovelaceCardEditor } from "../../types";
import { EditorTarget, EntitiesEditorEvent } from "../types"; import { EditorTarget, EntitiesEditorEvent } from "../types";
import { configElementStyle } from "./config-elements-style"; import { configElementStyle } from "./config-elements-style";
import { assert, object, string, optional } from "superstruct";
const cardConfigStruct = object({ const cardConfigStruct = struct({
type: string(), type: "string",
entity: string(), entity: "string",
name: optional(string()), name: "string?",
theme: optional(string()), theme: "string?",
}); });
const includeDomains = ["plant"]; const includeDomains = ["plant"];
@@ -35,7 +35,7 @@ export class HuiPlantStatusCardEditor extends LitElement
@internalProperty() private _config?: PlantStatusCardConfig; @internalProperty() private _config?: PlantStatusCardConfig;
public setConfig(config: PlantStatusCardConfig): void { public setConfig(config: PlantStatusCardConfig): void {
assert(config, cardConfigStruct); config = cardConfigStruct(config);
this._config = config; this._config = config;
} }
@@ -102,7 +102,6 @@ export class HuiPlantStatusCardEditor extends LitElement
} }
if (target.configValue) { if (target.configValue) {
if (target.value === "") { if (target.value === "") {
this._config = { ...this._config };
delete this._config[target.configValue!]; delete this._config[target.configValue!];
} else { } else {
this._config = { this._config = {

View File

@@ -16,22 +16,22 @@ import "../../../../components/entity/ha-entity-picker";
import "../../../../components/ha-icon-input"; import "../../../../components/ha-icon-input";
import { HomeAssistant } from "../../../../types"; import { HomeAssistant } from "../../../../types";
import { SensorCardConfig } from "../../cards/types"; import { SensorCardConfig } from "../../cards/types";
import { struct } from "../../common/structs/struct";
import "../../components/hui-theme-select-editor"; import "../../components/hui-theme-select-editor";
import { LovelaceCardEditor } from "../../types"; import { LovelaceCardEditor } from "../../types";
import { EditorTarget, EntitiesEditorEvent } from "../types"; import { EditorTarget, EntitiesEditorEvent } from "../types";
import { configElementStyle } from "./config-elements-style"; import { configElementStyle } from "./config-elements-style";
import { string, assert, object, optional, number } from "superstruct";
const cardConfigStruct = object({ const cardConfigStruct = struct({
type: string(), type: "string",
entity: optional(string()), entity: "string?",
name: optional(string()), name: "string?",
icon: optional(string()), icon: "string?",
graph: optional(string()), graph: "string?",
unit: optional(string()), unit: "string?",
detail: optional(number()), detail: "number?",
theme: optional(string()), theme: "string?",
hours_to_show: optional(number()), hours_to_show: "number?",
}); });
const includeDomains = ["sensor"]; const includeDomains = ["sensor"];
@@ -44,7 +44,7 @@ export class HuiSensorCardEditor extends LitElement
@internalProperty() private _config?: SensorCardConfig; @internalProperty() private _config?: SensorCardConfig;
public setConfig(config: SensorCardConfig): void { public setConfig(config: SensorCardConfig): void {
assert(config, cardConfigStruct); config = cardConfigStruct(config);
this._config = config; this._config = config;
} }
@@ -205,7 +205,6 @@ export class HuiSensorCardEditor extends LitElement
target.value === "" || target.value === "" ||
(target.type === "number" && isNaN(Number(target.value))) (target.type === "number" && isNaN(Number(target.value)))
) { ) {
this._config = { ...this._config };
delete this._config[target.configValue!]; delete this._config[target.configValue!];
} else { } else {
let value: any = target.value; let value: any = target.value;

View File

@@ -13,15 +13,15 @@ import { isComponentLoaded } from "../../../../common/config/is_component_loaded
import { fireEvent } from "../../../../common/dom/fire_event"; import { fireEvent } from "../../../../common/dom/fire_event";
import { HomeAssistant } from "../../../../types"; import { HomeAssistant } from "../../../../types";
import { ShoppingListCardConfig } from "../../cards/types"; import { ShoppingListCardConfig } from "../../cards/types";
import { struct } from "../../common/structs/struct";
import "../../components/hui-theme-select-editor"; import "../../components/hui-theme-select-editor";
import { LovelaceCardEditor } from "../../types"; import { LovelaceCardEditor } from "../../types";
import { EditorTarget, EntitiesEditorEvent } from "../types"; import { EditorTarget, EntitiesEditorEvent } from "../types";
import { string, assert, object, optional } from "superstruct";
const cardConfigStruct = object({ const cardConfigStruct = struct({
type: string(), type: "string",
title: optional(string()), title: "string?",
theme: optional(string()), theme: "string?",
}); });
@customElement("hui-shopping-list-card-editor") @customElement("hui-shopping-list-card-editor")
@@ -32,7 +32,7 @@ export class HuiShoppingListEditor extends LitElement
@internalProperty() private _config?: ShoppingListCardConfig; @internalProperty() private _config?: ShoppingListCardConfig;
public setConfig(config: ShoppingListCardConfig): void { public setConfig(config: ShoppingListCardConfig): void {
assert(config, cardConfigStruct); config = cardConfigStruct(config);
this._config = config; this._config = config;
} }
@@ -91,7 +91,6 @@ export class HuiShoppingListEditor extends LitElement
} }
if (target.configValue) { if (target.configValue) {
if (target.value === "") { if (target.value === "") {
this._config = { ...this._config };
delete this._config[target.configValue!]; delete this._config[target.configValue!];
} else { } else {
this._config = { this._config = {

View File

@@ -16,6 +16,7 @@ import { fireEvent, HASSDomEvent } from "../../../../common/dom/fire_event";
import { LovelaceConfig } from "../../../../data/lovelace"; import { LovelaceConfig } from "../../../../data/lovelace";
import { HomeAssistant } from "../../../../types"; import { HomeAssistant } from "../../../../types";
import { StackCardConfig } from "../../cards/types"; import { StackCardConfig } from "../../cards/types";
import { struct } from "../../common/structs/struct";
import { LovelaceCardEditor } from "../../types"; import { LovelaceCardEditor } from "../../types";
import { import {
ConfigChangedEvent, ConfigChangedEvent,
@@ -23,12 +24,11 @@ import {
} from "../card-editor/hui-card-editor"; } from "../card-editor/hui-card-editor";
import "../card-editor/hui-card-picker"; import "../card-editor/hui-card-picker";
import { GUIModeChangedEvent } from "../types"; import { GUIModeChangedEvent } from "../types";
import { assert, object, string, array, any, optional } from "superstruct";
const cardConfigStruct = object({ const cardConfigStruct = struct({
type: string(), type: "string",
cards: array(any()), cards: ["any"],
title: optional(string()), title: "string?",
}); });
@customElement("hui-stack-card-editor") @customElement("hui-stack-card-editor")
@@ -48,9 +48,8 @@ export class HuiStackCardEditor extends LitElement
@query("hui-card-editor") private _cardEditorEl?: HuiCardEditor; @query("hui-card-editor") private _cardEditorEl?: HuiCardEditor;
public setConfig(config: Readonly<StackCardConfig>): void { public setConfig(config: StackCardConfig): void {
assert(config, cardConfigStruct); this._config = cardConfigStruct(config);
this._config = config;
} }
public refreshYamlEditor(focus) { public refreshYamlEditor(focus) {
@@ -163,9 +162,7 @@ export class HuiStackCardEditor extends LitElement
if (!this._config) { if (!this._config) {
return; return;
} }
const cards = [...this._config.cards]; this._config.cards[this._selectedCard] = ev.detail.config;
cards[this._selectedCard] = ev.detail.config;
this._config = { ...this._config, cards };
this._guiModeAvailable = ev.detail.guiModeAvailable; this._guiModeAvailable = ev.detail.guiModeAvailable;
fireEvent(this, "config-changed", { config: this._config }); fireEvent(this, "config-changed", { config: this._config });
} }
@@ -176,8 +173,7 @@ export class HuiStackCardEditor extends LitElement
return; return;
} }
const config = ev.detail.config; const config = ev.detail.config;
const cards = [...this._config.cards, config]; this._config.cards.push(config);
this._config = { ...this._config, cards };
fireEvent(this, "config-changed", { config: this._config }); fireEvent(this, "config-changed", { config: this._config });
} }
@@ -185,9 +181,7 @@ export class HuiStackCardEditor extends LitElement
if (!this._config) { if (!this._config) {
return; return;
} }
const cards = [...this._config.cards]; this._config.cards.splice(this._selectedCard, 1);
cards.splice(this._selectedCard, 1);
this._config = { ...this._config, cards };
this._selectedCard = Math.max(0, this._selectedCard - 1); this._selectedCard = Math.max(0, this._selectedCard - 1);
fireEvent(this, "config-changed", { config: this._config }); fireEvent(this, "config-changed", { config: this._config });
} }
@@ -198,13 +192,8 @@ export class HuiStackCardEditor extends LitElement
} }
const source = this._selectedCard; const source = this._selectedCard;
const target = ev.target.id === "move-before" ? source - 1 : source + 1; const target = ev.target.id === "move-before" ? source - 1 : source + 1;
const cards = [...this._config.cards]; const card = this._config.cards.splice(this._selectedCard, 1)[0];
const card = cards.splice(this._selectedCard, 1)[0]; this._config.cards.splice(target, 0, card);
cards.splice(target, 0, card);
this._config = {
...this._config,
cards,
};
this._selectedCard = target; this._selectedCard = target;
fireEvent(this, "config-changed", { config: this._config }); fireEvent(this, "config-changed", { config: this._config });
} }

View File

@@ -11,17 +11,17 @@ import { fireEvent } from "../../../../common/dom/fire_event";
import "../../../../components/entity/ha-entity-picker"; import "../../../../components/entity/ha-entity-picker";
import { HomeAssistant } from "../../../../types"; import { HomeAssistant } from "../../../../types";
import { ThermostatCardConfig } from "../../cards/types"; import { ThermostatCardConfig } from "../../cards/types";
import { struct } from "../../common/structs/struct";
import "../../components/hui-theme-select-editor"; import "../../components/hui-theme-select-editor";
import { LovelaceCardEditor } from "../../types"; import { LovelaceCardEditor } from "../../types";
import { EditorTarget, EntitiesEditorEvent } from "../types"; import { EditorTarget, EntitiesEditorEvent } from "../types";
import { configElementStyle } from "./config-elements-style"; import { configElementStyle } from "./config-elements-style";
import { object, string, optional, assert } from "superstruct";
const cardConfigStruct = object({ const cardConfigStruct = struct({
type: string(), type: "string",
entity: string(), entity: "string",
name: optional(string()), name: "string?",
theme: optional(string()), theme: "string?",
}); });
const includeDomains = ["climate"]; const includeDomains = ["climate"];
@@ -34,7 +34,7 @@ export class HuiThermostatCardEditor extends LitElement
@internalProperty() private _config?: ThermostatCardConfig; @internalProperty() private _config?: ThermostatCardConfig;
public setConfig(config: ThermostatCardConfig): void { public setConfig(config: ThermostatCardConfig): void {
assert(config, cardConfigStruct); config = cardConfigStruct(config);
this._config = config; this._config = config;
} }
@@ -102,7 +102,6 @@ export class HuiThermostatCardEditor extends LitElement
} }
if (target.configValue) { if (target.configValue) {
if (target.value === "") { if (target.value === "") {
this._config = { ...this._config };
delete this._config[target.configValue!]; delete this._config[target.configValue!];
} else { } else {
this._config = { ...this._config, [target.configValue!]: target.value }; this._config = { ...this._config, [target.configValue!]: target.value };

View File

@@ -12,20 +12,20 @@ import "../../../../components/ha-switch";
import "../../../../components/ha-formfield"; import "../../../../components/ha-formfield";
import { HomeAssistant } from "../../../../types"; import { HomeAssistant } from "../../../../types";
import { WeatherForecastCardConfig } from "../../cards/types"; import { WeatherForecastCardConfig } from "../../cards/types";
import { struct } from "../../common/structs/struct";
import "../../components/hui-theme-select-editor"; import "../../components/hui-theme-select-editor";
import { LovelaceCardEditor } from "../../types"; import { LovelaceCardEditor } from "../../types";
import { EditorTarget, EntitiesEditorEvent } from "../types"; import { EditorTarget, EntitiesEditorEvent } from "../types";
import { configElementStyle } from "./config-elements-style"; import { configElementStyle } from "./config-elements-style";
import { computeRTLDirection } from "../../../../common/util/compute_rtl"; import { computeRTLDirection } from "../../../../common/util/compute_rtl";
import { object, string, optional, boolean, assert } from "superstruct";
const cardConfigStruct = object({ const cardConfigStruct = struct({
type: string(), type: "string",
entity: optional(string()), entity: "string?",
name: optional(string()), name: "string?",
theme: optional(string()), theme: "string?",
show_forecast: optional(boolean()), show_forecast: "boolean?",
secondary_info_attribute: optional(string()), secondary_info_attribute: "string?",
}); });
const includeDomains = ["weather"]; const includeDomains = ["weather"];
@@ -38,7 +38,7 @@ export class HuiWeatherForecastCardEditor extends LitElement
@internalProperty() private _config?: WeatherForecastCardConfig; @internalProperty() private _config?: WeatherForecastCardConfig;
public setConfig(config: WeatherForecastCardConfig): void { public setConfig(config: WeatherForecastCardConfig): void {
assert(config, cardConfigStruct); config = cardConfigStruct(config);
this._config = config; this._config = config;
} }
@@ -139,7 +139,6 @@ export class HuiWeatherForecastCardEditor extends LitElement
} }
if (target.configValue) { if (target.configValue) {
if (target.value === "") { if (target.value === "") {
this._config = { ...this._config };
delete this._config[target.configValue!]; delete this._config[target.configValue!];
} else { } else {
this._config = { this._config = {

View File

@@ -1,9 +0,0 @@
export class GUISupportError extends Error {
public warnings?: string[] = [];
constructor(message: string, warnings?: string[]) {
super(message);
this.name = "GUISupportError";
this.warnings = warnings;
}
}

View File

@@ -4,10 +4,8 @@ import {
LovelaceViewConfig, LovelaceViewConfig,
ShowViewConfig, ShowViewConfig,
} from "../../../data/lovelace"; } from "../../../data/lovelace";
import { struct } from "../common/structs/struct";
import { EntityConfig } from "../entity-rows/types"; import { EntityConfig } from "../entity-rows/types";
import { optional, string, object, union } from "superstruct";
import { EntityId } from "../common/structs/is-entity-id";
import { Icon } from "../common/structs/is-icon";
export interface YamlChangedEvent extends Event { export interface YamlChangedEvent extends Event {
detail: { detail: {
@@ -68,19 +66,19 @@ export interface CardPickTarget extends EventTarget {
config: LovelaceCardConfig; config: LovelaceCardConfig;
} }
export const actionConfigStruct = object({ export const actionConfigStruct = struct({
action: string(), action: "string",
navigation_path: optional(string()), navigation_path: "string?",
url_path: optional(string()), url_path: "string?",
service: optional(string()), service: "string?",
service_data: optional(object()), service_data: "object?",
}); });
export const entitiesConfigStruct = union([ export const entitiesConfigStruct = struct.union([
object({ {
entity: EntityId, entity: "entity-id",
name: optional(string()), name: "string?",
icon: optional(Icon), icon: "icon?",
}), },
EntityId, "entity-id",
]); ]);

View File

@@ -176,12 +176,6 @@ export class HuiUnusedEntities extends LitElement {
selectable selectable
@selection-changed=${this._handleSelectionChanged} @selection-changed=${this._handleSelectionChanged}
.dir=${computeRTLDirection(this.hass)} .dir=${computeRTLDirection(this.hass)}
.searchLabel=${this.hass.localize(
"ui.panel.lovelace.unused_entities.search"
)}
.noDataText=${this.hass.localize(
"ui.panel.lovelace.unused_entities.no_data"
)}
></ha-data-table> ></ha-data-table>
${this._selectedEntities.length ${this._selectedEntities.length

View File

@@ -98,7 +98,7 @@ class HuiInputNumberEntityRow extends LitElement implements LovelaceRow {
no-label-float no-label-float
auto-validate auto-validate
.disabled=${UNAVAILABLE_STATES.includes(stateObj.state)} .disabled=${UNAVAILABLE_STATES.includes(stateObj.state)}
pattern="[0-9]+([\\.][0-9]+)?" .pattern="[0-9]+([\\.][0-9]+)?"
.step="${Number(stateObj.attributes.step)}" .step="${Number(stateObj.attributes.step)}"
.min="${Number(stateObj.attributes.min)}" .min="${Number(stateObj.attributes.min)}"
.max="${Number(stateObj.attributes.max)}" .max="${Number(stateObj.attributes.max)}"

View File

@@ -1,5 +1,5 @@
import { ActionConfig } from "../../../data/lovelace"; import { ActionConfig } from "../../../data/lovelace";
import { object, optional, union, string, number, array } from "superstruct"; import { struct } from "../common/structs/struct";
import { actionConfigStruct, entitiesConfigStruct } from "../editor/types"; import { actionConfigStruct, entitiesConfigStruct } from "../editor/types";
import { EntityConfig } from "../entity-rows/types"; import { EntityConfig } from "../entity-rows/types";
@@ -24,27 +24,27 @@ export interface PictureHeaderFooterConfig extends LovelaceHeaderFooterConfig {
double_tap_action?: ActionConfig; double_tap_action?: ActionConfig;
} }
export const pictureHeaderFooterConfigStruct = object({ export const pictureHeaderFooterConfigStruct = struct({
type: string(), type: "string",
image: string(), image: "string",
tap_action: optional(actionConfigStruct), tap_action: struct.optional(actionConfigStruct),
hold_action: optional(actionConfigStruct), hold_action: struct.optional(actionConfigStruct),
double_tap_action: optional(actionConfigStruct), double_tap_action: struct.optional(actionConfigStruct),
}); });
export const buttonsHeaderFooterConfigStruct = object({ export const buttonsHeaderFooterConfigStruct = struct({
type: string(), type: "string",
entities: array(entitiesConfigStruct), entities: [entitiesConfigStruct],
}); });
export const graphHeaderFooterConfigStruct = object({ export const graphHeaderFooterConfigStruct = struct({
type: string(), type: "string",
entity: string(), entity: "string",
detail: optional(string()), detail: "number?",
hours_to_show: optional(number()), hours_to_show: "number?",
}); });
export const headerFooterConfigStructs = union([ export const headerFooterConfigStructs = struct.union([
pictureHeaderFooterConfigStruct, pictureHeaderFooterConfigStruct,
buttonsHeaderFooterConfigStruct, buttonsHeaderFooterConfigStruct,
graphHeaderFooterConfigStruct, graphHeaderFooterConfigStruct,

View File

@@ -27,12 +27,12 @@ import {
} from "../../dialogs/generic/show-dialog-box"; } from "../../dialogs/generic/show-dialog-box";
import { haStyle } from "../../resources/styles"; import { haStyle } from "../../resources/styles";
import type { HomeAssistant } from "../../types"; import type { HomeAssistant } from "../../types";
import { struct } from "./common/structs/struct";
import type { Lovelace } from "./types"; import type { Lovelace } from "./types";
import { optional, array, string, object, type, assert } from "superstruct";
const lovelaceStruct = type({ const lovelaceStruct = struct.interface({
title: optional(string()), title: "string?",
views: array(object()), views: ["object"],
}); });
@customElement("hui-editor") @customElement("hui-editor")
@@ -251,7 +251,7 @@ class LovelaceFullConfigEditor extends LitElement {
return; return;
} }
try { try {
assert(config, lovelaceStruct); config = lovelaceStruct(config);
} catch (err) { } catch (err) {
showAlertDialog(this, { showAlertDialog(this, {
text: this.hass.localize( text: this.hass.localize(

View File

@@ -58,8 +58,6 @@ import type { Lovelace } from "./types";
import "./views/hui-panel-view"; import "./views/hui-panel-view";
import type { HUIPanelView } from "./views/hui-panel-view"; import type { HUIPanelView } from "./views/hui-panel-view";
import { HUIView } from "./views/hui-view"; import { HUIView } from "./views/hui-view";
import type { RequestSelectedDetail } from "@material/mwc-list/mwc-list-item";
import { shouldHandleRequestSelectedEvent } from "../../common/mwc/handle-request-selected-event";
class HUIRoot extends LitElement { class HUIRoot extends LitElement {
@property({ attribute: false }) public hass!: HomeAssistant; @property({ attribute: false }) public hass!: HomeAssistant;
@@ -135,19 +133,14 @@ class HUIRoot extends LitElement {
<ha-svg-icon path=${mdiPencil}></ha-svg-icon> <ha-svg-icon path=${mdiPencil}></ha-svg-icon>
</mwc-icon-button> </mwc-icon-button>
</div> </div>
<a <mwc-icon-button
href="https://www.home-assistant.io/lovelace/" title="${this.hass!.localize(
rel="noreferrer" "ui.panel.lovelace.menu.help"
target="_blank" )}"
@click="${this._handleHelp}"
> >
<mwc-icon-button <ha-svg-icon path=${mdiHelpCircle}></ha-svg-icon>
title="${this.hass!.localize( </mwc-icon-button>
"ui.panel.lovelace.menu.help"
)}"
>
<ha-svg-icon path=${mdiHelpCircle}></ha-svg-icon>
</mwc-icon-button>
</a>
<ha-button-menu corner="BOTTOM_START"> <ha-button-menu corner="BOTTOM_START">
<mwc-icon-button <mwc-icon-button
slot="trigger" slot="trigger"
@@ -167,14 +160,14 @@ class HUIRoot extends LitElement {
aria-label=${this.hass!.localize( aria-label=${this.hass!.localize(
"ui.panel.lovelace.unused_entities.title" "ui.panel.lovelace.unused_entities.title"
)} )}
@request-selected="${this._handleUnusedEntities}" @tap="${this._handleUnusedEntities}"
> >
${this.hass!.localize( ${this.hass!.localize(
"ui.panel.lovelace.unused_entities.title" "ui.panel.lovelace.unused_entities.title"
)} )}
</mwc-list-item> </mwc-list-item>
`} `}
<mwc-list-item @request-selected="${this._handleRawEditor}"> <mwc-list-item @tap="${this.lovelace!.enableFullEditMode}">
${this.hass!.localize( ${this.hass!.localize(
"ui.panel.lovelace.editor.menu.raw_editor" "ui.panel.lovelace.editor.menu.raw_editor"
)} )}
@@ -217,7 +210,7 @@ class HUIRoot extends LitElement {
aria-label=${this.hass!.localize( aria-label=${this.hass!.localize(
"ui.panel.lovelace.menu.refresh" "ui.panel.lovelace.menu.refresh"
)} )}
@request-selected="${this._handleRefresh}" @tap="${this._handleRefresh}"
> >
${this.hass!.localize( ${this.hass!.localize(
"ui.panel.lovelace.menu.refresh" "ui.panel.lovelace.menu.refresh"
@@ -227,7 +220,7 @@ class HUIRoot extends LitElement {
aria-label=${this.hass!.localize( aria-label=${this.hass!.localize(
"ui.panel.lovelace.unused_entities.title" "ui.panel.lovelace.unused_entities.title"
)} )}
@request-selected="${this._handleUnusedEntities}" @tap="${this._handleUnusedEntities}"
> >
${this.hass!.localize( ${this.hass!.localize(
"ui.panel.lovelace.unused_entities.title" "ui.panel.lovelace.unused_entities.title"
@@ -242,7 +235,7 @@ class HUIRoot extends LitElement {
aria-label=${this.hass!.localize( aria-label=${this.hass!.localize(
"ui.panel.lovelace.menu.reload_resources" "ui.panel.lovelace.menu.reload_resources"
)} )}
@request-selected=${this._handleReloadResources} @tap="${this._handleReloadResources}"
> >
${this.hass!.localize( ${this.hass!.localize(
"ui.panel.lovelace.menu.reload_resources" "ui.panel.lovelace.menu.reload_resources"
@@ -256,7 +249,7 @@ class HUIRoot extends LitElement {
aria-label=${this.hass!.localize( aria-label=${this.hass!.localize(
"ui.panel.lovelace.menu.configure_ui" "ui.panel.lovelace.menu.configure_ui"
)} )}
@request-selected=${this._handleEnableEditMode} @tap="${this._editModeEnable}"
> >
${this.hass!.localize( ${this.hass!.localize(
"ui.panel.lovelace.menu.configure_ui" "ui.panel.lovelace.menu.configure_ui"
@@ -264,19 +257,14 @@ class HUIRoot extends LitElement {
</mwc-list-item> </mwc-list-item>
` `
: ""} : ""}
<a <mwc-list-item
href="https://www.home-assistant.io/lovelace/" aria-label=${this.hass!.localize(
rel="noreferrer" "ui.panel.lovelace.menu.help"
target="_blank" )}
@tap="${this._handleHelp}"
> >
<mwc-list-item ${this.hass!.localize("ui.panel.lovelace.menu.help")}
aria-label=${this.hass!.localize( </mwc-list-item>
"ui.panel.lovelace.menu.help"
)}
>
${this.hass!.localize("ui.panel.lovelace.menu.help")}
</mwc-list-item>
</a>
</ha-button-menu> </ha-button-menu>
</app-toolbar> </app-toolbar>
`} `}
@@ -486,17 +474,11 @@ class HUIRoot extends LitElement {
return this.shadowRoot!.getElementById("view") as HTMLDivElement; return this.shadowRoot!.getElementById("view") as HTMLDivElement;
} }
private _handleRefresh(ev: CustomEvent<RequestSelectedDetail>): void { private _handleRefresh(): void {
if (!shouldHandleRequestSelectedEvent(ev)) {
return;
}
fireEvent(this, "config-refresh"); fireEvent(this, "config-refresh");
} }
private _handleReloadResources(ev: CustomEvent<RequestSelectedDetail>): void { private _handleReloadResources(): void {
if (!shouldHandleRequestSelectedEvent(ev)) {
return;
}
this.hass.callService("lovelace", "reload_resources"); this.hass.callService("lovelace", "reload_resources");
showConfirmationDialog(this, { showConfirmationDialog(this, {
title: this.hass!.localize( title: this.hass!.localize(
@@ -509,17 +491,7 @@ class HUIRoot extends LitElement {
}); });
} }
private _handleRawEditor(ev: CustomEvent<RequestSelectedDetail>): void { private _handleUnusedEntities(): void {
if (!shouldHandleRequestSelectedEvent(ev)) {
return;
}
this.lovelace!.enableFullEditMode();
}
private _handleUnusedEntities(ev: CustomEvent<RequestSelectedDetail>): void {
if (!shouldHandleRequestSelectedEvent(ev)) {
return;
}
navigate(this, `${this.route?.prefix}/hass-unused-entities`); navigate(this, `${this.route?.prefix}/hass-unused-entities`);
} }
@@ -527,20 +499,17 @@ class HUIRoot extends LitElement {
showVoiceCommandDialog(this); showVoiceCommandDialog(this);
} }
private _handleEnableEditMode(ev: CustomEvent<RequestSelectedDetail>): void { private _handleHelp(): void {
if (!shouldHandleRequestSelectedEvent(ev)) { window.open("https://www.home-assistant.io/lovelace/", "_blank");
return; }
}
private _editModeEnable(): void {
if (this._yamlMode) { if (this._yamlMode) {
showAlertDialog(this, { showAlertDialog(this, {
text: "The edit UI is not available when in YAML mode.", text: "The edit UI is not available when in YAML mode.",
}); });
return; return;
} }
this._enableEditMode();
}
private _enableEditMode(): void {
this.lovelace!.setEditMode(true); this.lovelace!.setEditMode(true);
} }
@@ -645,7 +614,7 @@ class HUIRoot extends LitElement {
const viewConfig = this.config.views[viewIndex]; const viewConfig = this.config.views[viewIndex];
if (!viewConfig) { if (!viewConfig) {
this._enableEditMode(); this._editModeEnable();
return; return;
} }

View File

@@ -83,14 +83,14 @@ class HaPanelShoppingList extends LocalizeMixin(PolymerElement) {
icon="hass:microphone" icon="hass:microphone"
on-click="_showVoiceCommandDialog" on-click="_showVoiceCommandDialog"
></ha-icon-button> ></ha-icon-button>
<ha-button-menu corner="BOTTOM_START" on-action="_clearCompleted"> <ha-button-menu corner="BOTTOM_START">
<ha-icon-button <ha-icon-button
icon="hass:dots-vertical" icon="hass:dots-vertical"
label="Menu" label="Menu"
slot="trigger" slot="trigger"
> >
</ha-icon-button> </ha-icon-button>
<mwc-list-item> <mwc-list-item on-click="_clearCompleted">
[[localize('ui.panel.shopping-list.clear_completed')]] [[localize('ui.panel.shopping-list.clear_completed')]]
</mwc-list-item> </mwc-list-item>
</ha-button-menu> </ha-button-menu>

View File

@@ -34,7 +34,7 @@ documentContainer.innerHTML = `<custom-style>
--scrollbar-thumb-color: rgb(194, 194, 194); --scrollbar-thumb-color: rgb(194, 194, 194);
--error-color: #db4437; --error-color: #db4437;
--warning-color: #FF9800; --warning-color: #f4b400;
--success-color: #0f9d58; --success-color: #0f9d58;
--info-color: #4285f4; --info-color: #4285f4;

View File

@@ -9,7 +9,7 @@ import { Constructor } from "../types";
import { HassBaseEl } from "./hass-base-mixin"; import { HassBaseEl } from "./hass-base-mixin";
import { HASSDomEvent } from "../common/dom/fire_event"; import { HASSDomEvent } from "../common/dom/fire_event";
const DEBUG = false; const DEBUG = true;
export const urlSyncMixin = <T extends Constructor<HassBaseEl>>( export const urlSyncMixin = <T extends Constructor<HassBaseEl>>(
superClass: T superClass: T

View File

@@ -335,8 +335,7 @@
"automation": "Part of the following automations" "automation": "Part of the following automations"
}, },
"data-table": { "data-table": {
"search": "Search", "search": "Search"
"no-data": "No data"
} }
}, },
"dialogs": { "dialogs": {
@@ -848,10 +847,10 @@
"label": "Mode", "label": "Mode",
"description": "The mode controls what happens when the automation is triggered while the actions are still running from a previous trigger. Check the {documentation_link} for more info.", "description": "The mode controls what happens when the automation is triggered while the actions are still running from a previous trigger. Check the {documentation_link} for more info.",
"documentation": "automation documentation", "documentation": "automation documentation",
"single": "Single (default)", "single": "Single",
"restart": "Restart", "restart": "Restart",
"queued": "Queued", "queued": "Queued",
"parallel": "Parallel" "parallel": "Parallel (default)"
}, },
"max": { "max": {
"queued": "Queue length", "queued": "Queue length",
@@ -1602,7 +1601,7 @@
"spinner": "Searching for ZHA Zigbee devices...", "spinner": "Searching for ZHA Zigbee devices...",
"pairing_mode": "Make sure your devices are in pairing mode. Check the instructions of your device on how to do this.", "pairing_mode": "Make sure your devices are in pairing mode. Check the instructions of your device on how to do this.",
"discovered_text": "Devices will show up here once discovered.", "discovered_text": "Devices will show up here once discovered.",
"no_devices_found": "No devices were found, make sure they are in paring mode and keep them awake while discovering is running.", "no_devices_found": "No devices where found, make sure they are in paring mode and keep them awake while discovering is running.",
"search_again": "Search Again" "search_again": "Search Again"
}, },
"network_management": { "network_management": {
@@ -1830,9 +1829,7 @@
"entity": "Entity", "entity": "Entity",
"entity_id": "Entity ID", "entity_id": "Entity ID",
"domain": "Domain", "domain": "Domain",
"last_changed": "Last Changed", "last_changed": "Last Changed"
"search": "Search entities",
"no_data": "No unused entities found"
}, },
"add_entities": { "add_entities": {
"yaml_unsupported": "You cannot use this function when using Lovelace UI in YAML mode.", "yaml_unsupported": "You cannot use this function when using Lovelace UI in YAML mode.",
@@ -1901,12 +1898,9 @@
}, },
"edit_card": { "edit_card": {
"header": "Card Configuration", "header": "Card Configuration",
"typed_header": "{type} Card Configuration",
"pick_card": "Which card would you like to add?", "pick_card": "Which card would you like to add?",
"pick_card_view_title": "Which card would you like to add to your {name} view?", "pick_card_view_title": "Which card would you like to add to your {name} view?",
"toggle_editor": "Toggle Editor", "toggle_editor": "Toggle Editor",
"unsaved_changes": "You have unsaved changes",
"confirm_cancel": "Are you sure you want to cancel?",
"show_visual_editor": "Show Visual Editor", "show_visual_editor": "Show Visual Editor",
"show_code_editor": "Show Code Editor", "show_code_editor": "Show Code Editor",
"add": "Add Card", "add": "Add Card",

View File

@@ -1,9 +1,4 @@
{ {
"config_entry": {
"disabled_by": {
"integration": "تكامل"
}
},
"groups": { "groups": {
"system-admin": "مسؤولين", "system-admin": "مسؤولين",
"system-read-only": "مستخدمين للعرض فقط", "system-read-only": "مستخدمين للعرض فقط",
@@ -27,19 +22,6 @@
"auto": "تلقائي", "auto": "تلقائي",
"off": "إيقاف", "off": "إيقاف",
"on": "تشغيل" "on": "تشغيل"
},
"hvac_action": {
"drying": "تجفيف"
}
},
"humidifier": {
"mode": {
"auto": "تلقائي",
"baby": "الطفل",
"comfort": "الراحة",
"eco": "اقتصادي",
"home": "في المنزل",
"normal": "عادي"
} }
} }
}, },
@@ -186,7 +168,7 @@
}, },
"configurator": { "configurator": {
"configure": "إعداد", "configure": "إعداد",
"configured": "تم التكوين" "configured": "تم الإعداد"
}, },
"cover": { "cover": {
"closed": "مغلق", "closed": "مغلق",
@@ -255,7 +237,7 @@
"on": "قيد التشغيل" "on": "قيد التشغيل"
}, },
"scene": { "scene": {
"scening": "تشهيد" "scening": "قبد البحث"
}, },
"script": { "script": {
"off": "إيقاف", "off": "إيقاف",
@@ -317,7 +299,7 @@
"ui": { "ui": {
"auth_store": { "auth_store": {
"ask": "هل تريد حفظ هذا الدخول؟", "ask": "هل تريد حفظ هذا الدخول؟",
"confirm": "نعم", "confirm": "حفظ الدخول",
"decline": "لا شكرا" "decline": "لا شكرا"
}, },
"card": { "card": {
@@ -348,15 +330,10 @@
"direction": "Richting", "direction": "Richting",
"speed": "Snelheid" "speed": "Snelheid"
}, },
"humidifier": {
"humidity": "الرطوبة المستهدفة",
"mode": "الوضع",
"target_humidity_entity": "{name} الرطوبة المستهدفة"
},
"light": { "light": {
"brightness": "Helderheid", "brightness": "Helderheid",
"color_temperature": "Kleurtemperatuur", "color_temperature": "Kleurtemperatuur",
"white_value": "قيمة البياض" "white_value": "Witwaarde"
}, },
"lock": { "lock": {
"lock": "قفل", "lock": "قفل",
@@ -374,8 +351,6 @@
"activate": "تفعيل" "activate": "تفعيل"
}, },
"script": { "script": {
"cancel": "إلغاء",
"cancel_multiple": "إلغاء {number}",
"execute": "نفذ" "execute": "نفذ"
}, },
"service": { "service": {
@@ -439,14 +414,6 @@
"clear": "مسح", "clear": "مسح",
"show_areas": "إظهار المناطق" "show_areas": "إظهار المناطق"
}, },
"data-table": {
"no-data": "لايوجد بيانات",
"search": "بحث"
},
"date-range-picker": {
"end_date": "تاريخ الإنتهاء",
"start_date": "تاريخ البدء"
},
"device-picker": { "device-picker": {
"no_area": "لا مجال", "no_area": "لا مجال",
"toggle": "تبديل" "toggle": "تبديل"
@@ -460,14 +427,7 @@
"loading_history": "جارٍ تحميل سجل الحالات ...", "loading_history": "جارٍ تحميل سجل الحالات ...",
"no_history_found": "لم يتم العثور على سجل الحالات." "no_history_found": "لم يتم العثور على سجل الحالات."
}, },
"related-items": {
"integration": "تكامل"
},
"relative_time": { "relative_time": {
"duration": {
"minute": "{count} {count, plural,\n one {دقيقة}\n other {دقائق}\n}"
},
"future": "قبل {time}",
"never": "Nooit" "never": "Nooit"
}, },
"service-picker": { "service-picker": {
@@ -476,18 +436,14 @@
}, },
"dialogs": { "dialogs": {
"config_entry_system_options": { "config_entry_system_options": {
"enable_new_entities_description": "إذا تم تعطيله ، فلن تتم إضافة الكيانات المكتشفة حديثًا لـ {integration} تلقائيًا إلى Home Assistant.",
"title": "خيارات النظام لـ {integration}",
"update": "تحديث" "update": "تحديث"
}, },
"entity_registry": { "entity_registry": {
"editor": { "editor": {
"confirm_delete": "هل أنت متأكد أنك تريد حذف هذا الإدخال؟", "confirm_delete": "هل أنت متأكد أنك تريد حذف هذا الإدخال؟",
"delete": "حذف", "delete": "حذف",
"note": "ملاحظة: قد لا يعمل مع كافة التكاملات بعد.",
"update": "تحديث" "update": "تحديث"
}, }
"related": "ذات صلة"
}, },
"generic": { "generic": {
"cancel": "إلغاء الأمر", "cancel": "إلغاء الأمر",
@@ -509,11 +465,8 @@
"add": "إضافة" "add": "إضافة"
}, },
"input_text": { "input_text": {
"max": "الحد الأقصى للطول",
"min": "الحد الأدنى للطول",
"password": "كلمة المرور" "password": "كلمة المرور"
}, }
"platform_not_loaded": "لم يتم تحميل تكامل {platform} . يرجى إضافته إلى التكوين الخاص بك إما عن طريق إضافة ':default_config' أو \"{platform}\"."
}, },
"more_info_control": { "more_info_control": {
"sun": { "sun": {
@@ -540,20 +493,13 @@
"title": "{device} معلومات تصحيح الأخطاء", "title": "{device} معلومات تصحيح الأخطاء",
"triggers": "محفزات" "triggers": "محفزات"
}, },
"voice_command": {
"did_not_hear": "Home Assistant لم يسمع أي شيء"
},
"zha_device_info": { "zha_device_info": {
"buttons": { "buttons": {
"add": "أضف أجهزة عبر هذا الجهاز",
"zigbee_information": "معلومات Zigbee" "zigbee_information": "معلومات Zigbee"
}, },
"device_signature": "توقيع جهاز Zigbee", "device_signature": "توقيع جهاز Zigbee",
"services": { "services": {
"zigbee_information": "عرض معلومات Zigbee للجهاز." "zigbee_information": "عرض معلومات Zigbee للجهاز."
},
"zha_device_card": {
"device_name_placeholder": "تغيير اسم الجهاز"
} }
} }
}, },
@@ -564,7 +510,7 @@
}, },
"login-form": { "login-form": {
"log_in": "تسجيل الدخول", "log_in": "تسجيل الدخول",
"password": "كلمة السر", "password": "كلمه السر",
"remember": "تذكر" "remember": "تذكر"
}, },
"notification_drawer": { "notification_drawer": {
@@ -597,15 +543,10 @@
"name": "اسم", "name": "اسم",
"name_required": "الاسم مطلوب", "name_required": "الاسم مطلوب",
"unknown_error": "خطأ غير معروف" "unknown_error": "خطأ غير معروف"
},
"picker": {
"integrations_page": "صفحة التكاملات",
"introduction": "يتم استخدام المناطق لتنظيم أمكنة الأجهزة. سيتم استخدام هذه المعلومات في جميع أنحاء Home Assistant لمساعدتك في تنظيم الواجهة والأذونات و التكاملات مع الأنظمة الأخرى.",
"introduction2": "لوضع الأجهزة في منطقة ما، إستخدم الرابط أدناه للإنتقال إلى صفحة التكاملات ثم انقر فوق تكامل مكوّن للوصول إلى بطاقات الجهاز."
} }
}, },
"automation": { "automation": {
"caption": "الأتمتة", "caption": "التشغيل التلقائي",
"description": "إنشاء وتحرير التشغيل الألي", "description": "إنشاء وتحرير التشغيل الألي",
"editor": { "editor": {
"actions": { "actions": {
@@ -682,7 +623,7 @@
"sunset": "غروب الشمس" "sunset": "غروب الشمس"
}, },
"template": { "template": {
"label": "نموذج", "label": "النموذج",
"value_template": "نموذج القيمة" "value_template": "نموذج القيمة"
}, },
"time": { "time": {
@@ -691,7 +632,7 @@
"label": "وقت" "label": "وقت"
}, },
"zone": { "zone": {
"entity": "كيان مع موقع", "entity": "الجهاز في المنطقة",
"label": "المنطقة", "label": "المنطقة",
"zone": "المنطقة" "zone": "المنطقة"
} }
@@ -701,17 +642,6 @@
"default_name": "متحكم آلي جديد", "default_name": "متحكم آلي جديد",
"enable_disable": "تمكين/تعطيل التنفيذ التلقائي", "enable_disable": "تمكين/تعطيل التنفيذ التلقائي",
"introduction": "استخدم المتحكمات الآلية لتجعل منزلك ينبض بالحياة", "introduction": "استخدم المتحكمات الآلية لتجعل منزلك ينبض بالحياة",
"max": {
"queued": "طول قائمة الإنتظار"
},
"modes": {
"documentation": "وثائق الأتمتة",
"label": "وضع",
"parallel": "موازي",
"queued": "في قائمة الإنتظار",
"restart": "إعادة تشغيل",
"single": "فردي (افتراضي)"
},
"move_down": "تحرك لأسفل", "move_down": "تحرك لأسفل",
"move_up": "تحريك لأعلى", "move_up": "تحريك لأعلى",
"save": "حفظ", "save": "حفظ",
@@ -723,7 +653,6 @@
"header": "المشغلات", "header": "المشغلات",
"introduction": "المشغلات هي ما يبدأ تشغيل قاعدة المتحكم الآلي. من الممكن تحديد مشغلات متعددة لنفس القاعدة. بمجرد بدء المشغل ، سيقوم Home Assistant بالتحقق من الشروط ، إن وجدت ، واستدعاء الإجراء. \n\n [مزيد من المعلومات حول المشغلات.] (https://home-assistant.io/docs/automation/trigger/)", "introduction": "المشغلات هي ما يبدأ تشغيل قاعدة المتحكم الآلي. من الممكن تحديد مشغلات متعددة لنفس القاعدة. بمجرد بدء المشغل ، سيقوم Home Assistant بالتحقق من الشروط ، إن وجدت ، واستدعاء الإجراء. \n\n [مزيد من المعلومات حول المشغلات.] (https://home-assistant.io/docs/automation/trigger/)",
"learn_more": "معرفة المزيد عن المشغلات", "learn_more": "معرفة المزيد عن المشغلات",
"name": "المشغل",
"type_select": "نوع المشغل", "type_select": "نوع المشغل",
"type": { "type": {
"device": { "device": {
@@ -803,25 +732,13 @@
} }
}, },
"cloud": { "cloud": {
"account": { "caption": "كلاود هوم اسيستينت",
"integrations": "تكاملات",
"integrations_introduction2": "تحقق من الموقع ل",
"integrations_link_all_features": " جميع الميزات المتوفرة"
},
"caption": "سحابة Home Assistant",
"description_login": "تم تسجيل الدخول كـ {email}", "description_login": "تم تسجيل الدخول كـ {email}",
"description_not_login": "لم يتم تسجيل الدخول", "description_not_login": "لم يتم تسجيل الدخول"
"dialog_cloudhook": {
"info_disable_webhook": "إذا كنت لم تعد ترغب في استخدام هذا الwebhook ، يمكنك"
},
"register": {
"feature_amazon_alexa": "التكامل مع Amazon Alexa",
"feature_google_home": "التكامل مع Google Assistant"
}
}, },
"core": { "core": {
"caption": "عام", "caption": "عام",
"description": "قم بتغيير التكوينات العامة لـ Home Assistant", "description": "التحقق من صحة ملف الإعدادات والتحكم بالخادم",
"section": { "section": {
"core": { "core": {
"core_config": { "core_config": {
@@ -837,22 +754,18 @@
"caption": "التخصيص", "caption": "التخصيص",
"description": "تخصيص الكيانات الخاصة بك", "description": "تخصيص الكيانات الخاصة بك",
"picker": { "picker": {
"entity": "الكيان", "entity": "الكيان"
"introduction": "تعديل السمات لكل كيان. سيتم تفعيل التخصيصات المضافة / المعدلة على الفور. ستسري التخصيصات التي تمت إزالتها عندما يتم تحديث الكيان."
} }
}, },
"devices": { "devices": {
"cant_edit": "يمكنك فقط تحرير العناصر التي تم إنشاؤها في واجهة المستخدم.",
"confirm_delete": "هل أنت متأكد أنك تريد حذف هذا الجهاز؟", "confirm_delete": "هل أنت متأكد أنك تريد حذف هذا الجهاز؟",
"data_table": { "data_table": {
"integration": "تكامل",
"no_area": "لا مجال", "no_area": "لا مجال",
"no_devices": "لا توجد أجهزة" "no_devices": "لا توجد أجهزة"
}, },
"delete": "حذف", "delete": "حذف",
"device_info": "معلومات الجهاز", "device_info": "معلومات الجهاز",
"entities": { "entities": {
"add_entities_lovelace": "أضف إلى Lovelace",
"disabled_entities": "{count} {count, plural,\n one {كيان}\n other {كيانات}\n}", "disabled_entities": "{count} {count, plural,\n one {كيان}\n other {كيانات}\n}",
"hide_disabled": "إخفاء معطل" "hide_disabled": "إخفاء معطل"
}, },
@@ -860,14 +773,10 @@
}, },
"entities": { "entities": {
"picker": { "picker": {
"headers": {
"integration": "تكامل"
},
"remove_selected": { "remove_selected": {
"confirm_partly_text": "يمكنك فقط إزالة {removable} من الكيانات {selected} . لا يمكن إزالة الكيانات إلا عندما يتوقف التكامل عن توفير الكيانات. في بعض الأحيان ، يتعين عليك إعادة تشغيل Home Assistant قبل أن تتمكن من إزالة كيانات التكامل الذي تمت إزالته. هل أنت متأكد من أنك تريد إزالة الكيانات القابلة للإزالة؟", "confirm_partly_text": "يمكنك فقط إزالة {removable} من الكيانات {selected} . لا يمكن إزالة الكيانات إلا عندما يتوقف التكامل عن توفير الكيانات. في بعض الأحيان ، يتعين عليك إعادة تشغيل Home Assistant قبل أن تتمكن من إزالة كيانات التكامل الذي تمت إزالته. هل أنت متأكد من أنك تريد إزالة الكيانات القابلة للإزالة؟",
"confirm_partly_title": "يمكن فقط إزالة {number} الكيانات المحددة." "confirm_partly_title": "يمكن فقط إزالة {number} الكيانات المحددة."
}, },
"search": "إبحث عن الكيانات",
"status": { "status": {
"restored": "مستعاد" "restored": "مستعاد"
} }
@@ -877,7 +786,7 @@
"clear": "محو", "clear": "محو",
"filtering_by": "التصفية حسب" "filtering_by": "التصفية حسب"
}, },
"header": "تكوين Home Assistant", "header": "برمجة نظام مساعد البيت",
"helpers": { "helpers": {
"dialog": { "dialog": {
"create": "إضافة" "create": "إضافة"
@@ -891,7 +800,6 @@
} }
}, },
"types": { "types": {
"input_boolean": "تبديل",
"input_number": "رقم", "input_number": "رقم",
"input_select": "القائمه المنسدله", "input_select": "القائمه المنسدله",
"input_text": "النص" "input_text": "النص"
@@ -901,85 +809,54 @@
"caption": "معلومات", "caption": "معلومات",
"description": "معلومات حول تثبيت Home Assistant", "description": "معلومات حول تثبيت Home Assistant",
"documentation": "الوثائق", "documentation": "الوثائق",
"home_assistant_logo": "شعار Home Assistant",
"integrations": "تكاملات", "integrations": "تكاملات",
"issues": "الاعطال" "issues": "الاعطال"
}, },
"integration_panel_move": {
"link_integration_page": "صفحة التكاملات",
"missing_zha": "هل فقدت لوحة تكوين ZHA؟ تم نقله إلى إدخال ZHA على {integrations_page} ."
},
"integrations": { "integrations": {
"add_integration": "أضف تكامل", "add_integration": "أضف integration",
"caption": "التكاملات", "caption": "تكاملات",
"config_entry": { "config_entry": {
"area": "في {area}",
"delete": "حذف", "delete": "حذف",
"delete_button": "حذف {integration}",
"delete_confirm": "هل تريد حقا حذف هذا التكامل؟", "delete_confirm": "هل تريد حقا حذف هذا التكامل؟",
"device_unavailable": "الجهاز غير متوفر", "device_unavailable": "الجهاز غير متوفر",
"devices": "{count} {count, plural,\n one {جهاز}\n other {أجهزة}\n}", "devices": "{count} {count, plural,\n one {جهاز}\n other {أجهزة}\n}",
"documentation": "الوثائق",
"entities": "{count} {count, plural,\n one {كيان}\n other {كيانات}\n}", "entities": "{count} {count, plural,\n one {كيان}\n other {كيانات}\n}",
"entity_unavailable": "الكيان غير متوفر", "entity_unavailable": "العنصر غير متوفر",
"firmware": "نظام التشغيل {version}", "firmware": "نظام التشغيل {version}",
"hub": "متصل عبر",
"manuf": "بواسطة {manufacturer}", "manuf": "بواسطة {manufacturer}",
"no_area": "لا توجد منطقة", "no_area": "لا توجد منطقة",
"no_device": "كيانات بدون أجهزة", "no_device": "عناصر بدون أجهزة",
"no_devices": "هذا التكامل لا يوجد لديه الأجهزة.", "no_devices": "هذا التكامل لا يوجد لديه الأجهزة.",
"options": "خيارات", "options": "خيارات",
"rename": "إعادة تسمية", "rename": "إعادة تسمية",
"restart_confirm": "أعد تشغيل Home Assistant لإنهاء حذف هذا التكامل", "restart_confirm": "اعادة تشغيل هوم اسيستينت لإنهاء حذف هذه التكامل",
"settings_button": "تحرير الإعدادات لـ {integration}",
"system_options": "خيارات النظام", "system_options": "خيارات النظام",
"system_options_button": "خيارات النظام لـ {integration}",
"unnamed_entry": "إدخال بدون اسم" "unnamed_entry": "إدخال بدون اسم"
}, },
"config_flow": { "config_flow": {
"aborted": "تم الإلغاء", "loading_first_time": "يرجى الانتظار بينما يتم تثبيت الـintegration"
"close": "إغلاق",
"created_config": "تم إنشاء تكوين لـ {name}.",
"error_saving_area": "خطأ في حفظ المنطقة: {error}",
"external_step": {
"description": "تتطلب هذه الخطوة زيارة موقع خارجي للإكمال.",
"open_site": "افتح الموقع"
},
"finish": "إنهاء",
"loading_first_time": "يرجى الانتظار بينما يتم تثبيت الـintegration",
"not_all_required_fields": "لم يتم تعبئة جميع الحقول المطلوبة."
}, },
"configure": "إعداد", "configure": "إعداد",
"configured": "تم التكوين", "configured": "تم الإعداد",
"description": عداد وإدارة التكاملات", "description": "إدارة الأجهزة والخدمات المتصلة",
"details": "تفاصيل التكامل",
"discovered": "مكتشف", "discovered": "مكتشف",
"home_assistant_website": "موقع Home Assistant",
"ignore": { "ignore": {
"confirm_delete_ignore": "سيؤدي ذلك إلى ظهور التكامل في عمليات التكامل المكتشفة مرة أخرى عند اكتشافها. قد يتطلب هذا إعادة تشغيل أو يستغرق بعض الوقت.",
"confirm_delete_ignore_title": "توقف عن تجاهل {name} ؟", "confirm_delete_ignore_title": "توقف عن تجاهل {name} ؟",
"confirm_ignore": "هل أنت متأكد أنك لا تريد إعداد هذا التكامل؟ يمكنك التراجع بالنقر على \"إظهار عمليات التكامل التي تم تجاهلها\" في القائمة بأعلى اليسار.",
"confirm_ignore_title": "تجاهل اكتشاف {name} ؟",
"hide_ignored": "إخفاء التكاملات المتجاهلة",
"ignore": "تجاهل", "ignore": "تجاهل",
"ignored": "متجاهل", "ignored": "تجاهل",
"show_ignored": "أظهر التكاملات المتجاهلة", "show_ignored": "أظهر الدمج المتجاهل",
"stop_ignore": "توقف عن التجاهل" "stop_ignore": "توقف عن التجاهل"
}, },
"integration": "تكامل", "integration": "integration",
"integration_not_found": "لم يتم العثور على التكامل.",
"new": "إعداد تكامل جديد", "new": "إعداد تكامل جديد",
"no_integrations": "يبدو أنه لم يتم تكوين أي تكاملات بعد. انقر على الزر أدناه لإضافة تكاملك الأول!", "no_integrations": "يبدوأن ليس هناك أي integations بعد. انقر على الزر أدناه لإضافة واحدة!",
"none": "لم يتم تكوين أي شيء حتى الآن", "none": "لم يتم الإعداد بعد",
"none_found": "لم يتم العثور على تكاملات", "none_found": "لم يتم العثور على عمليات تكامل",
"none_found_detail": "إضبط معايير بحثك.", "none_found_detail": "اضبط معايير البحث.",
"note_about_integrations": "لا يمكن تكوين جميع التكاملات عبر واجهة المستخدم حتى الآن.", "rename_dialog": "تعديل الاسم",
"note_about_website_reference": "يتوفر المزيد على ", "rename_input_label": "الاسم"
"rename_dialog": "تحرير إسم إدخال هذا التكوين",
"rename_input_label": "الاسم",
"search": "إبحث عن التكاملات"
}, },
"introduction": "يمكنك هنا برمجة المكونات الخاصة بك و إعداد نظام Home Assistant. ليس كل شيء متاح للبرمجة من خلال واجهة المستخدم حتى الآن، ولكننا نعمل على ذلك.", "introduction": "يمكنك هنا برمجة المكونات الخاصة بك و إعداد نظام مساعد البيت. ليس كل شيء متاح للبرمجة من خلال واجهة المستخدم حتى الآن، ولكننا نعمل على ذلك.",
"logs": { "logs": {
"caption": "السجلات", "caption": "السجلات",
"description": "عرض سجلات Home Assistant" "description": "عرض سجلات Home Assistant"
@@ -1044,26 +921,14 @@
} }
}, },
"mqtt": { "mqtt": {
"button": "كوِن",
"title": "MQTT" "title": "MQTT"
}, },
"person": { "person": {
"caption": "الأشخاص",
"description": "إدارة الأشخاص الذين يتتبعهم Home Assistant.",
"detail": { "detail": {
"device_tracker_pick": "اختر جهاز لتتبع", "device_tracker_pick": "اختر جهاز لتتبع"
"link_integrations_page": "صفحة التكاملات", }
"link_presence_detection_integrations": "تكاملات الكشف عن التواجد",
"name_error_msg": "الاسم مطلوب",
"no_device_tracker_available_intro": "عندما يكون لديك أجهزة تشير إلى تواجد شخص ، ستتمكن من تعيينها إلى شخص هنا. يمكنك إضافة جهازك الأول عن طريق إضافة تكامل كشف التواجد من صفحة التكاملات."
},
"no_persons_created_yet": "يبدو أنك لم تقم بإنشاء أي شخص حتى الآن.",
"note_about_persons_configured_in_yaml": "ملاحظة: لا يمكن تعديل الأشخاص الذين تم تكوينهم عبر config.yaml عبر واجهة المستخدم."
}, },
"scene": { "scene": {
"editor": {
"icon": "أيقونة"
},
"picker": { "picker": {
"headers": { "headers": {
"name": "الاسم" "name": "الاسم"
@@ -1074,20 +939,7 @@
"caption": "السكريبت", "caption": "السكريبت",
"description": "إنشاء و تحرير السكريبت", "description": "إنشاء و تحرير السكريبت",
"editor": { "editor": {
"alias": "الاسم", "alias": "الاسم"
"icon": "أيقونة",
"id": "معرف الكيان",
"id_already_exists": "هذا المعرف موجود بالفعل",
"max": {
"queued": "طول قائمة الإنتظار"
},
"modes": {
"label": "وضع",
"parallel": "موازي",
"queued": "في قائمة الإنتظار",
"restart": "إعادة تشغيل",
"single": "فردي (إفتراضي)"
}
}, },
"picker": { "picker": {
"headers": { "headers": {
@@ -1099,22 +951,11 @@
"server_control": { "server_control": {
"section": { "section": {
"reloading": { "reloading": {
"automation": "إعادة تحميل الأتمتة",
"core": "إعادة تحميل الموقع والتخصيصات",
"input_boolean": "إعادة تحميل مدخلات منطقية", "input_boolean": "إعادة تحميل مدخلات منطقية",
"input_datetime": "إعادة تحميل أوقات تاريخ الإدخال", "input_datetime": "إعادة تحميل أوقات تاريخ الإدخال",
"input_number": "إعادة تحميل أرقام الإدخال", "input_number": "إعادة تحميل أرقام الإدخال",
"input_select": "إعادة تحميل تحديدات الإدخال", "input_select": "إعادة تحميل تحديدات الإدخال",
"input_text": "إعادة تحميل النصوص المدخلة", "input_text": "إعادة تحميل النصوص المدخلة"
"person": "إعادة تحميل الأشخاص",
"zone": "إعادة تحميل المناطق"
},
"server_management": {
"confirm_restart": "هل تريد بالتأكيد اعادة تشغيل Home Assistant؟",
"confirm_stop": "هل تريد بالتأكيد إيقاف Home Assistant؟"
},
"validation": {
"introduction": "تحقق من صلاحية التكوين الخاص بك إذا قمت مؤخرًا بإجراء بعض التغييرات وتريد التأكد من صلاحية جميعها"
} }
} }
}, },
@@ -1148,52 +989,29 @@
}, },
"users_privileges_note": "مجموعة المستخدمين هي عمل قيد التقدم. لن يتمكن المستخدم من إدارة المثيل عبر واجهة المستخدم. ما زلنا نقوم بتدقيق جميع نقاط نهاية واجهة برمجة تطبيقات الإدارة للتأكد من أنها تحد من الوصول إلى المسؤولين بشكل صحيح." "users_privileges_note": "مجموعة المستخدمين هي عمل قيد التقدم. لن يتمكن المستخدم من إدارة المثيل عبر واجهة المستخدم. ما زلنا نقوم بتدقيق جميع نقاط نهاية واجهة برمجة تطبيقات الإدارة للتأكد من أنها تحد من الوصول إلى المسؤولين بشكل صحيح."
}, },
"zha": {
"add_device_page": {
"discovered_text": "ستظهر الأجهزة هنا عند إكتشافها."
},
"button": "كوِن",
"groups": {
"zha_zigbee_groups": "مجموعات ZHA Zigbee"
},
"network": {
"caption": "الشبكة"
},
"node_management": {
"header": "إدارة الجهاز"
}
},
"zone": { "zone": {
"add_zone": "إضافة المنطقة",
"caption": "المناطق",
"configured_in_yaml": "لا يمكن تحرير المناطق التي تم تكوينها بواسطة configuration.yaml عبر واجهة المستخدم.",
"description": "إدارة المناطق التي تريد تتبع الأشخاص فيها.",
"detail": { "detail": {
"create": "إضافة", "create": "إضافة",
"delete": "حذف", "delete": "حذف",
"icon": "أيقونة", "icon": "أيقونة",
"name": "الاسم", "name": "الاسم",
"new_zone": "منطقة جديدة", "required_error_msg": "العنوان مطلوب.",
"required_error_msg": "هذا الحقل مطلوب",
"update": "تحديث" "update": "تحديث"
}, }
"introduction": "تسمح لك المناطق بتحديد مناطق معينة على وجه الأرض. عندما يكون الشخص داخل منطقة ما ، ستأخذ الحالة الاسم من المنطقة. يمكن أيضًا استخدام المناطق كمشغل أو حالة داخل إعدادات الأتمتة."
}, },
"zwave": { "zwave": {
"button": "كوِن",
"caption": "Z-Wave", "caption": "Z-Wave",
"description": "إدارة شبكة Z-Wave", "description": "إدارة شبكة Z-Wave",
"node_config": { "node_config": {
"seconds": "ثواني",
"set_config_parameter": "تعيين معلمة التكوين" "set_config_parameter": "تعيين معلمة التكوين"
}, },
"node_management": { "node_management": {
"add_to_group": "إضافة إلى المجموعة", "add_to_group": "إضافة إلى المجموعة",
"entities": "كيانات هذه العقدة", "entities": "كيانات هذه العقدة",
"entity_info": "معلومات الكيان", "entity_info": "معلومات الكيان",
"exclude_entity": "استبعد هذا الكيان من Home Assistant", "exclude_entity": "تحكم بسيرفر Home Assistant ... من Home Assistant.",
"group": "مجموعة", "group": "مجموعة",
"header": "إدارة عقد Z-Wave", "header": "إدارة العقدة Z-Wave",
"introduction": "قم بتشغيل أوامر Z-Wave التي تؤثر على عقدة واحدة. اختر عقدة لترى قائمة بالأوامر المتاحة.", "introduction": "قم بتشغيل أوامر Z-Wave التي تؤثر على عقدة واحدة. اختر عقدة لترى قائمة بالأوامر المتاحة.",
"max_associations": "اعلى رقم للجمعيات:", "max_associations": "اعلى رقم للجمعيات:",
"node_group_associations": "ارتباطات مجموعة العقدة", "node_group_associations": "ارتباطات مجموعة العقدة",
@@ -1221,9 +1039,6 @@
"refresh_node": "تحديث العقدة", "refresh_node": "تحديث العقدة",
"remove_failed_node": "إزالة العقدة الفاشلة", "remove_failed_node": "إزالة العقدة الفاشلة",
"replace_failed_node": "استبدال العقدة الفاشلة", "replace_failed_node": "استبدال العقدة الفاشلة",
"start_network": "بدء تشغيل الشبكة",
"stop_network": "إيقاف الشبكة",
"test_network": "اختبار الشبكة",
"test_node": "اختبار عقدة" "test_node": "اختبار عقدة"
} }
} }
@@ -1237,7 +1052,6 @@
"title": "الخدمات" "title": "الخدمات"
}, },
"states": { "states": {
"description2": "لن يتواصل هذا مع الجهاز الفعلي.",
"title": "الحالات" "title": "الحالات"
}, },
"templates": { "templates": {
@@ -1247,35 +1061,16 @@
}, },
"history": { "history": {
"period": "المدة", "period": "المدة",
"ranges": {
"last_week": "الأسبوع الماضي",
"this_week": "هذا الأسبوع",
"today": "اليوم",
"yesterday": "أمس"
},
"showing_entries": "عرض الأحداث لـ" "showing_entries": "عرض الأحداث لـ"
}, },
"logbook": { "logbook": {
"ranges": {
"last_week": "الأسبوع الماضي",
"this_week": "هذا الأسبوع",
"today": "اليوم",
"yesterday": "أمس"
},
"showing_entries": "عرض الأحداث لـ" "showing_entries": "عرض الأحداث لـ"
}, },
"lovelace": { "lovelace": {
"cards": { "cards": {
"empty_state": {
"go_to_integrations_page": "انتقل إلى صفحة التكاملات.",
"no_devices": "تسمح لك هذه الصفحة بالتحكم في أجهزتك ، ولكن يبدو أنك لم تعد أي أجهزة حتى الآن. توجه إلى صفحة التكاملات للبدء."
},
"safe-mode": {
"description": "واجه Home Assistant مشكلة أثناء تحميل التكوينات الخاصة بك ويتم تشغيله الآن في الوضع الآمن. أنظر إلى سجل الأخطاء لمعرفة الخطأ."
},
"starting": { "starting": {
"description": "Home Assistant يبدأ، يرجى الانتظار...", "description": "Home Assistant يبدأ، يرجى الانتظار...",
"header": "Home Assistant يبدأ..." "header": "يبدأ مساعد المنزل ..."
} }
}, },
"editor": { "editor": {
@@ -1312,14 +1107,11 @@
}, },
"generic": { "generic": {
"attribute": "السمه", "attribute": "السمه",
"camera_view": "عرض الكاميرا",
"double_tap_action": "تأثير النقر المزدوج", "double_tap_action": "تأثير النقر المزدوج",
"manual": "يدويا", "manual": "يدويا",
"manual_description": "هل تريد إضافة بطاقة مخصصة أو ترغب فقط في كتابة yaml يدويًا؟", "manual_description": "هل تريد إضافة بطاقة مخصصة أو ترغب فقط في كتابة yaml يدويًا؟",
"no_theme": "لا توجد تصاميم متاحة", "no_theme": "لا توجد تصاميم متاحة",
"search": "بحث",
"secondary_info_attribute": "سمة المعلومات الثانوية", "secondary_info_attribute": "سمة المعلومات الثانوية",
"show_name": "أظهر الاسم؟",
"state": "الحالة" "state": "الحالة"
}, },
"glance": { "glance": {
@@ -1331,10 +1123,6 @@
"horizontal-stack": { "horizontal-stack": {
"description": "تتيح لك بطاقة التكديس الأفقي تجميع عدة بطاقات معًا ، بحيث تكون دائمًا بجانب بعضها البعض في مساحة عمود واحد." "description": "تتيح لك بطاقة التكديس الأفقي تجميع عدة بطاقات معًا ، بحيث تكون دائمًا بجانب بعضها البعض في مساحة عمود واحد."
}, },
"humidifier": {
"description": "تتيح بطاقة المرطب التحكم في كيان المرطب. يسمح لك بتغيير الرطوبة ووضع الكيان.",
"name": "المرطب"
},
"iframe": { "iframe": {
"description": "تسمح لك بطاقة صفحة الويب بتضمين صفحة ويب مباشرةً في Home Assistant." "description": "تسمح لك بطاقة صفحة الويب بتضمين صفحة ويب مباشرةً في Home Assistant."
}, },
@@ -1388,20 +1176,12 @@
"no_description": "لا يوجد وصف متاح." "no_description": "لا يوجد وصف متاح."
}, },
"edit_card": { "edit_card": {
"confirm_cancel": "هل أنت متأكد من الإلغاء؟",
"delete": "حذف", "delete": "حذف",
"duplicate": "بطاقة مكررة", "duplicate": "بطاقة مكررة",
"edit": "تصحيح", "edit": "تصحيح",
"move": "نقل", "move": "نقل"
"options": "المزيد من الخيارات",
"typed_header": "{type} تكوين البطاقة",
"unsaved_changes": "لديك تغييرات غير محفوظة"
},
"edit_lovelace": {
"title": "عنوان"
}, },
"edit_view": { "edit_view": {
"header_name": "{name} عرض التكوين",
"tab_visibility": "الرؤية", "tab_visibility": "الرؤية",
"visibility": { "visibility": {
"select_users": "تحديد المستخدمين الذين يجب أن يروا طريقة العرض هذه في التنقل" "select_users": "تحديد المستخدمين الذين يجب أن يروا طريقة العرض هذه في التنقل"
@@ -1417,7 +1197,6 @@
"cancel": "لا يهم", "cancel": "لا يهم",
"close": "إغلاق", "close": "إغلاق",
"empty_config": "ابدأ بلوحة معلومات فارغة", "empty_config": "ابدأ بلوحة معلومات فارغة",
"para_sure": "هل أنت متأكد أنك تريد التحكم في واجهة المستخدم الخاصة بك؟",
"yaml_mode": "أنت تستخدم وضع YAML للوحة البيانات هذه ، مما يعني أنه لا يمكنك تغيير تكوين Lovelace من واجهة المستخدم. إذا كنت تريد إدارة لوحة التحكم هذه من واجهة المستخدم ، فقم بإزالة \"الوضع: yaml\" من تكوين Lovelace في \"config.yaml.\"." "yaml_mode": "أنت تستخدم وضع YAML للوحة البيانات هذه ، مما يعني أنه لا يمكنك تغيير تكوين Lovelace من واجهة المستخدم. إذا كنت تريد إدارة لوحة التحكم هذه من واجهة المستخدم ، فقم بإزالة \"الوضع: yaml\" من تكوين Lovelace في \"config.yaml.\"."
}, },
"view": { "view": {
@@ -1429,15 +1208,10 @@
"menu": { "menu": {
"reload_resources": "إعادة تحميل الموارد" "reload_resources": "إعادة تحميل الموارد"
}, },
"reload_lovelace": "إعادة تحميل واجهة المستخدم",
"reload_resources": { "reload_resources": {
"refresh_body": "يجب عليك تحديث الصفحة لإكمال إعادة التحميل ، هل تريد التحديث الآن؟", "refresh_body": "يجب عليك تحديث الصفحة لإكمال إعادة التحميل ، هل تريد التحديث الآن؟",
"refresh_header": "هل تريد التحديث؟" "refresh_header": "هل تريد التحديث؟"
}, },
"unused_entities": {
"no_data": "لم يعثر على كيانات غير مستخدمة",
"search": "إبحث عن الكيانات"
},
"views": { "views": {
"confirm_delete_existing_cards": "سيؤدي حذف هذا العرض إلى إزالة البطاقات أيضًا", "confirm_delete_existing_cards": "سيؤدي حذف هذا العرض إلى إزالة البطاقات أيضًا",
"confirm_delete_existing_cards_text": "هل أنت متأكد من أنك تريد حذف طريقة عرض ''{name}''؟ تحتوي طريقة العرض على {number} بطاقات سيتم حذفها. لا يمكن التراجع عن هذا الإجراء.", "confirm_delete_existing_cards_text": "هل أنت متأكد من أنك تريد حذف طريقة عرض ''{name}''؟ تحتوي طريقة العرض على {number} بطاقات سيتم حذفها. لا يمكن التراجع عن هذا الإجراء.",
@@ -1447,7 +1221,7 @@
"attribute_not_found": "السمة {attribute} غير متاحة في: {entity}", "attribute_not_found": "السمة {attribute} غير متاحة في: {entity}",
"entity_not_found": "الجهاز غير متوفر: {entity}", "entity_not_found": "الجهاز غير متوفر: {entity}",
"entity_unavailable": "العنصر غير متوفر", "entity_unavailable": "العنصر غير متوفر",
"starting": "Home Assistant يبدأ، قد لا يكون كل شيء متاح حتى الآن" "starting": "يبدأ مساعد المنزل ، قد لا يكون كل شيء متاح حتى الآن"
} }
}, },
"mailbox": { "mailbox": {
@@ -1471,16 +1245,6 @@
} }
} }
} }
},
"trusted_networks": {
"abort": {
"not_allowed": "كمبيوترك غير مسموح به."
},
"step": {
"init": {
"description": "يرجى تحديد المستخدم الذي تريد تسجيل الدخول باسمه:"
}
}
} }
}, },
"start_over": "البدء من جديد", "start_over": "البدء من جديد",
@@ -1488,22 +1252,7 @@
}, },
"initializing": "جار التهيئة" "initializing": "جار التهيئة"
}, },
"page-demo": {
"config": {
"arsaboo": {
"labels": {
"air": "هواء"
}
}
}
},
"page-onboarding": { "page-onboarding": {
"integration": {
"finish": "إنهاء",
"intro": "يتم تمثيل الأجهزة والخدمات في Home Assistant كتكاملات. يمكنك إعدادها الآن ، أو القيام بذلك لاحقًا من شاشة التكوين.",
"more_integrations": "المزيد"
},
"intro": "هل أنت مستعد لإيقاظ منزلك واستعادة خصوصيتك والانضمام إلى مجتمع عالمي من اللاعبين؟",
"user": { "user": {
"data": { "data": {
"password": "كلمه السر", "password": "كلمه السر",
@@ -1538,7 +1287,7 @@
"language": { "language": {
"dropdown_label": "اللغة", "dropdown_label": "اللغة",
"header": "اللغة", "header": "اللغة",
"link_promo": "ساعد في الترجمة" "link_promo": "المساعدة في ترجمة"
}, },
"long_lived_access_tokens": { "long_lived_access_tokens": {
"last_used": "آخر استخدام بتاريخ {date} من {location}", "last_used": "آخر استخدام بتاريخ {date} من {location}",
@@ -1568,10 +1317,6 @@
"last_used": "آخر استخدام بتاريخ {date} من {location}", "last_used": "آخر استخدام بتاريخ {date} من {location}",
"not_used": "لم يتم استخدامها ابدأ" "not_used": "لم يتم استخدامها ابدأ"
}, },
"suspend": {
"description": "هل يغلق الاتصال بالخادم بعد إخفاؤه لمدة 5 دقائق؟",
"header": "إغلق الاتصال تلقائيًا"
},
"themes": { "themes": {
"dropdown_label": "التصميم", "dropdown_label": "التصميم",
"error_no_theme": "لا توجد تصاميم متاحة.", "error_no_theme": "لا توجد تصاميم متاحة.",

View File

@@ -1159,7 +1159,6 @@
}, },
"edit_card": { "edit_card": {
"add": "Добавяне на карта", "add": "Добавяне на карта",
"confirm_cancel": "Сигурни ли сте, че искате да отмените?",
"delete": "Изтриване на карта", "delete": "Изтриване на карта",
"edit": "Редактиране", "edit": "Редактиране",
"header": "Конфигуриране на Карта", "header": "Конфигуриране на Карта",

View File

@@ -430,8 +430,6 @@
"activate": "Activar" "activate": "Activar"
}, },
"script": { "script": {
"cancel": "Cancel·la",
"cancel_multiple": "Cancel·la {number}",
"execute": "Executar" "execute": "Executar"
}, },
"service": { "service": {
@@ -528,7 +526,6 @@
"show_areas": "Mostra àrees" "show_areas": "Mostra àrees"
}, },
"data-table": { "data-table": {
"no-data": "No hi ha dades",
"search": "Cerca" "search": "Cerca"
}, },
"date-range-picker": { "date-range-picker": {
@@ -952,10 +949,10 @@
"description": "El mode controla què passa quan es dispara l'automatització i encara hi ha accions executant-se d'un disparament anterior. Consulta {documentation_link} per a més informació.", "description": "El mode controla què passa quan es dispara l'automatització i encara hi ha accions executant-se d'un disparament anterior. Consulta {documentation_link} per a més informació.",
"documentation": "documentació d'automatització", "documentation": "documentació d'automatització",
"label": "Mode", "label": "Mode",
"parallel": "Paral·lel", "parallel": "Paral·lel (per defecte)",
"queued": "A la cua", "queued": "A la cua",
"restart": "Reinicia", "restart": "Reinicia",
"single": "Individual (per defecte)" "single": "Individual"
}, },
"move_down": "Mou avall", "move_down": "Mou avall",
"move_up": "Mou amunt", "move_up": "Mou amunt",
@@ -1665,7 +1662,6 @@
"introduction": "Les entitats que no pertanyen a un dispositiu es poden configurar aquí.", "introduction": "Les entitats que no pertanyen a un dispositiu es poden configurar aquí.",
"without_device": "Entitats sense dispositiu" "without_device": "Entitats sense dispositiu"
}, },
"icon": "Icona",
"introduction": "Utilitza les escenes per donar més vida a la teva llar.", "introduction": "Utilitza les escenes per donar més vida a la teva llar.",
"load_error_not_editable": "Només es poden editar les escenes de l'arxiu scenes.yaml.", "load_error_not_editable": "Només es poden editar les escenes de l'arxiu scenes.yaml.",
"load_error_unknown": "Error en carregar l'escena ({err_no}).", "load_error_unknown": "Error en carregar l'escena ({err_no}).",
@@ -1699,10 +1695,6 @@
"delete_confirm": "Estàs segur que vols eliminar aquest script?", "delete_confirm": "Estàs segur que vols eliminar aquest script?",
"delete_script": "Elimina l'script", "delete_script": "Elimina l'script",
"header": "Script: {name}", "header": "Script: {name}",
"icon": "Icona",
"id": "ID de l'entitat",
"id_already_exists": "Aquest ID ja existeix",
"id_already_exists_save_error": "No pots desar aquest script perquè l'ID no és únic, tria'n un altre o deixa-ho en blanc perquè se'n generi un automàticament.",
"introduction": "Utilitza els scripts per executar seqüències d'accions.", "introduction": "Utilitza els scripts per executar seqüències d'accions.",
"link_available_actions": "Més informació sobre les accions disponibles.", "link_available_actions": "Més informació sobre les accions disponibles.",
"load_error_not_editable": "Només es poden editar els scripts dins de l'arxiu scripts.yaml.", "load_error_not_editable": "Només es poden editar els scripts dins de l'arxiu scripts.yaml.",
@@ -1816,7 +1808,7 @@
"discovered_text": "Els dispositius apareixeran aquí un cop descoberts.", "discovered_text": "Els dispositius apareixeran aquí un cop descoberts.",
"discovery_text": "Els dispositius descoberts apareixeran aquí. Segueix les instruccions del/s teu/s dispositiu/s i posa el dispositiu/s en mode d'emparellament.", "discovery_text": "Els dispositius descoberts apareixeran aquí. Segueix les instruccions del/s teu/s dispositiu/s i posa el dispositiu/s en mode d'emparellament.",
"header": "Domòtica amb Zigbee - Afegir dispositius", "header": "Domòtica amb Zigbee - Afegir dispositius",
"no_devices_found": "No s'han trobat dispositius, assegura't que estiguin en mode vinculació i manten-los desperts mentre s'estiguin descoberint.", "no_devices_found": "No s'han trobat dispositius, assegura't que estiguin en mode vinculació i manten-los desperts mentre estiguin intentant ser descoberts.",
"pairing_mode": "Assegura't que els dispositiu estiguin en mode vinculació. Consulta les instruccions del dispositiu per saber com fer-ho.", "pairing_mode": "Assegura't que els dispositiu estiguin en mode vinculació. Consulta les instruccions del dispositiu per saber com fer-ho.",
"search_again": "Torna a cercar", "search_again": "Torna a cercar",
"spinner": "S'estan cercant dispositius ZHA Zigbee..." "spinner": "S'estan cercant dispositius ZHA Zigbee..."
@@ -2340,7 +2332,6 @@
}, },
"edit_card": { "edit_card": {
"add": "Afegir targeta", "add": "Afegir targeta",
"confirm_cancel": "Segur que vols cancel·lar?",
"delete": "Elimina targeta", "delete": "Elimina targeta",
"duplicate": "Duplica targeta", "duplicate": "Duplica targeta",
"edit": "Editar", "edit": "Editar",
@@ -2351,9 +2342,7 @@
"pick_card_view_title": "Quina targeta vols afegir a la visualització {name}?", "pick_card_view_title": "Quina targeta vols afegir a la visualització {name}?",
"show_code_editor": "Mostra l'editor de codi", "show_code_editor": "Mostra l'editor de codi",
"show_visual_editor": "Mostra l'editor visual", "show_visual_editor": "Mostra l'editor visual",
"toggle_editor": "Commutar l'editor", "toggle_editor": "Commutar l'editor"
"typed_header": "Configuració de la targeta {type}",
"unsaved_changes": "Hi ha canvis no desats"
}, },
"edit_lovelace": { "edit_lovelace": {
"edit_title": "Edita el títol", "edit_title": "Edita el títol",
@@ -2446,8 +2435,6 @@
"entity": "Entitat", "entity": "Entitat",
"entity_id": "ID de l'entitat", "entity_id": "ID de l'entitat",
"last_changed": "Últim canvi", "last_changed": "Últim canvi",
"no_data": "No s'han trobat entitats sense utilitzar",
"search": "Cerca entitats",
"select_to_add": "Selecciona les entitats que vols afegir a una targeta i fés clic al botó d'afegir targeta.", "select_to_add": "Selecciona les entitats que vols afegir a una targeta i fés clic al botó d'afegir targeta.",
"title": "Entitats sense utilitzar" "title": "Entitats sense utilitzar"
}, },

View File

@@ -70,9 +70,9 @@
"armed_custom_bypass": "Zabezpečeno", "armed_custom_bypass": "Zabezpečeno",
"armed_home": "Zabezpečeno", "armed_home": "Zabezpečeno",
"armed_night": "Zabezpečeno", "armed_night": "Zabezpečeno",
"arming": "Zabezpečování", "arming": "Aktivace",
"disarmed": "Nezabezpečeno", "disarmed": "Nezabezpečeno",
"disarming": "Odbezpečování", "disarming": "Deaktivace",
"pending": "Čeká", "pending": "Čeká",
"triggered": "Spuštěn" "triggered": "Spuštěn"
}, },
@@ -95,7 +95,7 @@
"alarm_control_panel": { "alarm_control_panel": {
"armed": "Zabezpečeno", "armed": "Zabezpečeno",
"armed_away": "Režim nepřítomnost", "armed_away": "Režim nepřítomnost",
"armed_custom_bypass": "Zabezpečeno uživatelským obejitím", "armed_custom_bypass": "Aktivní uživatelským obejitím",
"armed_home": "Režim domov", "armed_home": "Režim domov",
"armed_night": "Noční režim", "armed_night": "Noční režim",
"arming": "Zabezpečování", "arming": "Zabezpečování",
@@ -430,8 +430,6 @@
"activate": "Aktivovat" "activate": "Aktivovat"
}, },
"script": { "script": {
"cancel": "Zrušit",
"cancel_multiple": "Zrušit {number}",
"execute": "Vykonat" "execute": "Vykonat"
}, },
"service": { "service": {
@@ -527,10 +525,6 @@
"clear": "Vymazat", "clear": "Vymazat",
"show_areas": "Zobrazit oblasti" "show_areas": "Zobrazit oblasti"
}, },
"data-table": {
"no-data": "Žádná data",
"search": "Hledat"
},
"date-range-picker": { "date-range-picker": {
"end_date": "Koncové datum", "end_date": "Koncové datum",
"select": "Vybrat", "select": "Vybrat",
@@ -944,19 +938,6 @@
"introduction": "Použijte automatizace k oživení svého domova", "introduction": "Použijte automatizace k oživení svého domova",
"load_error_not_editable": "Lze upravovat pouze automatizace v automations.yaml.", "load_error_not_editable": "Lze upravovat pouze automatizace v automations.yaml.",
"load_error_unknown": "Chyba při načítání automatizace ({err_no}).", "load_error_unknown": "Chyba při načítání automatizace ({err_no}).",
"max": {
"parallel": "Maximální počet paralelních spuštění",
"queued": "Délka fronty"
},
"modes": {
"description": "Režim určuje, co se stane, když je automatizace spuštěna a zároveň stále ještě běží akce na základě předchozího spuštění. Další informace naleznete na {documentation_link}.",
"documentation": "Dokumentace automatizací",
"label": "Režim",
"parallel": "Paralelně",
"queued": "Fronta",
"restart": "Restart",
"single": "Jediný (výchozí)"
},
"move_down": "Posunout dolů", "move_down": "Posunout dolů",
"move_up": "Posunout nahoru", "move_up": "Posunout nahoru",
"save": "Uložit", "save": "Uložit",
@@ -1375,7 +1356,6 @@
"confirm_text": "Entity lze odebrat pouze v případě, že integrace již entity neposkytuje.", "confirm_text": "Entity lze odebrat pouze v případě, že integrace již entity neposkytuje.",
"confirm_title": "Chcete odstranit {number} entit?" "confirm_title": "Chcete odstranit {number} entit?"
}, },
"search": "Hledat entitu",
"selected": "{number} vybraných", "selected": "{number} vybraných",
"status": { "status": {
"disabled": "Zakázáno", "disabled": "Zakázáno",
@@ -1406,14 +1386,13 @@
"entity_id": "ID entity", "entity_id": "ID entity",
"name": "Název", "name": "Název",
"type": "Typ" "type": "Typ"
}, }
"no_helpers": "Vypadá to, že ještě nemáte žádné pomocníky!"
}, },
"types": { "types": {
"input_boolean": "Přepínač", "input_boolean": "Přepnout",
"input_datetime": "Datum a/nebo čas", "input_datetime": "Datum a/nebo čas",
"input_number": "Číslo", "input_number": "Číslo",
"input_select": "Výběr", "input_select": "Rozbalovací nabídka",
"input_text": "Text" "input_text": "Text"
} }
}, },
@@ -1511,8 +1490,7 @@
"note_about_integrations": "Ne všechny integrace lze prozatím konfigurovat prostřednictvím uživatelského rozhraní.", "note_about_integrations": "Ne všechny integrace lze prozatím konfigurovat prostřednictvím uživatelského rozhraní.",
"note_about_website_reference": "Další jsou k dispozici na ", "note_about_website_reference": "Další jsou k dispozici na ",
"rename_dialog": "Upravit název této položky nastavení", "rename_dialog": "Upravit název této položky nastavení",
"rename_input_label": "Název položky", "rename_input_label": "Název položky"
"search": "Hledat integraci"
}, },
"introduction": "Zde je možné konfigurovat vaše komponenty a Home Assistant.\nZ uživatelského rozhraní sice zatím není možné konfigurovat vše, ale pracujeme na tom.", "introduction": "Zde je možné konfigurovat vaše komponenty a Home Assistant.\nZ uživatelského rozhraní sice zatím není možné konfigurovat vše, ale pracujeme na tom.",
"logs": { "logs": {
@@ -1665,7 +1643,6 @@
"introduction": "Zde lze nastavit entity, které nepatří k zařízení.", "introduction": "Zde lze nastavit entity, které nepatří k zařízení.",
"without_device": "Entity bez zařízení" "without_device": "Entity bez zařízení"
}, },
"icon": "Ikona",
"introduction": "Pomocí scén oživte svůj domov.", "introduction": "Pomocí scén oživte svůj domov.",
"load_error_not_editable": "Lze upravovat pouze scény v souboru scenes.yaml.", "load_error_not_editable": "Lze upravovat pouze scény v souboru scenes.yaml.",
"load_error_unknown": "Chyba při načítání scény ({err_no}).", "load_error_unknown": "Chyba při načítání scény ({err_no}).",
@@ -1699,26 +1676,9 @@
"delete_confirm": "Opravdu chcete tento skript smazat?", "delete_confirm": "Opravdu chcete tento skript smazat?",
"delete_script": "Smazat skript", "delete_script": "Smazat skript",
"header": "Skript: {name}", "header": "Skript: {name}",
"icon": "Ikona",
"id": "ID entity",
"id_already_exists": "Toto ID již existuje",
"id_already_exists_save_error": "Tento skript nelze uložit, protože ID není jedinečné, vyberte jiné ID nebo jej nechte prázdné a bude automaticky vygenerováno.",
"introduction": "K provedení posloupnosti akcí použijte skripty.", "introduction": "K provedení posloupnosti akcí použijte skripty.",
"link_available_actions": "Další informace o dostupných akcích.", "link_available_actions": "Další informace o dostupných akcích.",
"load_error_not_editable": "Upravovat lze pouze skripty uvnitř scripts.yaml.", "load_error_not_editable": "Upravovat lze pouze skripty uvnitř scripts.yaml.",
"max": {
"parallel": "Maximální počet paralelních spuštění",
"queued": "Délka fronty"
},
"modes": {
"description": "Režim určuje, co se stane, když je skript spuštěn a zároveň stále ještě běží na základě předchozího spuštění. Další informace naleznete na {documentation_link}.",
"documentation": "Dokumentace skriptů",
"label": "Režim",
"parallel": "Paralelně",
"queued": "Fronta",
"restart": "Restart",
"single": "Jediný (výchozí)"
},
"sequence": "Sekvence", "sequence": "Sekvence",
"sequence_sentence": "Posloupnost akcí tohoto skriptu." "sequence_sentence": "Posloupnost akcí tohoto skriptu."
}, },
@@ -1731,7 +1691,7 @@
}, },
"introduction": "Editor skriptů umožňuje vytvářet a upravovat skripty. Postupujte podle níže uvedeného odkazu a přečtěte si pokyny, abyste se ujistili, že jste Home Assistant nakonfigurovali správně.", "introduction": "Editor skriptů umožňuje vytvářet a upravovat skripty. Postupujte podle níže uvedeného odkazu a přečtěte si pokyny, abyste se ujistili, že jste Home Assistant nakonfigurovali správně.",
"learn_more": "Další informace o skriptech", "learn_more": "Další informace o skriptech",
"no_scripts": "Nemohli jsme najít žádné upravitelné skripty", "no_scripts": "Nemohli jsme najít žádné editovatelné skripty",
"show_info": "Zobrazit informace o skriptu", "show_info": "Zobrazit informace o skriptu",
"trigger_script": "Spustit skript" "trigger_script": "Spustit skript"
} }
@@ -1745,11 +1705,11 @@
"core": "Znovu načíst umístění a přizpůsobení", "core": "Znovu načíst umístění a přizpůsobení",
"group": "Znovu načíst skupiny", "group": "Znovu načíst skupiny",
"heading": "Konfigurace se načítá", "heading": "Konfigurace se načítá",
"input_boolean": "Znovu načíst pomocníky - čísla", "input_boolean": "Znovu načíst logické hodnoty",
"input_datetime": "Znovu načíst pomocníky - data/časy", "input_datetime": "Znovu načíst časy",
"input_number": "Znovu načíst pomocníky - přepínače", "input_number": "Znovu načíst vstupní čísla",
"input_select": "Znovu načíst pomocníky - výběry", "input_select": "Znovu načíst výběr",
"input_text": "Znovu načíst pomocníky - texty", "input_text": "Znovu načíst text",
"introduction": "Některé části Home Assistant lze načíst bez nutnosti restartování. Volba načtení zahodí jejich aktuální konfiguraci a načte novou.", "introduction": "Některé části Home Assistant lze načíst bez nutnosti restartování. Volba načtení zahodí jejich aktuální konfiguraci a načte novou.",
"person": "Znovu načíst osoby", "person": "Znovu načíst osoby",
"scene": "Znovu načíst scény", "scene": "Znovu načíst scény",
@@ -1939,9 +1899,9 @@
"update": "Aktualizovat" "update": "Aktualizovat"
}, },
"edit_home_zone": "Poloměr domovské zóny zatím nelze upravit z frontendu. Z frontendu se dá změnit jen poloha domovské zóny.", "edit_home_zone": "Poloměr domovské zóny zatím nelze upravit z frontendu. Z frontendu se dá změnit jen poloha domovské zóny.",
"edit_home_zone_narrow": "Poloměr domovské zóny zatím nelze upravit z rozhraní. Umístění lze změnit z obecné konfigurace.", "edit_home_zone_narrow": "Poloměr domovské zóny zatím nelze upravit z frontendu. Umístění lze změnit z obecné konfigurace.",
"go_to_core_config": "Přejít na obecnou konfiguraci?", "go_to_core_config": "Přejít na obecnou konfiguraci?",
"home_zone_core_config": "Umístění vaší domovské zóny lze upravit na stránce obecné konfigurace. Poloměr domovské zóny zatím nelze upravit z rozhraní. Chcete přejít na obecnou konfiguraci?", "home_zone_core_config": "Umístění vaší domovské zóny lze upravit na stránce obecné konfigurace. Poloměr domovské zóny zatím nelze upravit z frontendu. Chcete přejít na obecnou konfiguraci?",
"introduction": "Zóny umožňují určit určité oblasti na zemi. Když je osoba v zóně, stav převezme název ze zóny. Zóny lze také použít jako aktivační událost nebo podmínku v nastavení automatizace.", "introduction": "Zóny umožňují určit určité oblasti na zemi. Když je osoba v zóně, stav převezme název ze zóny. Zóny lze také použít jako aktivační událost nebo podmínku v nastavení automatizace.",
"no_zones_created_yet": "Vypadá to, že nejsou vytvořené žádné zóny." "no_zones_created_yet": "Vypadá to, že nejsou vytvořené žádné zóny."
}, },
@@ -2234,7 +2194,6 @@
"name": "Název", "name": "Název",
"no_theme": "Žádný motiv", "no_theme": "Žádný motiv",
"refresh_interval": "Interval obnovení", "refresh_interval": "Interval obnovení",
"search": "Hledat",
"secondary_info_attribute": "Sekundární informační atribut", "secondary_info_attribute": "Sekundární informační atribut",
"show_icon": "Zobrazit ikonu?", "show_icon": "Zobrazit ikonu?",
"show_name": "Zobrazit název?", "show_name": "Zobrazit název?",
@@ -2340,7 +2299,6 @@
}, },
"edit_card": { "edit_card": {
"add": "Přidat kartu", "add": "Přidat kartu",
"confirm_cancel": "Opravdu chcete zahodit změny?",
"delete": "Odstranit", "delete": "Odstranit",
"duplicate": "Duplikovat Kartu", "duplicate": "Duplikovat Kartu",
"edit": "Upravit", "edit": "Upravit",
@@ -2351,15 +2309,12 @@
"pick_card_view_title": "Kterou kartu byste chtěli přidat do svého {name} pohledu?", "pick_card_view_title": "Kterou kartu byste chtěli přidat do svého {name} pohledu?",
"show_code_editor": "Zobrazit editor kódu", "show_code_editor": "Zobrazit editor kódu",
"show_visual_editor": "Zobrazit vizuální editor", "show_visual_editor": "Zobrazit vizuální editor",
"toggle_editor": "Přepnout Editor", "toggle_editor": "Přepnout Editor"
"typed_header": "{type} Konfigurace karty",
"unsaved_changes": "Změny nejsou uloženy"
}, },
"edit_lovelace": { "edit_lovelace": {
"edit_title": "Upravit titulek", "edit_title": "Upravit titulek",
"explanation": "Tento název je zobrazen nad všemi vašimi zobrazeními v Lovelace.", "explanation": "Tento název je zobrazen nad všemi vašimi zobrazeními v Lovelace.",
"header": "Název vašeho uživatelského rozhraní Lovelace", "header": "Název vašeho uživatelského rozhraní Lovelace"
"title": "Název"
}, },
"edit_view": { "edit_view": {
"add": "Přidat pohled", "add": "Přidat pohled",
@@ -2408,7 +2363,7 @@
"empty_config": "Začít s prázdným dashboardem", "empty_config": "Začít s prázdným dashboardem",
"header": "Převzít kontrolu nad vaší Lovelace UI", "header": "Převzít kontrolu nad vaší Lovelace UI",
"para": "Ve výchozím nastavení bude Home Assistant spravovat vaše uživatelské rozhraní aktualizovat jej při přidání nové entity nebo Lovelace komponenty. Pokud převezmete kontrolu, nebudeme již provádět změny automaticky za vás.", "para": "Ve výchozím nastavení bude Home Assistant spravovat vaše uživatelské rozhraní aktualizovat jej při přidání nové entity nebo Lovelace komponenty. Pokud převezmete kontrolu, nebudeme již provádět změny automaticky za vás.",
"para_sure": "Opravdu chcete převzít kontrolu nad uživalským rozhraním ?", "para_sure": "Opravdu chcete převzít kontrolu nad uživalským rohraním ?",
"save": "Převzít kontrolu", "save": "Převzít kontrolu",
"yaml_config": "Abyste mohli snadněji začít, zde aktuální konfigurace tohoto dashboardu:", "yaml_config": "Abyste mohli snadněji začít, zde aktuální konfigurace tohoto dashboardu:",
"yaml_control": "Chcete-li převzít kontrolu v režimu YAML, vytvořte soubor YAML s názvem, který jste uvedli ve své konfiguraci pro tento dashboard nebo výchozí 'ui-lovelace.yaml'.", "yaml_control": "Chcete-li převzít kontrolu v režimu YAML, vytvořte soubor YAML s názvem, který jste uvedli ve své konfiguraci pro tento dashboard nebo výchozí 'ui-lovelace.yaml'.",
@@ -2446,8 +2401,6 @@
"entity": "Entita", "entity": "Entita",
"entity_id": "ID entity", "entity_id": "ID entity",
"last_changed": "Naposledy změněno", "last_changed": "Naposledy změněno",
"no_data": "Nebyly nalezeny žádné nepoužívané entity",
"search": "Hledat entitu",
"select_to_add": "Vyberte entity, které chcete přidat do karty, a poté klikněte na tlačítko přidat kartu.", "select_to_add": "Vyberte entity, které chcete přidat do karty, a poté klikněte na tlačítko přidat kartu.",
"title": "Nepoužité entity" "title": "Nepoužité entity"
}, },
@@ -2550,7 +2503,6 @@
}, },
"trusted_networks": { "trusted_networks": {
"abort": { "abort": {
"not_allowed": "Váš počítač není povolen.",
"not_whitelisted": "Váš počítač není na seznamu povolených." "not_whitelisted": "Váš počítač není na seznamu povolených."
}, },
"step": { "step": {
@@ -2726,10 +2678,6 @@
"not_used": "Nikdy nebylo použito", "not_used": "Nikdy nebylo použito",
"token_title": "Obnovovací token pro {clientId}" "token_title": "Obnovovací token pro {clientId}"
}, },
"suspend": {
"description": "Měli bychom ukončit spojení se serverem, pokud není Home Assistant viditelný po dobu delší než 5 minut?",
"header": "Automaticky ukončovat spojení"
},
"themes": { "themes": {
"dropdown_label": "Motiv", "dropdown_label": "Motiv",
"error_no_theme": "Žádné motivy nejsou k dispozici.", "error_no_theme": "Žádné motivy nejsou k dispozici.",

View File

@@ -77,7 +77,7 @@
"triggered": "Ausgel." "triggered": "Ausgel."
}, },
"default": { "default": {
"entity_not_found": "Entität nicht gefunden", "entity_not_found": "Entität nicht gefunden!",
"error": "Fehler", "error": "Fehler",
"unavailable": "N.v.", "unavailable": "N.v.",
"unknown": "Unbek." "unknown": "Unbek."
@@ -430,8 +430,6 @@
"activate": "Aktivieren" "activate": "Aktivieren"
}, },
"script": { "script": {
"cancel": "Abbrechen",
"cancel_multiple": "Abbrechen {number}",
"execute": "Ausführen" "execute": "Ausführen"
}, },
"service": { "service": {
@@ -528,7 +526,6 @@
"show_areas": "Bereiche anzeigen" "show_areas": "Bereiche anzeigen"
}, },
"data-table": { "data-table": {
"no-data": "Keine Daten",
"search": "Suche" "search": "Suche"
}, },
"date-range-picker": { "date-range-picker": {
@@ -740,7 +737,7 @@
"power_source": "Energiequelle", "power_source": "Energiequelle",
"quirk": "Eigenart", "quirk": "Eigenart",
"services": { "services": {
"reconfigure": "Konfiguriere das ZHA-Gerät neu (Gerät heilen). Verwende diese Option, wenn du Probleme mit dem Gerät hast. Wenn es sich bei dem fraglichen Gerät um ein batteriebetriebenes Gerät handelt, vergewissere dich, dass es wach ist und Befehle akzeptiert, wenn du diesen Dienst nutzt.", "reconfigure": "Konfigurieren Sie das ZHA-Gerät neu (Gerät heilen). Verwenden Sie diese Option, wenn Sie Probleme mit dem Gerät haben. Wenn es sich bei dem fraglichen Gerät um ein batteriebetriebenes Gerät handelt, vergewissern Sie sich, dass es wach ist und Befehle akzeptiert, wenn Sie diesen Dienst nutzen.",
"remove": "Ein Gerät aus dem ZigBee-Netzwerk entfernen.", "remove": "Ein Gerät aus dem ZigBee-Netzwerk entfernen.",
"updateDeviceName": "Lege einen benutzerdefinierten Namen für dieses Gerät in der Geräteregistrierung fest.", "updateDeviceName": "Lege einen benutzerdefinierten Namen für dieses Gerät in der Geräteregistrierung fest.",
"zigbee_information": "Zeige die ZigBee-Informationen für das Gerät an." "zigbee_information": "Zeige die ZigBee-Informationen für das Gerät an."
@@ -766,7 +763,7 @@
"remember": "Merken" "remember": "Merken"
}, },
"notification_drawer": { "notification_drawer": {
"click_to_configure": "Klicke auf die Schaltfläche, um {entity} zu konfigurieren", "click_to_configure": "Klicke auf die Schaltfläche, um {entity} zu konfigurieren.",
"close": "Schließen", "close": "Schließen",
"empty": "Keine Benachrichtigungen", "empty": "Keine Benachrichtigungen",
"title": "Benachrichtigungen" "title": "Benachrichtigungen"
@@ -775,7 +772,7 @@
"connection_lost": "Verbindung getrennt. Verbinde erneut...", "connection_lost": "Verbindung getrennt. Verbinde erneut...",
"service_call_failed": "Fehler beim Aufrufen des Service {service}.", "service_call_failed": "Fehler beim Aufrufen des Service {service}.",
"started": "Home Assistant wurde vollständig gestartet!", "started": "Home Assistant wurde vollständig gestartet!",
"starting": "Home Assistant startet, währenddessen kann es sein, dass nicht alles verfügbar ist.", "starting": "Home Assistant startet, währenddessen kann es sein das nicht alles verfügbar ist.",
"triggered": "{name} ausgelöst" "triggered": "{name} ausgelöst"
}, },
"panel": { "panel": {
@@ -814,7 +811,7 @@
"header": "Bereiche", "header": "Bereiche",
"integrations_page": "Integrationsseite", "integrations_page": "Integrationsseite",
"introduction": "In Bereichen wird festgelegt, wo sich Geräte befinden. Diese Informationen werden in Home Assistant verwendet, um Sie bei der Organisation Ihrer Benutzeroberfläche, Berechtigungen und Integrationen mit anderen Systemen zu unterstützen.", "introduction": "In Bereichen wird festgelegt, wo sich Geräte befinden. Diese Informationen werden in Home Assistant verwendet, um Sie bei der Organisation Ihrer Benutzeroberfläche, Berechtigungen und Integrationen mit anderen Systemen zu unterstützen.",
"introduction2": "Um Geräte in einem Bereich zu platzieren, navigiere mit dem Link unten zur Integrationsseite und klicke dann auf eine konfigurierte Integration, um zu den Gerätekarten zu gelangen.", "introduction2": "Um Geräte in einem Bereich zu platzieren, navigieren Sie mit dem Link unten zur Integrationsseite und klicken Sie dann auf eine konfigurierte Integration, um zu den Gerätekarten zu gelangen.",
"no_areas": "Sieht aus, als hätten Sie noch keine Bereiche!" "no_areas": "Sieht aus, als hätten Sie noch keine Bereiche!"
} }
}, },
@@ -944,19 +941,6 @@
"introduction": "Benutze Automatisierungen, um deinem Zuhause Leben einzuhauchen", "introduction": "Benutze Automatisierungen, um deinem Zuhause Leben einzuhauchen",
"load_error_not_editable": "Nur Automatisierungen in automations.yaml sind editierbar.", "load_error_not_editable": "Nur Automatisierungen in automations.yaml sind editierbar.",
"load_error_unknown": "Fehler beim Laden der Automatisierung ({err_no}).", "load_error_unknown": "Fehler beim Laden der Automatisierung ({err_no}).",
"max": {
"parallel": "Maximale Anzahl paralleler Läufe",
"queued": "Länge der Warteschlange"
},
"modes": {
"description": "Der Modus steuert, was passiert, wenn ein Skript aufgerufen wird, während es noch von einem oder mehreren vorherigen Aufrufen ausgeführt wird. Überprüfen Sie den {documentation_link} für weitere Informationen.",
"documentation": "Automatisierungs-Dokumentation",
"label": "Modus",
"parallel": "Parallel",
"queued": "In Warteschlange",
"restart": "Neu starten",
"single": "Einzeln (Standard)"
},
"move_down": "Runterschieben", "move_down": "Runterschieben",
"move_up": "Hochschieben", "move_up": "Hochschieben",
"save": "Speichern", "save": "Speichern",
@@ -1158,7 +1142,7 @@
"dialog_cloudhook": { "dialog_cloudhook": {
"available_at": "Der Webhook ist unter der folgenden URL verfügbar:", "available_at": "Der Webhook ist unter der folgenden URL verfügbar:",
"close": "Schließen", "close": "Schließen",
"confirm_disable": "Möchtest du diesen Webhook wirklich deaktivieren?", "confirm_disable": "Möchten Sie diesen Webhook wirklich deaktivieren?",
"copied_to_clipboard": "In die Zwischenablage kopiert", "copied_to_clipboard": "In die Zwischenablage kopiert",
"info_disable_webhook": "Wenn du diesen Webhook nicht mehr nutzen willst, kannst du", "info_disable_webhook": "Wenn du diesen Webhook nicht mehr nutzen willst, kannst du",
"link_disable_webhook": "deaktiviere es", "link_disable_webhook": "deaktiviere es",
@@ -1407,7 +1391,7 @@
"name": "Name", "name": "Name",
"type": "Typ" "type": "Typ"
}, },
"no_helpers": "Sieht so aus, als hättest du noch keine Helfer!" "no_helpers": "Sieht so aus, als hätten Sie noch keine Helfer!"
}, },
"types": { "types": {
"input_boolean": "Umschalten", "input_boolean": "Umschalten",
@@ -1439,8 +1423,8 @@
}, },
"integration_panel_move": { "integration_panel_move": {
"link_integration_page": "Integrationsseite", "link_integration_page": "Integrationsseite",
"missing_zha": "Vermisst du das ZHA-Konfigurationspanel? Es wurde in den ZHA-Eintrag auf der {integrations_page} verschoben.", "missing_zha": "Vermissen Sie das ZHA-Konfigurationspanel? Es wurde in den ZHA-Eintrag auf der {integrations_page} verschoben.",
"missing_zwave": "Vermisst du das Z-Wave-Konfigurationspanel? Es wurde in den Z-Wave-Eintrag auf der {integrations_page} verschoben." "missing_zwave": "Vermissen Sie das Z-Wave-Konfigurationspanel? Es wurde in den Z-Wave-Eintrag auf der {integrations_page} verschoben."
}, },
"integrations": { "integrations": {
"add_integration": "Integration hinzufügen", "add_integration": "Integration hinzufügen",
@@ -1622,7 +1606,7 @@
"person": { "person": {
"add_person": "Person hinzufügen", "add_person": "Person hinzufügen",
"caption": "Personen", "caption": "Personen",
"confirm_delete": "Möchtest du diese Person wirklich löschen?", "confirm_delete": "Möchten Sie diese Person wirklich löschen?",
"confirm_delete2": "Alle Geräte, die zu dieser Person gehören, werden nicht mehr zugeordnet.", "confirm_delete2": "Alle Geräte, die zu dieser Person gehören, werden nicht mehr zugeordnet.",
"create_person": "Person erstellen", "create_person": "Person erstellen",
"description": "Verwalte die Personen, die Home Assistant verfolgt.", "description": "Verwalte die Personen, die Home Assistant verfolgt.",
@@ -1638,7 +1622,7 @@
"name": "Name", "name": "Name",
"name_error_msg": "Name erforderlich", "name_error_msg": "Name erforderlich",
"new_person": "Neue Person", "new_person": "Neue Person",
"no_device_tracker_available_intro": "Wenn du Geräte hast, die die Anwesenheit einer Person anzeigen, kannst du diese hier einer Person zuordnen. Du kannst dein erstes Gerät hinzufügen, indem du eine Integration zur Anwesenheitserkennung auf der Integrationsseite hinzufügst.", "no_device_tracker_available_intro": "Wenn Sie Geräte haben, die die Anwesenheit einer Person anzeigen, können Sie diese hier einer Person zuordnen. Sie können Ihr erstes Gerät hinzufügen, indem Sie eine Integration zur Anwesenheitserkennung auf der Integrationsseite hinzufügen.",
"update": "Aktualisieren" "update": "Aktualisieren"
}, },
"introduction": "Hier können Sie jede Person von Interesse in Home Assistant definieren.", "introduction": "Hier können Sie jede Person von Interesse in Home Assistant definieren.",
@@ -1665,7 +1649,6 @@
"introduction": "Entitäten, die nicht zu einem Gerät gehören, können hier festgelegt werden.", "introduction": "Entitäten, die nicht zu einem Gerät gehören, können hier festgelegt werden.",
"without_device": "Entitäten ohne Gerät" "without_device": "Entitäten ohne Gerät"
}, },
"icon": "Symbol",
"introduction": "Benutze Szenen um deinem Zuhause Leben einzuhauchen.", "introduction": "Benutze Szenen um deinem Zuhause Leben einzuhauchen.",
"load_error_not_editable": "Nur Szenen in der scenes.yaml sind editierbar.", "load_error_not_editable": "Nur Szenen in der scenes.yaml sind editierbar.",
"load_error_unknown": "Fehler beim Laden der Szene ({err_no}).", "load_error_unknown": "Fehler beim Laden der Szene ({err_no}).",
@@ -1699,26 +1682,9 @@
"delete_confirm": "Möchtest du dieses Skript wirklich löschen?", "delete_confirm": "Möchtest du dieses Skript wirklich löschen?",
"delete_script": "Skript löschen", "delete_script": "Skript löschen",
"header": "Skript: {name}", "header": "Skript: {name}",
"icon": "Symbol",
"id": "Entitäts-ID",
"id_already_exists": "Diese ID existiert bereits",
"id_already_exists_save_error": "Du kannst dieses Skript nicht speichern, da die ID nicht eindeutig ist. Wähle eine andere ID aus oder lasse sie leer, um automatisch eine zu generieren.",
"introduction": "Verwende Skripte, um eine Abfolge von Aktionen auszuführen.", "introduction": "Verwende Skripte, um eine Abfolge von Aktionen auszuführen.",
"link_available_actions": "Erfahre mehr über verfügbare Aktionen.", "link_available_actions": "Erfahre mehr über verfügbare Aktionen.",
"load_error_not_editable": "Nur Skripte in scripts.yaml können bearbeitet werden.", "load_error_not_editable": "Nur Skripte in scripts.yaml können bearbeitet werden.",
"max": {
"parallel": "Maximale Anzahl paralleler Läufe",
"queued": "Länge der Warteschlange"
},
"modes": {
"description": "Der Modus steuert, was passiert, wenn ein Skript aufgerufen wird, während es noch von einem oder mehreren vorherigen Aufrufen ausgeführt wird. Überprüfen Sie den {documentation_link} für weitere Informationen.",
"documentation": "Skript-Dokumentation",
"label": "Modus",
"parallel": "Parallel",
"queued": "In Warteschlange",
"restart": "Neu starten",
"single": "Einzeln (Standard)"
},
"sequence": "Sequenz", "sequence": "Sequenz",
"sequence_sentence": "Die Abfolge der Aktionen dieses Skripts." "sequence_sentence": "Die Abfolge der Aktionen dieses Skripts."
}, },
@@ -1729,7 +1695,7 @@
"headers": { "headers": {
"name": "Name" "name": "Name"
}, },
"introduction": "Mit dem Skript-Editor können Skripte erstellt und bearbeitet werden. Bitte folge dem untenstehenden Link, um die Anleitung zu finden. Das stellt sicher, dass Home Assistant richtig konfiguriert ist.", "introduction": "Mit dem Skript-Editor können Skripte erstellt und bearbeitet werden. Bitte folge Sie dem untenstehenden Link, um die Anleitung zu finden. Das stellt sicher, dass Home Assistant richtig konfiguriert ist.",
"learn_more": "Weitere Informationen zu Skripten", "learn_more": "Weitere Informationen zu Skripten",
"no_scripts": "Wir konnten keine bearbeitbaren Skripte finden", "no_scripts": "Wir konnten keine bearbeitbaren Skripte finden",
"show_info": "Informationen zum Skript anzeigen", "show_info": "Informationen zum Skript anzeigen",
@@ -1757,8 +1723,8 @@
"zone": "Zonen neu laden" "zone": "Zonen neu laden"
}, },
"server_management": { "server_management": {
"confirm_restart": "Möchtest du Home Assistant wirklich neu starten?", "confirm_restart": "Möchten Sie Home Assistant wirklich neu starten?",
"confirm_stop": "Möchtest du Home Assistant wirklich beenden?", "confirm_stop": "Möchten Sie Home Assistant wirklich beenden?",
"heading": "Serververwaltung", "heading": "Serververwaltung",
"introduction": "Verwalte Home Assistant… von Home Assistant aus.", "introduction": "Verwalte Home Assistant… von Home Assistant aus.",
"restart": "Neu starten", "restart": "Neu starten",
@@ -1789,7 +1755,7 @@
"admin": "Administrator", "admin": "Administrator",
"caption": "Benutzer anzeigen", "caption": "Benutzer anzeigen",
"change_password": "Passwort ändern", "change_password": "Passwort ändern",
"confirm_user_deletion": "Möchtest du {name} wirklich löschen?", "confirm_user_deletion": "Möchten Sie {name} wirklich löschen?",
"deactivate_user": "Benutzer deaktivieren", "deactivate_user": "Benutzer deaktivieren",
"delete_user": "Benutzer löschen", "delete_user": "Benutzer löschen",
"group": "Gruppe", "group": "Gruppe",
@@ -1816,7 +1782,7 @@
"discovered_text": "Geräte werden hier angezeigt sobald sie erkannt worden sind.", "discovered_text": "Geräte werden hier angezeigt sobald sie erkannt worden sind.",
"discovery_text": "Erkannte Geräte werden hier angezeigt. Befolgen Sie die Anweisungen für Ihr Gerät und versetzen Sie das Gerät in den Pairing-Modus.", "discovery_text": "Erkannte Geräte werden hier angezeigt. Befolgen Sie die Anweisungen für Ihr Gerät und versetzen Sie das Gerät in den Pairing-Modus.",
"header": "Zigbee Home Automation - Geräte hinzufügen", "header": "Zigbee Home Automation - Geräte hinzufügen",
"no_devices_found": "Es wurden keine Geräte erkannt. Stelle sicher, dass sie sich im Pairing-Modus befinden und halte sie aktiv, solange die Erkennung läuft.", "no_devices_found": "Es wurden keine Geräte erkannt. Stelle sicher, dass sie sich im Pairing-Modus befinden und halte sie aktiv, solange die Erkennung läuft,",
"pairing_mode": "Stelle sicher, dass sich deine Geräte im Pairing-Modus befinden. Überprüfe dazu die Anweisungen deines Geräts.", "pairing_mode": "Stelle sicher, dass sich deine Geräte im Pairing-Modus befinden. Überprüfe dazu die Anweisungen deines Geräts.",
"search_again": "Erneut suchen", "search_again": "Erneut suchen",
"spinner": "Suche nach ZHA Zigbee Geräten..." "spinner": "Suche nach ZHA Zigbee Geräten..."
@@ -1983,10 +1949,10 @@
"add_to_group": "Zur Gruppe hinzufügen", "add_to_group": "Zur Gruppe hinzufügen",
"entities": "Entitäten dieses Knotens", "entities": "Entitäten dieses Knotens",
"entity_info": "Entitätsinformationen", "entity_info": "Entitätsinformationen",
"exclude_entity": "Schließe diese Entität vom Home Assistant aus", "exclude_entity": "Schließen Sie diese Entität vom Home Assistant aus",
"group": "Gruppe", "group": "Gruppe",
"header": "Z-Wave-Knotenverwaltung", "header": "Z-Wave-Knotenverwaltung",
"introduction": "Führe Z-Wave-Befehle aus, die einen einzelnen Knoten betreffen. Wähle einen Knoten aus, um eine Liste der verfügbaren Befehle anzuzeigen.", "introduction": "Führen Sie Z-Wave-Befehle aus, die einen einzelnen Knoten betreffen. Wählen Sie einen Knoten aus, um eine Liste der verfügbaren Befehle anzuzeigen.",
"max_associations": "Max Assoziationen:", "max_associations": "Max Assoziationen:",
"node_group_associations": "Knotengruppenzuordnungen", "node_group_associations": "Knotengruppenzuordnungen",
"node_protection": "Knotenschutz", "node_protection": "Knotenschutz",
@@ -2156,7 +2122,7 @@
"clear_items": "Markierte Elemente löschen" "clear_items": "Markierte Elemente löschen"
}, },
"starting": { "starting": {
"description": "Home Assistant startet, bitte warten", "description": "Home Assistant startet, bitte warten Sie..",
"header": "Home Assistant startet ..." "header": "Home Assistant startet ..."
} }
}, },
@@ -2340,7 +2306,6 @@
}, },
"edit_card": { "edit_card": {
"add": "Karte hinzufügen", "add": "Karte hinzufügen",
"confirm_cancel": "Bist du sicher, dass du Abbrechen willst?",
"delete": "Löschen", "delete": "Löschen",
"duplicate": "Karte duplizieren", "duplicate": "Karte duplizieren",
"edit": "Bearbeiten", "edit": "Bearbeiten",
@@ -2351,9 +2316,7 @@
"pick_card_view_title": "Welche Karte möchten Sie Ihrer {name} -Ansicht hinzufügen?", "pick_card_view_title": "Welche Karte möchten Sie Ihrer {name} -Ansicht hinzufügen?",
"show_code_editor": "Code-Editor anzeigen", "show_code_editor": "Code-Editor anzeigen",
"show_visual_editor": "Visuellen Editor anzeigen", "show_visual_editor": "Visuellen Editor anzeigen",
"toggle_editor": "Editor umschalten", "toggle_editor": "Editor umschalten"
"typed_header": "{type} Kartenkonfiguration",
"unsaved_changes": "Nicht gespeicherte Änderungen"
}, },
"edit_lovelace": { "edit_lovelace": {
"edit_title": "Titel bearbeiten", "edit_title": "Titel bearbeiten",
@@ -2407,7 +2370,7 @@
"close": "Schließen", "close": "Schließen",
"empty_config": "Beginne mit einem leeren Dashboard", "empty_config": "Beginne mit einem leeren Dashboard",
"header": "Lovelace Userinterface selbst verwalten", "header": "Lovelace Userinterface selbst verwalten",
"para": "Dieses Dashboard wird derzeit von Home Assistant verwaltet. Es wird automatisch aktualisiert, wenn neue Entitäten oder Lovelace-UI-Komponenten verfügbar werden. Wenn du die Kontrolle übernimmst, wird dieses Dashboard nicht mehr automatisch aktualisiert. Du kannst jederzeit ein neues Dashboard in der Konfiguration erstellen, mit dem du herumspielen kannst.", "para": "Dieses Dashboard wird derzeit von Home Assistant verwaltet. Es wird automatisch aktualisiert, wenn neue Entitäten oder Lovelace-UI-Komponenten verfügbar werden. Wenn Sie die Kontrolle übernehmen, wird dieses Dashboard nicht mehr automatisch aktualisiert. Sie können jederzeit ein neues Dashboard in der Konfiguration erstellen, mit dem Sie herumspielen können.",
"para_sure": "Bist du dir sicher, dass du die Benutzeroberfläche selbst verwalten möchtest?", "para_sure": "Bist du dir sicher, dass du die Benutzeroberfläche selbst verwalten möchtest?",
"save": "Kontrolle übernehmen", "save": "Kontrolle übernehmen",
"yaml_config": "Um dir den Einstieg zu erleichtern, findest du hier die aktuelle Konfiguration dieses Dashboards:", "yaml_config": "Um dir den Einstieg zu erleichtern, findest du hier die aktuelle Konfiguration dieses Dashboards:",
@@ -2446,8 +2409,6 @@
"entity": "Entität", "entity": "Entität",
"entity_id": "Entitäts-ID", "entity_id": "Entitäts-ID",
"last_changed": "Zuletzt geändert", "last_changed": "Zuletzt geändert",
"no_data": "Keine ungenutzten Entitäten gefunden",
"search": "Entitäten durchsuchen",
"select_to_add": "Wähle die Entitäten aus, die du zur Karte hinzufügen möchtest und klicke auf den Karte hinzufügen-Button.", "select_to_add": "Wähle die Entitäten aus, die du zur Karte hinzufügen möchtest und klicke auf den Karte hinzufügen-Button.",
"title": "Nicht verwendete Entitäten" "title": "Nicht verwendete Entitäten"
}, },
@@ -2527,7 +2488,7 @@
"legacy_api_password": { "legacy_api_password": {
"abort": { "abort": {
"login_expired": "Sitzung abgelaufen, bitte erneut anmelden.", "login_expired": "Sitzung abgelaufen, bitte erneut anmelden.",
"no_api_password_set": "Du hast kein API-Passwort konfiguriert." "no_api_password_set": "Sie haben kein API-Passwort konfiguriert."
}, },
"error": { "error": {
"invalid_auth": "Ungültiges API-Passwort", "invalid_auth": "Ungültiges API-Passwort",
@@ -2550,7 +2511,6 @@
}, },
"trusted_networks": { "trusted_networks": {
"abort": { "abort": {
"not_allowed": "Dein Computer ist nicht auf der Whitelist.",
"not_whitelisted": "Dein Computer ist nicht auf der Whitelist." "not_whitelisted": "Dein Computer ist nicht auf der Whitelist."
}, },
"step": { "step": {
@@ -2689,7 +2649,7 @@
"empty_state": "Sie haben noch keine langlebigen Zugangs-Token.", "empty_state": "Sie haben noch keine langlebigen Zugangs-Token.",
"header": "Langlebige Zugangs-Token", "header": "Langlebige Zugangs-Token",
"last_used": "Zuletzt verwendet am {date} in {location}", "last_used": "Zuletzt verwendet am {date} in {location}",
"learn_auth_requests": "Erfahre, wie du authentifizierte Anfragen stellen kannst.", "learn_auth_requests": "Erfahren Sie, wie Sie authentifizierte Anfragen stellen können.",
"not_used": "Wurde noch nie benutzt", "not_used": "Wurde noch nie benutzt",
"prompt_copy_token": "Kopiere deinen Zugangs-Token. Er wird nicht wieder angezeigt werden.", "prompt_copy_token": "Kopiere deinen Zugangs-Token. Er wird nicht wieder angezeigt werden.",
"prompt_name": "Name?" "prompt_name": "Name?"
@@ -2737,7 +2697,7 @@
"link_promo": "Erfahre mehr über Themen" "link_promo": "Erfahre mehr über Themen"
}, },
"vibrate": { "vibrate": {
"description": "Aktiviere oder deaktiviere die Vibration an diesem Gerät, wenn du Geräte steuerst.", "description": "Aktivieren oder deaktivieren Sie die Vibration an diesem Gerät, wenn Sie Geräte steuern.",
"header": "Vibrieren" "header": "Vibrieren"
} }
}, },

View File

@@ -48,19 +48,6 @@
"none": "Κανένας", "none": "Κανένας",
"sleep": "Ύπνος" "sleep": "Ύπνος"
} }
},
"humidifier": {
"mode": {
"auto": "Αυτόματο",
"away": "Εκτός",
"baby": "Μωρό",
"boost": "Ενίσχυση",
"comfort": "Άνεση",
"eco": "Eco",
"home": "Σπίτι",
"normal": "Κανονικός",
"sleep": "Ύπνος"
}
} }
}, },
"state_badge": { "state_badge": {
@@ -399,10 +386,6 @@
"reverse": "Αντιστροφή", "reverse": "Αντιστροφή",
"speed": "Ταχύτητα" "speed": "Ταχύτητα"
}, },
"humidifier": {
"humidity": "Επιθυμητή υγρασία",
"mode": "Λειτουργία"
},
"light": { "light": {
"brightness": "Φωτεινότητα", "brightness": "Φωτεινότητα",
"color_temperature": "Θερμοκρασία χρώματος", "color_temperature": "Θερμοκρασία χρώματος",
@@ -426,7 +409,6 @@
"activate": "Ενεργοποίηση" "activate": "Ενεργοποίηση"
}, },
"script": { "script": {
"cancel": "Ακύρωση",
"execute": "Εκτέλεση" "execute": "Εκτέλεση"
}, },
"service": { "service": {
@@ -460,7 +442,7 @@
"attributes": { "attributes": {
"air_pressure": "Πίεση αέρα", "air_pressure": "Πίεση αέρα",
"humidity": "Υγρασία", "humidity": "Υγρασία",
"precipitation": "Υετός", "precipitation": "Κατακρήμνιση",
"temperature": "Θερμοκρασία", "temperature": "Θερμοκρασία",
"visibility": "Ορατότητα", "visibility": "Ορατότητα",
"wind_speed": "Ταχύτητα ανέμου" "wind_speed": "Ταχύτητα ανέμου"
@@ -514,9 +496,6 @@
"clear": "Εκκαθάριση", "clear": "Εκκαθάριση",
"show_areas": "Εμφάνιση περιοχών" "show_areas": "Εμφάνιση περιοχών"
}, },
"data-table": {
"search": "Αναζήτηση"
},
"date-range-picker": { "date-range-picker": {
"end_date": "Ημερομηνία λήξης", "end_date": "Ημερομηνία λήξης",
"select": "Επιλογή", "select": "Επιλογή",
@@ -826,13 +805,6 @@
"introduction": "Χρησιμοποιήστε αυτοματισμούς για να ζωντανέψουν το σπίτι σας", "introduction": "Χρησιμοποιήστε αυτοματισμούς για να ζωντανέψουν το σπίτι σας",
"load_error_not_editable": "Μόνο οι αυτοματισμοί στο automations.yaml είναι επεξεργάσιμοι.", "load_error_not_editable": "Μόνο οι αυτοματισμοί στο automations.yaml είναι επεξεργάσιμοι.",
"load_error_unknown": "Σφάλμα κατά τη φόρτωση αυτοματισμού ({err_no}).", "load_error_unknown": "Σφάλμα κατά τη φόρτωση αυτοματισμού ({err_no}).",
"max": {
"queued": "Μήκος ουράς"
},
"modes": {
"documentation": "τεκμηρίωση αυτοματισμού",
"restart": "Επανεκκίνηση"
},
"save": "Αποθήκευση", "save": "Αποθήκευση",
"triggers": { "triggers": {
"add": "Προσθήκη εναύσματος", "add": "Προσθήκη εναύσματος",
@@ -1275,7 +1247,6 @@
"delete_button": "Διαγραφή {integration}", "delete_button": "Διαγραφή {integration}",
"delete_confirm": "Είστε σίγουρος ότι θέλετε να διαγραφεί αυτή η ενοποίηση;", "delete_confirm": "Είστε σίγουρος ότι θέλετε να διαγραφεί αυτή η ενοποίηση;",
"device_unavailable": "συσκευή μη διαθέσιμη", "device_unavailable": "συσκευή μη διαθέσιμη",
"documentation": "Τεκμηρίωση",
"entity_unavailable": "οντότητα μη διαθέσιμη", "entity_unavailable": "οντότητα μη διαθέσιμη",
"firmware": "Υλικολογισμικό: {version}", "firmware": "Υλικολογισμικό: {version}",
"hub": "Συνδεδεμένο μέσω", "hub": "Συνδεδεμένο μέσω",
@@ -1322,8 +1293,7 @@
"new": "Ρυθμίστε νέα ενοποίηση", "new": "Ρυθμίστε νέα ενοποίηση",
"none": "Δεν υπάρχει διαμόρφωση ακόμα", "none": "Δεν υπάρχει διαμόρφωση ακόμα",
"note_about_integrations": "Δεν μπορούν όλες οι ενσωματώσεις να διαμορφωθούν από το UI ακόμη.", "note_about_integrations": "Δεν μπορούν όλες οι ενσωματώσεις να διαμορφωθούν από το UI ακόμη.",
"note_about_website_reference": "Περισσότερα είναι διαθέσιμα στο", "note_about_website_reference": "Περισσότερα είναι διαθέσιμα στο"
"search": "Αναζήτηση ενσωματώσεων"
}, },
"introduction": "Εδώ είναι δυνατή η διαμόρφωση του Home Assistant και των εξαρτημάτων. Δεν είναι δυνατή η διαμόρφωση όλων από την διεπαφή χρήστη (UI) αλλά εργαζόμαστε πάνω σε αυτό.", "introduction": "Εδώ είναι δυνατή η διαμόρφωση του Home Assistant και των εξαρτημάτων. Δεν είναι δυνατή η διαμόρφωση όλων από την διεπαφή χρήστη (UI) αλλά εργαζόμαστε πάνω σε αυτό.",
"logs": { "logs": {
@@ -1418,7 +1388,6 @@
"introduction": "Εδώ μπορείτε να ορίσετε οντότητες που δεν ανήκουν σε κάποια συσκευή.", "introduction": "Εδώ μπορείτε να ορίσετε οντότητες που δεν ανήκουν σε κάποια συσκευή.",
"without_device": "Οντότητες χωρίς συσκευές" "without_device": "Οντότητες χωρίς συσκευές"
}, },
"icon": "Εικονίδιο",
"introduction": "Χρησιμοποιήστε σκηνές για να ζωντανέψουν το σπίτι σας", "introduction": "Χρησιμοποιήστε σκηνές για να ζωντανέψουν το σπίτι σας",
"load_error_not_editable": "Μόνο σκηνές στο scenes.yaml είναι επεξεργάσιμες.", "load_error_not_editable": "Μόνο σκηνές στο scenes.yaml είναι επεξεργάσιμες.",
"load_error_unknown": "Σφάλμα κατά τη φόρτωση της σκηνής ({err_no}).", "load_error_unknown": "Σφάλμα κατά τη φόρτωση της σκηνής ({err_no}).",
@@ -1452,20 +1421,9 @@
"delete_confirm": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτή τη δέσμη ενεργειών;", "delete_confirm": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτή τη δέσμη ενεργειών;",
"delete_script": "Διαγραφή δέσμης ενεργειών", "delete_script": "Διαγραφή δέσμης ενεργειών",
"header": "Δέσμη ενεργειών: {name}", "header": "Δέσμη ενεργειών: {name}",
"icon": "Εικονίδιο",
"introduction": "Χρησιμοποιήστε δέσμες ενεργειών για να εκτελέσετε μια ακολουθία ενεργειών.", "introduction": "Χρησιμοποιήστε δέσμες ενεργειών για να εκτελέσετε μια ακολουθία ενεργειών.",
"link_available_actions": "Μάθετε περισσότερα σχετικά με τις διαθέσιμες ενέργειες.", "link_available_actions": "Μάθετε περισσότερα σχετικά με τις διαθέσιμες ενέργειες.",
"load_error_not_editable": "Μόνο οι δέσμες ενεργειών που βρίσκονται μέσα στο scripts.yaml είναι επεξεργάσιμες", "load_error_not_editable": "Μόνο οι δέσμες ενεργειών που βρίσκονται μέσα στο scripts.yaml είναι επεξεργάσιμες",
"max": {
"queued": "Μήκος ουράς"
},
"modes": {
"documentation": "τεκμηρίωση δέσμης ενεργειών",
"parallel": "Παράλληλα",
"queued": "Στην ουρά",
"restart": "Επανεκκίνηση",
"single": "Μονό (προεπιλογή)"
},
"sequence": "Ακολουθία", "sequence": "Ακολουθία",
"sequence_sentence": "Η ακολουθία των ενεργειών αυτής της δέσμης ενεργειών." "sequence_sentence": "Η ακολουθία των ενεργειών αυτής της δέσμης ενεργειών."
}, },
@@ -1550,7 +1508,6 @@
}, },
"zha": { "zha": {
"add_device_page": { "add_device_page": {
"discovered_text": "Οι συσκευές θα εμφανιστούν εδώ μόλις ανακαλυφθούν.",
"discovery_text": "Οι ανακαλυφθείσες συσκευές θα εμφανιστούν εδώ. Ακολουθήστε τις οδηγίες για τις συσκευές σας και τοποθετήστε τις συσκευές στη λειτουργία αντιστοίχισης.", "discovery_text": "Οι ανακαλυφθείσες συσκευές θα εμφανιστούν εδώ. Ακολουθήστε τις οδηγίες για τις συσκευές σας και τοποθετήστε τις συσκευές στη λειτουργία αντιστοίχισης.",
"header": "Zigbee Home Automation - Προσθήκη Συσκευών", "header": "Zigbee Home Automation - Προσθήκη Συσκευών",
"search_again": "Αναζήτηση ξανά", "search_again": "Αναζήτηση ξανά",
@@ -1560,7 +1517,6 @@
"caption": "Προσθήκη Συσκευών", "caption": "Προσθήκη Συσκευών",
"description": "Προσθήκη συσκετών στο δίκτυο Zigbee" "description": "Προσθήκη συσκετών στο δίκτυο Zigbee"
}, },
"button": "Διαμόρφωση",
"caption": "ZHA", "caption": "ZHA",
"cluster_attributes": { "cluster_attributes": {
"attributes_of_cluster": "Χαρακτηριστικά της επιλεγμένης συστοιχίας", "attributes_of_cluster": "Χαρακτηριστικά της επιλεγμένης συστοιχίας",
@@ -1808,10 +1764,6 @@
"add_item": "Προσθήκη στοιχείου", "add_item": "Προσθήκη στοιχείου",
"checked_items": "Επιλεγμένα στοιχεία", "checked_items": "Επιλεγμένα στοιχεία",
"clear_items": "Εκκαθάριση επιλεγμένων στοιχείων" "clear_items": "Εκκαθάριση επιλεγμένων στοιχείων"
},
"starting": {
"description": "Ο Home Assistant ξεκινά, περιμένετε ...",
"header": "Ο Home Assistant ξεκινά..."
} }
}, },
"changed_toast": { "changed_toast": {
@@ -1875,7 +1827,6 @@
"name": "Όνομα", "name": "Όνομα",
"no_theme": "Χωρίς θέμα", "no_theme": "Χωρίς θέμα",
"refresh_interval": "Χρονικό διάστημα ανανέωσης", "refresh_interval": "Χρονικό διάστημα ανανέωσης",
"search": "Αναζήτηση",
"show_icon": "Εμφάνιση εικονιδίου;", "show_icon": "Εμφάνιση εικονιδίου;",
"show_name": "Εμφάνιση ονόματος;", "show_name": "Εμφάνιση ονόματος;",
"show_state": "Εμφάνιση κατάστασης;", "show_state": "Εμφάνιση κατάστασης;",
@@ -1896,9 +1847,6 @@
"horizontal-stack": { "horizontal-stack": {
"name": "Οριζόντια διάταξη" "name": "Οριζόντια διάταξη"
}, },
"humidifier": {
"name": "Υγραντήρας"
},
"iframe": { "iframe": {
"name": "Ιστοσελίδα" "name": "Ιστοσελίδα"
}, },
@@ -1973,8 +1921,7 @@
"edit_lovelace": { "edit_lovelace": {
"edit_title": "Επεξεργασία τίτλου", "edit_title": "Επεξεργασία τίτλου",
"explanation": "Αυτός ο τίτλος εμφανίζεται πάνω από όλες τις καρτέλες σας στο Lovelace.", "explanation": "Αυτός ο τίτλος εμφανίζεται πάνω από όλες τις καρτέλες σας στο Lovelace.",
"header": "Τίτλος του περιβάλλοντος εργασίας σας Lovelace", "header": "Τίτλος του περιβάλλοντος εργασίας σας Lovelace"
"title": "Τίτλος"
}, },
"edit_view": { "edit_view": {
"add": "Προσθήκη προβολής", "add": "Προσθήκη προβολής",
@@ -2137,7 +2084,6 @@
}, },
"trusted_networks": { "trusted_networks": {
"abort": { "abort": {
"not_allowed": "Ο υπολογιστής σας δεν είναι αποδεκτός.",
"not_whitelisted": "Ο υπολογιστής σας δεν είναι στη λίστα επιτρεπόμενων." "not_whitelisted": "Ο υπολογιστής σας δεν είναι στη λίστα επιτρεπόμενων."
}, },
"step": { "step": {
@@ -2310,9 +2256,6 @@
"not_used": "Δεν έχει χρησιμοποιηθεί ποτέ", "not_used": "Δεν έχει χρησιμοποιηθεί ποτέ",
"token_title": "Ανανέωση διακριτικού για το {clientId}" "token_title": "Ανανέωση διακριτικού για το {clientId}"
}, },
"suspend": {
"header": "Αυτόματο κλείσιμο σύνδεσης"
},
"themes": { "themes": {
"dropdown_label": "Θέμα", "dropdown_label": "Θέμα",
"error_no_theme": "Δεν υπάρχουν διαθέσιμα θέματα.", "error_no_theme": "Δεν υπάρχουν διαθέσιμα θέματα.",

View File

@@ -528,7 +528,6 @@
"show_areas": "Show areas" "show_areas": "Show areas"
}, },
"data-table": { "data-table": {
"no-data": "No data",
"search": "Search" "search": "Search"
}, },
"date-range-picker": { "date-range-picker": {
@@ -952,10 +951,10 @@
"description": "The mode controls what happens when the automation is triggered while the actions are still running from a previous trigger. Check the {documentation_link} for more info.", "description": "The mode controls what happens when the automation is triggered while the actions are still running from a previous trigger. Check the {documentation_link} for more info.",
"documentation": "automation documentation", "documentation": "automation documentation",
"label": "Mode", "label": "Mode",
"parallel": "Parallel", "parallel": "Parallel (default)",
"queued": "Queued", "queued": "Queued",
"restart": "Restart", "restart": "Restart",
"single": "Single (default)" "single": "Single"
}, },
"move_down": "Move down", "move_down": "Move down",
"move_up": "Move up", "move_up": "Move up",
@@ -1816,7 +1815,7 @@
"discovered_text": "Devices will show up here once discovered.", "discovered_text": "Devices will show up here once discovered.",
"discovery_text": "Discovered devices will show up here. Follow the instructions for your device(s) and place the device(s) in pairing mode.", "discovery_text": "Discovered devices will show up here. Follow the instructions for your device(s) and place the device(s) in pairing mode.",
"header": "Zigbee Home Automation - Add Devices", "header": "Zigbee Home Automation - Add Devices",
"no_devices_found": "No devices were found, make sure they are in paring mode and keep them awake while discovering is running.", "no_devices_found": "No devices where found, make sure they are in paring mode and keep them awake while discovering is running.",
"pairing_mode": "Make sure your devices are in pairing mode. Check the instructions of your device on how to do this.", "pairing_mode": "Make sure your devices are in pairing mode. Check the instructions of your device on how to do this.",
"search_again": "Search Again", "search_again": "Search Again",
"spinner": "Searching for ZHA Zigbee devices..." "spinner": "Searching for ZHA Zigbee devices..."
@@ -2340,7 +2339,6 @@
}, },
"edit_card": { "edit_card": {
"add": "Add Card", "add": "Add Card",
"confirm_cancel": "Are you sure you want to cancel?",
"delete": "Delete Card", "delete": "Delete Card",
"duplicate": "Duplicate Card", "duplicate": "Duplicate Card",
"edit": "Edit", "edit": "Edit",
@@ -2351,9 +2349,7 @@
"pick_card_view_title": "Which card would you like to add to your {name} view?", "pick_card_view_title": "Which card would you like to add to your {name} view?",
"show_code_editor": "Show Code Editor", "show_code_editor": "Show Code Editor",
"show_visual_editor": "Show Visual Editor", "show_visual_editor": "Show Visual Editor",
"toggle_editor": "Toggle Editor", "toggle_editor": "Toggle Editor"
"typed_header": "{type} Card Configuration",
"unsaved_changes": "You have unsaved changes"
}, },
"edit_lovelace": { "edit_lovelace": {
"edit_title": "Edit title", "edit_title": "Edit title",
@@ -2446,8 +2442,6 @@
"entity": "Entity", "entity": "Entity",
"entity_id": "Entity ID", "entity_id": "Entity ID",
"last_changed": "Last Changed", "last_changed": "Last Changed",
"no_data": "No unused entities found",
"search": "Search entities",
"select_to_add": "Select the entities you want to add to a card and then click the add card button.", "select_to_add": "Select the entities you want to add to a card and then click the add card button.",
"title": "Unused entities" "title": "Unused entities"
}, },

View File

@@ -430,8 +430,6 @@
"activate": "Activar" "activate": "Activar"
}, },
"script": { "script": {
"cancel": "Cancelar",
"cancel_multiple": "Cancelar {number}",
"execute": "Ejecutar" "execute": "Ejecutar"
}, },
"service": { "service": {
@@ -528,7 +526,6 @@
"show_areas": "Mostrar áreas" "show_areas": "Mostrar áreas"
}, },
"data-table": { "data-table": {
"no-data": "Sin datos",
"search": "Buscar" "search": "Buscar"
}, },
"date-range-picker": { "date-range-picker": {
@@ -944,19 +941,6 @@
"introduction": "Utiliza automatizaciones para darle vida a tu hogar.", "introduction": "Utiliza automatizaciones para darle vida a tu hogar.",
"load_error_not_editable": "Solo las automatizaciones en automations.yaml son editables.", "load_error_not_editable": "Solo las automatizaciones en automations.yaml son editables.",
"load_error_unknown": "Error al cargar la automatización ({err_no}).", "load_error_unknown": "Error al cargar la automatización ({err_no}).",
"max": {
"parallel": "Número máximo de ejecuciones paralelas",
"queued": "Longitud de la cola"
},
"modes": {
"description": "El modo controla lo que sucede cuando se activa la automatización mientras las acciones aún se ejecutan desde una activación anterior. Consulta la {documentation_link} para obtener más información.",
"documentation": "documentación de automatización",
"label": "Modo",
"parallel": "Paralelo",
"queued": "En cola",
"restart": "Reiniciar",
"single": "Único (predeterminado)"
},
"move_down": "Mover hacia abajo", "move_down": "Mover hacia abajo",
"move_up": "Mover hacia arriba", "move_up": "Mover hacia arriba",
"save": "Guardar", "save": "Guardar",
@@ -1665,7 +1649,6 @@
"introduction": "Las entidades que no pertenecen a un dispositivo se pueden configurar aquí.", "introduction": "Las entidades que no pertenecen a un dispositivo se pueden configurar aquí.",
"without_device": "Entidades sin dispositivo" "without_device": "Entidades sin dispositivo"
}, },
"icon": "Icono",
"introduction": "Usa escenas para dar vida a tu hogar.", "introduction": "Usa escenas para dar vida a tu hogar.",
"load_error_not_editable": "Solo las escenas de scenes.yaml son editables.", "load_error_not_editable": "Solo las escenas de scenes.yaml son editables.",
"load_error_unknown": "Error al cargar la escena ({err_no}).", "load_error_unknown": "Error al cargar la escena ({err_no}).",
@@ -1699,26 +1682,9 @@
"delete_confirm": "¿Seguro que quieres eliminar este script?", "delete_confirm": "¿Seguro que quieres eliminar este script?",
"delete_script": "Eliminar script", "delete_script": "Eliminar script",
"header": "Script: {name}", "header": "Script: {name}",
"icon": "Icono",
"id": "ID de la entidad",
"id_already_exists": "Este ID ya existe",
"id_already_exists_save_error": "No puedes guardar este script porque el ID no es único, elije otro ID o déjalo en blanco para generar uno automáticamente.",
"introduction": "Utiliza scripts para ejecutar una secuencia de acciones.", "introduction": "Utiliza scripts para ejecutar una secuencia de acciones.",
"link_available_actions": "Saber más sobre las acciones disponibles.", "link_available_actions": "Saber más sobre las acciones disponibles.",
"load_error_not_editable": "Solo los scripts dentro de scripts.yaml son editables.", "load_error_not_editable": "Solo los scripts dentro de scripts.yaml son editables.",
"max": {
"parallel": "Número máximo de ejecuciones paralelas",
"queued": "Longitud de la cola"
},
"modes": {
"description": "El modo controla lo que sucede cuando se invoca el script mientras aún se ejecuta desde una o más invocaciones anteriores. Consulta la {documentation_link} para obtener más información.",
"documentation": "documentación de script",
"label": "Modo",
"parallel": "Paralelo",
"queued": "En cola",
"restart": "Reiniciar",
"single": "Único (predeterminado)"
},
"sequence": "Secuencia", "sequence": "Secuencia",
"sequence_sentence": "La secuencia de acciones de este script." "sequence_sentence": "La secuencia de acciones de este script."
}, },
@@ -2340,7 +2306,6 @@
}, },
"edit_card": { "edit_card": {
"add": "Añadir tarjeta", "add": "Añadir tarjeta",
"confirm_cancel": "¿Estás seguro de que quieres cancelar?",
"delete": "Eliminar tarjeta", "delete": "Eliminar tarjeta",
"duplicate": "Duplicar tarjeta", "duplicate": "Duplicar tarjeta",
"edit": "Editar", "edit": "Editar",
@@ -2351,9 +2316,7 @@
"pick_card_view_title": "¿Qué tarjeta te gustaría añadir a tu vista {name} ?", "pick_card_view_title": "¿Qué tarjeta te gustaría añadir a tu vista {name} ?",
"show_code_editor": "Mostrar editor de código", "show_code_editor": "Mostrar editor de código",
"show_visual_editor": "Mostrar editor visual", "show_visual_editor": "Mostrar editor visual",
"toggle_editor": "Alternar editor", "toggle_editor": "Alternar editor"
"typed_header": "{type} Configuración de tarjeta",
"unsaved_changes": "Tienes cambios sin guardar"
}, },
"edit_lovelace": { "edit_lovelace": {
"edit_title": "Editar título", "edit_title": "Editar título",
@@ -2446,8 +2409,6 @@
"entity": "Entidad", "entity": "Entidad",
"entity_id": "ID de entidad", "entity_id": "ID de entidad",
"last_changed": "Última modificación", "last_changed": "Última modificación",
"no_data": "No se han encontrado entidades sin utilizar",
"search": "Buscar entidades",
"select_to_add": "Selecciona las entidades que quieres añadir a una tarjeta y, a continuación, haz clic en el botón Añadir tarjeta.", "select_to_add": "Selecciona las entidades que quieres añadir a una tarjeta y, a continuación, haz clic en el botón Añadir tarjeta.",
"title": "Entidades no utilizadas" "title": "Entidades no utilizadas"
}, },
@@ -2550,7 +2511,6 @@
}, },
"trusted_networks": { "trusted_networks": {
"abort": { "abort": {
"not_allowed": "Tu equipo no está permitido.",
"not_whitelisted": "Tu equipo no está en la lista de autorizados." "not_whitelisted": "Tu equipo no está en la lista de autorizados."
}, },
"step": { "step": {

View File

@@ -324,9 +324,6 @@
"save": "Gorde" "save": "Gorde"
}, },
"components": { "components": {
"data-table": {
"no-data": "Daturik ez"
},
"relative_time": { "relative_time": {
"duration": { "duration": {
"day": "{count} {count, plural,\n one {egun}\n other {egun}\n}", "day": "{count} {count, plural,\n one {egun}\n other {egun}\n}",
@@ -747,7 +744,6 @@
}, },
"trusted_networks": { "trusted_networks": {
"abort": { "abort": {
"not_allowed": "Zure ordenagailua ez dago baimenduta.",
"not_whitelisted": "Zure ordenagailua ez dago baimenduta." "not_whitelisted": "Zure ordenagailua ez dago baimenduta."
}, },
"step": { "step": {

View File

@@ -430,8 +430,6 @@
"activate": "Aktivoi" "activate": "Aktivoi"
}, },
"script": { "script": {
"cancel": "Peruuta",
"cancel_multiple": "Peruuta {number}",
"execute": "Suorita" "execute": "Suorita"
}, },
"service": { "service": {
@@ -527,10 +525,6 @@
"clear": "Tyhjennä", "clear": "Tyhjennä",
"show_areas": "Näytä alueet" "show_areas": "Näytä alueet"
}, },
"data-table": {
"no-data": "Ei dataa",
"search": "Hae"
},
"date-range-picker": { "date-range-picker": {
"end_date": "Päättymispäivä", "end_date": "Päättymispäivä",
"select": "Valitse", "select": "Valitse",
@@ -944,19 +938,6 @@
"introduction": "Käytä automaatioita herättääksesi kotisi eloon", "introduction": "Käytä automaatioita herättääksesi kotisi eloon",
"load_error_not_editable": "Vain automaatiot tiedostossa automations.yaml ovat muokattavissa.", "load_error_not_editable": "Vain automaatiot tiedostossa automations.yaml ovat muokattavissa.",
"load_error_unknown": "Virhe ladatessa automaatiota ( {err_no} )", "load_error_unknown": "Virhe ladatessa automaatiota ( {err_no} )",
"max": {
"parallel": "Rinnakkaisten ajojen enimmäismäärä",
"queued": "Jonon pituus"
},
"modes": {
"description": "Tila määrittää, mitä tapahtuu, kun automaatio käynnistyy, kun toiminnot ovat edelleen käynnissä edellisestä käynnistyksestä. Lisätietoja osoitteessa {documentation_link}.",
"documentation": "automaation dokumentaatio",
"label": "Tila",
"parallel": "Rinnakkain",
"queued": "Jonossa",
"restart": "Käynnistä uudelleen",
"single": "Yksittäinen (oletus)"
},
"move_down": "Siirrä alaspäin", "move_down": "Siirrä alaspäin",
"move_up": "Siirrä ylöspäin", "move_up": "Siirrä ylöspäin",
"save": "Tallenna", "save": "Tallenna",
@@ -1375,7 +1356,6 @@
"confirm_text": "Sinun tulisi poistaa ne Lovelace-käyttöliittymästä ja automaatioista, jos ne sisältävät näitä kohteita.", "confirm_text": "Sinun tulisi poistaa ne Lovelace-käyttöliittymästä ja automaatioista, jos ne sisältävät näitä kohteita.",
"confirm_title": "Haluatko poistaa {number} kohdetta?" "confirm_title": "Haluatko poistaa {number} kohdetta?"
}, },
"search": "Hae kohteita",
"selected": "{number} valittuna", "selected": "{number} valittuna",
"status": { "status": {
"disabled": "Poistettu käytöstä", "disabled": "Poistettu käytöstä",
@@ -1406,8 +1386,7 @@
"entity_id": "Kohde ID", "entity_id": "Kohde ID",
"name": "Nimi", "name": "Nimi",
"type": "Tyyppi" "type": "Tyyppi"
}, }
"no_helpers": "Näyttää siltä, että sinulla ei ole vielä avustajia!"
}, },
"types": { "types": {
"input_boolean": "Kytkin", "input_boolean": "Kytkin",
@@ -1452,7 +1431,6 @@
"delete_confirm": "Haluatko varmasti poistaa tämän integraation?", "delete_confirm": "Haluatko varmasti poistaa tämän integraation?",
"device_unavailable": "laite ei saatavissa", "device_unavailable": "laite ei saatavissa",
"devices": "{count} {count, plural,\n one {laite}\n other {laitteet}\n}", "devices": "{count} {count, plural,\n one {laite}\n other {laitteet}\n}",
"documentation": "Dokumentointi",
"entities": "{count} {count, plural,\n one {kohde}\n other {kohteet}\n}", "entities": "{count} {count, plural,\n one {kohde}\n other {kohteet}\n}",
"entity_unavailable": "kohde ei saatavilla", "entity_unavailable": "kohde ei saatavilla",
"firmware": "Laiteohjelmisto: {version}", "firmware": "Laiteohjelmisto: {version}",
@@ -1511,8 +1489,7 @@
"note_about_integrations": "Kaikkia integraatioita ei voi vielä määrittää käyttöliittymän kautta.", "note_about_integrations": "Kaikkia integraatioita ei voi vielä määrittää käyttöliittymän kautta.",
"note_about_website_reference": "Lisää saatavilla", "note_about_website_reference": "Lisää saatavilla",
"rename_dialog": "Muokkaa tämän määritysmerkinnän nimeä", "rename_dialog": "Muokkaa tämän määritysmerkinnän nimeä",
"rename_input_label": "Merkinnän nimi", "rename_input_label": "Merkinnän nimi"
"search": "Etsi integraatioita"
}, },
"introduction": "Täällä voit säätää Home Assistanttia ja sen komponentteja. Huomioithan, ettei kaikkea voi vielä säätää käyttöliittymän kautta, mutta teemme jatkuvasti töitä sen mahdollistamiseksi.", "introduction": "Täällä voit säätää Home Assistanttia ja sen komponentteja. Huomioithan, ettei kaikkea voi vielä säätää käyttöliittymän kautta, mutta teemme jatkuvasti töitä sen mahdollistamiseksi.",
"logs": { "logs": {
@@ -1665,7 +1642,6 @@
"introduction": "Kohteet, jotka eivät kuulu laitteisiin, voidaan asettaa täällä.", "introduction": "Kohteet, jotka eivät kuulu laitteisiin, voidaan asettaa täällä.",
"without_device": "Kohteet ilman laitetta" "without_device": "Kohteet ilman laitetta"
}, },
"icon": "Kuvake",
"introduction": "Käytä tilanteita herättääksesi kotisi eloon.", "introduction": "Käytä tilanteita herättääksesi kotisi eloon.",
"load_error_not_editable": "Vain tilanteet tiedostossa scenes.yaml ovat muokattavissa.", "load_error_not_editable": "Vain tilanteet tiedostossa scenes.yaml ovat muokattavissa.",
"load_error_unknown": "Virhe ladattaessa tilannetta ({err_no}).", "load_error_unknown": "Virhe ladattaessa tilannetta ({err_no}).",
@@ -1699,25 +1675,9 @@
"delete_confirm": "Haluatko varmasti poistaa tämän skriptin?", "delete_confirm": "Haluatko varmasti poistaa tämän skriptin?",
"delete_script": "Poista skripti", "delete_script": "Poista skripti",
"header": "Skripti: {name}", "header": "Skripti: {name}",
"icon": "Kuvake",
"id": "Kohde ID",
"id_already_exists": "Tämä tunnus on jo olemassa",
"id_already_exists_save_error": "Et voi tallentaa tätä skriptiä, koska tunnus ei ole yksilöivä. Valitse toinen tunnus tai jätä se tyhjäksi, jolloin se luodaan automaattisesti.",
"introduction": "Käytä scriptejä suorittaaksesi toimintasarjan.", "introduction": "Käytä scriptejä suorittaaksesi toimintasarjan.",
"link_available_actions": "Lisätietoja saatavilla olevista toiminnoista", "link_available_actions": "Lisätietoja saatavilla olevista toiminnoista",
"load_error_not_editable": "Vain scripts.yaml-tiedostossa olevat skriptit ovat muokattavissa.", "load_error_not_editable": "Vain scripts.yaml-tiedostossa olevat skriptit ovat muokattavissa.",
"max": {
"parallel": "Rinnakkaisten ajojen enimmäismäärä",
"queued": "Jonon pituus"
},
"modes": {
"documentation": "skriptin dokumentaatio",
"label": "Tila",
"parallel": "Rinnakkain",
"queued": "Jonossa",
"restart": "Käynnistä uudelleen",
"single": "Yksittäinen (oletus)"
},
"sequence": "Järjestys", "sequence": "Järjestys",
"sequence_sentence": "Skriptin toimintojen järjestys." "sequence_sentence": "Skriptin toimintojen järjestys."
}, },
@@ -2233,7 +2193,6 @@
"name": "Nimi", "name": "Nimi",
"no_theme": "Ei teemaa", "no_theme": "Ei teemaa",
"refresh_interval": "Päivitysväli", "refresh_interval": "Päivitysväli",
"search": "Hae",
"secondary_info_attribute": "Toissijainen info-attribuutti", "secondary_info_attribute": "Toissijainen info-attribuutti",
"show_icon": "Näytä kuvake?", "show_icon": "Näytä kuvake?",
"show_name": "Näytä nimi?", "show_name": "Näytä nimi?",
@@ -2339,7 +2298,6 @@
}, },
"edit_card": { "edit_card": {
"add": "Lisää kortti", "add": "Lisää kortti",
"confirm_cancel": "Haluatko varmasti peruuttaa?",
"delete": "Poista kortti", "delete": "Poista kortti",
"duplicate": "Kopioi kortti", "duplicate": "Kopioi kortti",
"edit": "Muokkaa", "edit": "Muokkaa",
@@ -2350,15 +2308,12 @@
"pick_card_view_title": "Minkä kortin haluat lisätä {name} -näkymääsi?", "pick_card_view_title": "Minkä kortin haluat lisätä {name} -näkymääsi?",
"show_code_editor": "Näytä koodieditori", "show_code_editor": "Näytä koodieditori",
"show_visual_editor": "Näytä visuaalinen editori", "show_visual_editor": "Näytä visuaalinen editori",
"toggle_editor": "Vaihda editori", "toggle_editor": "Vaihda editori"
"typed_header": "{type}-kortin kokoonpano",
"unsaved_changes": "Sinulla on tallentamattomia muutoksia"
}, },
"edit_lovelace": { "edit_lovelace": {
"edit_title": "Muokkaa otsikkoa", "edit_title": "Muokkaa otsikkoa",
"explanation": "Tämä otsikko on esillä näkymien yläpuolella Lovelace-käyttöliittymässä.", "explanation": "Tämä otsikko on esillä näkymien yläpuolella Lovelace-käyttöliittymässä.",
"header": "Lovelace-käyttöliittymän otsikko", "header": "Lovelace-käyttöliittymän otsikko"
"title": "Otsikko"
}, },
"edit_view": { "edit_view": {
"add": "Lisää näkymä", "add": "Lisää näkymä",
@@ -2445,8 +2400,6 @@
"entity": "Kohde", "entity": "Kohde",
"entity_id": "Kohde ID", "entity_id": "Kohde ID",
"last_changed": "Viimeksi muutettu", "last_changed": "Viimeksi muutettu",
"no_data": "Käyttämättömiä kohteita ei löytynyt",
"search": "Hae kohteita",
"select_to_add": "Valitse kohteet, jotka haluat lisätä korttiin, ja napsauta sitten Lisää kortti -painiketta.", "select_to_add": "Valitse kohteet, jotka haluat lisätä korttiin, ja napsauta sitten Lisää kortti -painiketta.",
"title": "Käyttämättömät entiteetit" "title": "Käyttämättömät entiteetit"
}, },
@@ -2549,7 +2502,6 @@
}, },
"trusted_networks": { "trusted_networks": {
"abort": { "abort": {
"not_allowed": "Tietokone ei ole sallittu.",
"not_whitelisted": "Tietokonettasi ei ole sallittu." "not_whitelisted": "Tietokonettasi ei ole sallittu."
}, },
"step": { "step": {
@@ -2725,10 +2677,6 @@
"not_used": "Ei ole koskaan käytetty", "not_used": "Ei ole koskaan käytetty",
"token_title": "Päivitä tunnus kohteelle {clientId}" "token_title": "Päivitä tunnus kohteelle {clientId}"
}, },
"suspend": {
"description": "Suljetaanko yhteys palvelimeen 5 minuuttia piilottamisen jälkeen?",
"header": "Sulje yhteys automaattisesti"
},
"themes": { "themes": {
"dropdown_label": "Teema", "dropdown_label": "Teema",
"error_no_theme": "Ei teemoja käytettävissä.", "error_no_theme": "Ei teemoja käytettävissä.",

View File

@@ -430,8 +430,6 @@
"activate": "Activer" "activate": "Activer"
}, },
"script": { "script": {
"cancel": "Annuler",
"cancel_multiple": "Annuler {number}",
"execute": "Exécuter" "execute": "Exécuter"
}, },
"service": { "service": {
@@ -528,7 +526,6 @@
"show_areas": "Afficher les pièces" "show_areas": "Afficher les pièces"
}, },
"data-table": { "data-table": {
"no-data": "Pas de données",
"search": "Chercher" "search": "Chercher"
}, },
"date-range-picker": { "date-range-picker": {
@@ -941,22 +938,9 @@
"edit_ui": "Modifier avec l'interface utilisateur", "edit_ui": "Modifier avec l'interface utilisateur",
"edit_yaml": "Modifier en tant que YAML", "edit_yaml": "Modifier en tant que YAML",
"enable_disable": "Activer/Désactiver l'automatisation", "enable_disable": "Activer/Désactiver l'automatisation",
"introduction": "Utiliser les automatisations pour donner vie à votre maison.", "introduction": "Utilisez les automatisations pour donner vie à votre maison",
"load_error_not_editable": "Seules les automatisations dans automations.yaml sont modifiables.", "load_error_not_editable": "Seules les automatisations dans automations.yaml sont modifiables.",
"load_error_unknown": "Erreur lors du chargement de l'automatisation ( {err_no} ).", "load_error_unknown": "Erreur lors du chargement de l'automatisation ( {err_no} ).",
"max": {
"parallel": "Nombre maximal de parcours parallèles",
"queued": "Longueur de la file d'attente"
},
"modes": {
"description": "Le mode contrôle ce qui se passe lorsque lautomatisation est déclenchée alors que les actions sont toujours en cours dexécution à partir dun déclencheur précédent. Consultez le {documentation_link} pour plus dinformations.",
"documentation": "documentation d'automatisation",
"label": "Mode",
"parallel": "Parallèle",
"queued": "En attente",
"restart": "Redémarrer",
"single": "Unique (par défaut)"
},
"move_down": "Déplacer vers le bas", "move_down": "Déplacer vers le bas",
"move_up": "Déplacer vers le haut", "move_up": "Déplacer vers le haut",
"save": "Sauvegarder", "save": "Sauvegarder",
@@ -1665,7 +1649,6 @@
"introduction": "Les entités n'appartenant pas à un périphérique peuvent être définies ici.", "introduction": "Les entités n'appartenant pas à un périphérique peuvent être définies ici.",
"without_device": "Entités sans appareil" "without_device": "Entités sans appareil"
}, },
"icon": "Icône",
"introduction": "Utilisez des scènes pour donner vie à votre maison.", "introduction": "Utilisez des scènes pour donner vie à votre maison.",
"load_error_not_editable": "Seules les scènes de scenes.yaml sont modifiables.", "load_error_not_editable": "Seules les scènes de scenes.yaml sont modifiables.",
"load_error_unknown": "Erreur de chargement de la scène ({err_no})", "load_error_unknown": "Erreur de chargement de la scène ({err_no})",
@@ -1699,26 +1682,9 @@
"delete_confirm": "Êtes-vous sûr de vouloir supprimer ce script?", "delete_confirm": "Êtes-vous sûr de vouloir supprimer ce script?",
"delete_script": "Supprimer le script", "delete_script": "Supprimer le script",
"header": "Script: {name}", "header": "Script: {name}",
"icon": "Icône",
"id": "ID de l'entité",
"id_already_exists": "Cet ID existe déjà",
"id_already_exists_save_error": "Vous ne pouvez pas enregistrer ce script car l'ID n'est pas unique, choisissez un autre ID ou laissez-le vide pour en générer automatiquement un.",
"introduction": "Utiliser des scripts pour exécuter une séquence d'actions.", "introduction": "Utiliser des scripts pour exécuter une séquence d'actions.",
"link_available_actions": "En savoir plus sur les actions disponibles.", "link_available_actions": "En savoir plus sur les actions disponibles.",
"load_error_not_editable": "Seuls les scripts dans scripts.yaml sont modifiables.", "load_error_not_editable": "Seuls les scripts dans scripts.yaml sont modifiables.",
"max": {
"parallel": "Nombre maximal de parcours parallèles",
"queued": "Longueur de la file d'attente"
},
"modes": {
"description": "Le mode contrôle ce qui se passe lorsque le script est appelé alors quil est toujours en cours dexécution à partir dune ou plusieurs invocations précédentes. Consultez le {documentation_link} pour plus dinformations.",
"documentation": "documentation script",
"label": "Mode",
"parallel": "Parallèle",
"queued": "En attente",
"restart": "Redémarrer",
"single": "Unique (par défaut)"
},
"sequence": "Séquence", "sequence": "Séquence",
"sequence_sentence": "La séquence d'actions de ce script." "sequence_sentence": "La séquence d'actions de ce script."
}, },
@@ -2340,7 +2306,6 @@
}, },
"edit_card": { "edit_card": {
"add": "Ajouter une action", "add": "Ajouter une action",
"confirm_cancel": "Êtes-vous sûrs de vouloir annuler ?",
"delete": "Supprimer", "delete": "Supprimer",
"duplicate": "Dupliquer la carte", "duplicate": "Dupliquer la carte",
"edit": "Modifier", "edit": "Modifier",
@@ -2351,9 +2316,7 @@
"pick_card_view_title": "Quelle carte souhaitez-vous ajouter à votre vue {name} ?", "pick_card_view_title": "Quelle carte souhaitez-vous ajouter à votre vue {name} ?",
"show_code_editor": "Afficher l'éditeur de code", "show_code_editor": "Afficher l'éditeur de code",
"show_visual_editor": "Afficher l'éditeur visuel", "show_visual_editor": "Afficher l'éditeur visuel",
"toggle_editor": "Permuter léditeur", "toggle_editor": "Permuter léditeur"
"typed_header": "{type} Configuration de la carte",
"unsaved_changes": "Vous avez des changements non enregistrés"
}, },
"edit_lovelace": { "edit_lovelace": {
"edit_title": "Éditer le titre", "edit_title": "Éditer le titre",
@@ -2446,8 +2409,6 @@
"entity": "Entité", "entity": "Entité",
"entity_id": "ID de l'entité", "entity_id": "ID de l'entité",
"last_changed": "Dernière modification", "last_changed": "Dernière modification",
"no_data": "Aucune entité inutilisée trouvée",
"search": "Rechercher des entités",
"select_to_add": "Sélectionner les entités que vous souhaitez ajouter à une carte, puis cliquez sur le bouton Ajouter une carte.", "select_to_add": "Sélectionner les entités que vous souhaitez ajouter à une carte, puis cliquez sur le bouton Ajouter une carte.",
"title": "Entités inutilisées" "title": "Entités inutilisées"
}, },
@@ -2550,7 +2511,6 @@
}, },
"trusted_networks": { "trusted_networks": {
"abort": { "abort": {
"not_allowed": "Votre ordinateur n'est pas autorisé.",
"not_whitelisted": "Votre ordinateur n'est pas en liste blanche." "not_whitelisted": "Votre ordinateur n'est pas en liste blanche."
}, },
"step": { "step": {

View File

@@ -430,8 +430,6 @@
"activate": "הפעל" "activate": "הפעל"
}, },
"script": { "script": {
"cancel": "בטל",
"cancel_multiple": "בטל {number}",
"execute": "הפעל" "execute": "הפעל"
}, },
"service": { "service": {
@@ -528,7 +526,6 @@
"show_areas": "הצג אזורים" "show_areas": "הצג אזורים"
}, },
"data-table": { "data-table": {
"no-data": "אין נתונים",
"search": "חיפוש" "search": "חיפוש"
}, },
"date-range-picker": { "date-range-picker": {
@@ -944,19 +941,6 @@
"introduction": "השתמש/י באוטומציות להפיח חיים בביתך.", "introduction": "השתמש/י באוטומציות להפיח חיים בביתך.",
"load_error_not_editable": "רק אוטומציה ב automations.yaml ניתנים לעריכה.", "load_error_not_editable": "רק אוטומציה ב automations.yaml ניתנים לעריכה.",
"load_error_unknown": "שגיאה בטעינת האוטומציה ( {err_no} ).", "load_error_unknown": "שגיאה בטעינת האוטומציה ( {err_no} ).",
"max": {
"parallel": "המספר המרבי של ריצות מקבילות",
"queued": "אורך התור"
},
"modes": {
"description": "המצב שולט במתרחש כאשר האוטומציה מופעלת בזמן שהפעולות עדיין פועלות מהטריגר הקודם. עיין ב {documentation_link} למידע נוסף.",
"documentation": "תיעוד אוטומציה",
"label": "מצב",
"parallel": "במקביל",
"queued": "בתור",
"restart": "אתחול",
"single": "יחיד (ברירת מחדל)"
},
"move_down": "הזז למטה", "move_down": "הזז למטה",
"move_up": "הזז למעלה", "move_up": "הזז למעלה",
"save": "שמור", "save": "שמור",
@@ -1598,7 +1582,7 @@
"refresh_body": "אתה צריך לרענן את הדף כדי להשלים את ההסרה, האם אתה רוצה לרענן עכשיו?", "refresh_body": "אתה צריך לרענן את הדף כדי להשלים את ההסרה, האם אתה רוצה לרענן עכשיו?",
"refresh_header": "האם אתה רוצה לרענן?", "refresh_header": "האם אתה רוצה לרענן?",
"types": { "types": {
"css": "Stylesheet", "css": "סגנון עיצוב",
"html": "HTML (הוצא משימוש)", "html": "HTML (הוצא משימוש)",
"js": "קובץ JavaScript (הוצא משימוש)", "js": "קובץ JavaScript (הוצא משימוש)",
"module": "JavaScript Module" "module": "JavaScript Module"
@@ -1665,7 +1649,6 @@
"introduction": "ניתן להגדיר כאן ישויות שאינן שייכות להתקנים.", "introduction": "ניתן להגדיר כאן ישויות שאינן שייכות להתקנים.",
"without_device": "ישויות ללא מכשיר" "without_device": "ישויות ללא מכשיר"
}, },
"icon": "סמל",
"introduction": "השתמש בסצינות כדי להחיות את הבית שלך.", "introduction": "השתמש בסצינות כדי להחיות את הבית שלך.",
"load_error_not_editable": "רק סצינות ב scenes.yaml ניתנות לעריכה.", "load_error_not_editable": "רק סצינות ב scenes.yaml ניתנות לעריכה.",
"load_error_unknown": "שגיאה בטעינת סצנה ({err_no}).", "load_error_unknown": "שגיאה בטעינת סצנה ({err_no}).",
@@ -1699,26 +1682,9 @@
"delete_confirm": "האם אתה בטוח שברצונך למחוק את הסקריפט הזה?", "delete_confirm": "האם אתה בטוח שברצונך למחוק את הסקריפט הזה?",
"delete_script": "מחק סקריפט", "delete_script": "מחק סקריפט",
"header": "סקריפט: {name}", "header": "סקריפט: {name}",
"icon": "סמל",
"id": "מזהה ישות",
"id_already_exists": "מזהה זה כבר קיים",
"id_already_exists_save_error": "אינך יכול לשמור סקריפט זה מכיוון שהמזהה אינו ייחודי, בחר מזהה אחר או השאר אותו ריק כדי ליצור אוטומטית.",
"introduction": "השתמש בסקריפטים כדי לבצע רצף של פעולות.", "introduction": "השתמש בסקריפטים כדי לבצע רצף של פעולות.",
"link_available_actions": "למד עוד אודות פעולות זמינות.", "link_available_actions": "למד עוד אודות פעולות זמינות.",
"load_error_not_editable": "רק סקריפטים בתוך קובץ scripts.yaml ניתנים לעריכה.", "load_error_not_editable": "רק סקריפטים בתוך קובץ scripts.yaml ניתנים לעריכה.",
"max": {
"parallel": "המספר המרבי של ריצות מקבילות",
"queued": "אורך התור"
},
"modes": {
"description": "המצב שולט במה שקורה כאשר מופעל סקריפט בזמן שהוא עדיין פועל מהפעלה קודמת אחת או יותר. עיין ב {documentation_link} למידע נוסף.",
"documentation": "תיעוד סקריפט",
"label": "מצב",
"parallel": "מַקְבִּיל",
"queued": "בתור",
"restart": "אתחול",
"single": "יחיד (ברירת מחדל)"
},
"sequence": "סדר פעולות", "sequence": "סדר פעולות",
"sequence_sentence": "רצף הפעולות של סקריפט זה." "sequence_sentence": "רצף הפעולות של סקריפט זה."
}, },
@@ -2091,12 +2057,12 @@
"title": "מצבים" "title": "מצבים"
}, },
"templates": { "templates": {
"description": "Templates are rendered using the Jinja2 template engine with some Home Assistant specific extensions.", "description": "התבניות מוצגות באמצעות מנוע התבניות Jinja2 עם כמה תוספים ספציפיים של Home Assistant.",
"editor": "Template editor", "editor": "עורך התבניות",
"jinja_documentation": "Jinja2 template documentation", "jinja_documentation": "תיעוד תבנית Jinja2",
"template_extensions": "Home Assistant template extensions", "template_extensions": "הרחבות תבנית של Home Assistant",
"title": "תבניות", "title": "תבניות",
"unknown_error_template": "Unknown error rendering template" "unknown_error_template": "שגיאה לא ידועה בעיבוד התבנית"
} }
} }
}, },
@@ -2340,7 +2306,6 @@
}, },
"edit_card": { "edit_card": {
"add": "הוסף כרטיסייה", "add": "הוסף כרטיסייה",
"confirm_cancel": "האם אתה בטוח שברצונך לבטל?",
"delete": "מחק", "delete": "מחק",
"duplicate": "שכפול כרטיס", "duplicate": "שכפול כרטיס",
"edit": "ערוך", "edit": "ערוך",
@@ -2351,9 +2316,7 @@
"pick_card_view_title": "איזה כרטיס ברצונך להוסיף לתצוגת {name}?", "pick_card_view_title": "איזה כרטיס ברצונך להוסיף לתצוגת {name}?",
"show_code_editor": "הצג עורך קוד", "show_code_editor": "הצג עורך קוד",
"show_visual_editor": "הצג עורך ויזואלי", "show_visual_editor": "הצג עורך ויזואלי",
"toggle_editor": "החלף מצב עורך", "toggle_editor": "החלף מצב עורך"
"typed_header": "תצורת כרטיס {type}",
"unsaved_changes": "יש לך שינויים שלא נשמרו"
}, },
"edit_lovelace": { "edit_lovelace": {
"edit_title": "ערוך כותרת", "edit_title": "ערוך כותרת",
@@ -2446,8 +2409,6 @@
"entity": "ישות", "entity": "ישות",
"entity_id": "מזהה ישות", "entity_id": "מזהה ישות",
"last_changed": "שונה לאחרונה", "last_changed": "שונה לאחרונה",
"no_data": "לא נמצאו ישויות שאינן בשימוש",
"search": "חיפוש ישויות",
"select_to_add": "בחר את הישויות שברצונך להוסיף לכרטיס ולחץ על כפתור הוסף כרטיס.", "select_to_add": "בחר את הישויות שברצונך להוסיף לכרטיס ולחץ על כפתור הוסף כרטיס.",
"title": "ישויות שאינן בשימוש" "title": "ישויות שאינן בשימוש"
}, },
@@ -2550,7 +2511,6 @@
}, },
"trusted_networks": { "trusted_networks": {
"abort": { "abort": {
"not_allowed": "המחשב שלך אינו מורשה.",
"not_whitelisted": "המחשב שלך אינו רשום ברשימת ההיתרים." "not_whitelisted": "המחשב שלך אינו רשום ברשימת ההיתרים."
}, },
"step": { "step": {

View File

@@ -48,19 +48,6 @@
"none": "Nincs", "none": "Nincs",
"sleep": "Alvás" "sleep": "Alvás"
} }
},
"humidifier": {
"mode": {
"auto": "Automatikus",
"away": "Távol",
"baby": "Baba",
"boost": "Turbo",
"comfort": "Komfort",
"eco": "Takarékos",
"home": "Otthon",
"normal": "Normál",
"sleep": "Alvás"
}
} }
}, },
"state_badge": { "state_badge": {
@@ -401,12 +388,6 @@
"reverse": "Fordított", "reverse": "Fordított",
"speed": "Sebesség" "speed": "Sebesség"
}, },
"humidifier": {
"humidity": "Kívánt páratartalom",
"mode": "Mód",
"on_entity": "{name} be",
"target_humidity_entity": "{name} kívánt páratartalom"
},
"light": { "light": {
"brightness": "Fényerő", "brightness": "Fényerő",
"color_temperature": "Színhőmérséklet", "color_temperature": "Színhőmérséklet",
@@ -430,8 +411,6 @@
"activate": "Aktiválás" "activate": "Aktiválás"
}, },
"script": { "script": {
"cancel": "Mégse",
"cancel_multiple": "Mégse {number}",
"execute": "Futtatás" "execute": "Futtatás"
}, },
"service": { "service": {
@@ -527,15 +506,6 @@
"clear": "Törlés", "clear": "Törlés",
"show_areas": "Területek megjelenítése" "show_areas": "Területek megjelenítése"
}, },
"data-table": {
"no-data": "Nincs adat",
"search": "Keresés"
},
"date-range-picker": {
"end_date": "Befejezés dátuma",
"select": "Kiválasztás",
"start_date": "Kezdés dátuma"
},
"device-picker": { "device-picker": {
"clear": "Törlés", "clear": "Törlés",
"device": "Eszköz", "device": "Eszköz",
@@ -724,11 +694,10 @@
}, },
"zha_device_info": { "zha_device_info": {
"buttons": { "buttons": {
"add": "Eszközök hozzáadása ezen az eszközön keresztül", "add": "Eszközök hozzáadása",
"clusters": "Klaszterek Kezelése",
"reconfigure": "Eszköz újrakonfigurálása", "reconfigure": "Eszköz újrakonfigurálása",
"remove": "Eszköz eltávolítása", "remove": "Eszköz eltávolítása",
"zigbee_information": "Zigbee eszköz aláírása" "zigbee_information": "Zigbee Információk"
}, },
"confirmations": { "confirmations": {
"remove": "Biztosan el akarod távolítani az eszközt?" "remove": "Biztosan el akarod távolítani az eszközt?"
@@ -748,7 +717,7 @@
"unknown": "Ismeretlen", "unknown": "Ismeretlen",
"zha_device_card": { "zha_device_card": {
"area_picker_label": "Terület", "area_picker_label": "Terület",
"device_name_placeholder": "Eszköznév módosítása", "device_name_placeholder": "Felhasználó által megadott név",
"update_name_button": "Név frissítése" "update_name_button": "Név frissítése"
} }
} }
@@ -944,18 +913,6 @@
"introduction": "Használj automatizálásokat otthonod életre keltéséhez", "introduction": "Használj automatizálásokat otthonod életre keltéséhez",
"load_error_not_editable": "Csak az automations.yaml fájlban megadott automatizálások szerkeszthetők.", "load_error_not_editable": "Csak az automations.yaml fájlban megadott automatizálások szerkeszthetők.",
"load_error_unknown": "Hiba az automatizálás betöltésekor ({err_no}).", "load_error_unknown": "Hiba az automatizálás betöltésekor ({err_no}).",
"max": {
"parallel": "A párhuzamos futtatások maximális száma",
"queued": "Várólista hossza"
},
"modes": {
"documentation": "automatizálási dokumentáció",
"label": "Mód",
"parallel": "Párhuzamos",
"queued": "Várólistás",
"restart": "Újraindítás",
"single": "Egyszeri (alapértelmezett)"
},
"move_down": "Le", "move_down": "Le",
"move_up": "Fel", "move_up": "Fel",
"save": "Mentés", "save": "Mentés",
@@ -1374,7 +1331,6 @@
"confirm_text": "El kell távolítanod őket a Lovelace konfigurációból és az automatizálásokból, ha tartalmazzák ezeket az entitásokat.", "confirm_text": "El kell távolítanod őket a Lovelace konfigurációból és az automatizálásokból, ha tartalmazzák ezeket az entitásokat.",
"confirm_title": "El szeretnél távolítani {number} entitást?" "confirm_title": "El szeretnél távolítani {number} entitást?"
}, },
"search": "Entitások keresése",
"selected": "{number} kiválasztva", "selected": "{number} kiválasztva",
"status": { "status": {
"disabled": "Letiltott", "disabled": "Letiltott",
@@ -1405,8 +1361,7 @@
"entity_id": "Entitás ID", "entity_id": "Entitás ID",
"name": "Név", "name": "Név",
"type": "Típus" "type": "Típus"
}, }
"no_helpers": "Úgy tűnik, még nincs egy segítőd sem!"
}, },
"types": { "types": {
"input_boolean": "Váltás", "input_boolean": "Váltás",
@@ -1418,9 +1373,7 @@
}, },
"info": { "info": {
"built_using": "Buildelve:", "built_using": "Buildelve:",
"caption": "Infó",
"custom_uis": "Egyéni felhasználói felületek:", "custom_uis": "Egyéni felhasználói felületek:",
"description": "Információ a Home Assistant telepítésedről",
"developed_by": "Egy csomó fantasztikus ember által kifejlesztve.", "developed_by": "Egy csomó fantasztikus ember által kifejlesztve.",
"documentation": "Dokumentáció", "documentation": "Dokumentáció",
"frontend": "frontend-ui", "frontend": "frontend-ui",
@@ -1436,9 +1389,6 @@
"system_health_error": "A rendszerállapot összetevő nincs betöltve. Add hozzá a 'system_health:' sort a configuration.yaml fájlhoz.", "system_health_error": "A rendszerállapot összetevő nincs betöltve. Add hozzá a 'system_health:' sort a configuration.yaml fájlhoz.",
"title": "Infó" "title": "Infó"
}, },
"integration_panel_move": {
"link_integration_page": "integrációk oldal"
},
"integrations": { "integrations": {
"add_integration": "Integráció hozzáadása", "add_integration": "Integráció hozzáadása",
"caption": "Integrációk", "caption": "Integrációk",
@@ -1449,7 +1399,6 @@
"delete_confirm": "Biztosan törölni szeretnéd ezt az integrációt?", "delete_confirm": "Biztosan törölni szeretnéd ezt az integrációt?",
"device_unavailable": "eszköz nem érhető el", "device_unavailable": "eszköz nem érhető el",
"devices": "{count} {count, plural,\n one {eszköz}\n other {eszköz}\n}", "devices": "{count} {count, plural,\n one {eszköz}\n other {eszköz}\n}",
"documentation": "Dokumentáció",
"entities": "{count} {count, plural,\n one {entitás}\n other {entitás}\n}", "entities": "{count} {count, plural,\n one {entitás}\n other {entitás}\n}",
"entity_unavailable": "entitás nem érhető el", "entity_unavailable": "entitás nem érhető el",
"firmware": "Firmware: {version}", "firmware": "Firmware: {version}",
@@ -1508,14 +1457,11 @@
"note_about_integrations": "Még nem minden integráció konfigurálható a felhasználói felületen keresztül.", "note_about_integrations": "Még nem minden integráció konfigurálható a felhasználói felületen keresztül.",
"note_about_website_reference": "Továbbiak érhetőek el itt: ", "note_about_website_reference": "Továbbiak érhetőek el itt: ",
"rename_dialog": "A konfigurációs bejegyzés nevének szerkesztése", "rename_dialog": "A konfigurációs bejegyzés nevének szerkesztése",
"rename_input_label": "Bejegyzés neve", "rename_input_label": "Bejegyzés neve"
"search": "Integrációk keresése"
}, },
"introduction": "Itt a komponenseket és a Home Assistant szervert lehet beállítani. Még nem lehet mindent a felületről, de dolgozunk rajta.", "introduction": "Itt a komponenseket és a Home Assistant szervert lehet beállítani. Még nem lehet mindent a felületről, de dolgozunk rajta.",
"logs": { "logs": {
"caption": "Napló",
"clear": "Törlés", "clear": "Törlés",
"description": "A Home Assistant naplófájlok megtekintése",
"details": "Naplózás részletessége ({level})", "details": "Naplózás részletessége ({level})",
"load_full_log": "Teljes Home Assistant napló betöltése", "load_full_log": "Teljes Home Assistant napló betöltése",
"loading_log": "Hibanapló betöltése...", "loading_log": "Hibanapló betöltése...",
@@ -1603,7 +1549,6 @@
} }
}, },
"mqtt": { "mqtt": {
"button": "Beállítás",
"description_listen": "Téma figyelése", "description_listen": "Téma figyelése",
"description_publish": "Csomag közzététele", "description_publish": "Csomag közzététele",
"listening_to": "Figyelés:", "listening_to": "Figyelés:",
@@ -1662,7 +1607,6 @@
"introduction": "Az eszköz nélküli entitások itt állíthatók be.", "introduction": "Az eszköz nélküli entitások itt állíthatók be.",
"without_device": "Eszköz nélküli entitások" "without_device": "Eszköz nélküli entitások"
}, },
"icon": "Ikon",
"introduction": "Használj jeleneteket otthonod életre keltéséhez.", "introduction": "Használj jeleneteket otthonod életre keltéséhez.",
"load_error_not_editable": "Csak a scenes.yaml fájlban megadott jelenetek szerkeszthetők.", "load_error_not_editable": "Csak a scenes.yaml fájlban megadott jelenetek szerkeszthetők.",
"load_error_unknown": "Hiba a jelenet betöltésekor ({err_no}).", "load_error_unknown": "Hiba a jelenet betöltésekor ({err_no}).",
@@ -1696,24 +1640,9 @@
"delete_confirm": "Biztosan törölni szeretnéd ezt a szkriptet?", "delete_confirm": "Biztosan törölni szeretnéd ezt a szkriptet?",
"delete_script": "Szkript törlése", "delete_script": "Szkript törlése",
"header": "Szkript: {name}", "header": "Szkript: {name}",
"icon": "Ikon",
"id": "Entitás ID",
"id_already_exists": "Ez az ID már létezik",
"introduction": "Használj szkripteket műveletsorozatok végrehajtásához.", "introduction": "Használj szkripteket műveletsorozatok végrehajtásához.",
"link_available_actions": "Tudj meg többet az elérhető műveletekről.", "link_available_actions": "Tudj meg többet az elérhető műveletekről.",
"load_error_not_editable": "Csak a scripts.yaml fájlban megadott szkriptek szerkeszthetők.", "load_error_not_editable": "Csak a scripts.yaml fájlban megadott szkriptek szerkeszthetők.",
"max": {
"parallel": "A párhuzamos futtatások maximális száma",
"queued": "Várólista hossza"
},
"modes": {
"documentation": "szkript dokumentáció",
"label": "Mód",
"parallel": "Párhuzamos",
"queued": "Várólistás",
"restart": "Újraindítás",
"single": "Egyszeri (alapértelmezett)"
},
"sequence": "Sorrend", "sequence": "Sorrend",
"sequence_sentence": "A szkript műveleti sorrendje." "sequence_sentence": "A szkript műveleti sorrendje."
}, },
@@ -1740,11 +1669,6 @@
"core": "Lokáció és testreszabások újratöltése", "core": "Lokáció és testreszabások újratöltése",
"group": "Csoportok újratöltése", "group": "Csoportok újratöltése",
"heading": "YAML konfiguráció újratöltése", "heading": "YAML konfiguráció újratöltése",
"input_boolean": "Bemeneti logikai változók újratöltése",
"input_datetime": "Időpont bemenetek újratöltése",
"input_number": "Szám bemenetek újratöltése",
"input_select": "Választási bemenetek újratöltése",
"input_text": "Bemeneti szövegek újratöltése",
"introduction": "A Home Assistant bizonyos részei újraindítás nélkül újratölthetőek. Újratöltéskor az aktuálisan betöltött YAML konfiguráció helyére betöltődik az új.", "introduction": "A Home Assistant bizonyos részei újraindítás nélkül újratölthetőek. Újratöltéskor az aktuálisan betöltött YAML konfiguráció helyére betöltődik az új.",
"person": "Személyek újratöltése", "person": "Személyek újratöltése",
"scene": "Jelenetek újratöltése", "scene": "Jelenetek újratöltése",
@@ -1807,7 +1731,6 @@
}, },
"zha": { "zha": {
"add_device_page": { "add_device_page": {
"discovered_text": "Az eszközök itt fognak megjelenni, ha felfedezésre kerültek.",
"discovery_text": "A felfedezett eszközök itt fognak megjelenni. A készülékek használati utasításai alapján állítsd őket párosítási módba.", "discovery_text": "A felfedezett eszközök itt fognak megjelenni. A készülékek használati utasításai alapján állítsd őket párosítási módba.",
"header": "Zigbee Home Automation - Eszközök hozzáadása", "header": "Zigbee Home Automation - Eszközök hozzáadása",
"search_again": "Keresés Újra", "search_again": "Keresés Újra",
@@ -1817,7 +1740,6 @@
"caption": "Eszközök hozzáadása", "caption": "Eszközök hozzáadása",
"description": "Eszközök hozzáadása a Zigbee hálózathoz" "description": "Eszközök hozzáadása a Zigbee hálózathoz"
}, },
"button": "Beállítás",
"caption": "ZHA", "caption": "ZHA",
"cluster_attributes": { "cluster_attributes": {
"attributes_of_cluster": "A kiválasztott klaszter attribútumai", "attributes_of_cluster": "A kiválasztott klaszter attribútumai",
@@ -1896,9 +1818,6 @@
"header": "Hálózat menedzsment", "header": "Hálózat menedzsment",
"introduction": "Parancsok, amik kihatnak az egész hálózatra" "introduction": "Parancsok, amik kihatnak az egész hálózatra"
}, },
"network": {
"caption": "Hálózat"
},
"node_management": { "node_management": {
"header": "Eszköz kezelés", "header": "Eszköz kezelés",
"help_node_dropdown": "Válassz egy eszközt az eszközönkénti beállítások megtekintéséhez.", "help_node_dropdown": "Válassz egy eszközt az eszközönkénti beállítások megtekintéséhez.",
@@ -1938,7 +1857,6 @@
"no_zones_created_yet": "Úgy tűnik, még nem hoztál létre zónákat." "no_zones_created_yet": "Úgy tűnik, még nem hoztál létre zónákat."
}, },
"zwave": { "zwave": {
"button": "Beállítás",
"caption": "Z-Wave", "caption": "Z-Wave",
"common": { "common": {
"index": "Index", "index": "Index",
@@ -1972,7 +1890,6 @@
"true": "Igaz" "true": "Igaz"
}, },
"node_management": { "node_management": {
"header": "Z-Wave csomópontkezelés",
"nodes": "Csomópontok" "nodes": "Csomópontok"
}, },
"ozw_log": { "ozw_log": {
@@ -1984,16 +1901,15 @@
"add_node_secure": "Biztonságos csomópont hozzáadása", "add_node_secure": "Biztonságos csomópont hozzáadása",
"cancel_command": "Parancs megszakítása", "cancel_command": "Parancs megszakítása",
"heal_network": "Hálózati struktúra feltérképezése", "heal_network": "Hálózati struktúra feltérképezése",
"node_info": "Csomópont információ", "node_info": "Node információ",
"refresh_entity": "Entitás frissítése", "refresh_entity": "Entitás frissítése",
"refresh_node": "Csomópont frissítése",
"remove_node": "Csomópont eltávolítása", "remove_node": "Csomópont eltávolítása",
"save_config": "Konfiguráció mentése", "save_config": "Konfiguráció mentése",
"soft_reset": "Soft Reset", "soft_reset": "Soft Reset",
"start_network": "Hálózat indítása", "start_network": "Hálózat indítása",
"stop_network": "Hálózat leállítása", "stop_network": "Hálózat leállítása",
"test_network": "Hálózat tesztelése", "test_network": "Hálózat tesztelése",
"test_node": "Teszt csomópont" "test_node": "Teszt Node"
}, },
"values": { "values": {
"header": "Csomópont értékek" "header": "Csomópont értékek"
@@ -2070,23 +1986,11 @@
}, },
"history": { "history": {
"period": "Időtartam", "period": "Időtartam",
"ranges": {
"last_week": "Múlt hét",
"this_week": "Aktuális hét",
"today": "Ma",
"yesterday": "Tegnap"
},
"showing_entries": "Bejegyzések megjelenítése" "showing_entries": "Bejegyzések megjelenítése"
}, },
"logbook": { "logbook": {
"entries_not_found": "Nincsenek naplóbejegyzések.", "entries_not_found": "Nincsenek naplóbejegyzések.",
"period": "Időszak", "period": "Időszak",
"ranges": {
"last_week": "Múlt hét",
"this_week": "Aktuális hét",
"today": "Ma",
"yesterday": "Tegnap"
},
"showing_entries": "Bejegyzések megjelenítése" "showing_entries": "Bejegyzések megjelenítése"
}, },
"lovelace": { "lovelace": {
@@ -2124,7 +2028,7 @@
"clear_items": "Bejelölt tételek törlése" "clear_items": "Bejelölt tételek törlése"
}, },
"starting": { "starting": {
"description": "A Home Assistant indítása folyamatban van, kérlek várj...", "description": "A Home Assistant indítása folyamatban van, kérlek várj.",
"header": "A Home Assistant indítása folyamatban van..." "header": "A Home Assistant indítása folyamatban van..."
} }
}, },
@@ -2202,7 +2106,6 @@
"name": "Név", "name": "Név",
"no_theme": "Nincs téma", "no_theme": "Nincs téma",
"refresh_interval": "Frissítési időköz", "refresh_interval": "Frissítési időköz",
"search": "Keresés",
"secondary_info_attribute": "Másodlagos információ attribútum", "secondary_info_attribute": "Másodlagos információ attribútum",
"show_icon": "Ikon megjelenítése?", "show_icon": "Ikon megjelenítése?",
"show_name": "Név megjelenítése?", "show_name": "Név megjelenítése?",
@@ -2227,9 +2130,6 @@
"description": "A Vízszintes Készlet kártya lehetővé teszi több kártya egymás mellé rendezését egy oszlopon belül.", "description": "A Vízszintes Készlet kártya lehetővé teszi több kártya egymás mellé rendezését egy oszlopon belül.",
"name": "Vízszintes Készlet" "name": "Vízszintes Készlet"
}, },
"humidifier": {
"name": "Párásító"
},
"iframe": { "iframe": {
"description": "A Weblap kártya lehetővé teszi a kedvenc weboldalad beágyazását a Home Assistant-ba.", "description": "A Weblap kártya lehetővé teszi a kedvenc weboldalad beágyazását a Home Assistant-ba.",
"name": "Weboldal" "name": "Weboldal"
@@ -2307,7 +2207,6 @@
}, },
"edit_card": { "edit_card": {
"add": "Kártya hozzáadása", "add": "Kártya hozzáadása",
"confirm_cancel": "Biztosan meg szeretnéd szakítani?",
"delete": "Kártya törlése", "delete": "Kártya törlése",
"duplicate": "Kártya duplikálása", "duplicate": "Kártya duplikálása",
"edit": "Szerkesztés", "edit": "Szerkesztés",
@@ -2318,15 +2217,12 @@
"pick_card_view_title": "Melyik kártyát szeretnéd hozzáadni a(z) {name} nézethez?", "pick_card_view_title": "Melyik kártyát szeretnéd hozzáadni a(z) {name} nézethez?",
"show_code_editor": "Kódszerkesztő megjelenítése", "show_code_editor": "Kódszerkesztő megjelenítése",
"show_visual_editor": "Vizuális szerkesztő megjelenítése", "show_visual_editor": "Vizuális szerkesztő megjelenítése",
"toggle_editor": "Szerkesztő", "toggle_editor": "Szerkesztő"
"typed_header": "{típusú} Kártya Konfiguráció",
"unsaved_changes": "Vannak nem mentett módosítások"
}, },
"edit_lovelace": { "edit_lovelace": {
"edit_title": "Cím szerkesztése", "edit_title": "Cím szerkesztése",
"explanation": "Ez a cím jelenik meg minden nézet felett a Lovelace felhasználói felületen.", "explanation": "Ez a cím jelenik meg minden nézet felett a Lovelace felhasználói felületen.",
"header": "Lovelace UI címe", "header": "Lovelace UI címe"
"title": "Cím"
}, },
"edit_view": { "edit_view": {
"add": "Nézet hozzáadása", "add": "Nézet hozzáadása",
@@ -2413,8 +2309,6 @@
"entity": "Entitás", "entity": "Entitás",
"entity_id": "Entitás ID", "entity_id": "Entitás ID",
"last_changed": "Utoljára változott", "last_changed": "Utoljára változott",
"no_data": "Nincsenek nem használt entitások",
"search": "Entitások keresése",
"select_to_add": "Válaszd ki azokat az entitásokat, amelyeket hozzá akarsz adni egy kártyához, majd kattints a kártya hozzáadása gombra.", "select_to_add": "Válaszd ki azokat az entitásokat, amelyeket hozzá akarsz adni egy kártyához, majd kattints a kártya hozzáadása gombra.",
"title": "Nem használt entitások" "title": "Nem használt entitások"
}, },
@@ -2517,7 +2411,6 @@
}, },
"trusted_networks": { "trusted_networks": {
"abort": { "abort": {
"not_allowed": "A számítógéped nem engedélyezett.",
"not_whitelisted": "A számítógéped nem engedélyezett." "not_whitelisted": "A számítógéped nem engedélyezett."
}, },
"step": { "step": {
@@ -2693,10 +2586,6 @@
"not_used": "Sosem használt", "not_used": "Sosem használt",
"token_title": "{clientId} frissítési tokenje" "token_title": "{clientId} frissítési tokenje"
}, },
"suspend": {
"description": "Lezárjuk a kapcsolatot a szerverrel, ha 5 percig rejtve van a felület?",
"header": "Kapcsolat automatikus bontása"
},
"themes": { "themes": {
"dropdown_label": "Téma", "dropdown_label": "Téma",
"error_no_theme": "Nincsenek elérhető témák.", "error_no_theme": "Nincsenek elérhető témák.",

View File

@@ -205,7 +205,6 @@
"stopped": "Stöðvuð" "stopped": "Stöðvuð"
}, },
"default": { "default": {
"off": "Slökkt",
"on": "Á", "on": "Á",
"unavailable": "Ekki tiltækt", "unavailable": "Ekki tiltækt",
"unknown": "Óþekkt" "unknown": "Óþekkt"
@@ -403,8 +402,6 @@
"activate": "Virkja" "activate": "Virkja"
}, },
"script": { "script": {
"cancel": "Hætta við",
"cancel_multiple": "Hætta við {number}",
"execute": "Framkvæma" "execute": "Framkvæma"
}, },
"service": { "service": {
@@ -492,9 +489,6 @@
"clear": "Hreinsa", "clear": "Hreinsa",
"show_areas": "Birta svæði" "show_areas": "Birta svæði"
}, },
"data-table": {
"search": "Leita"
},
"date-range-picker": { "date-range-picker": {
"end_date": "Loka dagsetning", "end_date": "Loka dagsetning",
"select": "Velja", "select": "Velja",
@@ -574,7 +568,6 @@
"time": "Tími" "time": "Tími"
}, },
"input_number": { "input_number": {
"box": "Innsláttarreitur",
"max": "Hámarksgildi", "max": "Hámarksgildi",
"min": "Lágmarksgildi", "min": "Lágmarksgildi",
"mode": "Birtingarmáti", "mode": "Birtingarmáti",
@@ -614,7 +607,6 @@
"title": "Uppfærslu leiðbeiningar" "title": "Uppfærslu leiðbeiningar"
}, },
"vacuum": { "vacuum": {
"locate": "Staðsetja",
"pause": "Hlé", "pause": "Hlé",
"start": "Byrja", "start": "Byrja",
"status": "Staða", "status": "Staða",
@@ -653,7 +645,6 @@
"unknown": "Óþekkt", "unknown": "Óþekkt",
"zha_device_card": { "zha_device_card": {
"area_picker_label": "Svæði", "area_picker_label": "Svæði",
"device_name_placeholder": "Breyta nafni á tæki",
"update_name_button": "Uppfæra nafn" "update_name_button": "Uppfæra nafn"
} }
} }
@@ -695,7 +686,6 @@
"description": "Yfirlit yfir öll svæði á heimilinu þínu.", "description": "Yfirlit yfir öll svæði á heimilinu þínu.",
"editor": { "editor": {
"create": "STOFNA", "create": "STOFNA",
"default_name": "Nýtt svæði",
"delete": "EYÐA", "delete": "EYÐA",
"name": "Nafn", "name": "Nafn",
"name_required": "Nafn er skilyrt", "name_required": "Nafn er skilyrt",
@@ -827,16 +817,10 @@
"label": "Lýsing", "label": "Lýsing",
"placeholder": "Valfrjáls lýsing" "placeholder": "Valfrjáls lýsing"
}, },
"edit_ui": "Breyta í viðmóti",
"edit_yaml": "Breyta sem YAML",
"enable_disable": "Virkja/slökkva á sjálfvirkni", "enable_disable": "Virkja/slökkva á sjálfvirkni",
"introduction": "Notaðu sjálfvirkni til að glæða húsið þitt lífi", "introduction": "Notaðu sjálfvirkni til að glæða húsið þitt lífi",
"load_error_not_editable": "Eingöngu er hægt að breyta sjálfvirkni í automations.yaml", "load_error_not_editable": "Eingöngu er hægt að breyta sjálfvirkni í automations.yaml",
"load_error_unknown": "Villa kom upp við að hlaða inn sjálfvirkni ({err_no}).", "load_error_unknown": "Villa kom upp við að hlaða inn sjálfvirkni ({err_no}).",
"modes": {
"label": "Hamur",
"restart": "Endurræsa"
},
"move_down": "Færa niður", "move_down": "Færa niður",
"move_up": "Færa upp", "move_up": "Færa upp",
"save": "Vista", "save": "Vista",
@@ -982,7 +966,6 @@
"description_login": "Innskráð(ur) sem {email}", "description_login": "Innskráð(ur) sem {email}",
"description_not_login": "Ekki skráð(ur) inn", "description_not_login": "Ekki skráð(ur) inn",
"dialog_certificate": { "dialog_certificate": {
"certificate_information": "Upplýsingar um skilríki",
"close": "Loka", "close": "Loka",
"fingerprint": "Fingrafar skilríkis:" "fingerprint": "Fingrafar skilríkis:"
}, },
@@ -1072,11 +1055,9 @@
"actions": { "actions": {
"caption": "Þegar eitthvað er ræst af kveikju..." "caption": "Þegar eitthvað er ræst af kveikju..."
}, },
"automations": "Sjálfvirkni",
"conditions": { "conditions": {
"caption": "Bara framkvæma eitthvað ef..." "caption": "Bara framkvæma eitthvað ef..."
}, },
"no_automations": "Engin sjálfvirkni",
"triggers": { "triggers": {
"caption": "Framkvæma eitthvað þegar..." "caption": "Framkvæma eitthvað þegar..."
} }
@@ -1089,7 +1070,6 @@
"device": "Tæki", "device": "Tæki",
"integration": "Samþætting", "integration": "Samþætting",
"manufacturer": "Framleiðandi", "manufacturer": "Framleiðandi",
"model": "Gerð",
"no_area": "Ekkert svæði", "no_area": "Ekkert svæði",
"no_devices": "Engin tæki" "no_devices": "Engin tæki"
}, },
@@ -1141,7 +1121,6 @@
"button": "Fjarlægja val", "button": "Fjarlægja val",
"confirm_title": "Viltu fjarlægja {number} einingar?" "confirm_title": "Viltu fjarlægja {number} einingar?"
}, },
"search": "Leita í einingum",
"selected": "{number} valin", "selected": "{number} valin",
"status": { "status": {
"disabled": "Afvirkjað", "disabled": "Afvirkjað",
@@ -1176,7 +1155,6 @@
} }
}, },
"info": { "info": {
"built_using": "Byggt með",
"caption": "Upplýsingar", "caption": "Upplýsingar",
"documentation": "Skjölun", "documentation": "Skjölun",
"icons_by": "Smátákn eftir", "icons_by": "Smátákn eftir",
@@ -1236,9 +1214,7 @@
"integration_not_found": "Samþætting fannst ekki.", "integration_not_found": "Samþætting fannst ekki.",
"new": "Setja upp nýja samþættingu", "new": "Setja upp nýja samþættingu",
"none": "Ekkert skilgreint sem stendur", "none": "Ekkert skilgreint sem stendur",
"none_found": "Engar samþættingar fundust", "none_found": "Engar samþættingar fundust"
"note_about_integrations": "Það er ekki er hægt að stilla allar samþættingar í gegnum viðmótið ennþá.",
"search": "Leita í samþættingum"
}, },
"introduction": "Hér er mögulegt að stilla af íhluti og Home Assistant. Því miður er ekki hægt að breyta öllu í gegnum viðmótið ennþá, en við erum að vinna í því.", "introduction": "Hér er mögulegt að stilla af íhluti og Home Assistant. Því miður er ekki hægt að breyta öllu í gegnum viðmótið ennþá, en við erum að vinna í því.",
"logs": { "logs": {
@@ -1343,10 +1319,8 @@
"entities": { "entities": {
"add": "Bæta við einingu", "add": "Bæta við einingu",
"delete": "Eyða einingu", "delete": "Eyða einingu",
"header": "Einingar", "header": "Einingar"
"without_device": "Einingar án tækja"
}, },
"icon": "Táknmynd",
"load_error_not_editable": "Það er eingöngu hægt að breyta senum í scenes.yaml.", "load_error_not_editable": "Það er eingöngu hægt að breyta senum í scenes.yaml.",
"name": "Nafn", "name": "Nafn",
"save": "Vista" "save": "Vista"
@@ -1371,13 +1345,7 @@
"description": "Búa til og breyta skriftum", "description": "Búa til og breyta skriftum",
"editor": { "editor": {
"alias": "Nafn", "alias": "Nafn",
"icon": "Táknmynd", "link_available_actions": "Læra meira um tiltækar aðgerðir."
"link_available_actions": "Læra meira um tiltækar aðgerðir.",
"modes": {
"label": "Hamur",
"restart": "Endurræsa"
},
"sequence": "Röð"
}, },
"picker": { "picker": {
"headers": { "headers": {
@@ -1540,12 +1508,10 @@
"node_management": { "node_management": {
"add_to_group": "Bæta í hóp", "add_to_group": "Bæta í hóp",
"entity_info": "Upplýsingar um einingu", "entity_info": "Upplýsingar um einingu",
"group": "Hópur", "group": "Hópur"
"remove_from_group": "Fjarlægja úr hóp"
}, },
"ozw_log": { "ozw_log": {
"header": "OZW annáll", "header": "OZW annáll"
"load": "Hlaða"
}, },
"services": { "services": {
"cancel_command": "Hætta við skipun", "cancel_command": "Hætta við skipun",
@@ -1579,9 +1545,7 @@
}, },
"states": { "states": {
"current_entities": "Tiltækar einingar", "current_entities": "Tiltækar einingar",
"entity": "Eining",
"more_info": "Frekari upplýsingar", "more_info": "Frekari upplýsingar",
"no_entities": "Engar einingar",
"set_state": "Setja stöðu", "set_state": "Setja stöðu",
"state": "Staða", "state": "Staða",
"title": "Stöður" "title": "Stöður"
@@ -1688,7 +1652,6 @@
"minimum": "Lágmark", "minimum": "Lágmark",
"name": "Nafn", "name": "Nafn",
"no_theme": "Ekkert þema", "no_theme": "Ekkert þema",
"search": "Leita",
"show_icon": "Birta táknmynd?", "show_icon": "Birta táknmynd?",
"show_name": "Birta nafn?", "show_name": "Birta nafn?",
"show_state": "Birta stöðu?", "show_state": "Birta stöðu?",
@@ -1730,7 +1693,6 @@
"name": "Mynd" "name": "Mynd"
}, },
"plant-status": { "plant-status": {
"description": "Staða plöntu kortið er fyrir alla grasafræðingana þarna úti.",
"name": "Staða plöntu" "name": "Staða plöntu"
}, },
"sensor": { "sensor": {
@@ -1756,7 +1718,6 @@
}, },
"edit_card": { "edit_card": {
"add": "Bæta við spjaldi", "add": "Bæta við spjaldi",
"confirm_cancel": "Ertu viss um að þú viljir hætta við?",
"delete": "Eyða", "delete": "Eyða",
"edit": "Breyta", "edit": "Breyta",
"header": "Stillingar spjalds", "header": "Stillingar spjalds",
@@ -1765,12 +1726,10 @@
"pick_card": "Veldu spjald sem þú vilt bæta við.", "pick_card": "Veldu spjald sem þú vilt bæta við.",
"show_code_editor": "Birta kóða ritil", "show_code_editor": "Birta kóða ritil",
"show_visual_editor": "Birta sjónrænan ritil", "show_visual_editor": "Birta sjónrænan ritil",
"toggle_editor": "Víxla ritli", "toggle_editor": "Víxla ritli"
"unsaved_changes": "Þú ert með óvistaðar breytingar"
}, },
"edit_lovelace": { "edit_lovelace": {
"edit_title": "Breyta titli", "edit_title": "Breyta titli"
"title": "Titill"
}, },
"edit_view": { "edit_view": {
"add": "Bæta við sýn", "add": "Bæta við sýn",
@@ -1789,7 +1748,6 @@
"migrate": "Uppfæra stillingar" "migrate": "Uppfæra stillingar"
}, },
"raw_editor": { "raw_editor": {
"error_save_yaml": "Ekki tókst að vista YAML: {error}",
"header": "Breyta stillingum", "header": "Breyta stillingum",
"save": "Vista", "save": "Vista",
"saved": "Vistað", "saved": "Vistað",
@@ -1907,7 +1865,6 @@
}, },
"trusted_networks": { "trusted_networks": {
"abort": { "abort": {
"not_allowed": "Tölvan þín er ekki leyfð.",
"not_whitelisted": "Tölvan þín er ekki hvítlistuð." "not_whitelisted": "Tölvan þín er ekki hvítlistuð."
}, },
"step": { "step": {

Some files were not shown because too many files have changed in this diff Show More