mirror of
https://github.com/home-assistant/frontend.git
synced 2026-08-17 03:49:46 +00:00
Compare commits
44
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2fef57f0b2 | ||
|
|
9b279632f8 | ||
|
|
480e781364 | ||
|
|
adc10ff0c6 | ||
|
|
57a718e409 | ||
|
|
23462bacfa | ||
|
|
d99f8b0da8 | ||
|
|
991d1f0997 | ||
|
|
54e99357b5 | ||
|
|
d263b5550a | ||
|
|
a2b6ce3437 | ||
|
|
9458f7ae62 | ||
|
|
4d2ae36b0d | ||
|
|
ebf0050e81 | ||
|
|
3d0f492d62 | ||
|
|
f5d3237b06 | ||
|
|
07671ba1d4 | ||
|
|
354d74ce1d | ||
|
|
e892d14af0 | ||
|
|
8d034fb7e7 | ||
|
|
249456e6a0 | ||
|
|
d3a6f31310 | ||
|
|
4c31aead8b | ||
|
|
3caf91c5d3 | ||
|
|
9c3e754d53 | ||
|
|
f48765c2b6 | ||
|
|
236f26e652 | ||
|
|
0fed96aba3 | ||
|
|
70b77833f1 | ||
|
|
307694a820 | ||
|
|
402391c3e1 | ||
|
|
81b5866e4d | ||
|
|
09985bf5f7 | ||
|
|
71d12a9e7a | ||
|
|
5fd733b6c9 | ||
|
|
bc3f827b4a | ||
|
|
a807a182e4 | ||
|
|
0a1fb843ca | ||
|
|
fceb1568f5 | ||
|
|
74e93bbefc | ||
|
|
5c0f4b564b | ||
|
|
76734f7a0b | ||
|
|
440d10e4cd | ||
|
|
a901072695 |
@@ -35,6 +35,9 @@ const createWebpackConfig = ({
|
||||
loader: "babel-loader",
|
||||
options: bundle.babelOptions({ latestBuild }),
|
||||
},
|
||||
resolve: {
|
||||
fullySpecified: false,
|
||||
},
|
||||
},
|
||||
{
|
||||
test: /\.css$/,
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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"
|
||||
],
|
||||
|
||||
@@ -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 }
|
||||
);
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 })}
|
||||
>
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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,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 couldn’t 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",
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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é",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": "Καθαρισμός Ολοκληρώθηκε",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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 מופעל עבור הממשק.",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -2600,10 +2600,6 @@
|
||||
"description": "한눈에 보기 카드는 여러 센서를 간단한 개요로 그룹화하는 데 유용합니다.",
|
||||
"name": "한눈에 보기"
|
||||
},
|
||||
"grid": {
|
||||
"description": "격자 모아보기 카드를 사용하면 한 격자에 여러 카드를 표시할 수 있습니다.",
|
||||
"name": "격자 모아보기"
|
||||
},
|
||||
"history-graph": {
|
||||
"description": "기록 그래프 카드를 사용하면 나열된 각 구성요소에 대한 그래프를 표시할 수 있습니다.",
|
||||
"name": "기록 그래프"
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": "Очистить завершенные",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": "清除已完成项目",
|
||||
|
||||
@@ -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": "清理完成",
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user