Compare commits

..
Author SHA1 Message Date
Zack Arnett 2fef57f0b2 save it 2020-11-12 22:39:34 -06:00
Zack Arnett 9b279632f8 Updates 2020-11-09 11:37:23 -06:00
Zack BarettandGitHub 480e781364 Restore hui-card-options.ts 2020-11-03 23:04:19 -06:00
Zack BarettandGitHub adc10ff0c6 Restore hui-picture-header-footer.ts 2020-11-03 23:03:46 -06:00
Zack BarettandGitHub 57a718e409 Merge branch 'dev' into lit-grid-layout 2020-11-03 23:01:29 -06:00
Zack BarettandGitHub 23462bacfa Restore hui-weather-forecast-card.ts 2020-11-03 23:00:02 -06:00
Zack BarettandGitHub d99f8b0da8 Restore hui-vertical-stack-card.ts 2020-11-03 22:59:58 -06:00
Zack BarettandGitHub 991d1f0997 Restore hui-thermostat-card.ts 2020-11-03 22:59:54 -06:00
Zack BarettandGitHub 54e99357b5 Restore hui-shopping-list-card.ts 2020-11-03 22:59:50 -06:00
Zack BarettandGitHub d263b5550a Restore hui-plant-status-card.ts 2020-11-03 22:59:46 -06:00
Zack BarettandGitHub a2b6ce3437 Restore hui-media-control-card.ts 2020-11-03 22:59:43 -06:00
Zack BarettandGitHub 9458f7ae62 Restore hui-markdown-card.ts 2020-11-03 22:59:40 -06:00
Zack BarettandGitHub 4d2ae36b0d Restore hui-map-card.ts 2020-11-03 22:59:35 -06:00
Zack BarettandGitHub ebf0050e81 Restore hui-light-card.ts 2020-11-03 22:59:31 -06:00
Zack BarettandGitHub 3d0f492d62 Restore hui-iframe-card.ts 2020-11-03 22:59:27 -06:00
Zack BarettandGitHub f5d3237b06 Restore hui-humidifier-card.ts 2020-11-03 22:59:23 -06:00
Zack BarettandGitHub 07671ba1d4 Restore hui-horizontal-stack-card.ts 2020-11-03 22:59:20 -06:00
Zack BarettandGitHub 354d74ce1d Restore hui-history-graph-card.ts 2020-11-03 22:59:17 -06:00
Zack BarettandGitHub e892d14af0 Restore hui-glance-card.ts 2020-11-03 22:59:13 -06:00
Zack BarettandGitHub 8d034fb7e7 Restore hui-gauge-card.ts 2020-11-03 22:59:10 -06:00
Zack BarettandGitHub 249456e6a0 Restore hui-entity-filter-card.ts 2020-11-03 22:59:07 -06:00
Zack BarettandGitHub d3a6f31310 Restore hui-entity-card.ts 2020-11-03 22:59:03 -06:00
Zack BarettandGitHub 4c31aead8b Restore hui-entities-card.ts 2020-11-03 22:59:00 -06:00
Zack BarettandGitHub 3caf91c5d3 Restore hui-button-card.ts 2020-11-03 22:58:56 -06:00
Zack BarettandGitHub 9c3e754d53 Restore hui-alarm-panel-card.ts 2020-11-03 22:58:53 -06:00
Zack BarettandGitHub f48765c2b6 Restore ha-card.ts 2020-11-03 22:58:43 -06:00
Zack Arnett 236f26e652 SOME CHANGES 2020-11-03 22:57:54 -06:00
Zack Arnett 0fed96aba3 idk what I just did. I never commit just work 2020-10-09 16:33:22 -05:00
Zack Arnett 70b77833f1 add grid card options 2020-10-04 16:49:10 -05:00
Zack Arnett 307694a820 updates 2020-10-01 11:17:35 -05:00
Zack BarettandGitHub 402391c3e1 Restore hui-masonry-view.ts 2020-09-30 20:57:06 -05:00
Zack BarettandGitHub 81b5866e4d Restore dialog-entity-editor.ts 2020-09-30 20:55:52 -05:00
Zack BarettandGitHub 09985bf5f7 Restore ha-device-actions-ozw.ts 2020-09-30 20:55:47 -05:00
Zack BarettandGitHub 71d12a9e7a Restore ha-automation-action-wait_template.ts 2020-09-30 20:55:41 -05:00
Zack BarettandGitHub 5fd733b6c9 Restore ha-more-info-logbook.ts 2020-09-30 20:55:34 -05:00
Zack Arnett bc3f827b4a Merge branch 'dev' of https://github.com/home-assistant/frontend into lit-grid-layout 2020-09-30 20:54:25 -05:00
Zack Arnett a807a182e4 fix card options 2020-09-30 20:53:40 -05:00
Zack BarettandGitHub 0a1fb843ca Restore hui-view.ts 2020-09-30 20:50:04 -05:00
Zack Arnett fceb1568f5 add Grid view 2020-09-30 20:49:38 -05:00
Zack BarettandGitHub 74e93bbefc Restore ha-panel-lovelace.ts 2020-09-30 20:31:42 -05:00
Zack BarettandGitHub 5c0f4b564b Restore lovelace.ts 2020-09-30 20:31:11 -05:00
Zack BarettandGitHub 76734f7a0b Restore types.ts 2020-09-30 20:29:07 -05:00
Zack ArnettandGitHub 440d10e4cd Merge branch 'dev' into lit-grid-layout 2020-08-04 09:17:23 -05:00
Zack Arnett a901072695 First changes, alot of work to do 2020-08-04 08:53:07 -05:00
64 changed files with 990 additions and 822 deletions
+3
View File
@@ -35,6 +35,9 @@ const createWebpackConfig = ({
loader: "babel-loader",
options: bundle.babelOptions({ latestBuild }),
},
resolve: {
fullySpecified: false,
},
},
{
test: /\.css$/,
+6 -32
View File
@@ -13,10 +13,7 @@ import {
fetchHassioAddonInfo,
HassioAddonDetails,
} from "../../../src/data/hassio/addon";
import {
createHassioSession,
validateHassioSession,
} from "../../../src/data/hassio/ingress";
import { createHassioSession } from "../../../src/data/hassio/supervisor";
import "../../../src/layouts/hass-loading-screen";
import "../../../src/layouts/hass-subpage";
import { HomeAssistant, Route } from "../../../src/types";
@@ -38,17 +35,6 @@ class HassioIngressView extends LitElement {
@property({ type: Boolean })
public narrow = false;
private _sessionKeepAlive?: number;
public disconnectedCallback() {
super.disconnectedCallback();
if (this._sessionKeepAlive) {
clearInterval(this._sessionKeepAlive);
this._sessionKeepAlive = undefined;
}
}
protected render(): TemplateResult {
if (!this._addon) {
return html` <hass-loading-screen></hass-loading-screen> `;
@@ -97,7 +83,10 @@ class HassioIngressView extends LitElement {
}
private async _fetchData(addonSlug: string) {
const createSessionPromise = createHassioSession(this.hass);
const createSessionPromise = createHassioSession(this.hass).then(
() => true,
() => false
);
let addon;
@@ -130,11 +119,7 @@ class HassioIngressView extends LitElement {
return;
}
let session;
try {
session = await createSessionPromise;
} catch (err) {
if (!(await createSessionPromise)) {
await showAlertDialog(this, {
text: "Unable to create an Ingress session",
title: addon.name,
@@ -143,17 +128,6 @@ class HassioIngressView extends LitElement {
return;
}
if (this._sessionKeepAlive) {
clearInterval(this._sessionKeepAlive);
}
this._sessionKeepAlive = window.setInterval(async () => {
try {
await validateHassioSession(this.hass, session);
} catch (err) {
session = await createHassioSession(this.hass);
}
}, 60000);
this._addon = addon;
}
+2
View File
@@ -105,6 +105,7 @@
"leaflet": "^1.4.0",
"leaflet-draw": "^1.0.4",
"lit-element": "^2.4.0",
"lit-grid-layout": "^1.1.11",
"lit-html": "^1.3.0",
"lit-virtualizer": "^0.4.2",
"marked": "^1.1.1",
@@ -121,6 +122,7 @@
"superstruct": "^0.10.12",
"tinykeys": "^1.1.1",
"unfetch": "^4.1.0",
"uuid": "^8.3.0",
"vue": "^2.6.11",
"vue2-daterange-picker": "^0.5.1",
"web-animations-js": "^2.3.2",
+1
View File
@@ -13,6 +13,7 @@
"src/panels/iframe/ha-panel-iframe.js",
"src/panels/logbook/ha-panel-logbook.js",
"src/panels/map/ha-panel-map.js",
"src/panels/shopping-list/ha-panel-shopping-list.js",
"src/panels/mailbox/ha-panel-mailbox.js",
"hassio/src/entrypoint.js"
],
-26
View File
@@ -1,26 +0,0 @@
import { HomeAssistant } from "../../types";
import { HassioResponse } from "./common";
import { CreateSessionResponse } from "./supervisor";
export const createHassioSession = async (hass: HomeAssistant) => {
const response = await hass.callApi<HassioResponse<CreateSessionResponse>>(
"POST",
"hassio/ingress/session"
);
document.cookie = `ingress_session=${
response.data.session
};path=/api/hassio_ingress/;SameSite=Strict${
location.protocol === "https:" ? ";Secure" : ""
}`;
return response.data.session;
};
export const validateHassioSession = async (
hass: HomeAssistant,
session: string
) =>
await hass.callApi<HassioResponse<null>>(
"POST",
"hassio/ingress/validate_session",
{ session }
);
+12
View File
@@ -111,6 +111,18 @@ export const fetchHassioLogs = async (
return hass.callApi<string>("GET", `hassio/${provider}/logs`);
};
export const createHassioSession = async (hass: HomeAssistant) => {
const response = await hass.callApi<HassioResponse<CreateSessionResponse>>(
"POST",
"hassio/ingress/session"
);
document.cookie = `ingress_session=${
response.data.session
};path=/api/hassio_ingress/;SameSite=Strict${
location.protocol === "https:" ? ";Secure" : ""
}`;
};
export const setSupervisorOption = async (
hass: HomeAssistant,
data: SupervisorOptions
@@ -126,10 +126,9 @@ export class HaConfigAreasDashboard extends LitElement {
></ha-icon-button>
<mwc-fab
slot="fab"
.label=${this.hass.localize(
title="${this.hass.localize(
"ui.panel.config.areas.picker.create_area"
)}
extended
)}"
@click=${this._createArea}
>
<ha-svg-icon slot="icon" .path=${mdiPlus}></ha-svg-icon>
@@ -30,9 +30,6 @@ export const handleChangeEvent = (
ev: CustomEvent
) => {
ev.stopPropagation();
if (ev.detail.isValid === false) {
return;
}
const name = (ev.target as any)?.name;
if (!name) {
return;
@@ -41,27 +41,14 @@ export class HaStateCondition extends LitElement implements ConditionElement {
@value-changed=${this._valueChanged}
allow-custom-value
></ha-entity-attribute-picker>
${Array.isArray(state)
? html`
<ha-yaml-editor
.label=${this.hass.localize(
"ui.panel.config.automation.editor.conditions.type.state.state"
) + " (YAML)"}
.defaultValue=${state}
.name=${"state"}
@value-changed=${this._valueChanged}
></ha-yaml-editor>
`
: html`
<paper-input
.label=${this.hass.localize(
"ui.panel.config.automation.editor.conditions.type.state.state"
)}
.name=${"state"}
.value=${state}
@value-changed=${this._valueChanged}
></paper-input>
`}
<paper-input
.label=${this.hass.localize(
"ui.panel.config.automation.editor.conditions.type.state.state"
)}
.name=${"state"}
.value=${state}
@value-changed=${this._valueChanged}
></paper-input>
`;
}
@@ -472,8 +472,7 @@ export class HaAutomationEditor extends KeyboardShortcutMixin(LitElement) {
<mwc-fab
slot="fab"
class=${classMap({ dirty: this._dirty })}
.label=${this.hass.localize("ui.panel.config.automation.editor.save")}
extended
.title=${this.hass.localize("ui.panel.config.automation.editor.save")}
@click=${this._saveAutomation}
>
<ha-svg-icon slot="icon" .path=${mdiContentSave}></ha-svg-icon>
@@ -176,10 +176,9 @@ class HaAutomationPicker extends LitElement {
</mwc-icon-button>
<mwc-fab
slot="fab"
.label=${this.hass.localize(
title=${this.hass.localize(
"ui.panel.config.automation.picker.add_automation"
)}
extended
@click=${this._createNew}
>
<ha-svg-icon slot="icon" .path=${mdiPlus}></ha-svg-icon>
@@ -85,22 +85,13 @@ class DialogThingtalk extends LitElement {
.opened=${this._opened}
@opened-changed=${this._openedChanged}
>
<h2>
${this.hass.localize(
`ui.panel.config.automation.thingtalk.task_selection.header`
)}
</h2>
<h2>Create a new automation</h2>
<paper-dialog-scrollable>
${this._error ? html` <div class="error">${this._error}</div> ` : ""}
${this.hass.localize(
`ui.panel.config.automation.thingtalk.task_selection.introduction`
)}<br /><br />
${this.hass.localize(
`ui.panel.config.automation.thingtalk.task_selection.language_note`
)}<br /><br />
${this.hass.localize(
`ui.panel.config.automation.thingtalk.task_selection.for_example`
)}
Type below what this automation should do, and we will try to convert
it into a Home Assistant automation. (only English is supported for
now)<br /><br />
For example:
<ul @click=${this._handleExampleClick}>
<li>
<button class="link">
@@ -139,7 +130,7 @@ class DialogThingtalk extends LitElement {
</paper-dialog-scrollable>
<div class="paper-dialog-buttons">
<mwc-button class="left" @click="${this._skip}">
${this.hass.localize(`ui.common.skip`)}
Skip
</mwc-button>
<mwc-button @click="${this._generate}" .disabled=${this._submitting}>
${this._submitting
@@ -149,7 +140,7 @@ class DialogThingtalk extends LitElement {
title="Creating your automation..."
></ha-circular-progress>`
: ""}
${this.hass.localize(`ui.panel.config.automation.thingtalk.create`)}
Create automation
</mwc-button>
</div>
</ha-paper-dialog>
@@ -159,9 +150,7 @@ class DialogThingtalk extends LitElement {
private async _generate() {
this._value = this._input!.value as string;
if (!this._value) {
this._error = this.hass.localize(
`ui.panel.config.automation.thingtalk.task_selection.error_empty`
);
this._error = "Enter a command or tap skip.";
return;
}
this._submitting = true;
@@ -180,9 +169,7 @@ class DialogThingtalk extends LitElement {
this._submitting = false;
if (!Object.keys(config).length) {
this._error = this.hass.localize(
`ui.panel.config.automation.thingtalk.task_selection.error_unsupported`
);
this._error = "We couldn't create an automation for that (yet?).";
} else if (Object.keys(placeholders).length) {
this._config = config;
this._placeholders = placeholders;
@@ -131,11 +131,7 @@ export class ThingTalkPlaceholders extends SubscribeMixin(LitElement) {
.opened=${this.opened}
@opened-changed="${this._openedChanged}"
>
<h2>
${this.hass.localize(
`ui.panel.config.automation.thingtalk.link_devices.header`
)}
</h2>
<h2>Great! Now we need to link some devices.</h2>
<paper-dialog-scrollable>
${this._error ? html` <div class="error">${this._error}</div> ` : ""}
${Object.entries(this.placeholders).map(
@@ -172,9 +168,8 @@ export class ThingTalkPlaceholders extends SubscribeMixin(LitElement) {
${extraInfo && extraInfo.manualEntity
? html`
<h3>
${this.hass.localize(
`ui.panel.config.automation.thingtalk.link_devices.ambiguous_entities`
)}
One or more devices have more than one matching
entity, please pick the one you want to use.
</h3>
${Object.keys(extraInfo.manualEntity).map(
(idx) => html`
@@ -231,9 +226,7 @@ export class ThingTalkPlaceholders extends SubscribeMixin(LitElement) {
}
return html`
<div class="error">
${this.hass.localize(
`ui.panel.config.automation.thingtalk.link_devices.unknown_placeholder`
)}<br />
Unknown placeholder<br />
${placeholder.domains}<br />
${placeholder.fields.map(
(field) => html` ${field}<br /> `
@@ -246,10 +239,10 @@ export class ThingTalkPlaceholders extends SubscribeMixin(LitElement) {
</paper-dialog-scrollable>
<div class="paper-dialog-buttons">
<mwc-button class="left" @click="${this.skip}">
${this.hass.localize(`ui.common.skip`)}
Skip
</mwc-button>
<mwc-button @click="${this._done}" .disabled=${!this._isDone}>
${this.hass.localize(`ui.panel.config.automation.thingtalk.create`)}
Create automation
</mwc-button>
</div>
</ha-paper-dialog>
@@ -160,10 +160,9 @@ export class HaConfigHelpers extends LitElement {
>
<mwc-fab
slot="fab"
.label=${this.hass.localize(
title="${this.hass.localize(
"ui.panel.config.helpers.picker.add_helper"
)}
extended
)}"
@click=${this._createHelpler}
>
<ha-svg-icon slot="icon" .path=${mdiPlus}></ha-svg-icon>
@@ -475,10 +475,8 @@ class HaConfigIntegrations extends SubscribeMixin(LitElement) {
</div>
<mwc-fab
slot="fab"
.label=${this.hass.localize(
"ui.panel.config.integrations.add_integration"
)}
extended
aria-label=${this.hass.localize("ui.panel.config.integrations.new")}
title=${this.hass.localize("ui.panel.config.integrations.new")}
@click=${this._createFlow}
>
<ha-svg-icon slot="icon" .path=${mdiPlus}></ha-svg-icon>
@@ -84,8 +84,7 @@ class ZHAConfigDashboard extends LitElement {
</ha-card>
<a href="/config/zha/add" slot="fab">
<mwc-fab
.label=${this.hass.localize("ui.panel.config.zha.add_device")}
extended
title=${this.hass.localize("ui.panel.config.zha.add_device")}
?rtl=${computeRTL(this.hass)}
>
<ha-svg-icon slot="icon" .path=${mdiPlus}></ha-svg-icon>
@@ -128,10 +128,7 @@ export class ZHAGroupsDashboard extends LitElement {
>
<a href="/config/zha/group-add" slot="fab">
<mwc-fab
.label=${this.hass!.localize(
"ui.panel.config.zha.groups.add_group"
)}
extended
title=${this.hass!.localize("ui.panel.config.zha.groups.add_group")}
>
<ha-svg-icon slot="icon" .path=${mdiPlus}></ha-svg-icon>
</mwc-fab>
@@ -225,10 +225,9 @@ export class HaConfigLovelaceDashboards extends LitElement {
>
<mwc-fab
slot="fab"
.label=${this.hass.localize(
title="${this.hass.localize(
"ui.panel.config.lovelace.dashboards.picker.add_dashboard"
)}
extended
)}"
@click=${this._addDashboard}
>
<ha-svg-icon slot="icon" .path=${mdiPlus}></ha-svg-icon>
@@ -105,10 +105,9 @@ export class HaConfigLovelaceRescources extends LitElement {
>
<mwc-fab
slot="fab"
.label=${this.hass.localize(
title=${this.hass.localize(
"ui.panel.config.lovelace.resources.picker.add_resource"
)}
extended
@click=${this._addResource}
>
<ha-svg-icon slot="icon" .path=${mdiPlus}></ha-svg-icon>
+1 -2
View File
@@ -148,8 +148,7 @@ class HaConfigPerson extends LitElement {
</ha-config-section>
<mwc-fab
slot="fab"
.label=${hass.localize("ui.panel.config.person.add_person")}
extended
title="${hass.localize("ui.panel.config.person.add_person")}"
@click=${this._createPerson}
>
<ha-svg-icon slot="icon" .path=${mdiPlus}></ha-svg-icon>
@@ -153,10 +153,9 @@ class HaSceneDashboard extends LitElement {
</mwc-icon-button>
<a href="/config/scene/edit/new" slot="fab">
<mwc-fab
.label=${this.hass.localize(
title=${this.hass.localize(
"ui.panel.config.scene.picker.add_scene"
)}
extended
>
<ha-svg-icon slot="icon" .path=${mdiPlus}></ha-svg-icon>
</mwc-fab>
+1 -2
View File
@@ -405,8 +405,7 @@ export class HaSceneEditor extends SubscribeMixin(
</div>
<mwc-fab
slot="fab"
.label=${this.hass.localize("ui.panel.config.scene.editor.save")}
extended
.title=${this.hass.localize("ui.panel.config.scene.editor.save")}
@click=${this._saveScene}
class=${classMap({ dirty: this._dirty })}
>
+1 -2
View File
@@ -367,10 +367,9 @@ export class HaScriptEditor extends KeyboardShortcutMixin(LitElement) {
</div>
<mwc-fab
slot="fab"
.label=${this.hass.localize(
.title=${this.hass.localize(
"ui.panel.config.script.editor.save_script"
)}
extended
@click=${this._saveScript}
class=${classMap({
dirty: this._dirty,
+3 -4
View File
@@ -149,10 +149,9 @@ class HaScriptPicker extends LitElement {
<mwc-fab
?is-wide=${this.isWide}
?narrow=${this.narrow}
.label=${this.hass.localize(
"ui.panel.config.script.picker.add_script"
)}
extended
title="${this.hass.localize(
"ui.panel.config.script.picker.create_new_script"
)}"
?rtl=${computeRTL(this.hass)}
>
<ha-svg-icon slot="icon" .path=${mdiPlus}></ha-svg-icon>
+1 -1
View File
@@ -231,7 +231,7 @@ class DialogTagDetail extends LitElement
private async _generateQR() {
const qrcode = await import("qrcode");
const canvas = await qrcode.toCanvas(
`https://www.home-assistant.io/tag/${this._params!.entry!.id}`,
`https://home-assistant.io/tag/${this._params?.entry?.id}`,
{
width: 180,
errorCorrectionLevel: "Q",
+1 -2
View File
@@ -209,8 +209,7 @@ export class HaConfigTags extends SubscribeMixin(LitElement) {
</mwc-icon-button>
<mwc-fab
slot="fab"
.label=${this.hass.localize("ui.panel.config.tags.add_tag")}
extended
title=${this.hass.localize("ui.panel.config.tags.add_tag")}
@click=${this._addTag}
>
<ha-svg-icon slot="icon" .path=${mdiPlus}></ha-svg-icon>
+1 -2
View File
@@ -100,8 +100,7 @@ export class HaConfigUsers extends LitElement {
>
<mwc-fab
slot="fab"
.label=${this.hass.localize("ui.panel.config.users.picker.add_user")}
extended
.title=${this.hass.localize("ui.panel.config.users.picker.add_user")}
@click=${this._addUser}
>
<ha-svg-icon slot="icon" .path=${mdiPlus}></ha-svg-icon>
+1 -2
View File
@@ -257,8 +257,7 @@ export class HaConfigZone extends SubscribeMixin(LitElement) {
: ""}
<mwc-fab
slot="fab"
.label=${hass.localize("ui.panel.config.zone.add_zone")}
extended
title=${hass.localize("ui.panel.config.zone.add_zone")}
@click=${this._createZone}
>
<ha-svg-icon slot="icon" .path=${mdiPlus}></ha-svg-icon>
@@ -42,9 +42,6 @@ class HaPanelDevState extends EventsMixin(LocalizeMixin(PolymerElement)) {
.entities th {
text-align: left;
font-size: var(
--paper-input-container-shared-input-style_-_font-size
);
}
:host([rtl]) .entities th {
@@ -65,7 +62,7 @@ class HaPanelDevState extends EventsMixin(LocalizeMixin(PolymerElement)) {
}
.entities td {
padding: 4px;
min-width: 220px;
min-width: 200px;
word-break: break-word;
}
.entities ha-svg-icon {
@@ -171,13 +168,7 @@ class HaPanelDevState extends EventsMixin(LocalizeMixin(PolymerElement)) {
></ha-svg-icon>
<a href="#" on-click="entitySelected">[[entity.entity_id]]</a>
</td>
<td>
[[entity.state]]<br /><br />
<span class="secondary">
last_changed: [[lastChangedString(entity)]]<br />
last_updated: [[lastUpdatedString(entity)]]
</span>
</td>
<td>[[entity.state]]</td>
<template
is="dom-if"
if="[[computeShowAttributes(narrow, _showAttributes)]]"
@@ -390,14 +381,6 @@ class HaPanelDevState extends EventsMixin(LocalizeMixin(PolymerElement)) {
return output;
}
lastChangedString(entity) {
return new Date(entity.last_changed).toISOString();
}
lastUpdatedString(entity) {
return new Date(entity.last_updated).toISOString();
}
formatAttributeValue(value) {
if (
(Array.isArray(value) && value.some((val) => val instanceof Object)) ||
@@ -9,6 +9,7 @@ const ALWAYS_LOADED_LAYOUTS = new Set(["masonry"]);
const LAZY_LOAD_LAYOUTS = {
panel: () => import("../views/hui-panel-view"),
grid: () => import("../views/hui-grid-view"),
};
export const createViewElement = (
@@ -13,6 +13,7 @@ import {
TemplateResult,
} from "lit-element";
import {
any,
array,
assert,
boolean,
@@ -62,6 +63,7 @@ const cardConfigStruct = object({
theme: optional(string()),
show_header_toggle: optional(boolean()),
state_color: optional(boolean()),
layout: optional(any()),
entities: array(entitiesConfigStruct),
header: optional(headerFooterConfigStructs),
footer: optional(headerFooterConfigStructs),
@@ -110,7 +110,6 @@ export class HuiUnusedEntities extends LitElement {
>
<mwc-fab
.label=${this.hass.localize("ui.panel.lovelace.editor.edit_card.add")}
extended
@click=${this._addToLovelaceView}
>
<ha-svg-icon slot="icon" .path=${mdiPlus}></ha-svg-icon>
+1
View File
@@ -36,6 +36,7 @@ export interface LovelaceCard extends HTMLElement {
hass?: HomeAssistant;
isPanel?: boolean;
editMode?: boolean;
layout?: any;
getCardSize(): number | Promise<number>;
setConfig(config: LovelaceCardConfig): void;
}
@@ -0,0 +1,3 @@
// hui-grid-view dependencies for when in edit mode.
import "@material/mwc-fab";
import "./hui-grid-card-options";
@@ -0,0 +1,195 @@
import "@material/mwc-icon-button";
import {
mdiContentDuplicate,
mdiDelete,
mdiDotsVertical,
mdiPencil,
} from "@mdi/js";
import {
css,
CSSResult,
customElement,
LitElement,
property,
queryAssignedNodes,
} from "lit-element";
import { html, TemplateResult } from "lit-html";
import "../../../../components/ha-svg-icon";
import { HomeAssistant } from "../../../../types";
import { computeCardSize } from "../../common/compute-card-size";
import { showEditCardDialog } from "../../editor/card-editor/show-edit-card-dialog";
import { confDeleteCard } from "../../editor/delete-card";
import { Lovelace, LovelaceCard } from "../../types";
@customElement("hui-grid-card-options")
export class HuiGridCardOptions extends LitElement {
@property({ attribute: false }) public hass?: HomeAssistant;
@property({ attribute: false }) public lovelace?: Lovelace;
@property({ type: Array }) public path?: [number, number];
@queryAssignedNodes() private _assignedNodes?: NodeListOf<LovelaceCard>;
public getCardSize() {
return this._assignedNodes ? computeCardSize(this._assignedNodes[0]) : 1;
}
protected render(): TemplateResult {
return html`
<slot></slot>
<div class="parent-card-actions">
<div class="overlay"></div>
<div class="card-actions">
<mwc-icon-button
.title=${this.hass!.localize(
"ui.panel.lovelace.editor.edit_card.edit"
)}
@click=${this._editCard}
>
<ha-svg-icon .path=${mdiPencil}></ha-svg-icon>
</mwc-icon-button>
<mwc-icon-button
.title=${this.hass!.localize(
"ui.panel.lovelace.editor.edit_card.duplicate"
)}
@click=${this._duplicateCard}
>
<ha-svg-icon .path=${mdiContentDuplicate}></ha-svg-icon>
</mwc-icon-button>
<mwc-icon-button
.title=${this.hass!.localize(
"ui.panel.lovelace.editor.edit_card.delete"
)}
@click=${this._deleteCard}
>
<ha-svg-icon .path=${mdiDelete}></ha-svg-icon>
</mwc-icon-button>
<div>
<ha-button-menu corner="BOTTOM_START">
<mwc-icon-button
slot="trigger"
aria-label=${this.hass!.localize(
"ui.panel.lovelace.editor.edit_card.options"
)}
.title=${this.hass!.localize(
"ui.panel.lovelace.editor.edit_card.options"
)}
>
<ha-svg-icon .path=${mdiDotsVertical}></ha-svg-icon>
</mwc-icon-button>
<mwc-list-item>
${this.hass!.localize(
"ui.panel.lovelace.editor.edit_card.move"
)}
</mwc-list-item>
</ha-button-menu>
</div>
</div>
</div>
`;
}
static get styles(): CSSResult {
return css`
slot {
pointer-events: none;
z-index: 0;
}
.overlay {
transition: all 0.25s;
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 1;
opacity: 0;
cursor: move;
}
.parent-card-actions:hover .overlay {
outline: 2px solid var(--primary-color);
background: rgba(0, 0, 0, 0.3);
/* background-color: grey; */
opacity: 1;
}
.parent-card-actions {
transition: all 0.25s;
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
opacity: 0;
}
.parent-card-actions:hover {
opacity: 1;
}
.card-actions {
display: flex;
flex-wrap: wrap;
justify-content: center;
align-items: center;
z-index: 2;
position: absolute;
left: 0;
right: 0;
bottom: 24px;
color: white;
}
.card-actions > * {
margin: 0 4px;
border-radius: 24px;
background: rgba(0, 0, 0, 0.7);
}
mwc-list-item {
cursor: pointer;
white-space: nowrap;
}
mwc-list-item.delete-item {
color: var(--error-color);
}
.drag-handle {
cursor: move;
}
`;
}
private _duplicateCard(): void {
const path = this.path!;
const cardConfig = this.lovelace!.config.views[path[0]].cards![path[1]];
showEditCardDialog(this, {
lovelaceConfig: this.lovelace!.config,
cardConfig,
saveConfig: this.lovelace!.saveConfig,
path: [path[0]],
});
}
private _editCard(): void {
showEditCardDialog(this, {
lovelaceConfig: this.lovelace!.config,
saveConfig: this.lovelace!.saveConfig,
path: this.path!,
});
}
private _deleteCard(): void {
confDeleteCard(this, this.hass!, this.lovelace!, this.path!);
}
}
declare global {
interface HTMLElementTagNameMap {
"hui-grid-card-options": HuiGridCardOptions;
}
}
+363
View File
@@ -0,0 +1,363 @@
import "@material/mwc-fab/mwc-fab";
import { mdiPlus, mdiResizeBottomRight } from "@mdi/js";
import {
css,
CSSResult,
customElement,
html,
internalProperty,
LitElement,
property,
PropertyValues,
TemplateResult,
} from "lit-element";
import "lit-grid-layout";
import { classMap } from "lit-html/directives/class-map";
import { v4 as uuidv4 } from "uuid";
import { computeRTL } from "../../../common/util/compute_rtl";
import { nextRender } from "../../../common/util/render-status";
import "../../../components/entity/ha-state-label-badge";
import "../../../components/ha-svg-icon";
import type {
LovelaceViewConfig,
LovelaceViewElement,
} from "../../../data/lovelace";
import type { HomeAssistant } from "../../../types";
import { computeCardSize } from "../common/compute-card-size";
import { HuiCardOptions } from "../components/hui-card-options";
import { showCreateCardDialog } from "../editor/card-editor/show-create-card-dialog";
import { replaceView } from "../editor/config-util";
import type { Lovelace, LovelaceBadge, LovelaceCard } from "../types";
import { HuiGridCardOptions } from "./grid/hui-grid-card-options";
let editCodeLoaded = false;
const mediaQueryColumns = [2, 6, 9, 12];
interface LovelaceGridCard extends LovelaceCard, HuiGridCardOptions {
key: string;
grid?: {
key: string;
width: number;
height: number;
posX: number;
posY: number;
};
}
const RESIZE_HANDLE = document.createElement("div") as HTMLElement;
RESIZE_HANDLE.style.cssText =
"width: 100%; height: 100%; cursor: se-resize; fill: var(--primary-text-color)";
RESIZE_HANDLE.innerHTML = `
<svg
viewBox="0 0 24 24"
preserveAspectRatio="xMidYMid meet"
focusable="false"
>
<g><path d=${mdiResizeBottomRight}></path></g>
</svg>
`;
@customElement("hui-grid-view")
export class GridView extends LitElement implements LovelaceViewElement {
@property({ attribute: false }) public hass!: HomeAssistant;
@property({ attribute: false }) public lovelace?: Lovelace;
@property({ type: Number }) public index?: number;
@property({ attribute: false }) public cards: Array<LovelaceGridCard> = [];
@property({ attribute: false }) public badges: LovelaceBadge[] = [];
@internalProperty() private _columns?: number;
@internalProperty() private _layout?: Array<{
width: number;
height: number;
posX: number;
posY: number;
key: string;
}>;
@internalProperty() public _cards: {
[key: string]: LovelaceCard | HuiCardOptions;
} = {};
private _config?: LovelaceViewConfig;
private _createColumnsIteration = 0;
private _mqls?: MediaQueryList[];
public constructor() {
super();
this.addEventListener("iron-resize", (ev: Event) => ev.stopPropagation());
}
public setConfig(config: LovelaceViewConfig): void {
this._config = config;
}
protected render(): TemplateResult {
return html`
<div
id="badges"
style=${this.badges.length > 0 ? "display: block" : "display: none"}
>
${this.badges.map((badge) => html`${badge}`)}
</div>
<lit-grid-layout
rowHeight="15"
.resizeHandle=${RESIZE_HANDLE}
.itemRenderer=${this._itemRenderer}
.layout=${this._layout}
.columns=${this._columns}
.dragDisabled=${!this.lovelace?.editMode}
.resizeDisabled=${!this.lovelace?.editMode}
@item-changed=${this._saveLayout}
></lit-grid-layout>
${this.lovelace?.editMode
? html`
<mwc-fab
class=${classMap({
rtl: computeRTL(this.hass!),
})}
.title=${this.hass!.localize(
"ui.panel.lovelace.editor.edit_card.add"
)}
@click=${this._addCard}
>
<ha-svg-icon slot="icon" .path=${mdiPlus}></ha-svg-icon>
</mwc-fab>
`
: ""}
`;
}
protected firstUpdated(): void {
this._updateColumns = this._updateColumns.bind(this);
this._mqls = [300, 600, 900, 1200].map((width) => {
const mql = matchMedia(`(min-width: ${width}px)`);
mql.addEventListener("change", this._updateColumns);
return mql;
});
this._updateColumns();
}
protected updated(changedProperties: PropertyValues): void {
super.updated(changedProperties);
if (this.lovelace?.editMode && !editCodeLoaded) {
editCodeLoaded = true;
import(
/* webpackChunkName: "grid-view-editable" */ "./grid/grid-view-editable"
);
}
if (changedProperties.has("hass")) {
const oldHass = changedProperties.get("hass") as HomeAssistant;
if (
(oldHass && this.hass!.dockedSidebar !== oldHass.dockedSidebar) ||
(!oldHass && this.hass)
) {
this._updateColumns();
}
if (changedProperties.size === 1) {
return;
}
}
const oldLovelace = changedProperties.get("lovelace") as
| Lovelace
| undefined;
if (
(changedProperties.has("lovelace") &&
(oldLovelace?.config !== this.lovelace?.config ||
oldLovelace?.editMode !== this.lovelace?.editMode)) ||
changedProperties.has("_columns")
) {
this._createLayout();
this._createCards();
}
}
private async _saveLayout(ev: CustomEvent): Promise<void> {
console.log("save");
const viewConf: LovelaceViewConfig = {
...this._config,
layout: ev.detail.layout,
};
await this.lovelace?.saveConfig(
replaceView(this.lovelace!.config, this.index, viewConf)
);
}
private _itemRenderer = (key: string): TemplateResult => {
if (!this._cards) {
return html``;
}
return html`${this._cards[key]}`;
};
private _addCard(): void {
showCreateCardDialog(this, {
lovelaceConfig: this.lovelace!.config,
saveConfig: this.lovelace!.saveConfig,
path: [this.index!],
});
}
private async _createLayout() {
this._createColumnsIteration++;
const iteration = this._createColumnsIteration;
if (this._layout?.length) {
return;
}
const newLayout: Array<{
width: number;
height: number;
posX: number;
posY: number;
key: string;
minHeight: number;
}> = [];
let tillNextRender: Promise<unknown> | undefined;
let start: Date | undefined;
// Calculate the size of every card and determine in what column it should go
for (const [index, card] of this.cards.entries()) {
const cardConfig = this._config!.cards![index];
if (tillNextRender === undefined) {
// eslint-disable-next-line no-loop-func
tillNextRender = nextRender().then(() => {
tillNextRender = undefined;
start = undefined;
});
}
let waitProm: Promise<unknown> | undefined;
// We should work for max 16ms (60fps) before allowing a frame to render
if (start === undefined) {
// Save the time we start for this frame, no need to wait yet
start = new Date();
} else if (new Date().getTime() - start.getTime() > 16) {
// We are working too long, we will prevent a render, wait to allow for a render
waitProm = tillNextRender;
}
const cardSizeProm = computeCardSize(card);
// @ts-ignore
// eslint-disable-next-line no-await-in-loop
const [cardSize] = await Promise.all([cardSizeProm, waitProm]);
if (iteration !== this._createColumnsIteration) {
// An other create columns is started, abort this one
return;
}
const layout = {
width: 3,
height: cardSize,
key: uuidv4(),
minHeight: 4,
...cardConfig.layout,
};
newLayout.push(layout);
}
this._layout = newLayout;
this._createCards();
}
private _createCards(): void {
const elements = {};
this.cards.forEach((card: LovelaceGridCard, index) => {
const layout = this._layout![index];
card.editMode = this.lovelace?.editMode;
let element = card;
if (this.lovelace?.editMode) {
const wrapper = document.createElement(
"hui-grid-card-options"
) as LovelaceGridCard;
wrapper.hass = this.hass;
wrapper.lovelace = this.lovelace;
wrapper.path = [this.index!, index];
wrapper.appendChild(card);
element = wrapper;
}
elements[layout.key] = element;
});
this._cards = elements;
}
private _updateColumns() {
if (!this._mqls) {
return;
}
const matchColumns = this._mqls!.reduce(
(cols, mql) => cols + Number(mql.matches),
0
);
// Do -1 column if the menu is docked and open
this._columns = Math.max(1, mediaQueryColumns[matchColumns - 1]);
}
static get styles(): CSSResult {
return css`
:host {
display: block;
box-sizing: border-box;
padding: 4px 4px env(safe-area-inset-bottom);
transform: translateZ(0);
position: relative;
color: var(--primary-text-color);
background: var(--lovelace-background, var(--primary-background-color));
}
lit-grid-layout {
--placeholder-background-color: var(--accent-color);
--resize-handle-size: 32px;
}
#badges {
margin: 8px 16px;
font-size: 85%;
text-align: center;
}
mwc-fab {
position: sticky;
float: right;
right: calc(16px + env(safe-area-inset-right));
bottom: calc(16px + env(safe-area-inset-bottom));
z-index: 5;
}
mwc-fab.rtl {
float: left;
right: auto;
left: calc(16px + env(safe-area-inset-left));
}
`;
}
}
declare global {
interface HTMLElementTagNameMap {
"hui-grid-view": GridView;
}
}
@@ -84,10 +84,9 @@ export class MasonryView extends LitElement implements LovelaceViewElement {
${this.lovelace?.editMode
? html`
<mwc-fab
.label=${this.hass!.localize(
title=${this.hass!.localize(
"ui.panel.lovelace.editor.edit_card.add"
)}
extended
@click=${this._addCard}
class=${classMap({
rtl: computeRTL(this.hass!),
@@ -115,7 +114,7 @@ export class MasonryView extends LitElement implements LovelaceViewElement {
if (this.lovelace?.editMode && !editCodeLoaded) {
editCodeLoaded = true;
import(
/* webpackChunkName: "default-layout-editable" */ "./default-view-editable"
/* webpackChunkName: "default-view-editable" */ "./default-view-editable"
);
}
+1 -2
View File
@@ -78,10 +78,9 @@ export class PanelView extends LitElement implements LovelaceViewElement {
${this.lovelace?.editMode && this.cards.length === 0
? html`
<mwc-fab
.label=${this.hass!.localize(
title=${this.hass!.localize(
"ui.panel.lovelace.editor.edit_card.add"
)}
extended
@click=${this._addCard}
class=${classMap({
rtl: computeRTL(this.hass!),
@@ -0,0 +1,245 @@
import "../../layouts/ha-app-layout";
import "@polymer/app-layout/app-header/app-header";
import "@polymer/app-layout/app-toolbar/app-toolbar";
import "@polymer/paper-checkbox/paper-checkbox";
import "../../components/ha-icon-button";
import "@polymer/paper-input/paper-input";
import "@polymer/paper-item/paper-icon-item";
import "@polymer/paper-item/paper-item";
import "@polymer/paper-item/paper-item-body";
import "@polymer/paper-listbox/paper-listbox";
import "@material/mwc-list/mwc-list-item";
import "../../components/ha-button-menu";
import { html } from "@polymer/polymer/lib/utils/html-tag";
/* eslint-plugin-disable lit */
import { PolymerElement } from "@polymer/polymer/polymer-element";
import { isComponentLoaded } from "../../common/config/is_component_loaded";
import "../../components/ha-card";
import "../../components/ha-menu-button";
import { showVoiceCommandDialog } from "../../dialogs/voice-command-dialog/show-ha-voice-command-dialog";
import LocalizeMixin from "../../mixins/localize-mixin";
import "../../styles/polymer-ha-style";
import { mdiDotsVertical } from "@mdi/js";
/*
* @appliesMixin LocalizeMixin
*/
class HaPanelShoppingList extends LocalizeMixin(PolymerElement) {
static get template() {
return html`
<style include="ha-style">
:host {
height: 100%;
}
app-toolbar paper-listbox {
width: 150px;
}
app-toolbar paper-item {
cursor: pointer;
}
.content {
padding-bottom: 32px;
max-width: 600px;
margin: 0 auto;
}
paper-icon-item {
border-top: 1px solid var(--divider-color);
}
paper-icon-item:first-child {
border-top: 0;
}
paper-checkbox {
padding: 11px;
}
paper-input {
--paper-input-container-underline: {
display: none;
}
--paper-input-container-underline-focus: {
display: none;
}
position: relative;
top: 1px;
}
.tip {
padding: 24px;
text-align: center;
color: var(--secondary-text-color);
}
</style>
<ha-app-layout>
<app-header slot="header" fixed>
<app-toolbar>
<ha-menu-button
hass="[[hass]]"
narrow="[[narrow]]"
></ha-menu-button>
<div main-title>[[localize('panel.shopping_list')]]</div>
<ha-icon-button
hidden$="[[!conversation]]"
aria-label="Start conversation"
icon="hass:microphone"
on-click="_showVoiceCommandDialog"
></ha-icon-button>
<ha-button-menu corner="BOTTOM_START" on-action="_clearCompleted">
<ha-icon-button
icon="hass:dots-vertical"
label="Menu"
slot="trigger"
>
</ha-icon-button>
<mwc-list-item>
[[localize('ui.panel.shopping-list.clear_completed')]]
</mwc-list-item>
</ha-button-menu>
</app-toolbar>
</app-header>
<div class="content">
<ha-card>
<paper-icon-item on-focus="_focusRowInput">
<ha-icon-button
slot="item-icon"
icon="hass:plus"
on-click="_addItem"
></ha-icon-button>
<paper-item-body>
<paper-input
id="addBox"
placeholder="[[localize('ui.panel.shopping-list.add_item')]]"
on-keydown="_addKeyPress"
no-label-float
></paper-input>
</paper-item-body>
</paper-icon-item>
<template is="dom-repeat" items="[[items]]">
<paper-icon-item>
<paper-checkbox
slot="item-icon"
checked="{{item.complete}}"
on-click="_itemCompleteTapped"
tabindex="0"
></paper-checkbox>
<paper-item-body>
<paper-input
id="editBox"
no-label-float
value="[[item.name]]"
on-change="_saveEdit"
></paper-input>
</paper-item-body>
</paper-icon-item>
</template>
</ha-card>
<div class="tip" hidden$="[[!conversation]]">
[[localize('ui.panel.shopping-list.microphone_tip')]]
</div>
</div>
</ha-app-layout>
`;
}
static get properties() {
return {
hass: Object,
narrow: Boolean,
conversation: {
type: Boolean,
computed: "_computeConversation(hass)",
},
items: {
type: Array,
value: [],
},
};
}
connectedCallback() {
super.connectedCallback();
this._fetchData = this._fetchData.bind(this);
this.hass.connection
.subscribeEvents(this._fetchData, "shopping_list_updated")
.then(
function (unsub) {
this._unsubEvents = unsub;
}.bind(this)
);
this._fetchData();
}
disconnectedCallback() {
super.disconnectedCallback();
if (this._unsubEvents) this._unsubEvents();
}
_fetchData() {
this.hass.callApi("get", "shopping_list").then(
function (items) {
items.reverse();
this.items = items;
}.bind(this)
);
}
_itemCompleteTapped(ev) {
ev.stopPropagation();
this.hass
.callApi("post", "shopping_list/item/" + ev.model.item.id, {
complete: ev.target.checked,
})
.catch(() => this._fetchData());
}
_addItem(ev) {
this.hass
.callApi("post", "shopping_list/item", {
name: this.$.addBox.value,
})
.catch(() => this._fetchData());
this.$.addBox.value = "";
// Presence of 'ev' means tap on "add" button.
if (ev) {
setTimeout(() => this.$.addBox.focus(), 10);
}
}
_addKeyPress(ev) {
if (ev.keyCode === 13) {
this._addItem();
}
}
_computeConversation(hass) {
return isComponentLoaded(hass, "conversation");
}
_showVoiceCommandDialog() {
showVoiceCommandDialog(this);
}
_saveEdit(ev) {
const { index, item } = ev.model;
const name = ev.target.value;
if (name === item.name) {
return;
}
this.set(["items", index, "name"], name);
this.hass
.callApi("post", "shopping_list/item/" + item.id, {
name: name,
})
.catch(() => this._fetchData());
}
_clearCompleted() {
this.hass.callApi("POST", "shopping_list/clear_completed");
}
}
customElements.define("ha-panel-shopping-list", HaPanelShoppingList);
@@ -1,130 +0,0 @@
import "@polymer/app-layout/app-header/app-header";
import "@polymer/app-layout/app-toolbar/app-toolbar";
import {
css,
CSSResultArray,
customElement,
html,
internalProperty,
LitElement,
property,
PropertyValues,
TemplateResult,
} from "lit-element";
import memoizeOne from "memoize-one";
import { mdiMicrophone } from "@mdi/js";
import { HomeAssistant } from "../../types";
import { haStyle } from "../../resources/styles";
import { createCardElement } from "../lovelace/create-element/create-card-element";
import { LovelaceCard } from "../lovelace/types";
import { HuiErrorCard } from "../lovelace/cards/hui-error-card";
import { isComponentLoaded } from "../../common/config/is_component_loaded";
import { showVoiceCommandDialog } from "../../dialogs/voice-command-dialog/show-ha-voice-command-dialog";
import "../../components/ha-menu-button";
import "../../layouts/ha-app-layout";
@customElement("ha-panel-shopping-list")
class PanelShoppingList extends LitElement {
@property({ attribute: false }) public hass!: HomeAssistant;
@property({ type: Boolean, reflect: true }) public narrow!: boolean;
@internalProperty() private _card!: LovelaceCard | HuiErrorCard;
private _conversation = memoizeOne((_components) =>
isComponentLoaded(this.hass, "conversation")
);
protected firstUpdated(changedProperties: PropertyValues): void {
super.firstUpdated(changedProperties);
this._card = createCardElement({ type: "shopping-list" }) as LovelaceCard;
this._card.hass = this.hass;
}
protected updated(changedProperties: PropertyValues): void {
super.updated(changedProperties);
if (changedProperties.has("hass")) {
this._card.hass = this.hass;
}
}
protected render(): TemplateResult {
return html`
<ha-app-layout>
<app-header fixed slot="header">
<app-toolbar>
<ha-menu-button
.hass=${this.hass}
.narrow=${this.narrow}
></ha-menu-button>
<div main-title>${this.hass.localize("panel.shopping_list")}</div>
${this._conversation(this.hass.config.components)
? html`
<mwc-icon-button
.label=${this.hass!.localize(
"ui.panel.shopping_list.start_conversation"
)}
@click=${this._showVoiceCommandDialog}
>
<ha-svg-icon .path=${mdiMicrophone}></ha-svg-icon>
</mwc-icon-button>
`
: ""}
</app-toolbar>
</app-header>
<div id="columns">
<div class="column">
${this._card}
</div>
</div>
</ha-app-layout>
`;
}
private _showVoiceCommandDialog(): void {
showVoiceCommandDialog(this);
}
static get styles(): CSSResultArray {
return [
haStyle,
css`
:host {
--mdc-theme-primary: var(--app-header-text-color);
display: block;
height: 100%;
}
:host([narrow]) app-toolbar mwc-button {
width: 65px;
}
.heading {
overflow: hidden;
white-space: nowrap;
margin-top: 4px;
}
#columns {
display: flex;
flex-direction: row;
justify-content: center;
margin-left: 4px;
margin-right: 4px;
}
.column {
flex: 1 0 0;
max-width: 500px;
min-width: 0;
}
`,
];
}
}
declare global {
interface HTMLElementTagNameMap {
"ha-panel-shopping-list": PanelShoppingList;
}
}
+1 -7
View File
@@ -221,15 +221,9 @@ export default <T extends Constructor<HassBaseEl>>(superClass: T) =>
// loaded resources. This merges the new data on top of the old data for
// this language, so that the full translation set can be loaded across
// multiple fragments.
//
// Beware of a subtle race condition: it is possible to get here twice
// before this.hass is even created. In this case our base state comes
// from this._pendingHass instead. Otherwise the first set of strings is
// overwritten when we call _updateHass the second time!
const baseHass = this.hass ?? this._pendingHass;
const resources = {
[language]: {
...baseHass?.resources?.[language],
...this.hass?.resources?.[language],
...data,
},
};
+7 -23
View File
@@ -7,7 +7,7 @@
"logbook": "Logbook",
"history": "History",
"mailbox": "Mailbox",
"shopping_list": "Shopping List",
"shopping_list": "Shopping list",
"developer_tools": "Developer Tools",
"media_browser": "Media Browser",
"profile": "Profile"
@@ -275,7 +275,6 @@
"save": "Save",
"yes": "Yes",
"no": "No",
"skip": "Skip",
"menu": "Menu",
"overflow_menu": "Overflow menu",
"successfully_saved": "Successfully saved",
@@ -518,7 +517,6 @@
"edit": "Edit entity",
"details": "Details",
"history": "History",
"last_changed": "Last changed",
"last_updated": "Last updated",
"last_changed": "Last changed",
"script": {
@@ -1121,7 +1119,7 @@
"event_data": "Event data",
"context_users": "Limit to events triggered by",
"context_user_picked": "User firing event",
"context_user_pick": "Select user"
"context_user_pick": "Add user"
},
"geo_location": {
"label": "Geolocation",
@@ -1349,22 +1347,6 @@
}
}
}
},
"thingtalk": {
"create": "Create automation",
"task_selection": {
"header": "Create a new automation",
"introduction": "Type below what this automation should do, and we will try to convert it into a Home Assistant automation.",
"language_note": "Note: Only English is supported for now.",
"for_example": "For example:",
"error_empty": "Enter a command or tap skip.",
"error_unsupported": "We couldn't create an automation for that (yet?)."
},
"link_devices": {
"header": "Great! Now we need to link some devices",
"ambiguous_entities": "One or more devices have more than one matching entity, please pick the one you want to use.",
"unknown_placeholder": "Unknown placeholder"
}
}
},
"script": {
@@ -1375,7 +1357,7 @@
"introduction": "The script editor allows you to create and edit scripts. Please follow the link below to read the instructions to make sure that you have configured Home Assistant correctly.",
"learn_more": "Learn more about scripts",
"no_scripts": "We couldnt find any editable scripts",
"add_script": "Add script",
"add_script": "Create new script",
"show_info": "Show info about script",
"trigger_script": "Trigger script",
"run_script": "Run script",
@@ -2790,8 +2772,10 @@
"empty_state": "You have no long-lived access tokens yet."
}
},
"shopping_list": {
"start_conversation": "Start conversation"
"shopping-list": {
"clear_completed": "Clear completed",
"add_item": "Add item",
"microphone_tip": "Tap the microphone on the top right and say or type “Add candy to my shopping list”"
},
"page-authorize": {
"initializing": "Initializing",
+4 -4
View File
@@ -1,5 +1,5 @@
import * as assert from "assert";
import { createHassioSession } from "../../src/data/hassio/ingress";
import { createHassioSession } from "../../src/data/hassio/supervisor";
const sessionID = "fhdsu73rh3io4h8f3irhjel8ousafehf8f3yh";
@@ -15,7 +15,7 @@ describe("Create hassio session", function () {
return { data: { session: sessionID } };
},
});
assert.strictEqual(
assert.equal(
// @ts-ignore
global.document.cookie,
"ingress_session=fhdsu73rh3io4h8f3irhjel8ousafehf8f3yh;path=/api/hassio_ingress/;SameSite=Strict"
@@ -32,7 +32,7 @@ describe("Create hassio session", function () {
return { data: { session: sessionID } };
},
});
assert.strictEqual(
assert.equal(
// @ts-ignore
global.document.cookie,
"ingress_session=fhdsu73rh3io4h8f3irhjel8ousafehf8f3yh;path=/api/hassio_ingress/;SameSite=Strict;Secure"
@@ -52,6 +52,6 @@ describe("Create hassio session", function () {
() => true,
() => false
);
assert.strictEqual(await createSessionPromise, false);
assert.equal(await createSessionPromise, false);
});
});
+12 -32
View File
@@ -21,7 +21,7 @@
"map": "Mapa",
"media_browser": "Navegador multimèdia",
"profile": "Perfil",
"shopping_list": "Llista de la compra",
"shopping_list": "Llista de compres",
"states": "Visualització general"
},
"state_attributes": {
@@ -432,7 +432,7 @@
"turn_on": "Engega"
},
"persistent_notification": {
"dismiss": "Omet"
"dismiss": "Desestimar"
},
"scene": {
"activate": "Activar"
@@ -520,7 +520,6 @@
"previous": "Anterior",
"refresh": "Actualitza",
"save": "Desa",
"skip": "Omet",
"successfully_deleted": "S'ha eliminat correctament",
"successfully_saved": "S'ha desat correctament",
"undo": "Desfés",
@@ -716,7 +715,7 @@
},
"entity_registry": {
"control": "Control",
"dismiss": "Omet",
"dismiss": "Desestimar",
"editor": {
"confirm_delete": "Estàs segur que vols eliminar aquesta entrada?",
"delete": "Elimina",
@@ -796,7 +795,7 @@
"more_info_control": {
"controls": "Controls",
"details": "Detalls",
"dismiss": "Omet el diàleg",
"dismiss": "Desestimar el diàleg",
"edit": "Edita entitat",
"history": "Historial",
"last_changed": "Darrer canvi",
@@ -953,13 +952,13 @@
"notification_drawer": {
"click_to_configure": "Prem el botó per configurar {entity}",
"close": "Tanca",
"dismiss_all": "Omet tot",
"dismiss_all": "Descarta-ho tot",
"empty": "No hi ha notificacions",
"title": "Notificacions"
},
"notification_toast": {
"connection_lost": "Connexió perduda. Tornant a connectar...",
"dismiss": "Omet",
"dismiss": "Desestimar",
"service_call_failed": "Ha fallat la crida al servei {service}.",
"started": "Home Assistant s'ha iniciat!",
"starting": "Home Assistant està iniciant-se, no estarà tot disponible fins que acabi",
@@ -1085,7 +1084,7 @@
"wait_template": "Plantilla d'espera"
}
},
"unsupported_action": "La UI no és compatible amb l'acció: {action}"
"unsupported_action": "Acció no suportada per la UI: {action}"
},
"alias": "Nom",
"conditions": {
@@ -1162,7 +1161,7 @@
"zone": "Zona"
}
},
"unsupported_condition": "La UI no és compatible amb la condició: {condition}"
"unsupported_condition": "Condició no suportada per la UI: {condition}"
},
"copy_to_clipboard": "Copia al porta-retalls",
"default_name": "Nova automatització",
@@ -1213,7 +1212,7 @@
"trigger": "Disparador"
},
"event": {
"context_user_pick": "Selecciona usuari",
"context_user_pick": "Afegeix usuari",
"context_user_picked": "Esdeveniment cridat per usuari",
"context_users": "Limita-ho als esdeveniments disparats per",
"event_data": "Dades de l'esdeveniment",
@@ -1291,7 +1290,7 @@
"zone": "Zona"
}
},
"unsupported_platform": "La UI no és compatible amb la plataforma: {platform}"
"unsupported_platform": "Plataforma no suportada per la UI: {platform}"
},
"unsaved_confirm": "Hi ha canvis no desats. Segur que vols sortir?"
},
@@ -1312,22 +1311,6 @@
"only_editable": "Només es poden editar les automatitzacions definides dins l'arxiu automations.yaml.",
"pick_automation": "Selecciona l'automatització a editar",
"show_info_automation": "Mostra informació sobre l'automatització"
},
"thingtalk": {
"create": "Crea automatització",
"link_devices": {
"ambiguous_entities": "Un o més dispositius tenen més d'una entitat coincident. Escull la que vulguis utilitzar.",
"header": "Genial! Ara hem d'enllaçar alguns dispositius",
"unknown_placeholder": "Marcador desconegut"
},
"task_selection": {
"error_empty": "Introdueix alguna ordre o prem a omet.",
"error_unsupported": "No hem pogut crear una automatització per a això (encara?).",
"for_example": "Per exemple:",
"header": "Crea una nova automatització",
"introduction": "Escriu a continuació el que hauria de fer l'automatització i intentarem convertir-ho en una automatització de Home Assistant.",
"language_note": "Nota: ara per are només s'admet en anglès"
}
}
},
"cloud": {
@@ -1458,7 +1441,7 @@
"login": {
"alert_email_confirm_necessary": "Has de confirmar el teu correu electrònic abans d'iniciar sessió.",
"alert_password_change_required": "Has de canviar la teva contrasenya abans d'iniciar sessió.",
"dismiss": "Omet",
"dismiss": "Desestimar",
"email": "Correu electrònic",
"email_error_msg": "Correu electrònic invàlid",
"forgot_password": "has oblidat la contrasenya?",
@@ -1763,7 +1746,7 @@
"aborted": "Avortat",
"close": "Tanca",
"created_config": "S'ha creat configuració per a {name}.",
"dismiss": "Omet el diàleg",
"dismiss": "Desestima el diàleg",
"error_saving_area": "Error desant àrea: {error}",
"external_step": {
"description": "Aquest pas requereix que visitis un lloc web extern per completar-lo.",
@@ -3319,9 +3302,6 @@
"header": "Vibra"
}
},
"shopping_list": {
"start_conversation": "Inicia conversa"
},
"shopping-list": {
"add_item": "Afegir article",
"clear_completed": "Elimina els completats",
+2 -22
View File
@@ -520,7 +520,6 @@
"previous": "Předchozí",
"refresh": "Obnovit",
"save": "Uložit",
"skip": "Přeskočit",
"successfully_deleted": "Úspěšně smazáno",
"successfully_saved": "Úspěšně uloženo",
"undo": "Zpět",
@@ -572,7 +571,7 @@
"no_history_found": "Historie stavu chybí."
},
"logbook": {
"by": "prostřednictvím",
"by": "přes",
"by_service": "službou",
"entries_not_found": "Nenalezeny žádné záznamy.",
"messages": {
@@ -1213,7 +1212,7 @@
"trigger": "Spouštěč"
},
"event": {
"context_user_pick": "Vyberte uživatele",
"context_user_pick": "Přidat uživatele",
"context_user_picked": "Uživatel, který spustil událost",
"context_users": "Omezit na události spuštěné",
"event_data": "Data události",
@@ -1312,22 +1311,6 @@
"only_editable": "Upravitelné mohou být pouze automatizace definované v automations.yaml.",
"pick_automation": "Vyberte automatizaci, kterou chcete upravit",
"show_info_automation": "Zobrazit informace o automatizaci"
},
"thingtalk": {
"create": "Vytvořit automatizaci",
"link_devices": {
"ambiguous_entities": "Jedno nebo více zařízení má více než jednu odpovídající entitu, prosím vyberte tu, kterou chcete použít.",
"header": "Skvěle! Nyní musíme propojit některá zařízení",
"unknown_placeholder": "Neznámý zástupný symbol"
},
"task_selection": {
"error_empty": "Zadejte příkaz nebo klepněte na Přeskočit.",
"error_unsupported": "Nedokázali jsme vytvořit automatizaci (zatím?).",
"for_example": "Například:",
"header": "Vytvoření nové automatizace",
"introduction": "Zadejte níže, co by tato automatizace měla dělat, a my se ji pokusíme převést na automatizaci Home Assistant.",
"language_note": "Poznámka: Prozatím je podporována pouze angličtina."
}
}
},
"cloud": {
@@ -3319,9 +3302,6 @@
"header": "Vibrovat"
}
},
"shopping_list": {
"start_conversation": "Zahájit konverzaci"
},
"shopping-list": {
"add_item": "Přidat položku",
"clear_completed": "Vymazat nakoupené",
+2 -24
View File
@@ -520,7 +520,6 @@
"previous": "Vorher",
"refresh": "Aktualisieren",
"save": "Speichern",
"skip": "Überspringen",
"successfully_deleted": "Erfolgreich gelöscht",
"successfully_saved": "Erfolgreich gespeichert",
"undo": "Rückgängig machen",
@@ -799,7 +798,6 @@
"dismiss": "Dialog ausblenden",
"edit": "Entität bearbeiten",
"history": "Verlauf",
"last_changed": "Zuletzt geändert",
"last_updated": "Letztes Update",
"person": {
"create_zone": "Zone vom aktuellen Standort erstellen"
@@ -1078,7 +1076,7 @@
"wait_template": "Warte-Template"
}
},
"unsupported_action": "Keine UI-Unterstützung für Aktion: {action}"
"unsupported_action": "Nicht unterstützte Aktion: {action}"
},
"alias": "Name",
"conditions": {
@@ -1206,7 +1204,7 @@
"trigger": "Auslöser"
},
"event": {
"context_user_pick": "Benutzer auswählen",
"context_user_pick": "Benutzer hinzufügen",
"context_user_picked": "Ereignis auslösender Benutzer",
"context_users": "Auf Ereignisse beschränken, die ausgelöst wurden durch",
"event_data": "Ereignisdaten",
@@ -1305,20 +1303,6 @@
"only_editable": "Nur Automatisierungen in automations.yaml sind editierbar.",
"pick_automation": "Wähle eine Automatisierung zum Bearbeiten",
"show_info_automation": "Informationen über die Automatisierung anzeigen"
},
"thingtalk": {
"create": "Automatisierung erstellen",
"link_devices": {
"header": "Großartig! Jetzt müssen wir einige Geräte verknüpfen",
"unknown_placeholder": "Unbekannter Platzhalter"
},
"task_selection": {
"error_empty": "Gib einen Befehl ein oder tippe auf Überspringen.",
"error_unsupported": "Dafür konnten wir (noch?) keine Automatisierung erstellen.",
"for_example": "Zum Beispiel:",
"header": "Eine neue Automatisierung erstellen",
"language_note": "Hinweis: Im Moment wird nur Englisch unterstützt."
}
}
},
"cloud": {
@@ -2737,9 +2721,6 @@
"description": "Die Glance-Karte ist nützlich, um mehrere Sensoren in einer kompakten Übersicht zu gruppieren.",
"name": "Glance"
},
"grid": {
"name": "Raster"
},
"history-graph": {
"description": "Mit der Verlaufsdiagramm-Karte kannst du für jedes der aufgelisteten Objekte ein Diagramm anzeigen.",
"name": "History Graph"
@@ -3279,9 +3260,6 @@
"header": "Vibrieren"
}
},
"shopping_list": {
"start_conversation": "Konversation starten"
},
"shopping-list": {
"add_item": "Artikel hinzufügen",
"clear_completed": "Abgehakte entfernen",
+3 -23
View File
@@ -520,7 +520,6 @@
"previous": "Προηγούμενο",
"refresh": "Ανανέωση",
"save": "Αποθήκευση",
"skip": "Παράλειψη",
"successfully_deleted": "Η διαγραφή ολοκληρώθηκε με επιτυχία",
"successfully_saved": "Αποθηκεύτηκε με επιτυχία",
"undo": "Αναίρεση",
@@ -578,8 +577,8 @@
"messages": {
"became_unavailable": "μετετράπη σε μη διαθέσιμο",
"changed_to_state": "άλλαξε σε {state}",
"cleared_device_class": "παραγράφηκε (δεν εντοπίστηκε {device_class} )",
"detected_device_class": "εντόπισε {device_class}",
"cleared_device_class": "διαγράφηκε (δεν εντοπίστηκε {device_class} )",
"detected_device_class": "εντοπίστηκε {device_class}",
"rose": "αυξήθηκε",
"set": "ορίστηκε",
"turned_off": "απενεργοποιήθηκε",
@@ -1213,7 +1212,7 @@
"trigger": "Έναυσμα"
},
"event": {
"context_user_pick": "Επιλογή χρήστη",
"context_user_pick": "Προσθήκη χρήστη",
"context_user_picked": "Συμβάν πυροδότησης χρήστη",
"context_users": "Περιορισμός σε συμβάντα που ενεργοποιούνται από",
"event_data": "Δεδομένα συμβάντος",
@@ -1312,22 +1311,6 @@
"only_editable": "Μόνο οι αυτοματισμοί που ορίζονται στο automations.yaml είναι επεξεργάσιμοι.",
"pick_automation": "Επιλέξτε αυτοματισμό για επεξεργασία",
"show_info_automation": "Εμφάνιση πληροφοριών σχετικά με τον αυτοματισμό"
},
"thingtalk": {
"create": "Δημιουργία αυτοματισμού",
"link_devices": {
"ambiguous_entities": "Μία ή περισσότερες συσκευές έχουν περισσότερες από μία οντότητες που ταιριάζουν, επιλέξτε αυτήν που θέλετε να χρησιμοποιήσετε.",
"header": "Τέλεια! Τώρα πρέπει να συνδέσουμε ορισμένες συσκευές",
"unknown_placeholder": "Άγνωστο σύμβολο κράτησης θέσης"
},
"task_selection": {
"error_empty": "Εισαγάγετε μια εντολή ή πατήστε Παράλειψη.",
"error_unsupported": "Δεν μπορούσαμε να δημιουργήσουμε έναν αυτοματισμό για αυτό (ακόμα;).",
"for_example": "Για παράδειγμα:",
"header": "Δημιουργία νέου αυτοματισμού",
"introduction": "Πληκτρολογήστε παρακάτω τι πρέπει να κάνει αυτός ο αυτοματισμός και θα προσπαθήσουμε να τον μετατρέψουμε σε αυτοματισμό του Home Assistant.",
"language_note": "Σημείωση: Μόνο τα Αγγλικά υποστηρίζονται προς το παρόν."
}
}
},
"cloud": {
@@ -3319,9 +3302,6 @@
"header": "Δόνηση"
}
},
"shopping_list": {
"start_conversation": "Έναρξη συζήτησης"
},
"shopping-list": {
"add_item": "Προσθήκη στοιχείου",
"clear_completed": "Καθαρισμός Ολοκληρώθηκε",
+3 -23
View File
@@ -21,7 +21,7 @@
"map": "Map",
"media_browser": "Media Browser",
"profile": "Profile",
"shopping_list": "Shopping List",
"shopping_list": "Shopping list",
"states": "Overview"
},
"state_attributes": {
@@ -520,7 +520,6 @@
"previous": "Previous",
"refresh": "Refresh",
"save": "Save",
"skip": "Skip",
"successfully_deleted": "Successfully deleted",
"successfully_saved": "Successfully saved",
"undo": "Undo",
@@ -1213,7 +1212,7 @@
"trigger": "Trigger"
},
"event": {
"context_user_pick": "Select user",
"context_user_pick": "Add user",
"context_user_picked": "User firing event",
"context_users": "Limit to events triggered by",
"event_data": "Event data",
@@ -1312,22 +1311,6 @@
"only_editable": "Only automations defined in automations.yaml are editable.",
"pick_automation": "Pick automation to edit",
"show_info_automation": "Show info about automation"
},
"thingtalk": {
"create": "Create automation",
"link_devices": {
"ambiguous_entities": "One or more devices have more than one matching entity, please pick the one you want to use.",
"header": "Great! Now we need to link some devices",
"unknown_placeholder": "Unknown placeholder"
},
"task_selection": {
"error_empty": "Enter a command or tap skip.",
"error_unsupported": "We couldn't create an automation for that (yet?).",
"for_example": "For example:",
"header": "Create a new automation",
"introduction": "Type below what this automation should do, and we will try to convert it into a Home Assistant automation.",
"language_note": "Note: Only English is supported for now."
}
}
},
"cloud": {
@@ -2136,7 +2119,7 @@
"sequence_sentence": "The sequence of actions of this script."
},
"picker": {
"add_script": "Add script",
"add_script": "Create new script",
"edit_script": "Edit script",
"header": "Script Editor",
"headers": {
@@ -3319,9 +3302,6 @@
"header": "Vibrate"
}
},
"shopping_list": {
"start_conversation": "Start conversation"
},
"shopping-list": {
"add_item": "Add item",
"clear_completed": "Clear completed",
+2 -22
View File
@@ -520,7 +520,6 @@
"previous": "Anterior",
"refresh": "Actualizar",
"save": "Guardar",
"skip": "Omitir",
"successfully_deleted": "Eliminado correctamente",
"successfully_saved": "Guardado correctamente",
"undo": "Deshacer",
@@ -1213,7 +1212,7 @@
"trigger": "Desencadenante"
},
"event": {
"context_user_pick": "Seleccionar usuario",
"context_user_pick": "Añadir usuario",
"context_user_picked": "Evento desencadenado por usuario",
"context_users": "Límite a eventos desencadenados por",
"event_data": "Datos del evento",
@@ -1312,22 +1311,6 @@
"only_editable": "Solo las automatizaciones definidas en automations.yaml son editables.",
"pick_automation": "Elije la automatización para editar",
"show_info_automation": "Mostrar información sobre la automatización"
},
"thingtalk": {
"create": "Crear automatización",
"link_devices": {
"ambiguous_entities": "Uno o más dispositivos tienen más de una entidad coincidente, selecciona la que deseas utilizar.",
"header": "¡Excelente! Ahora necesitamos vincular algunos dispositivos",
"unknown_placeholder": "Marcador de posición desconocido"
},
"task_selection": {
"error_empty": "Introduce un comando o pulsa omitir.",
"error_unsupported": "No hemos podido crear una automatización para eso (¿todavía?).",
"for_example": "Por ejemplo:",
"header": "Crear una nueva automatización",
"introduction": "Escribe a continuación lo que debe hacer esta automatización, e intentaremos convertirlo en una automatización de Home Assistant.",
"language_note": "Nota: Solo se admite Inglés por ahora."
}
}
},
"cloud": {
@@ -1553,7 +1536,7 @@
}
},
"devices": {
"add_prompt": "Todavía no se han añadido {name} usando este dispositivo. Puedes añadir pulsando en el botón + de arriba.",
"add_prompt": "Todavía no se ha añadido ningún {name} usando este dispositivo. Puedes añadir uno pulsando en el botón + de arriba.",
"automation": {
"actions": {
"caption": "Cuando algo se activa....",
@@ -3319,9 +3302,6 @@
"header": "Vibrar"
}
},
"shopping_list": {
"start_conversation": "Iniciar conversación"
},
"shopping-list": {
"add_item": "Añadir artículo",
"clear_completed": "Borrado completado",
+8 -28
View File
@@ -520,7 +520,6 @@
"previous": "Eelmine",
"refresh": "Värskenda",
"save": "Salvesta",
"skip": "Jäta vahele",
"successfully_deleted": "Edukalt kustutatud",
"successfully_saved": "Edukalt salvestatud",
"undo": "Ennista",
@@ -572,7 +571,7 @@
"no_history_found": "Oleku ajalugu ei leitud"
},
"logbook": {
"by": "allikas:",
"by": "poolt",
"by_service": "teenuse poolt",
"entries_not_found": "Logiraamatu kandeid ei leitud.",
"messages": {
@@ -671,9 +670,9 @@
"duration": {
"day": "{count} {count, plural,\n one {päev}\n other {päeva}\n}",
"hour": "{count} {count, plural,\n one {tund}\n other {tunni}\n}",
"minute": "{count} {count, plural,\n one {minut}\n other {minuti}\n}",
"minute": "{count} {count, plural,\n one {minut}\n other {minutit}\n}",
"second": "{count} {count, plural,\n one {sekund}\n other {sekundit}\n}",
"week": "{count} {count, plural,\n one {nädala}\n other {nädala}\n}"
"week": "{count} {count, plural,\n one {nädal}\n other {nädalat}\n}"
},
"future": "{time} pärast",
"future_duration": {
@@ -940,8 +939,8 @@
},
"duration": {
"day": "{count} {count, plural,\n one {päev}\n other {päeva}\n}",
"hour": "{count} {count, plural,\n one {tund}\n other {tunni}\n}",
"minute": "{count} {count, plural,\n one {minut}\n other {minuti}\n}",
"hour": "{count} {count, plural,\n one {tund}\n other {tundi}\n}",
"minute": "{count} {count, plural,\n one {minut}\n other {minutit}\n}",
"second": "{count} {count, plural,\n one {sekund}\n other {sekundit}\n}",
"week": "{count} {count, plural,\n one {nädal}\n other {nädalat}\n}"
},
@@ -961,7 +960,7 @@
"connection_lost": "Ühendus kadunud. Taasühendamine...",
"dismiss": "Loobu",
"service_call_failed": "Teenuse {service} väljakutsumine ebaõnnestus.",
"started": "Home Assistant on käivitunud!",
"started": "Koduabiline on käivitunud!",
"starting": "Home Assistant käivitub, kõik elemendid ei pruugi veel saadaval olla",
"triggered": "Käivitati {name}"
},
@@ -1213,7 +1212,7 @@
"trigger": "Päästik"
},
"event": {
"context_user_pick": "Vali kasutaja",
"context_user_pick": "Lisa kasutaja",
"context_user_picked": "Kasutaja kes vallandas sündmuse",
"context_users": "Piira sündmustega mille on käivitanud",
"event_data": "Sündmuse andmed",
@@ -1312,22 +1311,6 @@
"only_editable": "Ainult automations.yaml failis defineeritud automatiseeringud on muudetavad.",
"pick_automation": "Vali muudetav automatiseering",
"show_info_automation": "Kuva automatiseeringu teave"
},
"thingtalk": {
"create": "Loo automatiseering",
"link_devices": {
"ambiguous_entities": "Ühel või mitmel seadmel on mitu sobivat olemit, palun vali see, mida soovid kasutada.",
"header": "Suurepärane! Nüüd peame lisama mõned seadmed",
"unknown_placeholder": "Tundmatu kohatäide"
},
"task_selection": {
"error_empty": "Sisesta käsk või vajuta Jäta vahele.",
"error_unsupported": "Me ei saanud selle jaoks (veel?) automaatiseeringut luua .",
"for_example": "Näiteks:",
"header": "Loo uus automatiseering",
"introduction": "Sisesta allpool, mida see automaatiseering peaks tegema, ja proovime selle teisendada Home Assistanti automaatiseeringuks.",
"language_note": "Märkus. Praegu toetatakse ainult inglise keelt."
}
}
},
"cloud": {
@@ -3297,7 +3280,7 @@
"token_title": "Ajutine juurdepääsutõend {clientId} jaoks"
},
"suspend": {
"description": "Kas sulgeda ühendus serveriga pärast 5-minutilist jõudeolekut ?",
"description": "Kas sulgeda ühenduse serveriga pärast 5-minutilist jõudeolekut ?",
"header": "Sule ühendus automaatselt"
},
"themes": {
@@ -3319,9 +3302,6 @@
"header": "Vibreeri"
}
},
"shopping_list": {
"start_conversation": "Alusta vestlust"
},
"shopping-list": {
"add_item": "Lisa toode",
"clear_completed": "Tühjenda täidetud",
-14
View File
@@ -520,7 +520,6 @@
"previous": "Précédent",
"refresh": "Rafraîchir",
"save": "Enregistrer",
"skip": "Passer",
"successfully_deleted": "Supprimé avec succès",
"successfully_saved": "Enregistré avec succès",
"undo": "Annuler",
@@ -1312,16 +1311,6 @@
"only_editable": "Seules les automatisations définies dans automations.yaml sont modifiables.",
"pick_automation": "Choisissez l'automatisation à modifier",
"show_info_automation": "Afficher des informations sur l'automatisation"
},
"thingtalk": {
"link_devices": {
"header": "Super ! Maintenant nous allons lier quelques appareils",
"unknown_placeholder": "Espace réservé introuvable"
},
"task_selection": {
"for_example": "Par exemple : ",
"language_note": "Remarque: pour l'instant, seul l'anglais est pris en charge."
}
}
},
"cloud": {
@@ -3309,9 +3298,6 @@
"header": "Vibrer"
}
},
"shopping_list": {
"start_conversation": "Démarrer la conversation"
},
"shopping-list": {
"add_item": "Ajouter un élément",
"clear_completed": "Supprimer les éléments complétés",
+14 -37
View File
@@ -590,7 +590,7 @@
"video": "וידאו"
},
"documentation": "תיעוד",
"learn_adding_local_media": "למד עוד אודות הוספת מדיה ב-{documentation}."
"learn_adding_local_media": "למד עוד אודות הוספת מדיה ב{תיעוד}."
},
"picture-upload": {
"label": "תמונה",
@@ -615,16 +615,9 @@
"second": "{count} {count, plural,\n one {שנייה}\n other {שניות}\n}",
"week": "{count} {count, plural,\n one {שבוע}\n other {שבועות}\n}"
},
"future": עוד {time}",
"future": "ב{time}",
"never": "אף פעם לא",
"past": "לפני {time}",
"past_duration": {
"day": "לפני {count} {count, plural,\n one {day}\n other {days}\n}",
"hour": "לפני {count} {count, plural,\n one {hour}\n other {hours}\n}",
"minute": "לפני {count} {count, plural,\n one {minute}\n other {minutes}\n}",
"second": "לפני {count} {count, plural,\n one {second}\n other {seconds}\n}",
"week": "לפני {count} {count, plural,\n one {week}\n other {weeks}\n}"
}
"past": "מלפני {time}"
},
"service-picker": {
"service": "שירות"
@@ -714,7 +707,6 @@
"dismiss": "סגור",
"edit": "ערוך יישות",
"history": "היסטוריה",
"last_changed": "שונה לאחרונה",
"person": {
"create_zone": "צור אזור מהמיקום הנוכחי"
},
@@ -771,13 +763,6 @@
}
},
"quick-bar": {
"commands": {
"server_control": {
"perform_action": "{action} שרת",
"restart": "הפעל מחדש",
"stop": "עצור"
}
},
"filter_placeholder": "מסנן ישויות"
},
"voice_command": {
@@ -799,7 +784,7 @@
"confirmations": {
"remove": "האם אתה בטוח שברצונך למחוק מכשיר זה?"
},
"device_signature": "חתימת התקן Zigbee",
"device_signature": "חתימת מכשיר Zigbee",
"last_seen": "נראה לאחרונה",
"manuf": "לפי {manufacturer}",
"no_area": "ללא אזור",
@@ -809,7 +794,7 @@
"reconfigure": "הגדר מחדש את המכשיר ה- ZHA (ריפוי מכשיר). השתמש בזה אם אתה נתקל בבעיות במכשיר. אם המכשיר המדובר הוא מכשיר המונע על ידי סוללה, אנא וודא שהוא דלוק ומקבל פקודות בעת השימוש בשירות זה.",
"remove": "הסר מכשיר מרשת ה-Zigbee",
"updateDeviceName": "הגדר שם מותאם אישית עבור מכשיר זה במאגר ההתקנים.",
"zigbee_information": "הצגת מידע Zigbee עבור ההתקן."
"zigbee_information": "הצגת מידע Zigbee עבור המכשיר."
},
"unknown": "לא ידוע",
"zha_device_card": {
@@ -1408,7 +1393,7 @@
},
"cant_edit": "באפשרותך לערוך פריטים שנוצרו בממשק המשתמש בלבד.",
"caption": "התקנים",
"confirm_delete": "האם אתה בטוח שברצונך למחוק התקן זה?",
"confirm_delete": "האם אתה בטוח שברצונך למחוק מכשיר זה?",
"confirm_rename_entity_ids": "האם אתה רוצה גם לשנות את המזהים של הישויות שלך?",
"confirm_rename_entity_ids_warning": "שינוי זה לא ישפיע על התצורה (כמו אוטומציות, קבצי Script, סצנות, Lovelace) המשתמשת כעת בישויות אלה, יהיה עליך לעדכן אותן בעצמך.",
"data_table": {
@@ -1423,7 +1408,7 @@
},
"delete": "מחיקה",
"description": "ניהול התקנים מחוברים",
"device_info": "פרטי התקן",
"device_info": "פרטי מכשיר",
"device_not_found": "המכשיר לא נמצא.",
"entities": {
"add_entities_lovelace": "הוסף לממשק Lovelace",
@@ -1627,7 +1612,7 @@
"rename_input_label": "שם ישות",
"search": "חיפוש אינטגרציות"
},
"introduction": "כאן ניתן להגדיר את הרכיבים ואת ה-Home Assistant. לא הכל ניתן להגדיר עם ממשק המשתמש עדיין, אבל אנחנו עובדים על זה.",
"introduction": "כאן ניתן להגדיר את הרכיבים ואת ה Home Assistant. לא הכל ניתן להגדיר את ממשק המשתמש עדיין, אבל אנחנו עובדים על זה.",
"logs": {
"caption": "יומנים",
"clear": "נקה",
@@ -1927,7 +1912,7 @@
"confirm_restart": "האם אתה בטוח שברצונך להפעיל מחדש את Home Assistant?",
"confirm_stop": "האם אתה בטוח שברצונך לעצור את Home Assistant?",
"heading": "ניהול שרת",
"introduction": "לשלוט על שרת Home Assistant שלך... מ-Home Assistant.",
"introduction": "לשלוט על שרת הHome Assistant שלך... מHome Assistant.",
"restart": "אתחל",
"stop": "עצור"
},
@@ -1998,7 +1983,7 @@
},
"picker": {
"headers": {
"group": "קבוצה",
"group": ְבוּצָה",
"name": "שם",
"system": "מערכת"
}
@@ -2007,11 +1992,11 @@
},
"zha": {
"add_device_page": {
"discovered_text": "התקנים יופיעו כאן לאחר שהתגלו.",
"discovered_text": "מכשירים יופיעו כאן לאחר שהתגלו.",
"discovery_text": ". המכשירים שהתגלו יופיעו כאן. עקוב אחר ההוראות עבור ההתקנים שלך והצב את ההתקנים במצב תיאום.",
"header": "אוטומציית Zigbee - הוספת התקנים",
"no_devices_found": "לא נמצאו התקנים כלשהם, וודא שהם במצב צימוד והקפד שיהיו פעילים בזמן החיפוש.",
"pairing_mode": "ודא שההתקנים שלך נמצאים במצב צימוד. בדוק את הוראות ההתקן כיצד לבצע זאת.",
"pairing_mode": "ודא שהמכשירים שלך במצב צימוד. בדוק את הוראות המכשיר שלך כיצד לבצע זאת.",
"search_again": "חפש שוב",
"spinner": "מחפש מכשירי ZHA Zigbee..."
},
@@ -2178,7 +2163,7 @@
"entities": "ישויות היחידה",
"entity_info": "מידע על הישות",
"exclude_entity": "אל תכלול ישות זו ב Home Assistant",
"group": "קבוצה",
"group": ְבוּצָה",
"header": "ניהול יחידות Z-Wave",
"introduction": "הפעל פקודות Z-Wave המשפיעות על יחידה בודדת. בחר יחידה כדי לראות רשימה של פקודות זמינות.",
"max_associations": "כמות קישורים מקסימלי:",
@@ -2384,7 +2369,6 @@
"calendar": {
"calendar_entities": "ישויות לוח שנה",
"inital_view": "תצוגה ראשונית",
"name": "לוח שנה",
"views": {
"dayGridDay": "יום",
"dayGridMonth": "חודש",
@@ -2483,9 +2467,6 @@
"description": "כרטיס ה־Glance שימושי עבור קיבוץ מספר חיישנים לסקירה קומפקטית.",
"name": "Glance"
},
"grid": {
"name": "רשת"
},
"history-graph": {
"description": "הכרטיס History Graph מאפשר לך להציג גרף עבור כל אחת מהישויות המפורטות.",
"name": "גרף ההיסטוריה"
@@ -2915,7 +2896,7 @@
},
"current_user": "אתה מחובר כעת כ- {fullName} .",
"dashboard": {
"description": "בחר לוח בקרה ברירת מחדל עבור התקן זה.",
"description": "בחר לוח בקרה ברירת מחדל עבור מכשיר זה.",
"dropdown_label": "לוח בקרה",
"header": "לוח בקרה"
},
@@ -2961,10 +2942,6 @@
"header": "מודלי אימות מרובה גורמים"
},
"push_notifications": {
"add_device_prompt": {
"input_label": "שם התקן",
"title": "איך לקרוא להתקן זה?"
},
"description": "שלח התראות למכשיר זה.",
"error_load_platform": "הגדר את notify.html5.",
"error_use_https": "נדרש SSL מופעל עבור הממשק.",
-13
View File
@@ -520,7 +520,6 @@
"previous": "Előző",
"refresh": "Frissítés",
"save": "Mentés",
"skip": "Kihagyás",
"successfully_deleted": "Sikeresen törölve",
"successfully_saved": "Sikeresen elmentve",
"undo": "Visszavonás",
@@ -1312,15 +1311,6 @@
"only_editable": "Csak az automations.yaml fájlban megadott automatizálások szerkeszthetők.",
"pick_automation": "Válassz ki egy automatizálást szerkesztésre",
"show_info_automation": "Információk megjelenítése az automatizálásról"
},
"thingtalk": {
"create": "Automatizálás létrehozása",
"task_selection": {
"error_empty": "Írj be egy parancsot, vagy koppints a kihagyásra.",
"for_example": "Például:",
"header": "Új automatizálás létrehozása",
"language_note": "Megjegyzés: Egyelőre csak az angol nyelv támogatott."
}
}
},
"cloud": {
@@ -3312,9 +3302,6 @@
"header": "Rezgés"
}
},
"shopping_list": {
"start_conversation": "Beszélgetés indítása"
},
"shopping-list": {
"add_item": "Tétel hozzáadása",
"clear_completed": "Bejelöltek törlése",
+1 -25
View File
@@ -520,7 +520,6 @@
"previous": "Indietro",
"refresh": "Aggiorna",
"save": "Salva",
"skip": "Salta",
"successfully_deleted": "Cancellato con successo",
"successfully_saved": "Salvataggio riuscito",
"undo": "Annulla",
@@ -1213,7 +1212,7 @@
"trigger": "Attivazione"
},
"event": {
"context_user_pick": "Seleziona utente",
"context_user_pick": "Aggiungi utente",
"context_user_picked": "Evento di attivazione dell'utente",
"context_users": "Limita agli eventi attivati da",
"event_data": "Dati dell'Evento",
@@ -1312,22 +1311,6 @@
"only_editable": "Solo le automazioni definite in automations.yaml sono modificabili.",
"pick_automation": "Scegli l'Automazione da modificare",
"show_info_automation": "Mostra informazioni sull'automazione"
},
"thingtalk": {
"create": "Crea automazione",
"link_devices": {
"ambiguous_entities": "Uno o più dispositivi hanno più di un'entità corrispondente, scegliere quello che si desidera utilizzare.",
"header": "Fantastico! Ora dobbiamo collegare alcuni dispositivi",
"unknown_placeholder": "Segnaposto sconosciuto"
},
"task_selection": {
"error_empty": "Immettere un comando o toccare Salta.",
"error_unsupported": "Non siamo riusciti a creare un'automazione per questo (ancora?).",
"for_example": "Per esempio:",
"header": "Crea una nuova automazione",
"introduction": "Digitare sotto ciò che questa automazione dovrebbe fare, e proveremo a convertirlo in un'automazione Home Assistant.",
"language_note": "Nota: per il momento è supportato solo l'inglese."
}
}
},
"cloud": {
@@ -2776,10 +2759,6 @@
"description": "La scheda Occhiata è utile per raggruppare più sensori in una panoramica compatta.",
"name": "Vista"
},
"grid": {
"description": "La scheda Griglia consente di mostrare più schede in una griglia.",
"name": "Griglia"
},
"history-graph": {
"description": "La scheda Grafico Storico consente di visualizzare un grafico per ciascuna delle entità elencate.",
"name": "Grafico cronologico"
@@ -3319,9 +3298,6 @@
"header": "Vibrazione"
}
},
"shopping_list": {
"start_conversation": "Avvia conversazione"
},
"shopping-list": {
"add_item": "Aggiungi articolo",
"clear_completed": "Cancellazione completata",
-4
View File
@@ -2600,10 +2600,6 @@
"description": "한눈에 보기 카드는 여러 센서를 간단한 개요로 그룹화하는 데 유용합니다.",
"name": "한눈에 보기"
},
"grid": {
"description": "격자 모아보기 카드를 사용하면 한 격자에 여러 카드를 표시할 수 있습니다.",
"name": "격자 모아보기"
},
"history-graph": {
"description": "기록 그래프 카드를 사용하면 나열된 각 구성요소에 대한 그래프를 표시할 수 있습니다.",
"name": "기록 그래프"
+6 -26
View File
@@ -520,7 +520,6 @@
"previous": "Virdrun",
"refresh": "Aktualiséieren",
"save": "Späicheren",
"skip": "Iwwersprangen",
"successfully_deleted": "Erfollegräich geläscht.",
"successfully_saved": "Erfollegräich gespäichert.",
"undo": "Réckgängeg maachen",
@@ -710,9 +709,9 @@
"enabled_description": "Deaktivéiert Entitéiten ginn net am Home Assistant bäigesat.",
"enabled_label": "Entitéit aktivéieren",
"entity_id": "ID vun der Entitéit",
"icon": "Ikon",
"icon": "Ikon iwwerschreiwen",
"icon_error": "Ikonen sollten am format 'prefix:numm' sinn, Beispill: 'mdi:home'",
"name": "Numm",
"name": "Numm iwwerschreiwen",
"note": "Note: dëst funktionéiert villäicht nach net mat all Integratioun.",
"unavailable": "Dës Entitéit ass net erreechbar fir de Moment.",
"update": "Aktualiséieren"
@@ -1191,7 +1190,7 @@
"trigger": "Ausléiser"
},
"event": {
"context_user_pick": "Benotzer auswielen",
"context_user_pick": "Benotzer erstellen",
"context_user_picked": "Benotzer deen den Evenement gestart huet",
"context_users": "Op Evenementer limitéieren déi ausgeléist goufen duerch ",
"event_data": "Evenement Donnée",
@@ -1290,22 +1289,6 @@
"only_editable": "Nëmmen Automatiounen déi am automations.yaml séfinéiert sinn kënnen editéiert ginn.",
"pick_automation": "Automatismus fir ze änneren auswielen",
"show_info_automation": "Informatiounen vum Automatisme uweisen"
},
"thingtalk": {
"create": "Automatisme erstellen",
"link_devices": {
"ambiguous_entities": "Een oder méi Apparater hunn méi wéi eng passend Entitéit, Wiel déi aus déi soll benotzt ginn.",
"header": "Super! Elo musse nach e puer Apparater verbonne ginn",
"unknown_placeholder": "Onbekannte Plazhaler"
},
"task_selection": {
"error_empty": "Gëff ee Kommando an oder klick op Iwwersprangen.",
"error_unsupported": "Mir konnten (nach?) keen Automatisme fir dëst erstellen.",
"for_example": "Zum Beispill:",
"header": "Nei Automatisme erstellen",
"introduction": "Gëff ënnendran an wat déi Automatisme maache sollt, a mir probéieren et an eng Home Assistant Automatisme ëmzewandelen.",
"language_note": "Nott: Nëmmen Englesch gëtt fir de Moment ënnerstëtzt."
}
}
},
"cloud": {
@@ -1558,7 +1541,7 @@
"caption": "Apparater",
"confirm_delete": "Sécher fir dësen Appara ze läsche?",
"confirm_rename_entity_ids": "Wëllt Dir och d'Entitéiten-ID vun Ären Entitéiten ëmbenennen?",
"confirm_rename_entity_ids_warning": "Dëst ännert keng Konfiguratioun (wéi Automatisatisme, Skripte, Szene, Tableau de Bord) déi aktuell dës Entitéite benotzt, du muss se selwer aktualiséieren fir dass sie déi nei Entitéiten ID's benotzen.",
"confirm_rename_entity_ids_warning": "Dëst ännert keng Konfiguratioun (wéi Automatisatisme, Skripte, Szene, Lovelace) déi aktuell dës Entitéite benotzt, du muss se selwer aktualiséieren.",
"data_table": {
"area": "Beräich",
"battery": "Batterie",
@@ -2145,7 +2128,7 @@
"input_text": "Agab Text frësch lueden",
"introduction": "E puer Deeler vum Home Assistant kënne frësch geluede ginn ouni datt een Neistart néideg ass. Klick op nei luede fir di aktuell Konfiguratioun z'entlueden an di nei Konfiguratioun ze lueden.",
"min_max": "Min/Max Entitéite frësch lueden",
"mqtt": "Manuell konfiguréiert MQTT Entitéiten frësch lueden",
"mqtt": "MQTT Entitéiten frësch lueden",
"person": "Persoune frësch lueden",
"ping": "Ping Binär Sensor Entitéite frësch lueden",
"reload": "{domain} frësh lueden",
@@ -2937,7 +2920,7 @@
},
"view": {
"panel_mode": {
"description": "Dëst stellt déi éischt Kaart op voller Breet duer. Aner Kaarte oder Badge ginn net duergestallt.",
"description": "Dëst stellt déi éischt Kaart op voller Breet duer; aner Kaarte ginn net duergestallt.",
"title": "Panel Modus?",
"warning_multiple_cards": "Dës Usiicht enthält méi wéi eng Kaart, mee eng Panneau Usiicht kann nëmmen 1 Kaart uweisen."
}
@@ -3288,9 +3271,6 @@
"header": "Vibréieren"
}
},
"shopping_list": {
"start_conversation": "Ënnerhalung starten"
},
"shopping-list": {
"add_item": "Objet dobäisetze",
"clear_completed": "Fäerdeg Elementer ewechhuelen",
+18 -38
View File
@@ -59,7 +59,7 @@
"comfort": "Komfort",
"eco": "Øko",
"home": "Hjem",
"normal": "Normal",
"normal": "",
"sleep": "Sove"
}
}
@@ -111,11 +111,11 @@
},
"binary_sensor": {
"battery": {
"off": "Normal",
"off": "Normalt",
"on": "Lavt"
},
"cold": {
"off": "Normal",
"off": "",
"on": "Kald"
},
"connectivity": {
@@ -167,7 +167,7 @@
"on": "Hjemme"
},
"problem": {
"off": "OK",
"off": "",
"on": ""
},
"safety": {
@@ -239,7 +239,7 @@
"locked": "Låst",
"not_home": "Borte",
"off": "Av",
"ok": "OK",
"ok": "",
"on": "På",
"open": "Åpen",
"opening": "Åpner",
@@ -271,7 +271,7 @@
"home": "Hjemme"
},
"plant": {
"ok": "OK",
"ok": "",
"problem": "Problem"
},
"remote": {
@@ -520,7 +520,6 @@
"previous": "Forrige",
"refresh": "Oppdater",
"save": "Lagre",
"skip": "Hopp over",
"successfully_deleted": "Sletting vellykket",
"successfully_saved": "Lagring vellykket",
"undo": "Angre",
@@ -740,7 +739,7 @@
"cancel": "Avbryt",
"close": "Lukk",
"default_confirmation_title": "Er du sikker?",
"ok": "OK"
"ok": ""
},
"helper_settings": {
"counter": {
@@ -796,7 +795,7 @@
"more_info_control": {
"controls": "Kontroller",
"details": "Detaljer",
"dismiss": "Avvis dialog",
"dismiss": "Avvis dialogboksen",
"edit": "Redigér entitet",
"history": "Historie",
"last_changed": "Sist endret",
@@ -1213,7 +1212,7 @@
"trigger": "Utløser"
},
"event": {
"context_user_pick": "Velg bruker",
"context_user_pick": "Legg til bruker",
"context_user_picked": "Bruker avfyrer hendelse",
"context_users": "Begrens til hendelser utløst av",
"event_data": "Hendelse data",
@@ -1312,22 +1311,6 @@
"only_editable": "Bare automasjoner definert i automations.yaml kan redigeres.",
"pick_automation": "Velg automasjon for å redigere",
"show_info_automation": "Vis informasjon om automasjon"
},
"thingtalk": {
"create": "Opprett automatisering",
"link_devices": {
"ambiguous_entities": "En eller flere enheter har mer enn en samsvarende entitet. Velg den du vil bruke.",
"header": "Flott! Nå må vi koble til noen enheter",
"unknown_placeholder": "Ukjent plassholder"
},
"task_selection": {
"error_empty": "Skriv inn en kommando, eller trykk hopp over.",
"error_unsupported": "Vi kunne ikke lage en automatisering for det (ennå?)",
"for_example": "For eksempel:",
"header": "Opprette en ny automatisering",
"introduction": "Skriv nedenfor hva denne automasjonen skal gjøre, og vi vil prøve å konvertere den til en Home Assistant-automatisering.",
"language_note": "Merk: Bare engelsk støttes foreløpig."
}
}
},
"cloud": {
@@ -1389,11 +1372,11 @@
"link_learn_more": "Finn ut mer om hvordan du oppretter webhook-drevne automasjoner.",
"loading": "Laster inn ...",
"manage": "Administrer",
"no_hooks_yet": "Ser ut som du ikke har noen webhook'er ennå. Kom i gang ved å konfigurere en ",
"no_hooks_yet": "Ser ut som du ikke har noen webhooks ennå. Kom i gang ved å konfigurere en ",
"no_hooks_yet_link_automation": "webhook-automasjon",
"no_hooks_yet_link_integration": "webhook-basert integrasjon",
"no_hooks_yet2": " eller ved å opprette en ",
"title": "Webhook'er"
"title": ""
}
},
"alexa": {
@@ -1423,11 +1406,11 @@
"dialog_cloudhook": {
"available_at": "Webhook er tilgjengelig på følgende URL:",
"close": "Lukk",
"confirm_disable": "Er du sikker på at du vil deaktivere denne webhook'en?",
"confirm_disable": "Er du sikker på at du vil deaktivere denne webhook?",
"copied_to_clipboard": "Kopiert til utklippstavle",
"info_disable_webhook": "Hvis du ikke lenger ønsker å bruke denne webhook'en, kan du",
"info_disable_webhook": "Hvis du ikke lenger ønsker å bruke denne webhook, kan du",
"link_disable_webhook": "deaktiver den",
"managed_by_integration": "Denne webhook'en administreres av en integrasjon og kan ikke deaktiveres.",
"managed_by_integration": "Denne webhook administreres av en integrasjon og kan ikke deaktiveres.",
"view_documentation": "Vis dokumentasjon",
"webhook_for": "Webhook for {name}"
},
@@ -1482,7 +1465,7 @@
"feature_amazon_alexa": "Integrasjon med Amazon Alexa",
"feature_google_home": "Integrasjon med Google Assistant",
"feature_remote_control": "Kontroller Home Assistent når du er borte fra hjemmet",
"feature_webhook_apps": "Enkel integrasjon med webhookbaserte apper som OwnTracks",
"feature_webhook_apps": "Enkel integrasjon med nettbaserte apper som OwnTracks",
"headline": "Start prøveversjon",
"information": "Opprett en konto for å starte en gratis prøveperiode på en måned med Home Assistant Cloud. Ingen betalingsinformasjon nødvendig.",
"information2": "Prøveperioden vil gi deg tilgang til alle fordelene med Home Assistant Cloud, inkludert:",
@@ -1636,7 +1619,7 @@
},
"filter": {
"filter": "",
"hidden_entities": "{number} {number, plural,\n one {skjult entitet}\n other {skjulte entiteter}\n}",
"hidden_entities": "{number} skjult {number, plural,\n one {entitet}\n other {entiteter}\n}",
"show_all": "Vis alle",
"show_disabled": "Vis deaktiverte entiteter",
"show_readonly": "Vis skrivebeskyttede entiteter",
@@ -1662,7 +1645,7 @@
"selected": "{number} valgte",
"status": {
"disabled": "Deaktivert",
"ok": "OK",
"ok": "",
"readonly": "Skrivebeskyttet",
"restored": "Gjennopprettet",
"unavailable": "Utilgjengelig"
@@ -2777,7 +2760,7 @@
"name": "Blikk"
},
"grid": {
"description": "Med Rutenett-kortet kan du vise flere kort i et rutenett",
"description": "Med Rutenett-kortet kan du vise flere kort i et rutenett.",
"name": "Rutenettet"
},
"history-graph": {
@@ -3319,9 +3302,6 @@
"header": "Vibrere"
}
},
"shopping_list": {
"start_conversation": "Start samtale"
},
"shopping-list": {
"add_item": "Legg til",
"clear_completed": "Fjern fullførte",
+2 -23
View File
@@ -520,7 +520,6 @@
"previous": "Vorige",
"refresh": "Vernieuwen",
"save": "Opslaan",
"skip": "Overslaan",
"successfully_deleted": "Succesvol verwijderd",
"successfully_saved": "Succesvol opgeslagen",
"undo": "Ongedaan maken",
@@ -580,7 +579,7 @@
"changed_to_state": "gewijzigd in {state}",
"cleared_device_class": "niets gedetecteerd (geen {device_class} gedetecteerd)",
"detected_device_class": "gedetecteerd {device_class}",
"rose": "opkomst",
"rose": "roos",
"set": "stel in",
"turned_off": "is uitgeschakeld",
"turned_on": "is ingeschakeld",
@@ -892,7 +891,6 @@
"zone": "Herlaad zones"
},
"server_control": {
"perform_action": "{action} Server",
"restart": "Herstarten",
"stop": "Stop"
}
@@ -1213,7 +1211,7 @@
"trigger": "Trigger"
},
"event": {
"context_user_pick": "Selecteer gebruiker",
"context_user_pick": "Gebruiker toevoegen",
"context_user_picked": "Gebeurtenis door gebruiker",
"context_users": "Limiet voor gebeurtenissen die zijn geactiveerd door",
"event_data": "Gebeurtenisdata",
@@ -1312,22 +1310,6 @@
"only_editable": "Alleen automatiseringen in automations.yaml kunnen worden bewerkt.",
"pick_automation": "Kies te bewerken automatisering",
"show_info_automation": "Informatie weergeven over automatisering"
},
"thingtalk": {
"create": "Creëer automatisering",
"link_devices": {
"ambiguous_entities": "Een of meer apparaten hebben meer dan één overeenkomende entiteit. Kies het apparaat dat u wilt gebruiken.",
"header": "Geweldig! Nu moeten we enkele apparaten koppelen",
"unknown_placeholder": "Onbekende tijdelijke aanduiding"
},
"task_selection": {
"error_empty": "Voer een commando in of druk op overslaan.",
"error_unsupported": "Daar konden we (nog) geen automatisering voor maken.",
"for_example": "Bijvoorbeeld:",
"header": "Creëer een nieuwe automatisering",
"introduction": "Typ hieronder wat deze automatisering zou moeten doen, en we zullen proberen om het om te zetten in een Home Assistant automatisering.",
"language_note": "Opmerking: voorlopig wordt alleen Engels ondersteund."
}
}
},
"cloud": {
@@ -3319,9 +3301,6 @@
"header": "Trillen"
}
},
"shopping_list": {
"start_conversation": "Gesprek starten"
},
"shopping-list": {
"add_item": "Item toevoegen",
"clear_completed": "Wissen voltooid",
+1 -21
View File
@@ -520,7 +520,6 @@
"previous": "Poprzedni",
"refresh": "Odśwież",
"save": "Zapisz",
"skip": "Pomiń",
"successfully_deleted": "Pomyślnie usunięto",
"successfully_saved": "Pomyślnie zapisano",
"undo": "Cofnij",
@@ -1213,7 +1212,7 @@
"trigger": "Wyzwalacz"
},
"event": {
"context_user_pick": "Wybierz użytkownika",
"context_user_pick": "Dodaj użytkownika",
"context_user_picked": "Użytkownik wywołujący zdarzenie",
"context_users": "Tylko zdarzenia wywołane przez",
"event_data": "Dane zdarzenia",
@@ -1312,22 +1311,6 @@
"only_editable": "Tylko automatyzacje zdefiniowane w pliku automations.yaml są edytowalne.",
"pick_automation": "Wybierz automatyzację do edycji",
"show_info_automation": "Pokaż informacje o automatyzacji"
},
"thingtalk": {
"create": "Utwórz automatyzację",
"link_devices": {
"ambiguous_entities": "Co najmniej jedno urządzenie ma więcej niż jedną pasującą encję. Wybierz tę, której chcesz użyć.",
"header": "Wspaniale! Teraz musimy podłączyć jakieś urządzenia",
"unknown_placeholder": "Nieznany symbol zastępczy"
},
"task_selection": {
"error_empty": "Wprowadź polecenie lub naciśnij \"Pomiń\"",
"error_unsupported": "Nie mogliśmy (jeszcze?) utworzyć takiej automatyzacji",
"for_example": "Na przykład:",
"header": "Utwórz nową automatyzację",
"introduction": "Wpisz poniżej, co ma robić ta automatyzacja, a my spróbujemy przekształcić ją w automatyzację Home Assistant.",
"language_note": "Uwaga: obecnie obsługiwany jest tylko język angielski."
}
}
},
"cloud": {
@@ -3319,9 +3302,6 @@
"header": "Wibracja"
}
},
"shopping_list": {
"start_conversation": "Rozpocznij rozmowę"
},
"shopping-list": {
"add_item": "Dodaj element",
"clear_completed": "Wyczyść ukończone",
+1 -21
View File
@@ -520,7 +520,6 @@
"previous": "Назад",
"refresh": "Обновить",
"save": "Сохранить",
"skip": "Пропустить",
"successfully_deleted": "Успешно удалено",
"successfully_saved": "Успешно сохранено",
"undo": "Отменить",
@@ -1213,7 +1212,7 @@
"trigger": "Триггер"
},
"event": {
"context_user_pick": "Выберите пользователя",
"context_user_pick": "Добавить пользователя",
"context_user_picked": "Пользователь, вызывающий события",
"context_users": "Ограничить событиями, вызванными",
"event_data": "Данные события",
@@ -1312,22 +1311,6 @@
"only_editable": "Доступны для редактирования только автоматизации из automations.yaml.",
"pick_automation": "Выберите автоматизацию для редактирования",
"show_info_automation": "Показать информацию об автоматизации"
},
"thingtalk": {
"create": "Создать автоматизацию",
"link_devices": {
"ambiguous_entities": "Одно или несколько устройств имеют более одного совпадающего объекта, выберите то, которое Вы хотите использовать.",
"header": "Прекрасно! Теперь нам нужно связать некоторые устройства",
"unknown_placeholder": "Неизвестный заполнитель"
},
"task_selection": {
"error_empty": "Введите текст автоматизации или нажмите \"Пропустить\".",
"error_unsupported": "Мы не могли создать для этого автоматизацию (пока?).",
"for_example": "Например:",
"header": "Новая автоматизация",
"introduction": "Введите ниже, что должна делать эта автоматизация, и мы попытаемся преобразовать текст в автоматизацию Home Assistant.",
"language_note": "Примечание: пока поддерживается только английский язык."
}
}
},
"cloud": {
@@ -3319,9 +3302,6 @@
"header": "Вибрация"
}
},
"shopping_list": {
"start_conversation": "Начать диалог"
},
"shopping-list": {
"add_item": "Добавить элемент",
"clear_completed": "Очистить завершенные",
+2 -30
View File
@@ -520,7 +520,6 @@
"previous": "Prejšnji",
"refresh": "Osveži",
"save": "Shrani",
"skip": "Preskoči",
"successfully_deleted": "Uspešno odstranjeno",
"successfully_saved": "Shranjeno",
"undo": "Razveljavi",
@@ -1312,14 +1311,6 @@
"only_editable": "Urejajo se lahko samo avtomatizacije, definirane v automations.yaml.",
"pick_automation": "Izberite avtomatizacijo za urejanje",
"show_info_automation": "Prikaži informacije o avtomatizaciji"
},
"thingtalk": {
"create": "Ustvari avtomatizacijo",
"task_selection": {
"error_empty": "Vnesite ukaz ali tapnite preskoči.",
"for_example": "Na primer:",
"header": "Ustvari novo avtomatizacijo"
}
}
},
"cloud": {
@@ -1931,15 +1922,8 @@
"network_status": {
"details": {
"driverallnodesqueried": "Poizvedena so bila vsa vozlišča",
"driverfailed": "Povezava s krmilnikom Z-Wave ni uspela",
"driverready": "Inicializacija krmilnika Z-Wave",
"driverremoved": "Gonilnik je odstranjen",
"driverreset": "Gonilnik je bil ponastavljen",
"offline": "OZWDaemon nedosegljiv",
"ready": "Pripravljen za povezavo",
"started": "Povezan z MQTT",
"starting": "Povezovanje z MQTT",
"stopped": "Omrežje Z-Wave ustavljen"
"starting": "Povezovanje z MQTT"
},
"offline": "Brez povezave",
"online": "Povezan",
@@ -1952,9 +1936,7 @@
"node_count": "{count} vozlišč"
},
"node_config": {
"header": "Konfiguracija vozlišča",
"help_source": "Opisi konfiguracijskih parametrov in besedilo pomoči zagotavlja projekt OpenZWave.",
"introduction": "Upravljajte različne konfiguracijske parametre za vozlišče Z-Wave."
"header": "Konfiguracija vozlišča"
},
"node_metadata": {
"product_manual": "Priročnik za izdelek"
@@ -1970,8 +1952,6 @@
"not_found": "Vozlišča ni mogoče najti"
},
"nodes_table": {
"failed": "Neuspešno",
"id": "ID",
"manufacturer": "Proizvajalec",
"model": "Model",
"zwave_plus": "Z-Wave Plus"
@@ -2671,7 +2651,6 @@
"button": "Gumb",
"buttons": "Gumbi",
"call-service": "Kliči Storitev",
"cast": "Zasedba",
"conditional": "Pogojno",
"divider": "Razdelilnik",
"section": "Sekcija",
@@ -2748,10 +2727,6 @@
"description": "Kartica Glance je uporabna za združevanje več senzorjev v kompaktnem pregledu.",
"name": "Pregled"
},
"grid": {
"description": "Kartica Mreža omogoča prikaz več kartic v mreži.",
"name": "Mreža"
},
"history-graph": {
"description": "Kartica Zgodovinski grafikon omogoča prikaz grafa za vsako od naštetih entitet.",
"name": "Graf zgodovine"
@@ -3291,9 +3266,6 @@
"header": "Vibriraj"
}
},
"shopping_list": {
"start_conversation": "Začni pogovor"
},
"shopping-list": {
"add_item": "Dodaj potrebščino",
"clear_completed": "Počisti dokončane",
+1 -21
View File
@@ -520,7 +520,6 @@
"previous": "上一步",
"refresh": "刷新",
"save": "保存",
"skip": "跳过",
"successfully_deleted": "已成功删除",
"successfully_saved": "保存成功",
"undo": "撤消",
@@ -1213,7 +1212,7 @@
"trigger": "触发条件"
},
"event": {
"context_user_pick": "选择用户",
"context_user_pick": "添加用户",
"context_user_picked": "用户触发事件",
"context_users": "仅限以下用户触发事件",
"event_data": "事件数据",
@@ -1312,22 +1311,6 @@
"only_editable": "只能编辑 automations.yaml 中的自动化。",
"pick_automation": "选择要编辑的自动化",
"show_info_automation": "显示有关自动化的信息"
},
"thingtalk": {
"create": "创建自动化",
"link_devices": {
"ambiguous_entities": "有些设备有多个匹配的实体,请选择要使用的实体。",
"header": "很好!现在我们需要链接设备",
"unknown_placeholder": "未知占位符"
},
"task_selection": {
"error_empty": "请输入命令或点击“跳过”。",
"error_unsupported": "目前无法创建这样的自动化。",
"for_example": "例如:",
"header": "创建新的自动化",
"introduction": "请在下方输入这个自动化要实现什么功能,Home Assistant 会尝试将其转换为自动化。",
"language_note": "注意:目前只支持英文。"
}
}
},
"cloud": {
@@ -3319,9 +3302,6 @@
"header": "振动"
}
},
"shopping_list": {
"start_conversation": "开始对话"
},
"shopping-list": {
"add_item": "添加项目",
"clear_completed": "清除已完成项目",
+1 -25
View File
@@ -520,7 +520,6 @@
"previous": "上一步",
"refresh": "更新",
"save": "儲存",
"skip": "略過",
"successfully_deleted": "成功刪除",
"successfully_saved": "成功儲存",
"undo": "撤消",
@@ -1213,7 +1212,7 @@
"trigger": "觸發自動化"
},
"event": {
"context_user_pick": "選擇用戶",
"context_user_pick": "新增用戶",
"context_user_picked": "用戶觸發事件",
"context_users": "限制觸發事件",
"event_data": "事件資料",
@@ -1312,22 +1311,6 @@
"only_editable": "僅有於 automations.yaml 內定義的自動化、方能進行編輯。",
"pick_automation": "選擇欲編輯的自動化",
"show_info_automation": "顯示關於自動化資訊"
},
"thingtalk": {
"create": "新增自動化",
"link_devices": {
"ambiguous_entities": "相符的實體具有一個以上的實體,請選擇所要使用的實體。",
"header": "太好了!現在我們需要連結一些設備",
"unknown_placeholder": "未知 Placeholder"
},
"task_selection": {
"error_empty": "輸入命令或點選忽略。",
"error_unsupported": "(尚)無法為此新增自動化。",
"for_example": "範例;",
"header": "新增自動化",
"introduction": "於下方輸入自動化內容,Home Assistant 將會試著將其轉換成自動化。",
"language_note": "注意:目前僅支援英文。"
}
}
},
"cloud": {
@@ -2776,10 +2759,6 @@
"description": "簡略式面板以緊致群組方式顯示多個傳感器狀態。",
"name": "簡略式面板"
},
"grid": {
"description": "方格排列面板可於方格內顯示多個面板。",
"name": "方格排列面板"
},
"history-graph": {
"description": "歷史圖表式面板可供顯示每個列表實體圖表。",
"name": "歷史圖表式面板"
@@ -3319,9 +3298,6 @@
"header": "震動"
}
},
"shopping_list": {
"start_conversation": "開始對話"
},
"shopping-list": {
"add_item": "新加入清單",
"clear_completed": "清理完成",
+13
View File
@@ -8608,6 +8608,14 @@ [email protected], lit-element@^2.0.0, lit-element@^2.2.1, lit-element@^2.3.0, l
dependencies:
lit-html "^1.1.1"
lit-grid-layout@^1.1.11:
version "1.1.11"
resolved "https://registry.yarnpkg.com/lit-grid-layout/-/lit-grid-layout-1.1.11.tgz#0eb160ac61fcd25fd1929963776ff5d2df051320"
integrity sha512-NSI7QuLllKvjrQEYdAFOv8Ucznu3TWDtxxroyDcv8Qv/zsjkuAJDK/bQjjuDSw/x7yy3NVn/c1I864fSUb47Rw==
dependencies:
lit-element "^2.4.0"
lit-html "^1.3.0"
[email protected], lit-html@^1.0.0, lit-html@^1.1.1, lit-html@^1.1.2, lit-html@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/lit-html/-/lit-html-1.3.0.tgz#c80f3cc5793a6dea6c07172be90a70ab20e56034"
@@ -12583,6 +12591,11 @@ uuid@^3.4.0:
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
uuid@^8.3.0:
version "8.3.0"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.0.tgz#ab738085ca22dc9a8c92725e459b1d507df5d6ea"
integrity sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==
v8-compile-cache@^2.0.3:
version "2.1.0"
resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e"