Compare commits

...

15 Commits

Author SHA1 Message Date
Bram Kragten
d19acf17c2 Merge pull request #5826 from home-assistant/dev 2020-05-09 21:17:30 +02:00
Bram Kragten
1a0bf861ee Bumped version to 20200509.0 2020-05-09 21:01:00 +02:00
Bram Kragten
db906ad4d0 Bump material (#5812) 2020-05-09 20:59:53 +02:00
Bram Kragten
75ed0f2f99 Fix translation download and add empty languages (#5824) 2020-05-09 20:59:34 +02:00
Bram Kragten
29ed1144d5 Simplify custom icon set, return only 1 icon per call (#5822) 2020-05-09 20:59:02 +02:00
Erik Montnemery
d10be4ef2d Show cover position slider if cover supports it (#5815) 2020-05-08 22:59:20 +02:00
Joakim Sørensen
7f66d5b8e9 Change target to currentTarget for the click event (#5816) 2020-05-08 16:31:07 -04:00
Bram Kragten
0c8cd680c2 Allow custom icon sets (#5794) 2020-05-08 21:56:25 +02:00
Maciej Bieniek
a7ba1977b4 Add translation for and word on the integration card (#5811)
* Add translation for and word on tje integration card

* Move and to ui.common
2020-05-08 17:43:21 +02:00
Bram Kragten
a960b39235 Bump lit-element and lit-html (#5810) 2020-05-08 14:00:09 +02:00
Bram Kragten
3febf059ec Codesplit Supervisor panel icons (#5809) 2020-05-08 13:10:24 +02:00
Paulus Schoutsen
20203f7bdb Bump home-assistant-js-websocket to 5.1.2 2020-05-07 18:35:14 -07:00
Franck Nijhof
a399d76d06 Add new core configuration UI for external_url & internal_url (#5755) 2020-05-07 18:32:03 -07:00
Franck Nijhof
1ca097c5a0 Add issue_tracker integration manifest property (#5744) 2020-05-07 20:51:46 -04:00
Bram Kragten
ae6243b7bf Merge pull request #5757 from home-assistant/dev 2020-05-05 17:38:14 +02:00
119 changed files with 4744 additions and 1721 deletions

View File

@@ -1,9 +1,14 @@
const del = require("del"); const del = require("del");
const gulp = require("gulp"); const gulp = require("gulp");
const fs = require("fs");
const mapStream = require("map-stream"); const mapStream = require("map-stream");
const inDir = "translations/frontend"; const inDirFrontend = "translations/frontend";
const downloadDir = inDir + "/downloads"; const inDirBackend = "translations/backend";
const downloadDir = "translations/downloads";
const srcMeta = "src/translations/translationMetadata.json";
const encoding = "utf8";
const tasks = []; const tasks = [];
@@ -53,9 +58,25 @@ gulp.task(taskName, function () {
}); });
tasks.push(taskName); tasks.push(taskName);
taskName = "check-all-files-exist";
gulp.task(taskName, function () {
const file = fs.readFileSync(srcMeta, { encoding });
const meta = JSON.parse(file);
Object.keys(meta).forEach((lang) => {
if (!fs.existsSync(`${inDirFrontend}/${lang}.json`)) {
fs.writeFileSync(`${inDirFrontend}/${lang}.json`, JSON.stringify({}));
}
if (!fs.existsSync(`${inDirBackend}/${lang}.json`)) {
fs.writeFileSync(`${inDirBackend}/${lang}.json`, JSON.stringify({}));
}
});
return Promise.resolve();
});
tasks.push(taskName);
taskName = "move-downloaded-translations"; taskName = "move-downloaded-translations";
gulp.task(taskName, function () { gulp.task(taskName, function () {
return gulp.src(`${downloadDir}/*.json`).pipe(gulp.dest(inDir)); return gulp.src(`${downloadDir}/*.json`).pipe(gulp.dest(inDirFrontend));
}); });
tasks.push(taskName); tasks.push(taskName);
@@ -65,6 +86,7 @@ gulp.task(
gulp.series( gulp.series(
"check-translations-html", "check-translations-html",
"move-downloaded-translations", "move-downloaded-translations",
"check-all-files-exist",
"clean-downloaded-translations" "clean-downloaded-translations"
) )
); );

View File

@@ -1,4 +1,4 @@
import "@polymer/paper-card/paper-card"; import { mdiArrowUpBoldCircle, mdiPuzzle } from "@mdi/js";
import { import {
css, css,
CSSResultArray, CSSResultArray,
@@ -10,6 +10,7 @@ import {
import memoizeOne from "memoize-one"; import memoizeOne from "memoize-one";
import { atLeastVersion } from "../../../src/common/config/version"; import { atLeastVersion } from "../../../src/common/config/version";
import { navigate } from "../../../src/common/navigate"; import { navigate } from "../../../src/common/navigate";
import "../../../src/components/ha-card";
import { import {
HassioAddonInfo, HassioAddonInfo,
HassioAddonRepository, HassioAddonRepository,
@@ -66,7 +67,7 @@ class HassioAddonRepositoryEl extends LitElement {
<div class="card-group"> <div class="card-group">
${addons.map( ${addons.map(
(addon) => html` (addon) => html`
<paper-card <ha-card
.addon=${addon} .addon=${addon}
class=${addon.available ? "" : "not_available"} class=${addon.available ? "" : "not_available"}
@click=${this._addonTapped} @click=${this._addonTapped}
@@ -78,8 +79,8 @@ class HassioAddonRepositoryEl extends LitElement {
.description=${addon.description} .description=${addon.description}
.available=${addon.available} .available=${addon.available}
.icon=${addon.installed && addon.installed !== addon.version .icon=${addon.installed && addon.installed !== addon.version
? "hassio:arrow-up-bold-circle" ? mdiArrowUpBoldCircle
: "hassio:puzzle"} : mdiPuzzle}
.iconTitle=${addon.installed .iconTitle=${addon.installed
? addon.installed !== addon.version ? addon.installed !== addon.version
? "New version available" ? "New version available"
@@ -111,7 +112,7 @@ class HassioAddonRepositoryEl extends LitElement {
: ""} : ""}
></hassio-card-content> ></hassio-card-content>
</div> </div>
</paper-card> </ha-card>
` `
)} )}
</div> </div>
@@ -127,7 +128,7 @@ class HassioAddonRepositoryEl extends LitElement {
return [ return [
hassioStyle, hassioStyle,
css` css`
paper-card { ha-card {
cursor: pointer; cursor: pointer;
} }
.not_available { .not_available {

View File

@@ -1,3 +1,6 @@
import "@material/mwc-icon-button/mwc-icon-button";
import "@material/mwc-list/mwc-list-item";
import { mdiDotsVertical } from "@mdi/js";
import { import {
css, css,
CSSResult, CSSResult,
@@ -6,22 +9,21 @@ import {
PropertyValues, PropertyValues,
} from "lit-element"; } from "lit-element";
import { html, TemplateResult } from "lit-html"; import { html, TemplateResult } from "lit-html";
import "../../../src/common/search/search-input";
import "../../../src/components/ha-button-menu";
import "../../../src/components/ha-svg-icon";
import { import {
fetchHassioAddonsInfo, fetchHassioAddonsInfo,
HassioAddonInfo, HassioAddonInfo,
HassioAddonRepository, HassioAddonRepository,
reloadHassioAddons, reloadHassioAddons,
} from "../../../src/data/hassio/addon"; } from "../../../src/data/hassio/addon";
import "../../../src/components/ha-icon-button";
import "../../../src/layouts/loading-screen";
import "../../../src/layouts/hass-tabs-subpage"; import "../../../src/layouts/hass-tabs-subpage";
import "../../../src/layouts/loading-screen";
import { HomeAssistant, Route } from "../../../src/types"; import { HomeAssistant, Route } from "../../../src/types";
import "../../../src/common/search/search-input";
import "./hassio-addon-repository";
import { supervisorTabs } from "../hassio-panel";
import { showRepositoriesDialog } from "../dialogs/repositories/show-dialog-repositories"; import { showRepositoriesDialog } from "../dialogs/repositories/show-dialog-repositories";
import { supervisorTabs } from "../hassio-panel";
import "./hassio-addon-repository";
const sortRepos = (a: HassioAddonRepository, b: HassioAddonRepository) => { const sortRepos = (a: HassioAddonRepository, b: HassioAddonRepository) => {
if (a.slug === "local") { if (a.slug === "local") {
@@ -94,27 +96,17 @@ class HassioAddonStore extends LitElement {
.tabs=${supervisorTabs} .tabs=${supervisorTabs}
> >
<span slot="header">Add-on store</span> <span slot="header">Add-on store</span>
<paper-menu-button <ha-button-menu corner="BOTTOM_START" slot="toolbar-icon">
close-on-activate <mwc-icon-button slot="trigger" alt="menu">
no-animations <ha-svg-icon path=${mdiDotsVertical}></ha-svg-icon>
horizontal-align="right" </mwc-icon-button>
horizontal-offset="-5" <mwc-list-item @tap=${this._manageRepositories}>
slot="toolbar-icon" Repositories
> </mwc-list-item>
<ha-icon-button <mwc-list-item @tap=${this.refreshData}>
icon="hassio:dots-vertical" Reload
slot="dropdown-trigger" </mwc-list-item>
alt="menu" </ha-button-menu>
></ha-icon-button>
<paper-listbox slot="dropdown-content" role="listbox">
<paper-item @tap=${this._manageRepositories}>
Repositories
</paper-item>
<paper-item @tap=${this.refreshData}>
Reload
</paper-item>
</paper-listbox>
</paper-menu-button>
${repos.length === 0 ${repos.length === 0
? html`<loading-screen></loading-screen>` ? html`<loading-screen></loading-screen>`
: html` : html`

View File

@@ -1,5 +1,4 @@
import "@material/mwc-button"; import "@material/mwc-button";
import "@polymer/paper-card/paper-card";
import "@polymer/paper-dropdown-menu/paper-dropdown-menu"; import "@polymer/paper-dropdown-menu/paper-dropdown-menu";
import "@polymer/paper-item/paper-item"; import "@polymer/paper-item/paper-item";
import "@polymer/paper-listbox/paper-listbox"; import "@polymer/paper-listbox/paper-listbox";
@@ -14,6 +13,7 @@ import {
TemplateResult, TemplateResult,
} from "lit-element"; } from "lit-element";
import "web-animations-js/web-animations-next-lite.min"; import "web-animations-js/web-animations-next-lite.min";
import "../../../../src/components/ha-card";
import { import {
HassioAddonDetails, HassioAddonDetails,
HassioAddonSetOptionParams, HassioAddonSetOptionParams,
@@ -23,9 +23,9 @@ import {
fetchHassioHardwareAudio, fetchHassioHardwareAudio,
HassioHardwareAudioDevice, HassioHardwareAudioDevice,
} from "../../../../src/data/hassio/hardware"; } from "../../../../src/data/hassio/hardware";
import { suggestAddonRestart } from "../../dialogs/suggestAddonRestart";
import { haStyle } from "../../../../src/resources/styles"; import { haStyle } from "../../../../src/resources/styles";
import { HomeAssistant } from "../../../../src/types"; import { HomeAssistant } from "../../../../src/types";
import { suggestAddonRestart } from "../../dialogs/suggestAddonRestart";
import { hassioStyle } from "../../resources/hassio-style"; import { hassioStyle } from "../../resources/hassio-style";
@customElement("hassio-addon-audio") @customElement("hassio-addon-audio")
@@ -46,7 +46,7 @@ class HassioAddonAudio extends LitElement {
protected render(): TemplateResult { protected render(): TemplateResult {
return html` return html`
<paper-card heading="Audio"> <ha-card header="Audio">
<div class="card-content"> <div class="card-content">
${this._error ? html` <div class="errors">${this._error}</div> ` : ""} ${this._error ? html` <div class="errors">${this._error}</div> ` : ""}
@@ -92,7 +92,7 @@ class HassioAddonAudio extends LitElement {
<div class="card-actions"> <div class="card-actions">
<mwc-button @click=${this._saveSettings}>Save</mwc-button> <mwc-button @click=${this._saveSettings}>Save</mwc-button>
</div> </div>
</paper-card> </ha-card>
`; `;
} }
@@ -102,7 +102,7 @@ class HassioAddonAudio extends LitElement {
hassioStyle, hassioStyle,
css` css`
:host, :host,
paper-card, ha-card,
paper-dropdown-menu { paper-dropdown-menu {
display: block; display: block;
} }

View File

@@ -8,12 +8,10 @@ import {
property, property,
TemplateResult, TemplateResult,
} from "lit-element"; } from "lit-element";
import { HomeAssistant } from "../../../../src/types";
import { HassioAddonDetails } from "../../../../src/data/hassio/addon"; import { HassioAddonDetails } from "../../../../src/data/hassio/addon";
import { hassioStyle } from "../../resources/hassio-style";
import { haStyle } from "../../../../src/resources/styles"; import { haStyle } from "../../../../src/resources/styles";
import { HomeAssistant } from "../../../../src/types";
import { hassioStyle } from "../../resources/hassio-style";
import "./hassio-addon-audio"; import "./hassio-addon-audio";
import "./hassio-addon-config"; import "./hassio-addon-config";
import "./hassio-addon-network"; import "./hassio-addon-network";

View File

@@ -1,6 +1,5 @@
import "@material/mwc-button"; import "@material/mwc-button";
import "@polymer/iron-autogrow-textarea/iron-autogrow-textarea"; import "@polymer/iron-autogrow-textarea/iron-autogrow-textarea";
import "@polymer/paper-card/paper-card";
import { import {
css, css,
CSSResult, CSSResult,
@@ -13,6 +12,7 @@ import {
TemplateResult, TemplateResult,
} from "lit-element"; } from "lit-element";
import { fireEvent } from "../../../../src/common/dom/fire_event"; import { fireEvent } from "../../../../src/common/dom/fire_event";
import "../../../../src/components/ha-card";
import "../../../../src/components/ha-yaml-editor"; import "../../../../src/components/ha-yaml-editor";
import type { HaYamlEditor } from "../../../../src/components/ha-yaml-editor"; import type { HaYamlEditor } from "../../../../src/components/ha-yaml-editor";
import { import {
@@ -23,9 +23,8 @@ import {
import { showConfirmationDialog } from "../../../../src/dialogs/generic/show-dialog-box"; import { showConfirmationDialog } from "../../../../src/dialogs/generic/show-dialog-box";
import { haStyle } from "../../../../src/resources/styles"; import { haStyle } from "../../../../src/resources/styles";
import type { HomeAssistant } from "../../../../src/types"; import type { HomeAssistant } from "../../../../src/types";
import { hassioStyle } from "../../resources/hassio-style";
import { suggestAddonRestart } from "../../dialogs/suggestAddonRestart"; import { suggestAddonRestart } from "../../dialogs/suggestAddonRestart";
import { hassioStyle } from "../../resources/hassio-style";
@customElement("hassio-addon-config") @customElement("hassio-addon-config")
class HassioAddonConfig extends LitElement { class HassioAddonConfig extends LitElement {
@@ -46,7 +45,7 @@ class HassioAddonConfig extends LitElement {
return html` return html`
<h1>${this.addon.name}</h1> <h1>${this.addon.name}</h1>
<paper-card heading="Configuration"> <ha-card header="Configuration">
<div class="card-content"> <div class="card-content">
<ha-yaml-editor <ha-yaml-editor
@value-changed=${this._configChanged} @value-changed=${this._configChanged}
@@ -65,7 +64,7 @@ class HassioAddonConfig extends LitElement {
Save Save
</mwc-button> </mwc-button>
</div> </div>
</paper-card> </ha-card>
`; `;
} }
@@ -77,7 +76,7 @@ class HassioAddonConfig extends LitElement {
:host { :host {
display: block; display: block;
} }
paper-card { ha-card {
display: block; display: block;
} }
.card-actions { .card-actions {

View File

@@ -1,4 +1,3 @@
import "@polymer/paper-card/paper-card";
import { PaperInputElement } from "@polymer/paper-input/paper-input"; import { PaperInputElement } from "@polymer/paper-input/paper-input";
import { import {
css, css,
@@ -11,15 +10,15 @@ import {
TemplateResult, TemplateResult,
} from "lit-element"; } from "lit-element";
import { fireEvent } from "../../../../src/common/dom/fire_event"; import { fireEvent } from "../../../../src/common/dom/fire_event";
import "../../../../src/components/ha-card";
import { import {
HassioAddonDetails, HassioAddonDetails,
HassioAddonSetOptionParams, HassioAddonSetOptionParams,
setHassioAddonOption, setHassioAddonOption,
} from "../../../../src/data/hassio/addon"; } from "../../../../src/data/hassio/addon";
import { suggestAddonRestart } from "../../dialogs/suggestAddonRestart";
import { haStyle } from "../../../../src/resources/styles"; import { haStyle } from "../../../../src/resources/styles";
import { HomeAssistant } from "../../../../src/types"; import { HomeAssistant } from "../../../../src/types";
import { suggestAddonRestart } from "../../dialogs/suggestAddonRestart";
import { hassioStyle } from "../../resources/hassio-style"; import { hassioStyle } from "../../resources/hassio-style";
interface NetworkItem { interface NetworkItem {
@@ -53,7 +52,7 @@ class HassioAddonNetwork extends LitElement {
} }
return html` return html`
<paper-card heading="Network"> <ha-card header="Network">
<div class="card-content"> <div class="card-content">
${this._error ? html` <div class="errors">${this._error}</div> ` : ""} ${this._error ? html` <div class="errors">${this._error}</div> ` : ""}
@@ -90,7 +89,7 @@ class HassioAddonNetwork extends LitElement {
</mwc-button> </mwc-button>
<mwc-button @click=${this._saveTapped}>Save</mwc-button> <mwc-button @click=${this._saveTapped}>Save</mwc-button>
</div> </div>
</paper-card> </ha-card>
`; `;
} }
@@ -102,7 +101,7 @@ class HassioAddonNetwork extends LitElement {
:host { :host {
display: block; display: block;
} }
paper-card { ha-card {
display: block; display: block;
} }
.errors { .errors {

View File

@@ -1,5 +1,4 @@
import "@polymer/paper-spinner/paper-spinner-lite"; import "@polymer/paper-spinner/paper-spinner-lite";
import "@polymer/paper-card/paper-card";
import { import {
css, css,
CSSResult, CSSResult,
@@ -9,16 +8,15 @@ import {
property, property,
TemplateResult, TemplateResult,
} from "lit-element"; } from "lit-element";
import { HomeAssistant } from "../../../../src/types";
import {
HassioAddonDetails,
fetchHassioAddonDocumentation,
} from "../../../../src/data/hassio/addon";
import "../../../../src/components/ha-markdown"; import "../../../../src/components/ha-markdown";
import {
fetchHassioAddonDocumentation,
HassioAddonDetails,
} from "../../../../src/data/hassio/addon";
import "../../../../src/layouts/loading-screen"; import "../../../../src/layouts/loading-screen";
import { hassioStyle } from "../../resources/hassio-style";
import { haStyle } from "../../../../src/resources/styles"; import { haStyle } from "../../../../src/resources/styles";
import { HomeAssistant } from "../../../../src/types";
import { hassioStyle } from "../../resources/hassio-style";
@customElement("hassio-addon-documentation-tab") @customElement("hassio-addon-documentation-tab")
class HassioAddonDocumentationDashboard extends LitElement { class HassioAddonDocumentationDashboard extends LitElement {
@@ -41,14 +39,14 @@ class HassioAddonDocumentationDashboard extends LitElement {
} }
return html` return html`
<div class="content"> <div class="content">
<paper-card> <ha-card>
${this._error ? html` <div class="errors">${this._error}</div> ` : ""} ${this._error ? html` <div class="errors">${this._error}</div> ` : ""}
<div class="card-content"> <div class="card-content">
${this._content ${this._content
? html`<ha-markdown .content=${this._content}></ha-markdown>` ? html`<ha-markdown .content=${this._content}></ha-markdown>`
: html`<loading-screen></loading-screen>`} : html`<loading-screen></loading-screen>`}
</div> </div>
</paper-card> </ha-card>
</div> </div>
`; `;
} }
@@ -58,7 +56,7 @@ class HassioAddonDocumentationDashboard extends LitElement {
haStyle, haStyle,
hassioStyle, hassioStyle,
css` css`
paper-card { ha-card {
display: block; display: block;
} }
.content { .content {

View File

@@ -1,4 +1,9 @@
import "../../../src/components/ha-icon-button"; import {
mdiCogs,
mdiFileDocument,
mdiInformationVariant,
mdiMathLog,
} from "@mdi/js";
import "@polymer/paper-spinner/paper-spinner-lite"; import "@polymer/paper-spinner/paper-spinner-lite";
import { import {
css, css,
@@ -14,18 +19,17 @@ import {
fetchHassioAddonInfo, fetchHassioAddonInfo,
HassioAddonDetails, HassioAddonDetails,
} from "../../../src/data/hassio/addon"; } from "../../../src/data/hassio/addon";
import "../../../src/layouts/hass-tabs-subpage";
import type { PageNavigation } from "../../../src/layouts/hass-tabs-subpage";
import { haStyle } from "../../../src/resources/styles"; import { haStyle } from "../../../src/resources/styles";
import { HomeAssistant, Route } from "../../../src/types"; import { HomeAssistant, Route } from "../../../src/types";
import { hassioStyle } from "../resources/hassio-style"; import { hassioStyle } from "../resources/hassio-style";
import "./config/hassio-addon-audio"; import "./config/hassio-addon-audio";
import "./config/hassio-addon-config"; import "./config/hassio-addon-config";
import "./config/hassio-addon-network";
import "./hassio-addon-router";
import "./info/hassio-addon-info"; import "./info/hassio-addon-info";
import "./log/hassio-addon-logs"; import "./log/hassio-addon-logs";
import "./config/hassio-addon-network";
import type { PageNavigation } from "../../../src/layouts/hass-tabs-subpage";
import "../../../src/layouts/hass-tabs-subpage";
import "./hassio-addon-router";
@customElement("hassio-addon-dashboard") @customElement("hassio-addon-dashboard")
class HassioAddonDashboard extends LitElement { class HassioAddonDashboard extends LitElement {
@@ -59,7 +63,7 @@ class HassioAddonDashboard extends LitElement {
{ {
name: "Info", name: "Info",
path: `/hassio/addon/${this.addon.slug}/info`, path: `/hassio/addon/${this.addon.slug}/info`,
icon: "hassio:information-variant", iconPath: mdiInformationVariant,
}, },
]; ];
@@ -67,7 +71,7 @@ class HassioAddonDashboard extends LitElement {
addonTabs.push({ addonTabs.push({
name: "Documentation", name: "Documentation",
path: `/hassio/addon/${this.addon.slug}/documentation`, path: `/hassio/addon/${this.addon.slug}/documentation`,
icon: "hassio:file-document", iconPath: mdiFileDocument,
}); });
} }
@@ -76,12 +80,12 @@ class HassioAddonDashboard extends LitElement {
{ {
name: "Configuration", name: "Configuration",
path: `/hassio/addon/${this.addon.slug}/config`, path: `/hassio/addon/${this.addon.slug}/config`,
icon: "hassio:cogs", iconPath: mdiCogs,
}, },
{ {
name: "Log", name: "Log",
path: `/hassio/addon/${this.addon.slug}/logs`, path: `/hassio/addon/${this.addon.slug}/logs`,
icon: "hassio:math-log", iconPath: mdiMathLog,
} }
); );
} }
@@ -115,7 +119,6 @@ class HassioAddonDashboard extends LitElement {
css` css`
:host { :host {
color: var(--primary-text-color); color: var(--primary-text-color);
--paper-card-header-color: var(--primary-text-color);
} }
.content { .content {
padding: 24px 0 32px; padding: 24px 0 32px;

View File

@@ -1,15 +1,15 @@
import { customElement, property } from "lit-element";
import { HassioAddonDetails } from "../../../src/data/hassio/addon";
import { import {
HassRouterPage, HassRouterPage,
RouterOptions, RouterOptions,
} from "../../../src/layouts/hass-router-page"; } from "../../../src/layouts/hass-router-page";
import { customElement, property } from "lit-element";
import { HomeAssistant } from "../../../src/types"; import { HomeAssistant } from "../../../src/types";
import "./config/hassio-addon-config-tab";
import "./documentation/hassio-addon-documentation-tab";
// Don't codesplit the others, because it breaks the UI when pushed to a Pi // Don't codesplit the others, because it breaks the UI when pushed to a Pi
import "./info/hassio-addon-info-tab"; import "./info/hassio-addon-info-tab";
import "./config/hassio-addon-config-tab";
import "./log/hassio-addon-log-tab"; import "./log/hassio-addon-log-tab";
import "./documentation/hassio-addon-documentation-tab";
import { HassioAddonDetails } from "../../../src/data/hassio/addon";
@customElement("hassio-addon-router") @customElement("hassio-addon-router")
class HassioAddonRouter extends HassRouterPage { class HassioAddonRouter extends HassRouterPage {

View File

@@ -8,12 +8,10 @@ import {
property, property,
TemplateResult, TemplateResult,
} from "lit-element"; } from "lit-element";
import { HomeAssistant } from "../../../../src/types";
import { HassioAddonDetails } from "../../../../src/data/hassio/addon"; import { HassioAddonDetails } from "../../../../src/data/hassio/addon";
import { hassioStyle } from "../../resources/hassio-style";
import { haStyle } from "../../../../src/resources/styles"; import { haStyle } from "../../../../src/resources/styles";
import { HomeAssistant } from "../../../../src/types";
import { hassioStyle } from "../../resources/hassio-style";
import "./hassio-addon-info"; import "./hassio-addon-info";
@customElement("hassio-addon-info-tab") @customElement("hassio-addon-info-tab")

View File

@@ -1,5 +1,20 @@
import "@material/mwc-button"; import "@material/mwc-button";
import "@polymer/paper-card/paper-card"; import {
mdiArrowUpBoldCircle,
mdiCheckCircle,
mdiChip,
mdiCircle,
mdiCursorDefaultClickOutline,
mdiDocker,
mdiExclamationThick,
mdiFlask,
mdiHomeAssistant,
mdiInformation,
mdiKey,
mdiNetwork,
mdiPound,
mdiShield,
} from "@mdi/js";
import "@polymer/paper-tooltip/paper-tooltip"; import "@polymer/paper-tooltip/paper-tooltip";
import { import {
css, css,
@@ -16,10 +31,11 @@ import { fireEvent } from "../../../../src/common/dom/fire_event";
import { navigate } from "../../../../src/common/navigate"; import { navigate } from "../../../../src/common/navigate";
import "../../../../src/components/buttons/ha-call-api-button"; import "../../../../src/components/buttons/ha-call-api-button";
import "../../../../src/components/buttons/ha-progress-button"; import "../../../../src/components/buttons/ha-progress-button";
import "../../../../src/components/ha-card";
import "../../../../src/components/ha-label-badge"; import "../../../../src/components/ha-label-badge";
import "../../../../src/components/ha-markdown"; import "../../../../src/components/ha-markdown";
import "../../../../src/components/ha-svg-icon";
import "../../../../src/components/ha-switch"; import "../../../../src/components/ha-switch";
import "../../../../src/components/ha-icon";
import { import {
fetchHassioAddonChangelog, fetchHassioAddonChangelog,
HassioAddonDetails, HassioAddonDetails,
@@ -30,23 +46,23 @@ import {
setHassioAddonSecurity, setHassioAddonSecurity,
uninstallHassioAddon, uninstallHassioAddon,
} from "../../../../src/data/hassio/addon"; } from "../../../../src/data/hassio/addon";
import { showConfirmationDialog } from "../../../../src/dialogs/generic/show-dialog-box";
import { haStyle } from "../../../../src/resources/styles"; import { haStyle } from "../../../../src/resources/styles";
import { HomeAssistant } from "../../../../src/types"; import { HomeAssistant } from "../../../../src/types";
import "../../components/hassio-card-content"; import "../../components/hassio-card-content";
import { showHassioMarkdownDialog } from "../../dialogs/markdown/show-dialog-hassio-markdown"; import { showHassioMarkdownDialog } from "../../dialogs/markdown/show-dialog-hassio-markdown";
import { hassioStyle } from "../../resources/hassio-style"; import { hassioStyle } from "../../resources/hassio-style";
import { showConfirmationDialog } from "../../../../src/dialogs/generic/show-dialog-box";
const STAGE_ICON = { const STAGE_ICON = {
stable: "mdi:check-circle", stable: mdiCheckCircle,
experimental: "mdi:flask", experimental: mdiFlask,
deprecated: "mdi:exclamation-thick", deprecated: mdiExclamationThick,
}; };
const PERMIS_DESC = { const PERMIS_DESC = {
stage: { stage: {
title: "Add-on Stage", title: "Add-on Stage",
description: `Add-ons can have one of three stages:\n\n<ha-icon icon='${STAGE_ICON.stable}'></ha-icon>**Stable**: These are add-ons ready to be used in production.\n<ha-icon icon='${STAGE_ICON.experimental}'></ha-icon>**Experimental**: These may contain bugs, and may be unfinished.\n<ha-icon icon='${STAGE_ICON.deprecated}'></ha-icon>**Deprecated**: These add-ons will no longer receive any updates.`, description: `Add-ons can have one of three stages:\n\n<ha-svg-icon path='${STAGE_ICON.stable}'></ha-svg-icon> **Stable**: These are add-ons ready to be used in production.\n\n<ha-svg-icon path='${STAGE_ICON.experimental}'></ha-svg-icon> **Experimental**: These may contain bugs, and may be unfinished.\n\n<ha-svg-icon path='${STAGE_ICON.deprecated}'></ha-svg-icon> **Deprecated**: These add-ons will no longer receive any updates.`,
}, },
rating: { rating: {
title: "Add-on Security Rating", title: "Add-on Security Rating",
@@ -116,7 +132,7 @@ class HassioAddonInfo extends LitElement {
return html` return html`
${this._computeUpdateAvailable ${this._computeUpdateAvailable
? html` ? html`
<paper-card heading="Update available! 🎉"> <ha-card header="Update available! 🎉">
<div class="card-content"> <div class="card-content">
<hassio-card-content <hassio-card-content
.hass=${this.hass} .hass=${this.hass}
@@ -124,7 +140,7 @@ class HassioAddonInfo extends LitElement {
.version_latest} is available" .version_latest} is available"
.description="You are currently running version ${this.addon .description="You are currently running version ${this.addon
.version}" .version}"
icon="hassio:arrow-up-bold-circle" icon=${mdiArrowUpBoldCircle}
iconClass="update" iconClass="update"
></hassio-card-content> ></hassio-card-content>
${!this.addon.available ${!this.addon.available
@@ -151,12 +167,13 @@ class HassioAddonInfo extends LitElement {
` `
: ""} : ""}
</div> </div>
</paper-card> </ha-card>
` `
: ""} : ""}
${!this.addon.protected ${!this.addon.protected
? html` ? html`
<paper-card heading="Warning: Protection mode is disabled!" class="warning"> <ha-card class="warning">
<div class="card-header">Warning: Protection mode is disabled!</div>
<div class="card-content"> <div class="card-content">
Protection mode on this add-on is disabled! This gives the add-on full access to the entire system, which adds security risks, and could damage your system when used incorrectly. Only disable the protection mode if you know, need AND trust the source of this add-on. Protection mode on this add-on is disabled! This gives the add-on full access to the entire system, which adds security risks, and could damage your system when used incorrectly. Only disable the protection mode if you know, need AND trust the source of this add-on.
</div> </div>
@@ -164,11 +181,11 @@ class HassioAddonInfo extends LitElement {
<mwc-button @click=${this._protectionToggled}>Enable Protection mode</mwc-button> <mwc-button @click=${this._protectionToggled}>Enable Protection mode</mwc-button>
</div> </div>
</div> </div>
</paper-card> </ha-card>
` `
: ""} : ""}
<paper-card> <ha-card>
<div class="card-content"> <div class="card-content">
<div class="addon-header"> <div class="addon-header">
${!this.narrow ? this.addon.name : ""} ${!this.narrow ? this.addon.name : ""}
@@ -177,18 +194,18 @@ class HassioAddonInfo extends LitElement {
? html` ? html`
${this._computeIsRunning ${this._computeIsRunning
? html` ? html`
<ha-icon <ha-svg-icon
title="Add-on is running" title="Add-on is running"
class="running" class="running"
icon="hassio:circle" path=${mdiCircle}
></ha-icon> ></ha-svg-icon>
` `
: html` : html`
<ha-icon <ha-svg-icon
title="Add-on is stopped" title="Add-on is stopped"
class="stopped" class="stopped"
icon="hassio:circle" path=${mdiCircle}
></ha-icon> ></ha-svg-icon>
`} `}
` `
: html` ${this.addon.version_latest} `} : html` ${this.addon.version_latest} `}
@@ -232,10 +249,11 @@ class HassioAddonInfo extends LitElement {
})} })}
@click=${this._showMoreInfo} @click=${this._showMoreInfo}
id="stage" id="stage"
.icon=${STAGE_ICON[this.addon.stage]}
label="stage" label="stage"
description="" description=""
></ha-label-badge> >
<ha-svg-icon .path=${STAGE_ICON[this.addon.stage]}></ha-svg-icon>
</ha-label-badge>
<ha-label-badge <ha-label-badge
class=${classMap({ class=${classMap({
green: [5, 6].includes(Number(this.addon.rating)), green: [5, 6].includes(Number(this.addon.rating)),
@@ -253,10 +271,11 @@ class HassioAddonInfo extends LitElement {
<ha-label-badge <ha-label-badge
@click=${this._showMoreInfo} @click=${this._showMoreInfo}
id="host_network" id="host_network"
icon="hassio:network"
label="host" label="host"
description="" description=""
></ha-label-badge> >
<ha-svg-icon path=${mdiNetwork}></ha-svg-icon>
</ha-label-badge>
` `
: ""} : ""}
${this.addon.full_access ${this.addon.full_access
@@ -264,10 +283,11 @@ class HassioAddonInfo extends LitElement {
<ha-label-badge <ha-label-badge
@click=${this._showMoreInfo} @click=${this._showMoreInfo}
id="full_access" id="full_access"
icon="hassio:chip"
label="hardware" label="hardware"
description="" description=""
></ha-label-badge> >
<ha-svg-icon path=${mdiChip}></ha-svg-icon>
</ha-label-badge>
` `
: ""} : ""}
${this.addon.homeassistant_api ${this.addon.homeassistant_api
@@ -275,10 +295,11 @@ class HassioAddonInfo extends LitElement {
<ha-label-badge <ha-label-badge
@click=${this._showMoreInfo} @click=${this._showMoreInfo}
id="homeassistant_api" id="homeassistant_api"
icon="hassio:home-assistant"
label="hass" label="hass"
description="" description=""
></ha-label-badge> >
<ha-svg-icon path=${mdiHomeAssistant}></ha-svg-icon>
</ha-label-badge>
` `
: ""} : ""}
${this._computeHassioApi ${this._computeHassioApi
@@ -286,10 +307,11 @@ class HassioAddonInfo extends LitElement {
<ha-label-badge <ha-label-badge
@click=${this._showMoreInfo} @click=${this._showMoreInfo}
id="hassio_api" id="hassio_api"
icon="hassio:home-assistant"
label="hassio" label="hassio"
.description=${this.addon.hassio_role} .description=${this.addon.hassio_role}
></ha-label-badge> >
<ha-svg-icon path=${mdiHomeAssistant}></ha-svg-icon>
</ha-label-badge>
` `
: ""} : ""}
${this.addon.docker_api ${this.addon.docker_api
@@ -297,10 +319,11 @@ class HassioAddonInfo extends LitElement {
<ha-label-badge <ha-label-badge
@click=${this._showMoreInfo} @click=${this._showMoreInfo}
id="docker_api" id="docker_api"
icon="hassio:docker"
label="docker" label="docker"
description="" description=""
></ha-label-badge> >
<ha-svg-icon path=${mdiDocker}></ha-svg-icon>
</ha-label-badge>
` `
: ""} : ""}
${this.addon.host_pid ${this.addon.host_pid
@@ -308,10 +331,11 @@ class HassioAddonInfo extends LitElement {
<ha-label-badge <ha-label-badge
@click=${this._showMoreInfo} @click=${this._showMoreInfo}
id="host_pid" id="host_pid"
icon="hassio:pound"
label="host pid" label="host pid"
description="" description=""
></ha-label-badge> >
<ha-svg-icon path=${mdiPound}></ha-svg-icon>
</ha-label-badge>
` `
: ""} : ""}
${this.addon.apparmor ${this.addon.apparmor
@@ -320,10 +344,11 @@ class HassioAddonInfo extends LitElement {
@click=${this._showMoreInfo} @click=${this._showMoreInfo}
class=${this._computeApparmorClassName} class=${this._computeApparmorClassName}
id="apparmor" id="apparmor"
icon="hassio:shield"
label="apparmor" label="apparmor"
description="" description=""
></ha-label-badge> >
<ha-svg-icon path=${mdiShield}></ha-svg-icon>
</ha-label-badge>
` `
: ""} : ""}
${this.addon.auth_api ${this.addon.auth_api
@@ -331,10 +356,11 @@ class HassioAddonInfo extends LitElement {
<ha-label-badge <ha-label-badge
@click=${this._showMoreInfo} @click=${this._showMoreInfo}
id="auth_api" id="auth_api"
icon="hassio:key"
label="auth" label="auth"
description="" description=""
></ha-label-badge> >
<ha-svg-icon path=${mdiKey}></ha-svg-icon>
</ha-label-badge>
` `
: ""} : ""}
${this.addon.ingress ${this.addon.ingress
@@ -342,10 +368,13 @@ class HassioAddonInfo extends LitElement {
<ha-label-badge <ha-label-badge
@click=${this._showMoreInfo} @click=${this._showMoreInfo}
id="ingress" id="ingress"
icon="hassio:cursor-default-click-outline"
label="ingress" label="ingress"
description="" description=""
></ha-label-badge> >
<ha-svg-icon
path=${mdiCursorDefaultClickOutline}
></ha-svg-icon>
</ha-label-badge>
` `
: ""} : ""}
</div> </div>
@@ -399,7 +428,7 @@ class HassioAddonInfo extends LitElement {
<div> <div>
Protection mode Protection mode
<span> <span>
<ha-icon icon="hassio:information"></ha-icon> <ha-svg-icon path=${mdiInformation}></ha-svg-icon>
<paper-tooltip> <paper-tooltip>
Grant the add-on elevated system access. Grant the add-on elevated system access.
</paper-tooltip> </paper-tooltip>
@@ -502,17 +531,17 @@ class HassioAddonInfo extends LitElement {
</ha-progress-button> </ha-progress-button>
`} `}
</div> </div>
</paper-card> </ha-card>
${this.addon.long_description ${this.addon.long_description
? html` ? html`
<paper-card> <ha-card>
<div class="card-content"> <div class="card-content">
<ha-markdown <ha-markdown
.content=${this.addon.long_description} .content=${this.addon.long_description}
></ha-markdown> ></ha-markdown>
</div> </div>
</paper-card> </ha-card>
` `
: ""} : ""}
`; `;
@@ -526,16 +555,21 @@ class HassioAddonInfo extends LitElement {
:host { :host {
display: block; display: block;
} }
paper-card { ha-card {
display: block; display: block;
margin-bottom: 16px; margin-bottom: 16px;
} }
paper-card.warning { ha-card.warning {
background-color: var(--google-red-500); background-color: var(--google-red-500);
color: white; color: white;
--paper-card-header-color: white;
} }
paper-card.warning mwc-button { ha-card.warning .card-header {
color: white;
}
ha-card.warning .card-content {
color: white;
}
ha-card.warning mwc-button {
--mdc-theme-primary: white !important; --mdc-theme-primary: white !important;
} }
.warning { .warning {
@@ -548,7 +582,7 @@ class HassioAddonInfo extends LitElement {
.addon-header { .addon-header {
padding-left: 8px; padding-left: 8px;
font-size: 24px; font-size: 24px;
color: var(--paper-card-header-color, --primary-text-color); color: var(--ha-card-header-color, --primary-text-color);
} }
.addon-version { .addon-version {
float: right; float: right;
@@ -575,7 +609,7 @@ class HassioAddonInfo extends LitElement {
width: 180px; width: 180px;
display: inline-block; display: inline-block;
} }
.state ha-icon { .state ha-svg-icon {
width: 16px; width: 16px;
height: 16px; height: 16px;
color: var(--secondary-text-color); color: var(--secondary-text-color);
@@ -583,10 +617,10 @@ class HassioAddonInfo extends LitElement {
ha-switch { ha-switch {
display: flex; display: flex;
} }
ha-icon.running { ha-svg-icon.running {
color: var(--paper-green-400); color: var(--paper-green-400);
} }
ha-icon.stopped { ha-svg-icon.stopped {
color: var(--google-red-300); color: var(--google-red-300);
} }
ha-call-api-button { ha-call-api-button {
@@ -664,7 +698,7 @@ class HassioAddonInfo extends LitElement {
} }
private _showMoreInfo(ev): void { private _showMoreInfo(ev): void {
const id = ev.target.getAttribute("id"); const id = ev.currentTarget.id;
showHassioMarkdownDialog(this, { showHassioMarkdownDialog(this, {
title: PERMIS_DESC[id].title, title: PERMIS_DESC[id].title,
content: PERMIS_DESC[id].description, content: PERMIS_DESC[id].description,

View File

@@ -1,5 +1,4 @@
import "@polymer/paper-spinner/paper-spinner-lite"; import "@polymer/paper-spinner/paper-spinner-lite";
import { import {
css, css,
CSSResult, CSSResult,
@@ -9,12 +8,10 @@ import {
property, property,
TemplateResult, TemplateResult,
} from "lit-element"; } from "lit-element";
import { HomeAssistant } from "../../../../src/types";
import { HassioAddonDetails } from "../../../../src/data/hassio/addon"; import { HassioAddonDetails } from "../../../../src/data/hassio/addon";
import { hassioStyle } from "../../resources/hassio-style";
import { haStyle } from "../../../../src/resources/styles"; import { haStyle } from "../../../../src/resources/styles";
import { HomeAssistant } from "../../../../src/types";
import { hassioStyle } from "../../resources/hassio-style";
import "./hassio-addon-logs"; import "./hassio-addon-logs";
@customElement("hassio-addon-log-tab") @customElement("hassio-addon-log-tab")

View File

@@ -1,5 +1,4 @@
import "@material/mwc-button"; import "@material/mwc-button";
import "@polymer/paper-card/paper-card";
import { import {
css, css,
CSSResult, CSSResult,
@@ -9,6 +8,7 @@ import {
property, property,
TemplateResult, TemplateResult,
} from "lit-element"; } from "lit-element";
import "../../../../src/components/ha-card";
import { import {
fetchHassioAddonLogs, fetchHassioAddonLogs,
HassioAddonDetails, HassioAddonDetails,
@@ -36,7 +36,7 @@ class HassioAddonLogs extends LitElement {
protected render(): TemplateResult { protected render(): TemplateResult {
return html` return html`
<h1>${this.addon.name}</h1> <h1>${this.addon.name}</h1>
<paper-card> <ha-card>
${this._error ? html` <div class="errors">${this._error}</div> ` : ""} ${this._error ? html` <div class="errors">${this._error}</div> ` : ""}
<div class="card-content"> <div class="card-content">
${this._content ${this._content
@@ -48,7 +48,7 @@ class HassioAddonLogs extends LitElement {
<div class="card-actions"> <div class="card-actions">
<mwc-button @click=${this._refresh}>Refresh</mwc-button> <mwc-button @click=${this._refresh}>Refresh</mwc-button>
</div> </div>
</paper-card> </ha-card>
`; `;
} }
@@ -58,7 +58,7 @@ class HassioAddonLogs extends LitElement {
hassioStyle, hassioStyle,
css` css`
:host, :host,
paper-card { ha-card {
display: block; display: block;
} }
.errors { .errors {

View File

@@ -1,3 +1,4 @@
import { mdiHelpCircle } from "@mdi/js";
import { import {
css, css,
CSSResult, CSSResult,
@@ -8,7 +9,7 @@ import {
TemplateResult, TemplateResult,
} from "lit-element"; } from "lit-element";
import "../../../src/components/ha-relative-time"; import "../../../src/components/ha-relative-time";
import "../../../src/components/ha-icon"; import "../../../src/components/ha-svg-icon";
import { HomeAssistant } from "../../../src/types"; import { HomeAssistant } from "../../../src/types";
@customElement("hassio-card-content") @customElement("hassio-card-content")
@@ -31,7 +32,7 @@ class HassioCardContent extends LitElement {
@property() public iconClass?: string; @property() public iconClass?: string;
@property() public icon = "hass:help-circle"; @property() public icon = mdiHelpCircle;
@property() public iconImage?: string; @property() public iconImage?: string;
@@ -48,11 +49,11 @@ class HassioCardContent extends LitElement {
</div> </div>
` `
: html` : html`
<ha-icon <ha-svg-icon
class=${this.iconClass} class=${this.iconClass}
.icon=${this.icon} .path=${this.icon}
.title=${this.iconTitle} .title=${this.iconTitle}
></ha-icon> ></ha-svg-icon>
`} `}
<div> <div>
<div class="title"> <div class="title">
@@ -78,25 +79,25 @@ class HassioCardContent extends LitElement {
static get styles(): CSSResult { static get styles(): CSSResult {
return css` return css`
ha-icon { ha-svg-icon {
margin-right: 24px; margin-right: 24px;
margin-left: 8px; margin-left: 8px;
margin-top: 12px; margin-top: 12px;
float: left; float: left;
color: var(--secondary-text-color); color: var(--secondary-text-color);
} }
ha-icon.update { ha-svg-icon.update {
color: var(--paper-orange-400); color: var(--paper-orange-400);
} }
ha-icon.running, ha-svg-icon.running,
ha-icon.installed { ha-svg-icon.installed {
color: var(--paper-green-400); color: var(--paper-green-400);
} }
ha-icon.hassupdate, ha-svg-icon.hassupdate,
ha-icon.snapshot { ha-svg-icon.snapshot {
color: var(--paper-item-icon-color); color: var(--paper-item-icon-color);
} }
ha-icon.not_available { ha-svg-icon.not_available {
color: var(--google-red-500); color: var(--google-red-500);
} }
.title { .title {

View File

@@ -1,4 +1,4 @@
import "@polymer/paper-card/paper-card"; import { mdiArrowUpBoldCircle, mdiPuzzle } from "@mdi/js";
import { import {
css, css,
CSSResult, CSSResult,
@@ -10,6 +10,7 @@ import {
} from "lit-element"; } from "lit-element";
import { atLeastVersion } from "../../../src/common/config/version"; import { atLeastVersion } from "../../../src/common/config/version";
import { navigate } from "../../../src/common/navigate"; import { navigate } from "../../../src/common/navigate";
import "../../../src/components/ha-card";
import { HassioAddonInfo } from "../../../src/data/hassio/addon"; import { HassioAddonInfo } from "../../../src/data/hassio/addon";
import { haStyle } from "../../../src/resources/styles"; import { haStyle } from "../../../src/resources/styles";
import { HomeAssistant } from "../../../src/types"; import { HomeAssistant } from "../../../src/types";
@@ -29,19 +30,19 @@ class HassioAddons extends LitElement {
<div class="card-group"> <div class="card-group">
${!this.addons ${!this.addons
? html` ? html`
<paper-card> <ha-card>
<div class="card-content"> <div class="card-content">
You don't have any add-ons installed yet. Head over to You don't have any add-ons installed yet. Head over to
<a href="#" @click=${this._openStore}>the add-on store</a> <a href="#" @click=${this._openStore}>the add-on store</a>
to get started! to get started!
</div> </div>
</paper-card> </ha-card>
` `
: this.addons : this.addons
.sort((a, b) => (a.name > b.name ? 1 : -1)) .sort((a, b) => (a.name > b.name ? 1 : -1))
.map( .map(
(addon) => html` (addon) => html`
<paper-card .addon=${addon} @click=${this._addonTapped}> <ha-card .addon=${addon} @click=${this._addonTapped}>
<div class="card-content"> <div class="card-content">
<hassio-card-content <hassio-card-content
.hass=${this.hass} .hass=${this.hass}
@@ -51,8 +52,8 @@ class HassioAddons extends LitElement {
.showTopbar=${addon.installed !== addon.version} .showTopbar=${addon.installed !== addon.version}
topbarClass="update" topbarClass="update"
.icon=${addon.installed !== addon.version .icon=${addon.installed !== addon.version
? "hassio:arrow-up-bold-circle" ? mdiArrowUpBoldCircle
: "hassio:puzzle"} : mdiPuzzle}
.iconTitle=${addon.state !== "started" .iconTitle=${addon.state !== "started"
? "Add-on is stopped" ? "Add-on is stopped"
: addon.installed !== addon.version : addon.installed !== addon.version
@@ -75,7 +76,7 @@ class HassioAddons extends LitElement {
: undefined} : undefined}
></hassio-card-content> ></hassio-card-content>
</div> </div>
</paper-card> </ha-card>
` `
)} )}
</div> </div>
@@ -88,7 +89,7 @@ class HassioAddons extends LitElement {
haStyle, haStyle,
hassioStyle, hassioStyle,
css` css`
paper-card { ha-card {
cursor: pointer; cursor: pointer;
} }
`, `,

View File

@@ -12,14 +12,13 @@ import {
HassioHomeAssistantInfo, HassioHomeAssistantInfo,
HassioSupervisorInfo, HassioSupervisorInfo,
} from "../../../src/data/hassio/supervisor"; } from "../../../src/data/hassio/supervisor";
import "../../../src/layouts/hass-tabs-subpage";
import { haStyle } from "../../../src/resources/styles"; import { haStyle } from "../../../src/resources/styles";
import { HomeAssistant, Route } from "../../../src/types"; import { HomeAssistant, Route } from "../../../src/types";
import "../../../src/layouts/hass-tabs-subpage"; import { supervisorTabs } from "../hassio-panel";
import "./hassio-addons"; import "./hassio-addons";
import "./hassio-update"; import "./hassio-update";
import { supervisorTabs } from "../hassio-panel";
@customElement("hassio-dashboard") @customElement("hassio-dashboard")
class HassioDashboard extends LitElement { class HassioDashboard extends LitElement {
@property({ attribute: false }) public hass!: HomeAssistant; @property({ attribute: false }) public hass!: HomeAssistant;

View File

@@ -1,5 +1,5 @@
import "@material/mwc-button"; import "@material/mwc-button";
import "@polymer/paper-card/paper-card"; import { mdiHomeAssistant } from "@mdi/js";
import { import {
css, css,
CSSResult, CSSResult,
@@ -10,15 +10,15 @@ import {
TemplateResult, TemplateResult,
} from "lit-element"; } from "lit-element";
import "../../../src/components/buttons/ha-call-api-button"; import "../../../src/components/buttons/ha-call-api-button";
import "../../../src/components/ha-card";
import "../../../src/components/ha-svg-icon";
import { HassioHassOSInfo } from "../../../src/data/hassio/host"; import { HassioHassOSInfo } from "../../../src/data/hassio/host";
import { import {
HassioHomeAssistantInfo, HassioHomeAssistantInfo,
HassioSupervisorInfo, HassioSupervisorInfo,
} from "../../../src/data/hassio/supervisor"; } from "../../../src/data/hassio/supervisor";
import { haStyle } from "../../../src/resources/styles"; import { haStyle } from "../../../src/resources/styles";
import "../../../src/components/ha-icon";
import { HomeAssistant } from "../../../src/types"; import { HomeAssistant } from "../../../src/types";
import "../components/hassio-card-content";
import { hassioStyle } from "../resources/hassio-style"; import { hassioStyle } from "../resources/hassio-style";
@customElement("hassio-update") @customElement("hassio-update")
@@ -72,7 +72,7 @@ export class HassioUpdate extends LitElement {
`https://${ `https://${
this.hassInfo.version_latest.includes("b") ? "rc" : "www" this.hassInfo.version_latest.includes("b") ? "rc" : "www"
}.home-assistant.io/latest-release-notes/`, }.home-assistant.io/latest-release-notes/`,
"hassio:home-assistant" mdiHomeAssistant
)} )}
${this._renderUpdateCard( ${this._renderUpdateCard(
"Supervisor", "Supervisor",
@@ -107,12 +107,12 @@ export class HassioUpdate extends LitElement {
return html``; return html``;
} }
return html` return html`
<paper-card> <ha-card>
<div class="card-content"> <div class="card-content">
${icon ${icon
? html` ? html`
<div class="icon"> <div class="icon">
<ha-icon .icon=${icon}></ha-icon> <ha-svg-icon .path=${icon}></ha-svg-icon>
</div> </div>
` `
: ""} : ""}
@@ -133,7 +133,7 @@ export class HassioUpdate extends LitElement {
Update Update
</ha-call-api-button> </ha-call-api-button>
</div> </div>
</paper-card> </ha-card>
`; `;
} }

View File

@@ -1,7 +1,3 @@
import "@polymer/app-layout/app-toolbar/app-toolbar";
import { PaperDialogElement } from "@polymer/paper-dialog";
import "@polymer/paper-dialog-scrollable/paper-dialog-scrollable";
import "../../../../src/components/ha-icon-button";
import { import {
css, css,
CSSResult, CSSResult,
@@ -9,46 +5,50 @@ import {
html, html,
LitElement, LitElement,
property, property,
query,
TemplateResult, TemplateResult,
} from "lit-element"; } from "lit-element";
import "../../../../src/components/dialog/ha-paper-dialog"; import { createCloseHeading } from "../../../../src/components/ha-dialog";
import "../../../../src/components/ha-markdown"; import "../../../../src/components/ha-markdown";
import { haStyleDialog } from "../../../../src/resources/styles"; import { haStyleDialog } from "../../../../src/resources/styles";
import { HomeAssistant } from "../../../../src/types";
import { hassioStyle } from "../../resources/hassio-style"; import { hassioStyle } from "../../resources/hassio-style";
import { HassioMarkdownDialogParams } from "./show-dialog-hassio-markdown"; import { HassioMarkdownDialogParams } from "./show-dialog-hassio-markdown";
@customElement("dialog-hassio-markdown") @customElement("dialog-hassio-markdown")
class HassioMarkdownDialog extends LitElement { class HassioMarkdownDialog extends LitElement {
@property() public hass!: HomeAssistant;
@property() public title!: string; @property() public title!: string;
@property() public content!: string; @property() public content!: string;
@query("#dialog") private _dialog!: PaperDialogElement; @property() private _opened = false;
public showDialog(params: HassioMarkdownDialogParams) { public showDialog(params: HassioMarkdownDialogParams) {
this.title = params.title; this.title = params.title;
this.content = params.content; this.content = params.content;
this._dialog.open(); this._opened = true;
} }
protected render(): TemplateResult { protected render(): TemplateResult {
if (!this._opened) {
return html``;
}
return html` return html`
<ha-paper-dialog id="dialog" with-backdrop=""> <ha-dialog
<app-toolbar> open
<ha-icon-button @closing=${this._closeDialog}
icon="hassio:close" .heading=${createCloseHeading(this.hass, this.title)}
dialog-dismiss="" >
></ha-icon-button> <ha-markdown .content=${this.content || ""}></ha-markdown>
<div main-title="">${this.title}</div> </ha-dialog>
</app-toolbar>
<paper-dialog-scrollable>
<ha-markdown .content=${this.content || ""}></ha-markdown>
</paper-dialog-scrollable>
</ha-paper-dialog>
`; `;
} }
private _closeDialog(): void {
this._opened = false;
}
static get styles(): CSSResult[] { static get styles(): CSSResult[] {
return [ return [
haStyleDialog, haStyleDialog,

View File

@@ -1,9 +1,11 @@
import "@material/mwc-button/mwc-button"; import "@material/mwc-button/mwc-button";
import "@material/mwc-icon-button/mwc-icon-button";
import { mdiDelete } from "@mdi/js";
import "@polymer/paper-input/paper-input"; import "@polymer/paper-input/paper-input";
import "@polymer/paper-spinner/paper-spinner";
import type { PaperInputElement } from "@polymer/paper-input/paper-input"; import type { PaperInputElement } from "@polymer/paper-input/paper-input";
import "@polymer/paper-item/paper-item"; import "@polymer/paper-item/paper-item";
import "@polymer/paper-item/paper-item-body"; import "@polymer/paper-item/paper-item-body";
import "@polymer/paper-spinner/paper-spinner";
import { import {
css, css,
CSSResult, CSSResult,
@@ -16,16 +18,14 @@ import {
} from "lit-element"; } from "lit-element";
import memoizeOne from "memoize-one"; import memoizeOne from "memoize-one";
import "../../../../src/components/ha-dialog"; import "../../../../src/components/ha-dialog";
import "../../../../src/components/ha-icon-button"; import "../../../../src/components/ha-svg-icon";
import {
fetchHassioAddonsInfo,
HassioAddonRepository,
} from "../../../../src/data/hassio/addon";
import { setSupervisorOption } from "../../../../src/data/hassio/supervisor";
import { haStyle, haStyleDialog } from "../../../../src/resources/styles"; import { haStyle, haStyleDialog } from "../../../../src/resources/styles";
import type { HomeAssistant } from "../../../../src/types"; import type { HomeAssistant } from "../../../../src/types";
import {
HassioAddonRepository,
fetchHassioAddonsInfo,
} from "../../../../src/data/hassio/addon";
import { setSupervisorOption } from "../../../../src/data/hassio/supervisor";
import { HassioRepositoryDialogParams } from "./show-dialog-repositories"; import { HassioRepositoryDialogParams } from "./show-dialog-repositories";
@customElement("dialog-hassio-repositories") @customElement("dialog-hassio-repositories")
@@ -84,12 +84,13 @@ class HassioRepositoriesDialog extends LitElement {
<div secondary>${repo.maintainer}</div> <div secondary>${repo.maintainer}</div>
<div secondary>${repo.url}</div> <div secondary>${repo.url}</div>
</paper-item-body> </paper-item-body>
<ha-icon-button <mwc-icon-button
.slug=${repo.slug} .slug=${repo.slug}
title="Remove" title="Remove"
@click=${this._removeRepository} @click=${this._removeRepository}
icon="hassio:delete" >
></ha-icon-button> <ha-svg-icon path=${mdiDelete}></ha-svg-icon>
</mwc-icon-button>
</paper-item> </paper-item>
`; `;
}) })
@@ -194,7 +195,7 @@ class HassioRepositoriesDialog extends LitElement {
} }
private async _removeRepository(ev: Event) { private async _removeRepository(ev: Event) {
const slug = (ev.target as any).slug; const slug = (ev.currentTarget as any).slug;
const repositories = this._filteredRepositories(this._repos); const repositories = this._filteredRepositories(this._repos);
const repository = repositories.find((repo) => { const repository = repositories.find((repo) => {
return repo.slug === slug; return repo.slug === slug;

View File

@@ -1,6 +1,6 @@
import { fireEvent } from "../../../../src/common/dom/fire_event"; import { fireEvent } from "../../../../src/common/dom/fire_event";
import "./dialog-hassio-repositories";
import { HassioAddonRepository } from "../../../../src/data/hassio/addon"; import { HassioAddonRepository } from "../../../../src/data/hassio/addon";
import "./dialog-hassio-repositories";
export interface HassioRepositoryDialogParams { export interface HassioRepositoryDialogParams {
repos: HassioAddonRepository[]; repos: HassioAddonRepository[];

View File

@@ -1,10 +1,6 @@
import "@material/mwc-button"; import "@material/mwc-button";
import "@polymer/app-layout/app-toolbar/app-toolbar"; import { mdiDelete, mdiDownload, mdiHistory } from "@mdi/js";
import { PaperCheckboxElement } from "@polymer/paper-checkbox/paper-checkbox"; import { PaperCheckboxElement } from "@polymer/paper-checkbox/paper-checkbox";
import { PaperDialogElement } from "@polymer/paper-dialog";
import "@polymer/paper-dialog-scrollable/paper-dialog-scrollable";
import "../../../../src/components/ha-icon-button";
import "../../../../src/components/ha-icon";
import "@polymer/paper-input/paper-input"; import "@polymer/paper-input/paper-input";
import { import {
css, css,
@@ -13,10 +9,10 @@ import {
html, html,
LitElement, LitElement,
property, property,
query,
TemplateResult, TemplateResult,
} from "lit-element"; } from "lit-element";
import "../../../../src/components/dialog/ha-paper-dialog"; import { createCloseHeading } from "../../../../src/components/ha-dialog";
import "../../../../src/components/ha-svg-icon";
import { getSignedPath } from "../../../../src/data/auth"; import { getSignedPath } from "../../../../src/data/auth";
import { import {
fetchHassioSnapshotInfo, fetchHassioSnapshotInfo,
@@ -76,7 +72,7 @@ class HassioSnapshotDialog extends LitElement {
@property() private _error?: string; @property() private _error?: string;
@property() private snapshot?: HassioSnapshotDetail; @property() private _snapshot?: HassioSnapshotDetail;
@property() private _folders!: FolderItem[]; @property() private _folders!: FolderItem[];
@@ -88,49 +84,35 @@ class HassioSnapshotDialog extends LitElement {
@property() private _restoreHass: boolean | null | undefined = true; @property() private _restoreHass: boolean | null | undefined = true;
@query("#dialog") private _dialog!: PaperDialogElement;
public async showDialog(params: HassioSnapshotDialogParams) { public async showDialog(params: HassioSnapshotDialogParams) {
this.snapshot = await fetchHassioSnapshotInfo(this.hass, params.slug); this._snapshot = await fetchHassioSnapshotInfo(this.hass, params.slug);
this._folders = _computeFolders( this._folders = _computeFolders(
this.snapshot.folders this._snapshot.folders
).sort((a: FolderItem, b: FolderItem) => (a.name > b.name ? 1 : -1)); ).sort((a: FolderItem, b: FolderItem) => (a.name > b.name ? 1 : -1));
this._addons = _computeAddons( this._addons = _computeAddons(
this.snapshot.addons this._snapshot.addons
).sort((a: AddonItem, b: AddonItem) => (a.name > b.name ? 1 : -1)); ).sort((a: AddonItem, b: AddonItem) => (a.name > b.name ? 1 : -1));
this._dialogParams = params; this._dialogParams = params;
try {
this._dialog.open();
} catch {
await this.showDialog(params);
}
} }
protected render(): TemplateResult { protected render(): TemplateResult {
if (!this.snapshot) { if (!this._dialogParams || !this._snapshot) {
return html``; return html``;
} }
return html` return html`
<ha-paper-dialog <ha-dialog
id="dialog" open
with-backdrop="" stacked
.on-iron-overlay-closed=${this._dialogClosed} @closing=${this._closeDialog}
.heading=${createCloseHeading(this.hass, this._computeName)}
> >
<app-toolbar>
<ha-icon-button
icon="hassio:close"
dialog-dismiss=""
></ha-icon-button>
<div main-title="">${this._computeName}</div>
</app-toolbar>
<div class="details"> <div class="details">
${this.snapshot.type === "full" ${this._snapshot.type === "full"
? "Full snapshot" ? "Full snapshot"
: "Partial snapshot"} : "Partial snapshot"}
(${this._computeSize})<br /> (${this._computeSize})<br />
${this._formatDatetime(this.snapshot.date)} ${this._formatDatetime(this._snapshot.date)}
</div> </div>
<div>Home Assistant:</div> <div>Home Assistant:</div>
<paper-checkbox <paper-checkbox
@@ -139,7 +121,7 @@ class HassioSnapshotDialog extends LitElement {
this._restoreHass = (ev.target as PaperCheckboxElement).checked; this._restoreHass = (ev.target as PaperCheckboxElement).checked;
}}" }}"
> >
Home Assistant ${this.snapshot.homeassistant} Home Assistant ${this._snapshot.homeassistant}
</paper-checkbox> </paper-checkbox>
${this._folders.length ${this._folders.length
? html` ? html`
@@ -183,7 +165,7 @@ class HassioSnapshotDialog extends LitElement {
</paper-dialog-scrollable> </paper-dialog-scrollable>
` `
: ""} : ""}
${this.snapshot.protected ${this._snapshot.protected
? html` ? html`
<paper-input <paper-input
autofocus="" autofocus=""
@@ -197,37 +179,35 @@ class HassioSnapshotDialog extends LitElement {
${this._error ? html` <p class="error">Error: ${this._error}</p> ` : ""} ${this._error ? html` <p class="error">Error: ${this._error}</p> ` : ""}
<div>Actions:</div> <div>Actions:</div>
<ul class="buttons">
<li> <mwc-button @click=${this._downloadClicked} slot="primaryAction">
<mwc-button @click=${this._downloadClicked}> <ha-svg-icon path=${mdiDownload} class="icon"></ha-svg-icon>
<ha-icon icon="hassio:download" class="icon"></ha-icon> Download Snapshot
Download Snapshot </mwc-button>
</mwc-button>
</li> <mwc-button
<li> @click=${this._partialRestoreClicked}
<mwc-button @click=${this._partialRestoreClicked}> slot="secondaryAction"
<ha-icon icon="hassio:history" class="icon"> </ha-icon> >
Restore Selected <ha-svg-icon path=${mdiHistory} class="icon"></ha-svg-icon>
</mwc-button> Restore Selected
</li> </mwc-button>
${this.snapshot.type === "full" ${this._snapshot.type === "full"
? html` ? html`
<li> <mwc-button
<mwc-button @click=${this._fullRestoreClicked}> @click=${this._fullRestoreClicked}
<ha-icon icon="hassio:history" class="icon"> </ha-icon> slot="secondaryAction"
Wipe &amp; restore >
</mwc-button> <ha-svg-icon path=${mdiHistory} class="icon"></ha-svg-icon>
</li> Wipe &amp; restore
` </mwc-button>
: ""} `
<li> : ""}
<mwc-button @click=${this._deleteClicked}> <mwc-button @click=${this._deleteClicked} slot="secondaryAction">
<ha-icon icon="hassio:delete" class="icon warning"> </ha-icon> <ha-svg-icon path=${mdiDelete} class="icon warning"></ha-svg-icon>
<span class="warning">Delete Snapshot</span> <span class="warning">Delete Snapshot</span>
</mwc-button> </mwc-button>
</li> </ha-dialog>
</ul>
</ha-paper-dialog>
`; `;
} }
@@ -235,37 +215,10 @@ class HassioSnapshotDialog extends LitElement {
return [ return [
haStyleDialog, haStyleDialog,
css` css`
ha-paper-dialog {
min-width: 350px;
font-size: 14px;
border-radius: 2px;
}
app-toolbar {
margin: 0;
padding: 0 16px;
color: var(--primary-text-color);
background-color: var(--secondary-background-color);
}
app-toolbar [main-title] {
margin-left: 16px;
}
ha-paper-dialog-scrollable {
margin: 0;
}
paper-checkbox { paper-checkbox {
display: block; display: block;
margin: 4px; margin: 4px;
} }
@media all and (max-width: 450px), all and (max-height: 500px) {
ha-paper-dialog {
max-height: 100%;
height: 100%;
}
app-toolbar {
color: var(--text-primary-color);
background-color: var(--primary-color);
}
}
.details { .details {
color: var(--secondary-text-color); color: var(--secondary-text-color);
} }
@@ -336,7 +289,7 @@ class HassioSnapshotDialog extends LitElement {
folders, folders,
}; };
if (this.snapshot!.protected) { if (this._snapshot!.protected) {
data.password = this._snapshotPassword; data.password = this._snapshotPassword;
} }
@@ -344,13 +297,13 @@ class HassioSnapshotDialog extends LitElement {
.callApi( .callApi(
"POST", "POST",
`hassio/snapshots/${this.snapshot!.slug}/restore/partial`, `hassio/snapshots/${this._snapshot!.slug}/restore/partial`,
data data
) )
.then( .then(
() => { () => {
alert("Snapshot restored!"); alert("Snapshot restored!");
this._dialog.close(); this._closeDialog();
}, },
(error) => { (error) => {
this._error = error.body.message; this._error = error.body.message;
@@ -363,20 +316,20 @@ class HassioSnapshotDialog extends LitElement {
return; return;
} }
const data = this.snapshot!.protected const data = this._snapshot!.protected
? { password: this._snapshotPassword } ? { password: this._snapshotPassword }
: undefined; : undefined;
this.hass this.hass
.callApi( .callApi(
"POST", "POST",
`hassio/snapshots/${this.snapshot!.slug}/restore/full`, `hassio/snapshots/${this._snapshot!.slug}/restore/full`,
data data
) )
.then( .then(
() => { () => {
alert("Snapshot restored!"); alert("Snapshot restored!");
this._dialog.close(); this._closeDialog();
}, },
(error) => { (error) => {
this._error = error.body.message; this._error = error.body.message;
@@ -391,11 +344,11 @@ class HassioSnapshotDialog extends LitElement {
this.hass this.hass
.callApi("POST", `hassio/snapshots/${this.snapshot!.slug}/remove`) .callApi("POST", `hassio/snapshots/${this._snapshot!.slug}/remove`)
.then( .then(
() => { () => {
this._dialog.close();
this._dialogParams!.onDelete(); this._dialogParams!.onDelete();
this._closeDialog();
}, },
(error) => { (error) => {
this._error = error.body.message; this._error = error.body.message;
@@ -408,7 +361,7 @@ class HassioSnapshotDialog extends LitElement {
try { try {
signedPath = await getSignedPath( signedPath = await getSignedPath(
this.hass, this.hass,
`/api/hassio/snapshots/${this.snapshot!.slug}/download` `/api/hassio/snapshots/${this._snapshot!.slug}/download`
); );
} catch (err) { } catch (err) {
alert(`Error: ${err.message}`); alert(`Error: ${err.message}`);
@@ -419,19 +372,19 @@ class HassioSnapshotDialog extends LitElement {
const a = document.createElement("a"); const a = document.createElement("a");
a.href = signedPath.path; a.href = signedPath.path;
a.download = `Hass_io_${name}.tar`; a.download = `Hass_io_${name}.tar`;
this._dialog.appendChild(a); this.shadowRoot!.appendChild(a);
a.click(); a.click();
this._dialog.removeChild(a); this.shadowRoot!.removeChild(a);
} }
private get _computeName() { private get _computeName() {
return this.snapshot return this._snapshot
? this.snapshot.name || this.snapshot.slug ? this._snapshot.name || this._snapshot.slug
: "Unnamed snapshot"; : "Unnamed snapshot";
} }
private get _computeSize() { private get _computeSize() {
return Math.ceil(this.snapshot!.size * 10) / 10 + " MB"; return Math.ceil(this._snapshot!.size * 10) / 10 + " MB";
} }
private _formatDatetime(datetime) { private _formatDatetime(datetime) {
@@ -445,9 +398,9 @@ class HassioSnapshotDialog extends LitElement {
}); });
} }
private _dialogClosed() { private _closeDialog() {
this._dialogParams = undefined; this._dialogParams = undefined;
this.snapshot = undefined; this._snapshot = undefined;
this._snapshotPassword = ""; this._snapshotPassword = "";
this._folders = []; this._folders = [];
this._addons = []; this._addons = [];

View File

@@ -3,11 +3,11 @@ import {
HassioAddonDetails, HassioAddonDetails,
restartHassioAddon, restartHassioAddon,
} from "../../../src/data/hassio/addon"; } from "../../../src/data/hassio/addon";
import { HomeAssistant } from "../../../src/types";
import { import {
showConfirmationDialog,
showAlertDialog, showAlertDialog,
showConfirmationDialog,
} from "../../../src/dialogs/generic/show-dialog-box"; } from "../../../src/dialogs/generic/show-dialog-box";
import { HomeAssistant } from "../../../src/types";
export const suggestAddonRestart = async ( export const suggestAddonRestart = async (
element: LitElement, element: LitElement,

View File

@@ -1,4 +1,3 @@
import "../../src/components/ha-icon-button";
import { PolymerElement } from "@polymer/polymer"; import { PolymerElement } from "@polymer/polymer";
import { customElement, property, PropertyValues } from "lit-element"; import { customElement, property, PropertyValues } from "lit-element";
import { applyThemesOnElement } from "../../src/common/dom/apply_themes_on_element"; import { applyThemesOnElement } from "../../src/common/dom/apply_themes_on_element";
@@ -34,12 +33,6 @@ import { HomeAssistant } from "../../src/types";
// Don't codesplit it, that way the dashboard always loads fast. // Don't codesplit it, that way the dashboard always loads fast.
import "./hassio-panel"; import "./hassio-panel";
// The register callback of the IronA11yKeysBehavior inside ha-icon-button
// is not called, causing _keyBindings to be uninitiliazed for ha-icon-button,
// causing an exception when added to DOM. When transpiled to ES5, this will
// break the build.
customElements.get("ha-icon-button").prototype._keyBindings = {};
@customElement("hassio-main") @customElement("hassio-main")
class HassioMain extends ProvideHassLitMixin(HassRouterPage) { class HassioMain extends ProvideHassLitMixin(HassRouterPage) {
@property() public hass!: HomeAssistant; @property() public hass!: HomeAssistant;

View File

@@ -1,3 +1,4 @@
import { mdiBackupRestore, mdiCogs, mdiStore, mdiViewDashboard } from "@mdi/js";
import { import {
customElement, customElement,
html, html,
@@ -5,37 +6,36 @@ import {
property, property,
TemplateResult, TemplateResult,
} from "lit-element"; } from "lit-element";
import { HassioHassOSInfo, HassioHostInfo } from "../../src/data/hassio/host"; import { HassioHassOSInfo, HassioHostInfo } from "../../src/data/hassio/host";
import { import {
HassioHomeAssistantInfo, HassioHomeAssistantInfo,
HassioSupervisorInfo, HassioSupervisorInfo,
} from "../../src/data/hassio/supervisor"; } from "../../src/data/hassio/supervisor";
import type { PageNavigation } from "../../src/layouts/hass-tabs-subpage";
import "../../src/resources/ha-style"; import "../../src/resources/ha-style";
import { HomeAssistant, Route } from "../../src/types"; import { HomeAssistant, Route } from "../../src/types";
import "./hassio-panel-router"; import "./hassio-panel-router";
import type { PageNavigation } from "../../src/layouts/hass-tabs-subpage";
export const supervisorTabs: PageNavigation[] = [ export const supervisorTabs: PageNavigation[] = [
{ {
name: "Dashboard", name: "Dashboard",
path: `/hassio/dashboard`, path: `/hassio/dashboard`,
icon: "hassio:view-dashboard", iconPath: mdiViewDashboard,
}, },
{ {
name: "Add-on store", name: "Add-on store",
path: `/hassio/store`, path: `/hassio/store`,
icon: "hassio:store", iconPath: mdiStore,
}, },
{ {
name: "Snapshots", name: "Snapshots",
path: `/hassio/snapshots`, path: `/hassio/snapshots`,
icon: "hassio:backup-restore", iconPath: mdiBackupRestore,
}, },
{ {
name: "System", name: "System",
path: `/hassio/system`, path: `/hassio/system`,
icon: "hassio:cogs", iconPath: mdiCogs,
}, },
]; ];

View File

@@ -86,9 +86,6 @@ class HassioIngressView extends LitElement {
height: 100%; height: 100%;
border: 0; border: 0;
} }
ha-icon-button {
color: var(--text-primary-color);
}
`; `;
} }
} }

View File

@@ -1,5 +1,6 @@
import "@material/mwc-button"; import "@material/mwc-button";
import "@polymer/paper-card/paper-card"; import "@material/mwc-icon-button";
import { mdiPackageVariant, mdiPackageVariantClosed, mdiReload } from "@mdi/js";
import "@polymer/paper-checkbox/paper-checkbox"; import "@polymer/paper-checkbox/paper-checkbox";
import type { PaperCheckboxElement } from "@polymer/paper-checkbox/paper-checkbox"; import type { PaperCheckboxElement } from "@polymer/paper-checkbox/paper-checkbox";
import "@polymer/paper-input/paper-input"; import "@polymer/paper-input/paper-input";
@@ -18,6 +19,8 @@ import {
TemplateResult, TemplateResult,
} from "lit-element"; } from "lit-element";
import { fireEvent } from "../../../src/common/dom/fire_event"; import { fireEvent } from "../../../src/common/dom/fire_event";
import "../../../src/components/ha-card";
import "../../../src/components/ha-svg-icon";
import { import {
createHassioFullSnapshot, createHassioFullSnapshot,
createHassioPartialSnapshot, createHassioPartialSnapshot,
@@ -28,15 +31,14 @@ import {
reloadHassioSnapshots, reloadHassioSnapshots,
} from "../../../src/data/hassio/snapshot"; } from "../../../src/data/hassio/snapshot";
import { HassioSupervisorInfo } from "../../../src/data/hassio/supervisor"; import { HassioSupervisorInfo } from "../../../src/data/hassio/supervisor";
import "../../../src/layouts/hass-tabs-subpage";
import { PolymerChangedEvent } from "../../../src/polymer-types"; import { PolymerChangedEvent } from "../../../src/polymer-types";
import { haStyle } from "../../../src/resources/styles"; import { haStyle } from "../../../src/resources/styles";
import { HomeAssistant, Route } from "../../../src/types"; import { HomeAssistant, Route } from "../../../src/types";
import "../../../src/layouts/hass-tabs-subpage";
import "../components/hassio-card-content"; import "../components/hassio-card-content";
import { showHassioSnapshotDialog } from "../dialogs/snapshot/show-dialog-hassio-snapshot"; import { showHassioSnapshotDialog } from "../dialogs/snapshot/show-dialog-hassio-snapshot";
import { hassioStyle } from "../resources/hassio-style";
import { supervisorTabs } from "../hassio-panel"; import { supervisorTabs } from "../hassio-panel";
import { hassioStyle } from "../resources/hassio-style";
interface CheckboxItem { interface CheckboxItem {
slug: string; slug: string;
@@ -98,12 +100,13 @@ class HassioSnapshots extends LitElement {
> >
<span slot="header">Snapshots</span> <span slot="header">Snapshots</span>
<ha-icon-button <mwc-icon-button
icon="hassio:reload"
slot="toolbar-icon" slot="toolbar-icon"
aria-label="Reload snapshots" aria-label="Reload snapshots"
@click=${this.refreshData} @click=${this.refreshData}
></ha-icon-button> >
<ha-svg-icon path=${mdiReload}></ha-svg-icon>
</mwc-icon-button>
<div class="content"> <div class="content">
<h1> <h1>
@@ -114,7 +117,7 @@ class HassioSnapshots extends LitElement {
Home Assistant instance. Home Assistant instance.
</p> </p>
<div class="card-group"> <div class="card-group">
<paper-card> <ha-card>
<div class="card-content"> <div class="card-content">
<paper-input <paper-input
autofocus autofocus
@@ -195,7 +198,7 @@ class HassioSnapshots extends LitElement {
Create Create
</mwc-button> </mwc-button>
</div> </div>
</paper-card> </ha-card>
</div> </div>
<h1>Available snapshots</h1> <h1>Available snapshots</h1>
@@ -204,15 +207,15 @@ class HassioSnapshots extends LitElement {
? undefined ? undefined
: this._snapshots.length === 0 : this._snapshots.length === 0
? html` ? html`
<paper-card> <ha-card>
<div class="card-content"> <div class="card-content">
You don't have any snapshots yet. You don't have any snapshots yet.
</div> </div>
</paper-card> </ha-card>
` `
: this._snapshots.map( : this._snapshots.map(
(snapshot) => html` (snapshot) => html`
<paper-card <ha-card
class="pointer" class="pointer"
.snapshot=${snapshot} .snapshot=${snapshot}
@click=${this._snapshotClicked} @click=${this._snapshotClicked}
@@ -224,12 +227,12 @@ class HassioSnapshots extends LitElement {
.description=${this._computeDetails(snapshot)} .description=${this._computeDetails(snapshot)}
.datetime=${snapshot.date} .datetime=${snapshot.date}
.icon=${snapshot.type === "full" .icon=${snapshot.type === "full"
? "hassio:package-variant-closed" ? mdiPackageVariantClosed
: "hassio:package-variant"} : mdiPackageVariant}
.icon-class="snapshot" .icon-class="snapshot"
></hassio-card-content> ></hassio-card-content>
</div> </div>
</paper-card> </ha-card>
` `
)} )}
</div> </div>

View File

@@ -1,5 +1,4 @@
import "@material/mwc-button"; import "@material/mwc-button";
import "@polymer/paper-card/paper-card";
import { import {
css, css,
CSSResult, CSSResult,
@@ -12,23 +11,23 @@ import {
import "../../../src/components/buttons/ha-call-api-button"; import "../../../src/components/buttons/ha-call-api-button";
import { fetchHassioHardwareInfo } from "../../../src/data/hassio/hardware"; import { fetchHassioHardwareInfo } from "../../../src/data/hassio/hardware";
import { import {
changeHostOptions,
fetchHassioHostInfo, fetchHassioHostInfo,
HassioHassOSInfo, HassioHassOSInfo,
HassioHostInfo as HassioHostInfoType, HassioHostInfo as HassioHostInfoType,
rebootHost, rebootHost,
shutdownHost, shutdownHost,
updateOS, updateOS,
changeHostOptions,
} from "../../../src/data/hassio/host"; } from "../../../src/data/hassio/host";
import {
showAlertDialog,
showConfirmationDialog,
showPromptDialog,
} from "../../../src/dialogs/generic/show-dialog-box";
import { haStyle } from "../../../src/resources/styles"; import { haStyle } from "../../../src/resources/styles";
import { HomeAssistant } from "../../../src/types"; import { HomeAssistant } from "../../../src/types";
import { showHassioMarkdownDialog } from "../dialogs/markdown/show-dialog-hassio-markdown"; import { showHassioMarkdownDialog } from "../dialogs/markdown/show-dialog-hassio-markdown";
import { hassioStyle } from "../resources/hassio-style"; import { hassioStyle } from "../resources/hassio-style";
import {
showConfirmationDialog,
showAlertDialog,
showPromptDialog,
} from "../../../src/dialogs/generic/show-dialog-box";
@customElement("hassio-host-info") @customElement("hassio-host-info")
class HassioHostInfo extends LitElement { class HassioHostInfo extends LitElement {
@@ -42,7 +41,7 @@ class HassioHostInfo extends LitElement {
public render(): TemplateResult | void { public render(): TemplateResult | void {
return html` return html`
<paper-card> <ha-card>
<div class="card-content"> <div class="card-content">
<h2>Host system</h2> <h2>Host system</h2>
<table class="info"> <table class="info">
@@ -113,7 +112,7 @@ class HassioHostInfo extends LitElement {
? html` <mwc-button @click=${this._updateOS}>Update</mwc-button> ` ? html` <mwc-button @click=${this._updateOS}>Update</mwc-button> `
: ""} : ""}
</div> </div>
</paper-card> </ha-card>
`; `;
} }
@@ -122,7 +121,7 @@ class HassioHostInfo extends LitElement {
haStyle, haStyle,
hassioStyle, hassioStyle,
css` css`
paper-card { ha-card {
height: 100%; height: 100%;
width: 100%; width: 100%;
} }

View File

@@ -1,5 +1,4 @@
import "@material/mwc-button"; import "@material/mwc-button";
import "@polymer/paper-card/paper-card";
import { import {
css, css,
CSSResult, CSSResult,
@@ -11,15 +10,16 @@ import {
} from "lit-element"; } from "lit-element";
import { fireEvent } from "../../../src/common/dom/fire_event"; import { fireEvent } from "../../../src/common/dom/fire_event";
import "../../../src/components/buttons/ha-call-api-button"; import "../../../src/components/buttons/ha-call-api-button";
import "../../../src/components/ha-card";
import { import {
HassioSupervisorInfo as HassioSupervisorInfoType, HassioSupervisorInfo as HassioSupervisorInfoType,
setSupervisorOption, setSupervisorOption,
SupervisorOptions, SupervisorOptions,
} from "../../../src/data/hassio/supervisor"; } from "../../../src/data/hassio/supervisor";
import { showConfirmationDialog } from "../../../src/dialogs/generic/show-dialog-box";
import { haStyle } from "../../../src/resources/styles"; import { haStyle } from "../../../src/resources/styles";
import { HomeAssistant } from "../../../src/types"; import { HomeAssistant } from "../../../src/types";
import { hassioStyle } from "../resources/hassio-style"; import { hassioStyle } from "../resources/hassio-style";
import { showConfirmationDialog } from "../../../src/dialogs/generic/show-dialog-box";
@customElement("hassio-supervisor-info") @customElement("hassio-supervisor-info")
class HassioSupervisorInfo extends LitElement { class HassioSupervisorInfo extends LitElement {
@@ -31,7 +31,7 @@ class HassioSupervisorInfo extends LitElement {
public render(): TemplateResult | void { public render(): TemplateResult | void {
return html` return html`
<paper-card> <ha-card>
<div class="card-content"> <div class="card-content">
<h2>Supervisor</h2> <h2>Supervisor</h2>
<table class="info"> <table class="info">
@@ -92,7 +92,7 @@ class HassioSupervisorInfo extends LitElement {
` `
: ""} : ""}
</div> </div>
</paper-card> </ha-card>
`; `;
} }
@@ -101,7 +101,7 @@ class HassioSupervisorInfo extends LitElement {
haStyle, haStyle,
hassioStyle, hassioStyle,
css` css`
paper-card { ha-card {
height: 100%; height: 100%;
width: 100%; width: 100%;
} }

View File

@@ -2,7 +2,6 @@ import "@material/mwc-button";
import "@polymer/paper-dropdown-menu/paper-dropdown-menu"; import "@polymer/paper-dropdown-menu/paper-dropdown-menu";
import "@polymer/paper-item/paper-item"; import "@polymer/paper-item/paper-item";
import "@polymer/paper-listbox/paper-listbox"; import "@polymer/paper-listbox/paper-listbox";
import "@polymer/paper-card/paper-card";
import { import {
css, css,
CSSResult, CSSResult,
@@ -12,14 +11,13 @@ import {
property, property,
TemplateResult, TemplateResult,
} from "lit-element"; } from "lit-element";
import "../../../src/components/ha-card";
import { fetchHassioLogs } from "../../../src/data/hassio/supervisor";
import "../../../src/layouts/loading-screen";
import { haStyle } from "../../../src/resources/styles"; import { haStyle } from "../../../src/resources/styles";
import { HomeAssistant } from "../../../src/types"; import { HomeAssistant } from "../../../src/types";
import { fetchHassioLogs } from "../../../src/data/hassio/supervisor";
import "../components/hassio-ansi-to-html"; import "../components/hassio-ansi-to-html";
import { hassioStyle } from "../resources/hassio-style"; import { hassioStyle } from "../resources/hassio-style";
import "../../../src/layouts/loading-screen";
interface LogProvider { interface LogProvider {
key: string; key: string;
@@ -70,7 +68,7 @@ class HassioSupervisorLog extends LitElement {
public render(): TemplateResult | void { public render(): TemplateResult | void {
return html` return html`
<paper-card> <ha-card>
${this._error ? html` <div class="errors">${this._error}</div> ` : ""} ${this._error ? html` <div class="errors">${this._error}</div> ` : ""}
${this.hass.userData?.showAdvanced ${this.hass.userData?.showAdvanced
? html` ? html`
@@ -105,7 +103,7 @@ class HassioSupervisorLog extends LitElement {
<div class="card-actions"> <div class="card-actions">
<mwc-button @click=${this._refresh}>Refresh</mwc-button> <mwc-button @click=${this._refresh}>Refresh</mwc-button>
</div> </div>
</paper-card> </ha-card>
`; `;
} }
@@ -114,7 +112,7 @@ class HassioSupervisorLog extends LitElement {
haStyle, haStyle,
hassioStyle, hassioStyle,
css` css`
paper-card { ha-card {
width: 100%; width: 100%;
} }
pre { pre {

View File

@@ -13,16 +13,15 @@ import {
HassioHostInfo, HassioHostInfo,
} from "../../../src/data/hassio/host"; } from "../../../src/data/hassio/host";
import { HassioSupervisorInfo } from "../../../src/data/hassio/supervisor"; import { HassioSupervisorInfo } from "../../../src/data/hassio/supervisor";
import { haStyle } from "../../../src/resources/styles";
import "../../../src/layouts/hass-tabs-subpage"; import "../../../src/layouts/hass-tabs-subpage";
import { haStyle } from "../../../src/resources/styles";
import { HomeAssistant, Route } from "../../../src/types"; import { HomeAssistant, Route } from "../../../src/types";
import { supervisorTabs } from "../hassio-panel";
import { hassioStyle } from "../resources/hassio-style"; import { hassioStyle } from "../resources/hassio-style";
import "./hassio-host-info"; import "./hassio-host-info";
import "./hassio-supervisor-info"; import "./hassio-supervisor-info";
import "./hassio-supervisor-log"; import "./hassio-supervisor-log";
import { supervisorTabs } from "../hassio-panel";
@customElement("hassio-system") @customElement("hassio-system")
class HassioSystem extends LitElement { class HassioSystem extends LitElement {
@property({ attribute: false }) public hass!: HomeAssistant; @property({ attribute: false }) public hass!: HomeAssistant;

View File

@@ -24,19 +24,19 @@
"author": "Paulus Schoutsen <Paulus@PaulusSchoutsen.nl> (http://paulusschoutsen.nl)", "author": "Paulus Schoutsen <Paulus@PaulusSchoutsen.nl> (http://paulusschoutsen.nl)",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@fullcalendar/core": "5.0.0-beta.2", "@fullcalendar/core": "^5.0.0-beta.2",
"@fullcalendar/daygrid": "5.0.0-beta.2", "@fullcalendar/daygrid": "^5.0.0-beta.2",
"@material/chips": "^6.0.0-canary.35a32aaea.0", "@material/chips": "7.0.0-canary.d92d8c93e.0",
"@material/mwc-button": "0.14.1", "@material/mwc-button": "^0.15.0",
"@material/mwc-checkbox": "0.14.1", "@material/mwc-checkbox": "^0.15.0",
"@material/mwc-dialog": "0.14.1", "@material/mwc-dialog": "^0.15.0",
"@material/mwc-fab": "0.14.1", "@material/mwc-fab": "^0.15.0",
"@material/mwc-formfield": "0.14.1", "@material/mwc-formfield": "^0.15.0",
"@material/mwc-icon-button": "0.14.1", "@material/mwc-icon-button": "^0.15.0",
"@material/mwc-list": "0.14.1", "@material/mwc-list": "^0.15.0",
"@material/mwc-menu": "0.14.1", "@material/mwc-menu": "^0.15.0",
"@material/mwc-ripple": "0.14.1", "@material/mwc-ripple": "^0.15.0",
"@material/mwc-switch": "0.14.1", "@material/mwc-switch": "^0.15.0",
"@mdi/js": "4.9.95", "@mdi/js": "4.9.95",
"@mdi/svg": "4.9.95", "@mdi/svg": "4.9.95",
"@polymer/app-layout": "^3.0.2", "@polymer/app-layout": "^3.0.2",
@@ -93,14 +93,14 @@
"fuse.js": "^3.4.4", "fuse.js": "^3.4.4",
"google-timezones-json": "^1.0.2", "google-timezones-json": "^1.0.2",
"hls.js": "^0.12.4", "hls.js": "^0.12.4",
"home-assistant-js-websocket": "5.0.0", "home-assistant-js-websocket": "^5.1.2",
"idb-keyval": "^3.2.0", "idb-keyval": "^3.2.0",
"intl-messageformat": "^8.3.9", "intl-messageformat": "^8.3.9",
"js-yaml": "^3.13.1", "js-yaml": "^3.13.1",
"leaflet": "^1.4.0", "leaflet": "^1.4.0",
"leaflet-draw": "^1.0.4", "leaflet-draw": "^1.0.4",
"lit-element": "^2.2.1", "lit-element": "^2.3.1",
"lit-html": "^1.1.0", "lit-html": "^1.2.1",
"lit-virtualizer": "^0.4.2", "lit-virtualizer": "^0.4.2",
"marked": "^0.6.1", "marked": "^0.6.1",
"mdn-polyfills": "^5.16.0", "mdn-polyfills": "^5.16.0",
@@ -196,20 +196,21 @@
"resolutions": { "resolutions": {
"@webcomponents/webcomponentsjs": "^2.2.10", "@webcomponents/webcomponentsjs": "^2.2.10",
"@polymer/polymer": "3.1.0", "@polymer/polymer": "3.1.0",
"lit-html": "^1.1.2", "lit-html": "1.2.1",
"@material/animation": "6.0.0", "lit-element": "2.3.1",
"@material/base": "6.0.0", "@material/animation": "7.0.0-canary.d92d8c93e.0",
"@material/checkbox": "6.0.0", "@material/base": "7.0.0-canary.d92d8c93e.0",
"@material/density": "6.0.0", "@material/checkbox": "7.0.0-canary.d92d8c93e.0",
"@material/dom": "6.0.0", "@material/density": "7.0.0-canary.d92d8c93e.0",
"@material/elevation": "6.0.0", "@material/dom": "7.0.0-canary.d92d8c93e.0",
"@material/feature-targeting": "6.0.0", "@material/elevation": "7.0.0-canary.d92d8c93e.0",
"@material/ripple": "6.0.0", "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0",
"@material/rtl": "6.0.0", "@material/ripple": "7.0.0-canary.d92d8c93e.0",
"@material/shape": "6.0.0", "@material/rtl": "7.0.0-canary.d92d8c93e.0",
"@material/theme": "6.0.0", "@material/shape": "7.0.0-canary.d92d8c93e.0",
"@material/touch-target": "6.0.0", "@material/theme": "7.0.0-canary.d92d8c93e.0",
"@material/typography": "6.0.0" "@material/touch-target": "7.0.0-canary.d92d8c93e.0",
"@material/typography": "7.0.0-canary.d92d8c93e.0"
}, },
"main": "src/home-assistant.js", "main": "src/home-assistant.js",
"husky": { "husky": {

View File

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

View File

@@ -1,4 +1,3 @@
import "../../components/ha-icon-button";
import "@polymer/paper-input/paper-input"; import "@polymer/paper-input/paper-input";
import { import {
css, css,
@@ -9,8 +8,10 @@ import {
} from "lit-element"; } from "lit-element";
import { html, TemplateResult } from "lit-html"; import { html, TemplateResult } from "lit-html";
import { classMap } from "lit-html/directives/class-map"; import { classMap } from "lit-html/directives/class-map";
import "../../components/ha-icon"; import "../../components/ha-svg-icon";
import { fireEvent } from "../dom/fire_event"; import { fireEvent } from "../dom/fire_event";
import { mdiMagnify, mdiClose } from "@mdi/js";
import "@material/mwc-icon-button/mwc-icon-button";
@customElement("search-input") @customElement("search-input")
class SearchInput extends LitElement { class SearchInput extends LitElement {
@@ -47,17 +48,22 @@ class SearchInput extends LitElement {
@value-changed=${this._filterInputChanged} @value-changed=${this._filterInputChanged}
.noLabelFloat=${this.noLabelFloat} .noLabelFloat=${this.noLabelFloat}
> >
<ha-icon icon="hass:magnify" slot="prefix" class="prefix"></ha-icon> <ha-svg-icon
path=${mdiMagnify}
slot="prefix"
class="prefix"
></ha-svg-icon>
${this.filter && ${this.filter &&
html` html`
<ha-icon-button <mwc-icon-button
slot="suffix" slot="suffix"
class="suffix" class="suffix"
@click=${this._clearSearch} @click=${this._clearSearch}
icon="hass:close"
alt="Clear" alt="Clear"
title="Clear" title="Clear"
></ha-icon-button> >
<ha-svg-icon path=${mdiClose}></ha-svg-icon>
</mwc-icon-button>
`} `}
</paper-input> </paper-input>
`; `;
@@ -77,11 +83,14 @@ class SearchInput extends LitElement {
static get styles(): CSSResult { static get styles(): CSSResult {
return css` return css`
ha-icon, ha-svg-icon,
ha-icon-button { mwc-icon-button {
color: var(--primary-text-color); color: var(--primary-text-color);
} }
ha-icon { mwc-icon-button {
--mdc-icon-button-size: 24px;
}
ha-svg-icon.prefix {
margin: 8px; margin: 8px;
} }
`; `;

View File

@@ -6,18 +6,19 @@ import {
CSSResult, CSSResult,
css, css,
query, query,
property,
} from "lit-element"; } from "lit-element";
import "@material/mwc-button"; import "@material/mwc-button";
import "@material/mwc-menu"; import "@material/mwc-menu";
import "@material/mwc-list/mwc-list-item"; import "@material/mwc-list/mwc-list-item";
import type { Menu } from "@material/mwc-menu"; import type { Menu, Corner } from "@material/mwc-menu";
import { haStyle } from "../resources/styles";
import "./ha-icon-button"; import "./ha-icon-button";
@customElement("ha-button-menu") @customElement("ha-button-menu")
export class HaButtonMenu extends LitElement { export class HaButtonMenu extends LitElement {
@property() public corner: Corner = "TOP_START";
@query("mwc-menu") private _menu?: Menu; @query("mwc-menu") private _menu?: Menu;
protected render(): TemplateResult { protected render(): TemplateResult {
@@ -25,7 +26,7 @@ export class HaButtonMenu extends LitElement {
<div @click=${this._handleClick}> <div @click=${this._handleClick}>
<slot name="trigger"></slot> <slot name="trigger"></slot>
</div> </div>
<mwc-menu> <mwc-menu .corner=${this.corner}>
<slot></slot> <slot></slot>
</mwc-menu> </mwc-menu>
`; `;
@@ -36,15 +37,13 @@ export class HaButtonMenu extends LitElement {
this._menu!.show(); this._menu!.show();
} }
static get styles(): CSSResult[] { static get styles(): CSSResult {
return [ return css`
haStyle, :host {
css` display: block;
:host { position: relative;
position: relative; }
} `;
`,
];
} }
} }

View File

@@ -4,17 +4,19 @@ import { style } from "@material/mwc-dialog/mwc-dialog-css";
import "./ha-icon-button"; import "./ha-icon-button";
import { css, CSSResult, customElement, html } from "lit-element"; import { css, CSSResult, customElement, html } from "lit-element";
import type { Constructor, HomeAssistant } from "../types"; import type { Constructor, HomeAssistant } from "../types";
import { mdiClose } from "@mdi/js";
const MwcDialog = customElements.get("mwc-dialog") as Constructor<Dialog>; const MwcDialog = customElements.get("mwc-dialog") as Constructor<Dialog>;
export const createCloseHeading = (hass: HomeAssistant, title: string) => html` export const createCloseHeading = (hass: HomeAssistant, title: string) => html`
${title} ${title}
<ha-icon-button <mwc-icon-button
aria-label=${hass.localize("ui.dialogs.generic.close")} aria-label=${hass.localize("ui.dialogs.generic.close")}
icon="hass:close"
dialogAction="close" dialogAction="close"
class="close_button" class="close_button"
></ha-icon-button> >
<ha-svg-icon path=${mdiClose}></ha-svg-icon>
</mwc-icon-button>
`; `;
@customElement("ha-dialog") @customElement("ha-dialog")

View File

@@ -1,41 +0,0 @@
import "@material/mwc-fab";
import type { Fab } from "@material/mwc-fab";
import { ripple } from "@material/mwc-ripple/ripple-directive";
import { customElement, html, TemplateResult } from "lit-element";
import { classMap } from "lit-html/directives/class-map";
import type { Constructor } from "../types";
import "./ha-icon";
const MwcFab = customElements.get("mwc-fab") as Constructor<Fab>;
@customElement("ha-fab")
export class HaFab extends MwcFab {
// We override the render method because we don't have an icon font and mwc-fab doesn't support our svg-icon sets.
// Based on version mwc-fab 0.8
protected render(): TemplateResult {
const classes = {
"mdc-fab--mini": this.mini,
"mdc-fab--exited": this.exited,
"mdc-fab--extended": this.extended,
};
const showLabel = this.label !== "" && this.extended;
return html`
<button
.ripple="${ripple()}"
class="mdc-fab ${classMap(classes)}"
?disabled="${this.disabled}"
aria-label="${this.label || this.icon}"
>
${showLabel && this.showIconAtEnd ? this.label : ""}
${this.icon ? html` <ha-icon .icon=${this.icon}></ha-icon> ` : ""}
${showLabel && !this.showIconAtEnd ? this.label : ""}
</button>
`;
}
}
declare global {
interface HTMLElementTagNameMap {
"ha-fab": HaFab;
}
}

View File

@@ -1,17 +1,30 @@
import { HaIconButton } from "./ha-icon-button"; import { LitElement, property, TemplateResult, html } from "lit-element";
import { mdiArrowLeft, mdiArrowRight } from "@mdi/js";
import "@material/mwc-icon-button/mwc-icon-button";
import "./ha-svg-icon";
export class HaIconButtonArrowPrev extends LitElement {
@property({ type: Boolean }) public disabled = false;
@property() private _icon = mdiArrowLeft;
export class HaIconButtonArrowPrev extends HaIconButton {
public connectedCallback() { public connectedCallback() {
super.connectedCallback(); super.connectedCallback();
// wait to check for direction since otherwise direction is wrong even though top level is RTL // wait to check for direction since otherwise direction is wrong even though top level is RTL
setTimeout(() => { setTimeout(() => {
this.icon = this._icon =
window.getComputedStyle(this).direction === "ltr" window.getComputedStyle(this).direction === "ltr"
? "hass:arrow-left" ? mdiArrowLeft
: "hass:arrow-right"; : mdiArrowRight;
}, 100); }, 100);
} }
protected render(): TemplateResult {
return html`<mwc-icon-button .disabled=${this.disabled}>
<ha-svg-icon .path=${this._icon}></ha-svg-icon>
</mwc-icon-button> `;
}
} }
declare global { declare global {

View File

@@ -1,5 +1,4 @@
import "@polymer/iron-icon/iron-icon"; import "@polymer/iron-icon/iron-icon";
import { get, set, clear, Store } from "idb-keyval";
import { import {
customElement, customElement,
LitElement, LitElement,
@@ -11,84 +10,23 @@ import {
CSSResult, CSSResult,
} from "lit-element"; } from "lit-element";
import "./ha-svg-icon"; import "./ha-svg-icon";
import { customIconsets, CustomIcon } from "../data/custom_iconsets";
import {
Chunks,
MDI_PREFIXES,
getIcon,
findIconChunk,
Icons,
checkCacheVersion,
writeCache,
} from "../data/iconsets";
import { debounce } from "../common/util/debounce"; import { debounce } from "../common/util/debounce";
import { iconMetadata } from "../resources/icon-metadata";
import { IconMeta } from "../types";
interface Icons {
[key: string]: string;
}
interface Chunks {
[key: string]: Promise<Icons>;
}
const iconStore = new Store("hass-icon-db", "mdi-icon-store");
get("_version", iconStore).then((version) => {
if (!version) {
set("_version", iconMetadata.version, iconStore);
} else if (version !== iconMetadata.version) {
clear(iconStore).then(() =>
set("_version", iconMetadata.version, iconStore)
);
}
});
const chunks: Chunks = {}; const chunks: Chunks = {};
const MDI_PREFIXES = ["mdi", "hass", "hassio", "hademo"];
let toRead: Array<[string, (string) => void]> = []; checkCacheVersion();
// Queue up as many icon fetches in 1 transaction const debouncedWriteCache = debounce(() => writeCache(chunks), 2000);
const getIcon = (iconName: string) =>
new Promise<string>((resolve) => {
toRead.push([iconName, resolve]);
if (toRead.length > 1) {
return;
}
const results: Array<[(string) => void, IDBRequest]> = [];
iconStore
._withIDBStore("readonly", (store) => {
for (const [iconName_, resolve_] of toRead) {
results.push([resolve_, store.get(iconName_)]);
}
toRead = [];
})
.then(() => {
for (const [resolve_, request] of results) {
resolve_(request.result);
}
});
});
const findIconChunk = (icon): string => {
let lastChunk: IconMeta;
for (const chunk of iconMetadata.parts) {
if (chunk.start !== undefined && icon < chunk.start) {
break;
}
lastChunk = chunk;
}
return lastChunk!.file;
};
const debouncedWriteCache = debounce(async () => {
const keys = Object.keys(chunks);
const iconsSets: Icons[] = await Promise.all(Object.values(chunks));
// We do a batch opening the store just once, for (considerable) performance
iconStore._withIDBStore("readwrite", (store) => {
iconsSets.forEach((icons, idx) => {
Object.entries(icons).forEach(([name, path]) => {
store.put(path, name);
});
delete chunks[keys[idx]];
});
});
}, 2000);
@customElement("ha-icon") @customElement("ha-icon")
export class HaIcon extends LitElement { export class HaIcon extends LitElement {
@@ -96,11 +34,14 @@ export class HaIcon extends LitElement {
@property() private _path?: string; @property() private _path?: string;
@property() private _noMdi = false; @property() private _viewBox?;
@property() private _legacy = false;
protected updated(changedProps: PropertyValues) { protected updated(changedProps: PropertyValues) {
if (changedProps.has("icon")) { if (changedProps.has("icon")) {
this._path = undefined; this._path = undefined;
this._viewBox = undefined;
this._loadIcon(); this._loadIcon();
} }
} }
@@ -109,25 +50,39 @@ export class HaIcon extends LitElement {
if (!this.icon) { if (!this.icon) {
return html``; return html``;
} }
if (this._noMdi) { if (this._legacy) {
return html`<iron-icon .icon=${this.icon}></iron-icon>`; return html`<iron-icon .icon=${this.icon}></iron-icon>`;
} }
return html`<ha-svg-icon .path=${this._path}></ha-svg-icon>`; return html`<ha-svg-icon
.path=${this._path}
.viewBox=${this._viewBox}
></ha-svg-icon>`;
} }
private async _loadIcon() { private async _loadIcon() {
if (!this.icon) { if (!this.icon) {
return; return;
} }
const icon = this.icon.split(":", 2); const [iconPrefix, iconName] = this.icon.split(":", 2);
if (!MDI_PREFIXES.includes(icon[0])) {
this._noMdi = true; if (!iconPrefix || !iconName) {
return; return;
} }
this._noMdi = false; if (!MDI_PREFIXES.includes(iconPrefix)) {
if (iconPrefix in customIconsets) {
const customIconset = customIconsets[iconPrefix];
if (customIconset) {
this._setCustomPath(customIconset(iconName));
}
return;
}
this._legacy = true;
return;
}
this._legacy = false;
const iconName = icon[1];
const cachedPath: string = await getIcon(iconName); const cachedPath: string = await getIcon(iconName);
if (cachedPath) { if (cachedPath) {
this._path = cachedPath; this._path = cachedPath;
@@ -147,6 +102,12 @@ export class HaIcon extends LitElement {
debouncedWriteCache(); debouncedWriteCache();
} }
private async _setCustomPath(promise: Promise<CustomIcon>) {
const icon = await promise;
this._path = icon.path;
this._viewBox = icon.viewBox;
}
private async _setPath(promise: Promise<Icons>, iconName: string) { private async _setPath(promise: Promise<Icons>, iconName: string) {
const iconPack = await promise; const iconPack = await promise;
this._path = iconPack[iconName]; this._path = iconPack[iconName];

View File

@@ -31,12 +31,14 @@ class HaLabelBadge extends LitElement {
big: Boolean(this.value && this.value.length > 4), big: Boolean(this.value && this.value.length > 4),
})}" })}"
> >
${this.icon && !this.value && !this.image <slot>
? html` <ha-icon .icon="${this.icon}"></ha-icon> ` ${this.icon && !this.value && !this.image
: ""} ? html` <ha-icon .icon=${this.icon}></ha-icon> `
${this.value && !this.image : ""}
? html` <span>${this.value}</span> ` ${this.value && !this.image
: ""} ? html` <span>${this.value}</span> `
: ""}
</slot>
</div> </div>
${this.label ${this.label
? html` ? html`

View File

@@ -13,6 +13,7 @@ import { computeDomain } from "../common/entity/compute_domain";
import { subscribeNotifications } from "../data/persistent_notification"; import { subscribeNotifications } from "../data/persistent_notification";
import { HomeAssistant } from "../types"; import { HomeAssistant } from "../types";
import "./ha-icon-button"; import "./ha-icon-button";
import { mdiMenu } from "@mdi/js";
@customElement("ha-menu-button") @customElement("ha-menu-button")
class HaMenuButton extends LitElement { class HaMenuButton extends LitElement {
@@ -55,11 +56,12 @@ class HaMenuButton extends LitElement {
(entityId) => computeDomain(entityId) === "configurator" (entityId) => computeDomain(entityId) === "configurator"
)); ));
return html` return html`
<ha-icon-button <mwc-icon-button
aria-label=${this.hass.localize("ui.sidebar.sidebar_toggle")} aria-label=${this.hass.localize("ui.sidebar.sidebar_toggle")}
icon="hass:menu"
@click=${this._toggleMenu} @click=${this._toggleMenu}
></ha-icon-button> >
<ha-svg-icon path=${mdiMenu}></ha-svg-icon>
</mwc-icon-button>
${hasNotifications ? html` <div class="dot"></div> ` : ""} ${hasNotifications ? html` <div class="dot"></div> ` : ""}
`; `;
} }
@@ -133,8 +135,8 @@ class HaMenuButton extends LitElement {
background-color: var(--accent-color); background-color: var(--accent-color);
width: 12px; width: 12px;
height: 12px; height: 12px;
top: 5px; top: 9px;
right: 2px; right: 7px;
border-radius: 50%; border-radius: 50%;
border: 2px solid var(--app-header-background-color); border: 2px solid var(--app-header-background-color);
} }

View File

@@ -12,10 +12,12 @@ import {
export class HaSvgIcon extends LitElement { export class HaSvgIcon extends LitElement {
@property() public path?: string; @property() public path?: string;
@property() public viewBox?: string;
protected render(): SVGTemplateResult { protected render(): SVGTemplateResult {
return svg` return svg`
<svg <svg
viewBox="0 0 24 24" viewBox=${this.viewBox || "0 0 24 24"}
preserveAspectRatio="xMidYMid meet" preserveAspectRatio="xMidYMid meet"
focusable="false"> focusable="false">
<g> <g>

148
src/components/ha-tab.ts Normal file
View File

@@ -0,0 +1,148 @@
import {
css,
CSSResult,
customElement,
LitElement,
property,
TemplateResult,
html,
queryAsync,
internalProperty,
eventOptions,
} from "lit-element";
import "@material/mwc-ripple/mwc-ripple";
import type { Ripple } from "@material/mwc-ripple";
import { RippleHandlers } from "@material/mwc-ripple/ripple-handlers";
import "./ha-icon";
import "./ha-svg-icon";
import { ifDefined } from "lit-html/directives/if-defined";
import { fireEvent } from "../common/dom/fire_event";
declare global {
// for fire event
interface HASSDomEvents {
activated: undefined;
}
}
@customElement("ha-tab")
export class HaTab extends LitElement {
@property({ type: Boolean, reflect: true }) public active = false;
@property({ type: Boolean, reflect: true }) public narrow = false;
@property() public name?: string;
@queryAsync("mwc-ripple") private _ripple!: Promise<Ripple | null>;
@internalProperty() private _shouldRenderRipple = false;
protected render(): TemplateResult {
return html`
<div
tabindex="0"
role="tab"
aria-selected=${this.active}
aria-label=${ifDefined(this.name)}
@focus=${this.handleRippleFocus}
@blur=${this.handleRippleBlur}
@mousedown=${this.handleRippleActivate}
@mouseup=${this.handleRippleDeactivate}
@mouseenter=${this.handleRippleMouseEnter}
@mouseleave=${this.handleRippleMouseLeave}
@touchstart=${this.handleRippleActivate}
@touchend=${this.handleRippleDeactivate}
@touchcancel=${this.handleRippleDeactivate}
@keydown=${this._handleKeyDown}
@click=${this._handleClick}
>
${this.narrow ? html`<slot name="icon"></slot>` : ""}
${!this.narrow || this.active
? html` <span class="name">${this.name}</span> `
: ""}
${this._shouldRenderRipple ? html`<mwc-ripple></mwc-ripple>` : ""}
</div>
`;
}
private _rippleHandlers: RippleHandlers = new RippleHandlers(() => {
this._shouldRenderRipple = true;
return this._ripple;
});
private _handleKeyDown(ev: KeyboardEvent): void {
if (ev.keyCode === 13) {
fireEvent(this, "activated");
}
}
private _handleClick(): void {
fireEvent(this, "activated");
}
@eventOptions({ passive: true })
private handleRippleActivate(evt?: Event) {
this._rippleHandlers.startPress(evt);
}
private handleRippleDeactivate() {
this._rippleHandlers.endPress();
}
private handleRippleMouseEnter() {
this._rippleHandlers.startHover();
}
private handleRippleMouseLeave() {
this._rippleHandlers.endHover();
}
private handleRippleFocus() {
this._rippleHandlers.startFocus();
}
private handleRippleBlur() {
this._rippleHandlers.endFocus();
}
static get styles(): CSSResult {
return css`
div {
padding: 0 32px;
display: flex;
flex-direction: column;
text-align: center;
align-items: center;
justify-content: center;
height: 64px;
cursor: pointer;
position: relative;
outline: none;
box-sizing: border-box;
}
.name {
white-space: nowrap;
}
:host([active]) {
color: var(--primary-color);
}
:host(:not([narrow])[active]) div {
border-bottom: 2px solid var(--primary-color);
}
:host([narrow]) {
padding: 0 16px;
width: 20%;
min-width: 0;
}
`;
}
}
declare global {
interface HTMLElementTagNameMap {
"ha-tab": HaTab;
}
}

View File

@@ -8,6 +8,8 @@ export interface ConfigUpdateValues {
elevation: number; elevation: number;
unit_system: "metric" | "imperial"; unit_system: "metric" | "imperial";
time_zone: string; time_zone: string;
external_url?: string | null;
internal_url?: string | null;
} }
export const saveCoreConfig = ( export const saveCoreConfig = (

View File

@@ -0,0 +1,16 @@
export interface CustomIcon {
path: string;
viewBox?: string;
}
export interface CustomIconsetsWindow {
customIconsets?: { [key: string]: (name: string) => Promise<CustomIcon> };
}
const customIconsetsWindow = window as CustomIconsetsWindow;
if (!("customIconsets" in customIconsetsWindow)) {
customIconsetsWindow.customIconsets = {};
}
export const customIconsets = customIconsetsWindow.customIconsets!;

79
src/data/iconsets.ts Normal file
View File

@@ -0,0 +1,79 @@
import { iconMetadata } from "../resources/icon-metadata";
import { IconMeta } from "../types";
import { get, set, clear, Store } from "idb-keyval";
export interface Icons {
[key: string]: string;
}
export interface Chunks {
[key: string]: Promise<Icons>;
}
export const iconStore = new Store("hass-icon-db", "mdi-icon-store");
export const MDI_PREFIXES = ["mdi", "hass", "hassio", "hademo"];
let toRead: Array<[string, (string) => void]> = [];
// Queue up as many icon fetches in 1 transaction
export const getIcon = (iconName: string) =>
new Promise<string>((resolve) => {
toRead.push([iconName, resolve]);
if (toRead.length > 1) {
return;
}
const results: Array<[(string) => void, IDBRequest]> = [];
iconStore
._withIDBStore("readonly", (store) => {
for (const [iconName_, resolve_] of toRead) {
results.push([resolve_, store.get(iconName_)]);
}
toRead = [];
})
.then(() => {
for (const [resolve_, request] of results) {
resolve_(request.result);
}
});
});
export const findIconChunk = (icon): string => {
let lastChunk: IconMeta;
for (const chunk of iconMetadata.parts) {
if (chunk.start !== undefined && icon < chunk.start) {
break;
}
lastChunk = chunk;
}
return lastChunk!.file;
};
export const writeCache = async (chunks: Chunks) => {
const keys = Object.keys(chunks);
const iconsSets: Icons[] = await Promise.all(Object.values(chunks));
// We do a batch opening the store just once, for (considerable) performance
iconStore._withIDBStore("readwrite", (store) => {
iconsSets.forEach((icons, idx) => {
Object.entries(icons).forEach(([name, path]) => {
store.put(path, name);
});
delete chunks[keys[idx]];
});
});
};
export const checkCacheVersion = () => {
get("_version", iconStore).then((version) => {
if (!version) {
set("_version", iconMetadata.version, iconStore);
} else if (version !== iconMetadata.version) {
clear(iconStore).then(() =>
set("_version", iconMetadata.version, iconStore)
);
}
});
};

View File

@@ -7,6 +7,7 @@ export interface IntegrationManifest {
name: string; name: string;
config_flow: boolean; config_flow: boolean;
documentation: string; documentation: string;
issue_tracker?: string;
dependencies?: string[]; dependencies?: string[];
after_dependencies?: string[]; after_dependencies?: string[];
codeowners?: string[]; codeowners?: string[];

View File

@@ -339,7 +339,6 @@ class DataEntryFlowDialog extends LitElement {
ha-icon-button { ha-icon-button {
display: inline-block; display: inline-block;
padding: 8px; padding: 8px;
margin: 16px 16px 0 0;
float: right; float: right;
} }
`, `,

View File

@@ -10,6 +10,7 @@ import LocalizeMixin from "../../../mixins/localize-mixin";
import CoverEntity from "../../../util/cover-model"; import CoverEntity from "../../../util/cover-model";
const FEATURE_CLASS_NAMES = { const FEATURE_CLASS_NAMES = {
4: "has-set_position",
128: "has-set_tilt_position", 128: "has-set_tilt_position",
}; };
class MoreInfoCover extends LocalizeMixin(PolymerElement) { class MoreInfoCover extends LocalizeMixin(PolymerElement) {
@@ -23,6 +24,7 @@ class MoreInfoCover extends LocalizeMixin(PolymerElement) {
overflow: hidden; overflow: hidden;
} }
.has-set_position .current_position,
.has-current_position .current_position, .has-current_position .current_position,
.has-set_tilt_position .tilt, .has-set_tilt_position .tilt,
.has-current_tilt_position .tilt { .has-current_tilt_position .tilt {

View File

@@ -456,15 +456,15 @@ export class HaVoiceCommandDialog extends LitElement {
} }
.bouncer { .bouncer {
width: 40px; width: 48px;
height: 40px; height: 48px;
position: absolute; position: absolute;
top: 0; top: 0;
} }
.double-bounce1, .double-bounce1,
.double-bounce2 { .double-bounce2 {
width: 40px; width: 48px;
height: 40px; height: 48px;
border-radius: 50%; border-radius: 50%;
background-color: var(--primary-color); background-color: var(--primary-color);
opacity: 0.2; opacity: 0.2;

View File

@@ -18,4 +18,6 @@ export const demoConfig: HassConfig = {
whitelist_external_dirs: [], whitelist_external_dirs: [],
config_source: "storage", config_source: "storage",
safe_mode: false, safe_mode: false,
internal_url: "http://homeassistant.local:8123",
external_url: null,
}; };

View File

@@ -16,7 +16,9 @@ import { navigate } from "../common/navigate";
import "../components/ha-menu-button"; import "../components/ha-menu-button";
import "../components/ha-icon-button-arrow-prev"; import "../components/ha-icon-button-arrow-prev";
import { HomeAssistant, Route } from "../types"; import { HomeAssistant, Route } from "../types";
import "../components/ha-svg-icon";
import "../components/ha-icon"; import "../components/ha-icon";
import "../components/ha-tab";
export interface PageNavigation { export interface PageNavigation {
path: string; path: string;
@@ -26,6 +28,7 @@ export interface PageNavigation {
core?: boolean; core?: boolean;
advancedOnly?: boolean; advancedOnly?: boolean;
icon?: string; icon?: string;
iconPath?: string;
info?: any; info?: any;
} }
@@ -33,12 +36,12 @@ export interface PageNavigation {
class HassTabsSubpage extends LitElement { class HassTabsSubpage extends LitElement {
@property() public hass!: HomeAssistant; @property() public hass!: HomeAssistant;
@property({ type: Boolean }) public hassio = false;
@property({ type: String, attribute: "back-path" }) public backPath?: string; @property({ type: String, attribute: "back-path" }) public backPath?: string;
@property() public backCallback?: () => void; @property() public backCallback?: () => void;
@property({ type: Boolean }) public hassio = false;
@property({ type: Boolean, attribute: "main-page" }) public mainPage = false; @property({ type: Boolean, attribute: "main-page" }) public mainPage = false;
@property() public route!: Route; @property() public route!: Route;
@@ -69,27 +72,23 @@ class HassTabsSubpage extends LitElement {
return shownTabs.map( return shownTabs.map(
(page) => (page) =>
html` html`
<div <ha-tab
class="tab ${classMap({ .hass=${this.hass}
active: page === activeTab, @activated=${this._tabTapped}
})}"
@click=${this._tabTapped}
.path=${page.path} .path=${page.path}
.active=${page === activeTab}
.narrow=${this.narrow}
.name=${page.translationKey
? this.hass.localize(page.translationKey)
: page.name}
> >
${this.narrow ${page.iconPath
? html` <ha-icon .icon=${page.icon}></ha-icon> ` ? html`<ha-svg-icon
: ""} slot="icon"
${!this.narrow || page === activeTab .path=${page.iconPath}
? html` ></ha-svg-icon>`
<span class="name" : html`<ha-icon slot="icon" .icon=${page.icon}></ha-icon>`}
>${page.translationKey </ha-tab>
? this.hass.localize(page.translationKey)
: page.name}</span
>
`
: ""}
<mwc-ripple></mwc-ripple>
</div>
` `
); );
} }
@@ -119,8 +118,8 @@ class HassTabsSubpage extends LitElement {
${this.mainPage ${this.mainPage
? html` ? html`
<ha-menu-button <ha-menu-button
.hass=${this.hass}
.hassio=${this.hassio} .hassio=${this.hassio}
.hass=${this.hass}
.narrow=${this.narrow} .narrow=${this.narrow}
></ha-menu-button> ></ha-menu-button>
` `
@@ -150,7 +149,7 @@ class HassTabsSubpage extends LitElement {
`; `;
} }
private _tabTapped(ev: MouseEvent): void { private _tabTapped(ev: Event): void {
navigate(this, (ev.currentTarget as any).path, true); navigate(this, (ev.currentTarget as any).path, true);
} }
@@ -174,6 +173,10 @@ class HassTabsSubpage extends LitElement {
background-color: var(--primary-background-color); background-color: var(--primary-background-color);
} }
ha-menu-button {
margin-right: 24px;
}
.toolbar { .toolbar {
display: flex; display: flex;
align-items: center; align-items: center;
@@ -211,35 +214,6 @@ class HassTabsSubpage extends LitElement {
justify-content: center; justify-content: center;
} }
.tab {
padding: 0 32px;
display: flex;
flex-direction: column;
text-align: center;
align-items: center;
justify-content: center;
height: 64px;
cursor: pointer;
}
.name {
white-space: nowrap;
}
.tab.active {
color: var(--primary-color);
}
#tabbar:not(.bottom-bar) .tab.active {
border-bottom: 2px solid var(--primary-color);
}
.bottom-bar .tab {
padding: 0 16px;
width: 20%;
min-width: 0;
}
:host(:not([narrow])) #toolbar-icon { :host(:not([narrow])) #toolbar-icon {
min-width: 40px; min-width: 40px;
} }

View File

@@ -16,7 +16,7 @@ import {
DataTableColumnContainer, DataTableColumnContainer,
RowClickedEvent, RowClickedEvent,
} from "../../../components/data-table/ha-data-table"; } from "../../../components/data-table/ha-data-table";
import "../../../components/ha-fab"; import "@material/mwc-fab";
import { import {
AreaRegistryEntry, AreaRegistryEntry,
createAreaRegistryEntry, createAreaRegistryEntry,
@@ -26,6 +26,8 @@ import {
devicesInArea, devicesInArea,
} from "../../../data/device_registry"; } from "../../../data/device_registry";
import { showAlertDialog } from "../../../dialogs/generic/show-dialog-box"; import { showAlertDialog } from "../../../dialogs/generic/show-dialog-box";
import "../../../components/ha-icon-button";
import "../../../components/ha-svg-icon";
import "../../../layouts/hass-loading-screen"; import "../../../layouts/hass-loading-screen";
import "../../../layouts/hass-tabs-subpage-data-table"; import "../../../layouts/hass-tabs-subpage-data-table";
import { HomeAssistant, Route } from "../../../types"; import { HomeAssistant, Route } from "../../../types";
@@ -35,6 +37,7 @@ import {
loadAreaRegistryDetailDialog, loadAreaRegistryDetailDialog,
showAreaRegistryDetailDialog, showAreaRegistryDetailDialog,
} from "./show-dialog-area-registry-detail"; } from "./show-dialog-area-registry-detail";
import { mdiPlus } from "@mdi/js";
@customElement("ha-config-areas-dashboard") @customElement("ha-config-areas-dashboard")
export class HaConfigAreasDashboard extends LitElement { export class HaConfigAreasDashboard extends LitElement {
@@ -120,15 +123,16 @@ export class HaConfigAreasDashboard extends LitElement {
@click=${this._showHelp} @click=${this._showHelp}
></ha-icon-button> ></ha-icon-button>
</hass-tabs-subpage-data-table> </hass-tabs-subpage-data-table>
<ha-fab <mwc-fab
?is-wide=${this.isWide} ?is-wide=${this.isWide}
?narrow=${this.narrow} ?narrow=${this.narrow}
icon="hass:plus"
title="${this.hass.localize( title="${this.hass.localize(
"ui.panel.config.areas.picker.create_area" "ui.panel.config.areas.picker.create_area"
)}" )}"
@click=${this._createArea} @click=${this._createArea}
></ha-fab> >
<ha-svg-icon slot="icon" path=${mdiPlus}></ha-svg-icon>
</mwc-fab>
`; `;
} }
@@ -177,25 +181,25 @@ export class HaConfigAreasDashboard extends LitElement {
--app-header-background-color: var(--sidebar-background-color); --app-header-background-color: var(--sidebar-background-color);
--app-header-text-color: var(--sidebar-text-color); --app-header-text-color: var(--sidebar-text-color);
} }
ha-fab { mwc-fab {
position: fixed; position: fixed;
bottom: 16px; bottom: 16px;
right: 16px; right: 16px;
z-index: 1; z-index: 1;
} }
ha-fab[is-wide] { mwc-fab[is-wide] {
bottom: 24px; bottom: 24px;
right: 24px; right: 24px;
} }
ha-fab[narrow] { mwc-fab[narrow] {
bottom: 84px; bottom: 84px;
} }
ha-fab.rtl { mwc-fab.rtl {
right: auto; right: auto;
left: 16px; left: 16px;
} }
ha-fab[is-wide].rtl { mwc-fab[is-wide].rtl {
bottom: 24px; bottom: 24px;
right: auto; right: auto;
left: 24px; left: 24px;

View File

@@ -14,7 +14,8 @@ import { classMap } from "lit-html/directives/class-map";
import { navigate } from "../../../common/navigate"; import { navigate } from "../../../common/navigate";
import { computeRTL } from "../../../common/util/compute_rtl"; import { computeRTL } from "../../../common/util/compute_rtl";
import "../../../components/ha-card"; import "../../../components/ha-card";
import "../../../components/ha-fab"; import "../../../components/ha-svg-icon";
import "@material/mwc-fab";
import { import {
AutomationConfig, AutomationConfig,
AutomationEntity, AutomationEntity,
@@ -40,6 +41,7 @@ import { HaDeviceAction } from "./action/types/ha-automation-action-device_id";
import "./condition/ha-automation-condition"; import "./condition/ha-automation-condition";
import "./trigger/ha-automation-trigger"; import "./trigger/ha-automation-trigger";
import { HaDeviceTrigger } from "./trigger/types/ha-automation-trigger-device"; import { HaDeviceTrigger } from "./trigger/types/ha-automation-trigger-device";
import { mdiContentSave } from "@mdi/js";
export class HaAutomationEditor extends LitElement { export class HaAutomationEditor extends LitElement {
@property() public hass!: HomeAssistant; @property() public hass!: HomeAssistant;
@@ -244,11 +246,10 @@ export class HaAutomationEditor extends LitElement {
</div> </div>
` `
: ""} : ""}
<ha-fab <mwc-fab
?is-wide="${this.isWide}" ?is-wide="${this.isWide}"
?narrow="${this.narrow}" ?narrow="${this.narrow}"
?dirty="${this._dirty}" ?dirty="${this._dirty}"
icon="hass:content-save"
.title="${this.hass.localize( .title="${this.hass.localize(
"ui.panel.config.automation.editor.save" "ui.panel.config.automation.editor.save"
)}" )}"
@@ -256,7 +257,9 @@ export class HaAutomationEditor extends LitElement {
class="${classMap({ class="${classMap({
rtl: computeRTL(this.hass), rtl: computeRTL(this.hass),
})}" })}"
></ha-fab> >
<ha-svg-icon slot="icon" path=${mdiContentSave}></ha-svg-icon>
</mwc-fab>
</hass-tabs-subpage> </hass-tabs-subpage>
`; `;
} }
@@ -452,7 +455,7 @@ export class HaAutomationEditor extends LitElement {
ha-entity-toggle { ha-entity-toggle {
margin-right: 8px; margin-right: 8px;
} }
ha-fab { mwc-fab {
position: fixed; position: fixed;
bottom: 16px; bottom: 16px;
right: 16px; right: 16px;
@@ -461,24 +464,24 @@ export class HaAutomationEditor extends LitElement {
transition: margin-bottom 0.3s; transition: margin-bottom 0.3s;
} }
ha-fab[is-wide] { mwc-fab[is-wide] {
bottom: 24px; bottom: 24px;
right: 24px; right: 24px;
} }
ha-fab[narrow] { mwc-fab[narrow] {
bottom: 84px; bottom: 84px;
margin-bottom: -140px; margin-bottom: -140px;
} }
ha-fab[dirty] { mwc-fab[dirty] {
margin-bottom: 0; margin-bottom: 0;
} }
ha-fab.rtl { mwc-fab.rtl {
right: auto; right: auto;
left: 16px; left: 16px;
} }
ha-fab[is-wide].rtl { mwc-fab[is-wide].rtl {
bottom: 24px; bottom: 24px;
right: auto; right: auto;
left: 24px; left: 24px;

View File

@@ -18,7 +18,7 @@ import { computeStateName } from "../../../common/entity/compute_state_name";
import { computeRTL } from "../../../common/util/compute_rtl"; import { computeRTL } from "../../../common/util/compute_rtl";
import { DataTableColumnContainer } from "../../../components/data-table/ha-data-table"; import { DataTableColumnContainer } from "../../../components/data-table/ha-data-table";
import "../../../components/entity/ha-entity-toggle"; import "../../../components/entity/ha-entity-toggle";
import "../../../components/ha-fab"; import "@material/mwc-fab";
import { import {
AutomationConfig, AutomationConfig,
AutomationEntity, AutomationEntity,
@@ -30,6 +30,8 @@ import { haStyle } from "../../../resources/styles";
import { HomeAssistant, Route } from "../../../types"; import { HomeAssistant, Route } from "../../../types";
import { configSections } from "../ha-panel-config"; import { configSections } from "../ha-panel-config";
import { showThingtalkDialog } from "./show-dialog-thingtalk"; import { showThingtalkDialog } from "./show-dialog-thingtalk";
import "../../../components/ha-svg-icon";
import { mdiPlus } from "@mdi/js";
@customElement("ha-automation-picker") @customElement("ha-automation-picker")
class HaAutomationPicker extends LitElement { class HaAutomationPicker extends LitElement {
@@ -168,17 +170,18 @@ class HaAutomationPicker extends LitElement {
hasFab hasFab
> >
</hass-tabs-subpage-data-table> </hass-tabs-subpage-data-table>
<ha-fab <mwc-fab
slot="fab" slot="fab"
?is-wide=${this.isWide} ?is-wide=${this.isWide}
?narrow=${this.narrow} ?narrow=${this.narrow}
icon="hass:plus"
title=${this.hass.localize( title=${this.hass.localize(
"ui.panel.config.automation.picker.add_automation" "ui.panel.config.automation.picker.add_automation"
)} )}
?rtl=${computeRTL(this.hass)} ?rtl=${computeRTL(this.hass)}
@click=${this._createNew} @click=${this._createNew}
></ha-fab> >
<ha-svg-icon slot="icon" path=${mdiPlus}></ha-svg-icon>
</mwc-fab>
`; `;
} }
@@ -208,7 +211,7 @@ class HaAutomationPicker extends LitElement {
return [ return [
haStyle, haStyle,
css` css`
ha-fab { mwc-fab {
position: fixed; position: fixed;
bottom: 16px; bottom: 16px;
right: 16px; right: 16px;
@@ -216,19 +219,19 @@ class HaAutomationPicker extends LitElement {
cursor: pointer; cursor: pointer;
} }
ha-fab[is-wide] { mwc-fab[is-wide] {
bottom: 24px; bottom: 24px;
right: 24px; right: 24px;
} }
ha-fab[narrow] { mwc-fab[narrow] {
bottom: 84px; bottom: 84px;
} }
ha-fab[rtl] { mwc-fab[rtl] {
right: auto; right: auto;
left: 16px; left: 16px;
} }
ha-fab[rtl][is-wide] { mwc-fab[rtl][is-wide] {
bottom: 24px; bottom: 24px;
right: auto; right: auto;
left: 24px; left: 24px;

View File

@@ -11,6 +11,7 @@ import "../../../resources/ha-style";
import "../ha-config-section"; import "../ha-config-section";
import "./ha-config-core-form"; import "./ha-config-core-form";
import "./ha-config-name-form"; import "./ha-config-name-form";
import "./ha-config-url-form";
/* /*
* @appliesMixin LocalizeMixin * @appliesMixin LocalizeMixin
@@ -59,6 +60,7 @@ class HaConfigSectionCore extends LocalizeMixin(PolymerElement) {
<ha-config-name-form hass="[[hass]]"></ha-config-name-form> <ha-config-name-form hass="[[hass]]"></ha-config-name-form>
<ha-config-core-form hass="[[hass]]"></ha-config-core-form> <ha-config-core-form hass="[[hass]]"></ha-config-core-form>
<ha-config-url-form hass="[[hass]]"></ha-config-url-form>
</ha-config-section> </ha-config-section>
`; `;
} }

View File

@@ -0,0 +1,168 @@
import "@material/mwc-button/mwc-button";
import "@polymer/paper-input/paper-input";
import type { PaperInputElement } from "@polymer/paper-input/paper-input";
import {
css,
CSSResult,
customElement,
html,
LitElement,
property,
TemplateResult,
} from "lit-element";
import "../../../components/ha-card";
import { saveCoreConfig } from "../../../data/core";
import type { PolymerChangedEvent } from "../../../polymer-types";
import type { HomeAssistant } from "../../../types";
@customElement("ha-config-url-form")
class ConfigUrlForm extends LitElement {
@property() public hass!: HomeAssistant;
@property() private _error?: string;
@property() private _working = false;
@property() private _external_url?: string;
@property() private _internal_url?: string;
protected render(): TemplateResult {
const canEdit = ["storage", "default"].includes(
this.hass.config.config_source
);
const disabled = this._working || !canEdit;
if (!this.hass.userData?.showAdvanced) {
return html``;
}
return html`
<ha-card>
<div class="card-content">
${!canEdit
? html`
<p>
${this.hass.localize(
"ui.panel.config.core.section.core.core_config.edit_requires_storage"
)}
</p>
`
: ""}
${this._error ? html`<div class="error">${this._error}</div>` : ""}
<div class="row">
<div class="flex">
${this.hass.localize(
"ui.panel.config.core.section.core.core_config.external_url"
)}
</div>
<paper-input
class="flex"
.label=${this.hass.localize(
"ui.panel.config.core.section.core.core_config.external_url"
)}
name="external_url"
type="url"
.disabled=${disabled}
.value=${this._externalUrlValue}
@value-changed=${this._handleChange}
>
</paper-input>
</div>
<div class="row">
<div class="flex">
${this.hass.localize(
"ui.panel.config.core.section.core.core_config.internal_url"
)}
</div>
<paper-input
class="flex"
.label=${this.hass.localize(
"ui.panel.config.core.section.core.core_config.internal_url"
)}
name="internal_url"
type="url"
.disabled=${disabled}
.value=${this._internalUrlValue}
@value-changed=${this._handleChange}
>
</paper-input>
</div>
</div>
<div class="card-actions">
<mwc-button @click=${this._save} .disabled=${disabled}>
${this.hass.localize(
"ui.panel.config.core.section.core.core_config.save_button"
)}
</mwc-button>
</div>
</ha-card>
`;
}
private get _internalUrlValue() {
return this._internal_url !== undefined
? this._internal_url
: this.hass.config.internal_url;
}
private get _externalUrlValue() {
return this._external_url !== undefined
? this._external_url
: this.hass.config.external_url;
}
private _handleChange(ev: PolymerChangedEvent<string>) {
const target = ev.currentTarget as PaperInputElement;
this[`_${target.name}`] = target.value;
}
private async _save() {
this._working = true;
this._error = undefined;
try {
await saveCoreConfig(this.hass, {
external_url: this._external_url || null,
internal_url: this._internal_url || null,
});
} catch (err) {
this._error = err.message || err;
} finally {
this._working = false;
}
}
static get styles(): CSSResult {
return css`
.row {
display: flex;
flex-direction: row;
margin: 0 -8px;
align-items: center;
}
.secondary {
color: var(--secondary-text-color);
}
.flex {
flex: 1;
}
.row > * {
margin: 0 8px;
}
.error {
color: var(--error-color);
}
`;
}
}
declare global {
interface HTMLElementTagNameMap {
"ha-config-url-form": ConfigUrlForm;
}
}

View File

@@ -22,7 +22,7 @@ import {
DataTableColumnContainer, DataTableColumnContainer,
RowClickedEvent, RowClickedEvent,
} from "../../../components/data-table/ha-data-table"; } from "../../../components/data-table/ha-data-table";
import "../../../components/ha-fab"; import "@material/mwc-fab";
import "../../../components/ha-icon"; import "../../../components/ha-icon";
import "../../../layouts/hass-loading-screen"; import "../../../layouts/hass-loading-screen";
import "../../../layouts/hass-tabs-subpage-data-table"; import "../../../layouts/hass-tabs-subpage-data-table";
@@ -31,6 +31,8 @@ import { showEntityEditorDialog } from "../entities/show-dialog-entity-editor";
import { configSections } from "../ha-panel-config"; import { configSections } from "../ha-panel-config";
import { HELPER_DOMAINS } from "./const"; import { HELPER_DOMAINS } from "./const";
import { showHelperDetailDialog } from "./show-dialog-helper-detail"; import { showHelperDetailDialog } from "./show-dialog-helper-detail";
import "../../../components/ha-svg-icon";
import { mdiPlus } from "@mdi/js";
@customElement("ha-config-helpers") @customElement("ha-config-helpers")
export class HaConfigHelpers extends LitElement { export class HaConfigHelpers extends LitElement {
@@ -154,15 +156,16 @@ export class HaConfigHelpers extends LitElement {
hasFab hasFab
> >
</hass-tabs-subpage-data-table> </hass-tabs-subpage-data-table>
<ha-fab <mwc-fab
?is-wide=${this.isWide} ?is-wide=${this.isWide}
?narrow=${this.narrow} ?narrow=${this.narrow}
icon="hass:plus"
title="${this.hass.localize( title="${this.hass.localize(
"ui.panel.config.helpers.picker.add_helper" "ui.panel.config.helpers.picker.add_helper"
)}" )}"
@click=${this._createHelpler} @click=${this._createHelpler}
></ha-fab> >
<ha-svg-icon slot="icon" path=${mdiPlus}></ha-svg-icon>
</mwc-fab>
`; `;
} }
@@ -209,17 +212,17 @@ export class HaConfigHelpers extends LitElement {
static get styles(): CSSResult { static get styles(): CSSResult {
return css` return css`
ha-fab { mwc-fab {
position: fixed; position: fixed;
bottom: 16px; bottom: 16px;
right: 16px; right: 16px;
z-index: 1; z-index: 1;
} }
ha-fab[is-wide] { mwc-fab[is-wide] {
bottom: 24px; bottom: 24px;
right: 24px; right: 24px;
} }
ha-fab[narrow] { mwc-fab[narrow] {
bottom: 84px; bottom: 84px;
} }
`; `;

View File

@@ -20,7 +20,7 @@ import {
} from "../../../common/util/render-status"; } from "../../../common/util/render-status";
import "../../../components/entity/ha-state-icon"; import "../../../components/entity/ha-state-icon";
import "../../../components/ha-card"; import "../../../components/ha-card";
import "../../../components/ha-fab"; import "@material/mwc-fab";
import { import {
ConfigEntry, ConfigEntry,
deleteConfigEntry, deleteConfigEntry,
@@ -58,6 +58,8 @@ import type {
HaIntegrationCard, HaIntegrationCard,
} from "./ha-integration-card"; } from "./ha-integration-card";
import { HASSDomEvent } from "../../../common/dom/fire_event"; import { HASSDomEvent } from "../../../common/dom/fire_event";
import "../../../components/ha-svg-icon";
import { mdiPlus } from "@mdi/js";
interface DataEntryFlowProgressExtended extends DataEntryFlowProgress { interface DataEntryFlowProgressExtended extends DataEntryFlowProgress {
localized_title?: string; localized_title?: string;
@@ -452,15 +454,16 @@ class HaConfigIntegrations extends SubscribeMixin(LitElement) {
` `
: ""} : ""}
</div> </div>
<ha-fab <mwc-fab
icon="hass:plus"
aria-label=${this.hass.localize("ui.panel.config.integrations.new")} aria-label=${this.hass.localize("ui.panel.config.integrations.new")}
title=${this.hass.localize("ui.panel.config.integrations.new")} title=${this.hass.localize("ui.panel.config.integrations.new")}
@click=${this._createFlow} @click=${this._createFlow}
?is-wide=${this.isWide} ?is-wide=${this.isWide}
?narrow=${this.narrow} ?narrow=${this.narrow}
?rtl=${computeRTL(this.hass!)} ?rtl=${computeRTL(this.hass!)}
></ha-fab> >
<ha-svg-icon slot="icon" path=${mdiPlus}></ha-svg-icon>
</mwc-fab>
</hass-tabs-subpage> </hass-tabs-subpage>
`; `;
} }
@@ -680,24 +683,24 @@ class HaConfigIntegrations extends SubscribeMixin(LitElement) {
h2 { h2 {
margin-top: 0; margin-top: 0;
} }
ha-fab { mwc-fab {
position: fixed; position: fixed;
bottom: 16px; bottom: 16px;
right: 16px; right: 16px;
z-index: 1; z-index: 1;
} }
ha-fab[is-wide] { mwc-fab[is-wide] {
bottom: 24px; bottom: 24px;
right: 24px; right: 24px;
} }
ha-fab[narrow] { mwc-fab[narrow] {
bottom: 84px; bottom: 84px;
} }
ha-fab[rtl] { mwc-fab[rtl] {
right: auto; right: auto;
left: 16px; left: 16px;
} }
ha-fab[is-wide].rtl { mwc-fab[is-wide].rtl {
bottom: 24px; bottom: 24px;
left: 24px; left: 24px;
right: auto; right: auto;

View File

@@ -148,7 +148,9 @@ export class HaIntegrationCard extends LitElement {
> >
` `
: ""} : ""}
${devices.length && entities.length ? "and" : ""} ${devices.length && entities.length
? this.hass.localize("ui.common.and")
: ""}
${entities.length ${entities.length
? html` ? html`
<a <a

View File

@@ -1,3 +1,4 @@
import "@material/mwc-fab";
import "@polymer/paper-tooltip/paper-tooltip"; import "@polymer/paper-tooltip/paper-tooltip";
import { import {
css, css,
@@ -16,7 +17,6 @@ import {
DataTableColumnContainer, DataTableColumnContainer,
RowClickedEvent, RowClickedEvent,
} from "../../../../components/data-table/ha-data-table"; } from "../../../../components/data-table/ha-data-table";
import "../../../../components/ha-fab";
import "../../../../components/ha-icon"; import "../../../../components/ha-icon";
import "../../../../components/ha-icon-button"; import "../../../../components/ha-icon-button";
import { import {
@@ -34,6 +34,8 @@ import "../../../../layouts/hass-tabs-subpage-data-table";
import { HomeAssistant, Route } from "../../../../types"; import { HomeAssistant, Route } from "../../../../types";
import { lovelaceTabs } from "../ha-config-lovelace"; import { lovelaceTabs } from "../ha-config-lovelace";
import { showDashboardDetailDialog } from "./show-dialog-lovelace-dashboard-detail"; import { showDashboardDetailDialog } from "./show-dialog-lovelace-dashboard-detail";
import "../../../../components/ha-svg-icon";
import { mdiPlus } from "@mdi/js";
@customElement("ha-config-lovelace-dashboards") @customElement("ha-config-lovelace-dashboards")
export class HaConfigLovelaceDashboards extends LitElement { export class HaConfigLovelaceDashboards extends LitElement {
@@ -222,15 +224,16 @@ export class HaConfigLovelaceDashboards extends LitElement {
hasFab hasFab
> >
</hass-tabs-subpage-data-table> </hass-tabs-subpage-data-table>
<ha-fab <mwc-fab
?is-wide=${this.isWide} ?is-wide=${this.isWide}
?narrow=${this.narrow} ?narrow=${this.narrow}
icon="hass:plus"
title="${this.hass.localize( title="${this.hass.localize(
"ui.panel.config.lovelace.dashboards.picker.add_dashboard" "ui.panel.config.lovelace.dashboards.picker.add_dashboard"
)}" )}"
@click=${this._addDashboard} @click=${this._addDashboard}
></ha-fab> >
<ha-svg-icon slot="icon" path=${mdiPlus}></ha-svg-icon>
</mwc-fab>
`; `;
} }
@@ -308,17 +311,17 @@ export class HaConfigLovelaceDashboards extends LitElement {
static get styles(): CSSResult { static get styles(): CSSResult {
return css` return css`
ha-fab { mwc-fab {
position: fixed; position: fixed;
bottom: 16px; bottom: 16px;
right: 16px; right: 16px;
z-index: 1; z-index: 1;
} }
ha-fab[is-wide] { mwc-fab[is-wide] {
bottom: 24px; bottom: 24px;
right: 24px; right: 24px;
} }
ha-fab[narrow] { mwc-fab[narrow] {
bottom: 84px; bottom: 84px;
} }
`; `;

View File

@@ -3,6 +3,7 @@ import "@polymer/paper-dropdown-menu/paper-dropdown-menu";
import "@polymer/paper-item/paper-icon-item"; import "@polymer/paper-item/paper-icon-item";
import "@polymer/paper-listbox/paper-listbox"; import "@polymer/paper-listbox/paper-listbox";
import "@polymer/paper-tooltip/paper-tooltip"; import "@polymer/paper-tooltip/paper-tooltip";
import "@material/mwc-fab";
import { import {
css, css,
CSSResult, CSSResult,
@@ -19,7 +20,6 @@ import {
DataTableColumnContainer, DataTableColumnContainer,
RowClickedEvent, RowClickedEvent,
} from "../../../../components/data-table/ha-data-table"; } from "../../../../components/data-table/ha-data-table";
import "../../../../components/ha-fab";
import "../../../../components/ha-icon"; import "../../../../components/ha-icon";
import { import {
createResource, createResource,
@@ -38,6 +38,8 @@ import { HomeAssistant, Route } from "../../../../types";
import { loadLovelaceResources } from "../../../lovelace/common/load-resources"; import { loadLovelaceResources } from "../../../lovelace/common/load-resources";
import { lovelaceTabs } from "../ha-config-lovelace"; import { lovelaceTabs } from "../ha-config-lovelace";
import { showResourceDetailDialog } from "./show-dialog-lovelace-resource-detail"; import { showResourceDetailDialog } from "./show-dialog-lovelace-resource-detail";
import "../../../../components/ha-svg-icon";
import { mdiPlus } from "@mdi/js";
@customElement("ha-config-lovelace-resources") @customElement("ha-config-lovelace-resources")
export class HaConfigLovelaceRescources extends LitElement { export class HaConfigLovelaceRescources extends LitElement {
@@ -102,15 +104,16 @@ export class HaConfigLovelaceRescources extends LitElement {
hasFab hasFab
> >
</hass-tabs-subpage-data-table> </hass-tabs-subpage-data-table>
<ha-fab <mwc-fab
?is-wide=${this.isWide} ?is-wide=${this.isWide}
?narrow=${this.narrow} ?narrow=${this.narrow}
icon="hass:plus"
title=${this.hass.localize( title=${this.hass.localize(
"ui.panel.config.lovelace.resources.picker.add_resource" "ui.panel.config.lovelace.resources.picker.add_resource"
)} )}
@click=${this._addResource} @click=${this._addResource}
></ha-fab> >
<ha-svg-icon slot="icon" path=${mdiPlus}></ha-svg-icon>
</mwc-fab>
`; `;
} }
@@ -199,17 +202,17 @@ export class HaConfigLovelaceRescources extends LitElement {
static get styles(): CSSResult { static get styles(): CSSResult {
return css` return css`
ha-fab { mwc-fab {
position: fixed; position: fixed;
bottom: 16px; bottom: 16px;
right: 16px; right: 16px;
z-index: 1; z-index: 1;
} }
ha-fab[is-wide] { mwc-fab[is-wide] {
bottom: 24px; bottom: 24px;
right: 24px; right: 24px;
} }
ha-fab[narrow] { mwc-fab[narrow] {
bottom: 84px; bottom: 84px;
} }
`; `;

View File

@@ -10,7 +10,7 @@ import {
} from "lit-element"; } from "lit-element";
import { compare } from "../../../common/string/compare"; import { compare } from "../../../common/string/compare";
import "../../../components/ha-card"; import "../../../components/ha-card";
import "../../../components/ha-fab"; import "@material/mwc-fab";
import { import {
createPerson, createPerson,
deletePerson, deletePerson,
@@ -29,6 +29,8 @@ import {
loadPersonDetailDialog, loadPersonDetailDialog,
showPersonDetailDialog, showPersonDetailDialog,
} from "./show-dialog-person-detail"; } from "./show-dialog-person-detail";
import "../../../components/ha-svg-icon";
import { mdiPlus } from "@mdi/js";
class HaConfigPerson extends LitElement { class HaConfigPerson extends LitElement {
@property() public hass?: HomeAssistant; @property() public hass?: HomeAssistant;
@@ -121,13 +123,14 @@ class HaConfigPerson extends LitElement {
</ha-config-section> </ha-config-section>
</hass-tabs-subpage> </hass-tabs-subpage>
<ha-fab <mwc-fab
?is-wide=${this.isWide} ?is-wide=${this.isWide}
?narrow=${this.narrow} ?narrow=${this.narrow}
icon="hass:plus"
title="${hass.localize("ui.panel.config.person.add_person")}" title="${hass.localize("ui.panel.config.person.add_person")}"
@click=${this._createPerson} @click=${this._createPerson}
></ha-fab> >
<ha-svg-icon slot="icon" path=${mdiPlus}></ha-svg-icon>
</mwc-fab>
`; `;
} }
@@ -237,16 +240,16 @@ class HaConfigPerson extends LitElement {
ha-card.storage paper-item { ha-card.storage paper-item {
cursor: pointer; cursor: pointer;
} }
ha-fab { mwc-fab {
position: fixed; position: fixed;
bottom: 16px; bottom: 16px;
right: 16px; right: 16px;
z-index: 1; z-index: 1;
} }
ha-fab[narrow] { mwc-fab[narrow] {
bottom: 84px; bottom: 84px;
} }
ha-fab[is-wide] { mwc-fab[is-wide] {
bottom: 24px; bottom: 24px;
right: 24px; right: 24px;
} }

View File

@@ -15,7 +15,7 @@ import { fireEvent } from "../../../common/dom/fire_event";
import { computeStateName } from "../../../common/entity/compute_state_name"; import { computeStateName } from "../../../common/entity/compute_state_name";
import { computeRTL } from "../../../common/util/compute_rtl"; import { computeRTL } from "../../../common/util/compute_rtl";
import { DataTableColumnContainer } from "../../../components/data-table/ha-data-table"; import { DataTableColumnContainer } from "../../../components/data-table/ha-data-table";
import "../../../components/ha-fab"; import "@material/mwc-fab";
import { forwardHaptic } from "../../../data/haptics"; import { forwardHaptic } from "../../../data/haptics";
import { activateScene, SceneEntity } from "../../../data/scene"; import { activateScene, SceneEntity } from "../../../data/scene";
import { showAlertDialog } from "../../../dialogs/generic/show-dialog-box"; import { showAlertDialog } from "../../../dialogs/generic/show-dialog-box";
@@ -24,6 +24,8 @@ import { haStyle } from "../../../resources/styles";
import { HomeAssistant, Route } from "../../../types"; import { HomeAssistant, Route } from "../../../types";
import { showToast } from "../../../util/toast"; import { showToast } from "../../../util/toast";
import { configSections } from "../ha-panel-config"; import { configSections } from "../ha-panel-config";
import "../../../components/ha-svg-icon";
import { mdiPlus } from "@mdi/js";
@customElement("ha-scene-dashboard") @customElement("ha-scene-dashboard")
class HaSceneDashboard extends LitElement { class HaSceneDashboard extends LitElement {
@@ -144,13 +146,14 @@ class HaSceneDashboard extends LitElement {
></ha-icon-button> ></ha-icon-button>
</hass-tabs-subpage-data-table> </hass-tabs-subpage-data-table>
<a href="/config/scene/edit/new"> <a href="/config/scene/edit/new">
<ha-fab <mwc-fab
?is-wide=${this.isWide} ?is-wide=${this.isWide}
?narrow=${this.narrow} ?narrow=${this.narrow}
icon="hass:plus"
title=${this.hass.localize("ui.panel.config.scene.picker.add_scene")} title=${this.hass.localize("ui.panel.config.scene.picker.add_scene")}
?rtl=${computeRTL(this.hass)} ?rtl=${computeRTL(this.hass)}
></ha-fab> >
<ha-svg-icon slot="icon" path=${mdiPlus}></ha-svg-icon>
</mwc-fab>
</a> </a>
`; `;
} }
@@ -197,26 +200,26 @@ class HaSceneDashboard extends LitElement {
return [ return [
haStyle, haStyle,
css` css`
ha-fab { mwc-fab {
position: fixed; position: fixed;
bottom: 16px; bottom: 16px;
right: 16px; right: 16px;
z-index: 1; z-index: 1;
} }
ha-fab[is-wide] { mwc-fab[is-wide] {
bottom: 24px; bottom: 24px;
right: 24px; right: 24px;
} }
ha-fab[narrow] { mwc-fab[narrow] {
bottom: 84px; bottom: 84px;
} }
ha-fab[rtl] { mwc-fab[rtl] {
right: auto; right: auto;
left: 16px; left: 16px;
} }
ha-fab[rtl][is-wide] { mwc-fab[rtl][is-wide] {
bottom: 24px; bottom: 24px;
right: auto; right: auto;
left: 24px; left: 24px;

View File

@@ -23,7 +23,7 @@ import { computeRTL } from "../../../common/util/compute_rtl";
import "../../../components/device/ha-device-picker"; import "../../../components/device/ha-device-picker";
import "../../../components/entity/ha-entities-picker"; import "../../../components/entity/ha-entities-picker";
import "../../../components/ha-card"; import "../../../components/ha-card";
import "../../../components/ha-fab"; import "@material/mwc-fab";
import { import {
computeDeviceName, computeDeviceName,
DeviceRegistryEntry, DeviceRegistryEntry,
@@ -54,6 +54,8 @@ import { haStyle } from "../../../resources/styles";
import { HomeAssistant, Route } from "../../../types"; import { HomeAssistant, Route } from "../../../types";
import "../ha-config-section"; import "../ha-config-section";
import { configSections } from "../ha-panel-config"; import { configSections } from "../ha-panel-config";
import "../../../components/ha-svg-icon";
import { mdiContentSave } from "@mdi/js";
interface DeviceEntities { interface DeviceEntities {
id: string; id: string;
@@ -372,17 +374,18 @@ export class HaSceneEditor extends SubscribeMixin(LitElement) {
` `
: ""} : ""}
</div> </div>
<ha-fab <mwc-fab
?is-wide=${this.isWide} ?is-wide=${this.isWide}
?narrow=${this.narrow} ?narrow=${this.narrow}
?dirty=${this._dirty} ?dirty=${this._dirty}
icon="hass:content-save"
.title=${this.hass.localize("ui.panel.config.scene.editor.save")} .title=${this.hass.localize("ui.panel.config.scene.editor.save")}
@click=${this._saveScene} @click=${this._saveScene}
class=${classMap({ class=${classMap({
rtl: computeRTL(this.hass), rtl: computeRTL(this.hass),
})} })}
></ha-fab> >
<ha-svg-icon slot="icon" path=${mdiContentSave}></ha-svg-icon>
</mwc-fab>
</hass-tabs-subpage> </hass-tabs-subpage>
`; `;
} }
@@ -728,7 +731,7 @@ export class HaSceneEditor extends SubscribeMixin(LitElement) {
span[slot="introduction"] a { span[slot="introduction"] a {
color: var(--primary-color); color: var(--primary-color);
} }
ha-fab { mwc-fab {
position: fixed; position: fixed;
bottom: 16px; bottom: 16px;
right: 16px; right: 16px;
@@ -737,24 +740,24 @@ export class HaSceneEditor extends SubscribeMixin(LitElement) {
transition: margin-bottom 0.3s; transition: margin-bottom 0.3s;
} }
ha-fab[is-wide] { mwc-fab[is-wide] {
bottom: 24px; bottom: 24px;
right: 24px; right: 24px;
} }
ha-fab[narrow] { mwc-fab[narrow] {
bottom: 84px; bottom: 84px;
margin-bottom: -140px; margin-bottom: -140px;
} }
ha-fab[dirty] { mwc-fab[dirty] {
margin-bottom: 0; margin-bottom: 0;
} }
ha-fab.rtl { mwc-fab.rtl {
right: auto; right: auto;
left: 16px; left: 16px;
} }
ha-fab[is-wide].rtl { mwc-fab[is-wide].rtl {
bottom: 24px; bottom: 24px;
right: auto; right: auto;
left: 24px; left: 24px;

View File

@@ -15,7 +15,7 @@ import { computeObjectId } from "../../../common/entity/compute_object_id";
import { navigate } from "../../../common/navigate"; import { navigate } from "../../../common/navigate";
import { computeRTL } from "../../../common/util/compute_rtl"; import { computeRTL } from "../../../common/util/compute_rtl";
import "../../../components/ha-card"; import "../../../components/ha-card";
import "../../../components/ha-fab"; import "@material/mwc-fab";
import { import {
Action, Action,
deleteScript, deleteScript,
@@ -30,6 +30,8 @@ import "../automation/action/ha-automation-action";
import { HaDeviceAction } from "../automation/action/types/ha-automation-action-device_id"; import { HaDeviceAction } from "../automation/action/types/ha-automation-action-device_id";
import "../ha-config-section"; import "../ha-config-section";
import { configSections } from "../ha-panel-config"; import { configSections } from "../ha-panel-config";
import "../../../components/ha-svg-icon";
import { mdiContentSave } from "@mdi/js";
export class HaScriptEditor extends LitElement { export class HaScriptEditor extends LitElement {
@property() public hass!: HomeAssistant; @property() public hass!: HomeAssistant;
@@ -139,17 +141,18 @@ export class HaScriptEditor extends LitElement {
: ""} : ""}
</div> </div>
</div> </div>
<ha-fab <mwc-fab
?is-wide=${this.isWide} ?is-wide=${this.isWide}
?narrow=${this.narrow} ?narrow=${this.narrow}
?dirty=${this._dirty} ?dirty=${this._dirty}
icon="hass:content-save"
.title="${this.hass.localize("ui.common.save")}" .title="${this.hass.localize("ui.common.save")}"
@click=${this._saveScript} @click=${this._saveScript}
class="${classMap({ class="${classMap({
rtl: computeRTL(this.hass), rtl: computeRTL(this.hass),
})}" })}"
></ha-fab> >
<ha-svg-icon slot="icon" path=${mdiContentSave}></ha-svg-icon>
</mwc-fab>
</hass-tabs-subpage> </hass-tabs-subpage>
`; `;
} }
@@ -300,7 +303,7 @@ export class HaScriptEditor extends LitElement {
span[slot="introduction"] a { span[slot="introduction"] a {
color: var(--primary-color); color: var(--primary-color);
} }
ha-fab { mwc-fab {
position: fixed; position: fixed;
bottom: 16px; bottom: 16px;
right: 16px; right: 16px;
@@ -309,24 +312,24 @@ export class HaScriptEditor extends LitElement {
transition: margin-bottom 0.3s; transition: margin-bottom 0.3s;
} }
ha-fab[is-wide] { mwc-fab[is-wide] {
bottom: 24px; bottom: 24px;
right: 24px; right: 24px;
} }
ha-fab[narrow] { mwc-fab[narrow] {
bottom: 84px; bottom: 84px;
margin-bottom: -140px; margin-bottom: -140px;
} }
ha-fab[dirty] { mwc-fab[dirty] {
margin-bottom: 0; margin-bottom: 0;
} }
ha-fab.rtl { mwc-fab.rtl {
right: auto; right: auto;
left: 16px; left: 16px;
} }
ha-fab[is-wide].rtl { mwc-fab[is-wide].rtl {
bottom: 24px; bottom: 24px;
right: auto; right: auto;
left: 24px; left: 24px;

View File

@@ -15,7 +15,7 @@ import { fireEvent } from "../../../common/dom/fire_event";
import { computeStateName } from "../../../common/entity/compute_state_name"; import { computeStateName } from "../../../common/entity/compute_state_name";
import { computeRTL } from "../../../common/util/compute_rtl"; import { computeRTL } from "../../../common/util/compute_rtl";
import { DataTableColumnContainer } from "../../../components/data-table/ha-data-table"; import { DataTableColumnContainer } from "../../../components/data-table/ha-data-table";
import "../../../components/ha-fab"; import "@material/mwc-fab";
import { triggerScript } from "../../../data/script"; import { triggerScript } from "../../../data/script";
import { showAlertDialog } from "../../../dialogs/generic/show-dialog-box"; import { showAlertDialog } from "../../../dialogs/generic/show-dialog-box";
import "../../../layouts/hass-tabs-subpage-data-table"; import "../../../layouts/hass-tabs-subpage-data-table";
@@ -23,6 +23,8 @@ import { haStyle } from "../../../resources/styles";
import { HomeAssistant, Route } from "../../../types"; import { HomeAssistant, Route } from "../../../types";
import { showToast } from "../../../util/toast"; import { showToast } from "../../../util/toast";
import { configSections } from "../ha-panel-config"; import { configSections } from "../ha-panel-config";
import "../../../components/ha-svg-icon";
import { mdiPlus } from "@mdi/js";
@customElement("ha-script-picker") @customElement("ha-script-picker")
class HaScriptPicker extends LitElement { class HaScriptPicker extends LitElement {
@@ -139,15 +141,16 @@ class HaScriptPicker extends LitElement {
></ha-icon-button> ></ha-icon-button>
</hass-tabs-subpage-data-table> </hass-tabs-subpage-data-table>
<a href="/config/script/edit/new"> <a href="/config/script/edit/new">
<ha-fab <mwc-fab
?is-wide=${this.isWide} ?is-wide=${this.isWide}
?narrow=${this.narrow} ?narrow=${this.narrow}
icon="hass:plus"
title="${this.hass.localize( title="${this.hass.localize(
"ui.panel.config.script.picker.add_script" "ui.panel.config.script.picker.add_script"
)}" )}"
?rtl=${computeRTL(this.hass)} ?rtl=${computeRTL(this.hass)}
></ha-fab> >
<ha-svg-icon slot="icon" path=${mdiPlus}></ha-svg-icon>
</mwc-fab>
</a> </a>
`; `;
} }
@@ -193,26 +196,26 @@ class HaScriptPicker extends LitElement {
return [ return [
haStyle, haStyle,
css` css`
ha-fab { mwc-fab {
position: fixed; position: fixed;
bottom: 16px; bottom: 16px;
right: 16px; right: 16px;
z-index: 1; z-index: 1;
} }
ha-fab[is-wide] { mwc-fab[is-wide] {
bottom: 24px; bottom: 24px;
right: 24px; right: 24px;
} }
ha-fab[narrow] { mwc-fab[narrow] {
bottom: 84px; bottom: 84px;
} }
ha-fab[rtl] { mwc-fab[rtl] {
right: auto; right: auto;
left: 16px; left: 16px;
} }
ha-fab[rtl][is-wide] { mwc-fab[rtl][is-wide] {
bottom: 24px; bottom: 24px;
right: auto; right: auto;
left: 24px; left: 24px;

View File

@@ -13,7 +13,7 @@ import {
DataTableColumnContainer, DataTableColumnContainer,
RowClickedEvent, RowClickedEvent,
} from "../../../components/data-table/ha-data-table"; } from "../../../components/data-table/ha-data-table";
import "../../../components/ha-fab"; import "@material/mwc-fab";
import { deleteUser, fetchUsers, updateUser, User } from "../../../data/user"; import { deleteUser, fetchUsers, updateUser, User } from "../../../data/user";
import { showConfirmationDialog } from "../../../dialogs/generic/show-dialog-box"; import { showConfirmationDialog } from "../../../dialogs/generic/show-dialog-box";
import "../../../layouts/hass-tabs-subpage-data-table"; import "../../../layouts/hass-tabs-subpage-data-table";
@@ -21,6 +21,8 @@ import { HomeAssistant, Route } from "../../../types";
import { configSections } from "../ha-panel-config"; import { configSections } from "../ha-panel-config";
import { showAddUserDialog } from "./show-dialog-add-user"; import { showAddUserDialog } from "./show-dialog-add-user";
import { showUserDetailDialog } from "./show-dialog-user-detail"; import { showUserDetailDialog } from "./show-dialog-user-detail";
import "../../../components/ha-svg-icon";
import { mdiPlus } from "@mdi/js";
@customElement("ha-config-users") @customElement("ha-config-users")
export class HaConfigUsers extends LitElement { export class HaConfigUsers extends LitElement {
@@ -97,14 +99,15 @@ export class HaConfigUsers extends LitElement {
hasFab hasFab
> >
</hass-tabs-subpage-data-table> </hass-tabs-subpage-data-table>
<ha-fab <mwc-fab
?is-wide=${this.isWide} ?is-wide=${this.isWide}
?narrow=${this.narrow} ?narrow=${this.narrow}
icon="hass:plus"
.title=${this.hass.localize("ui.panel.config.users.picker.add_user")} .title=${this.hass.localize("ui.panel.config.users.picker.add_user")}
@click=${this._addUser} @click=${this._addUser}
?rtl=${computeRTL(this.hass)} ?rtl=${computeRTL(this.hass)}
></ha-fab> >
<ha-svg-icon slot="icon" path=${mdiPlus}></ha-svg-icon>
</mwc-fab>
`; `;
} }
@@ -166,24 +169,24 @@ export class HaConfigUsers extends LitElement {
static get styles() { static get styles() {
return css` return css`
ha-fab { mwc-fab {
position: fixed; position: fixed;
bottom: 16px; bottom: 16px;
right: 16px; right: 16px;
z-index: 1; z-index: 1;
} }
ha-fab[is-wide] { mwc-fab[is-wide] {
bottom: 24px; bottom: 24px;
right: 24px; right: 24px;
} }
ha-fab[rtl] { mwc-fab[rtl] {
right: auto; right: auto;
left: 16px; left: 16px;
} }
ha-fab[narrow] { mwc-fab[narrow] {
bottom: 84px; bottom: 84px;
} }
ha-fab[rtl][is-wide] { mwc-fab[rtl][is-wide] {
bottom: 24px; bottom: 24px;
right: auto; right: auto;
left: 24px; left: 24px;

View File

@@ -20,7 +20,7 @@ import { computeStateDomain } from "../../../common/entity/compute_state_domain"
import { navigate } from "../../../common/navigate"; import { navigate } from "../../../common/navigate";
import { compare } from "../../../common/string/compare"; import { compare } from "../../../common/string/compare";
import "../../../components/ha-card"; import "../../../components/ha-card";
import "../../../components/ha-fab"; import "@material/mwc-fab";
import "../../../components/map/ha-locations-editor"; import "../../../components/map/ha-locations-editor";
import type { import type {
HaLocationsEditor, HaLocationsEditor,
@@ -47,6 +47,8 @@ import type { HomeAssistant, Route } from "../../../types";
import "../ha-config-section"; import "../ha-config-section";
import { configSections } from "../ha-panel-config"; import { configSections } from "../ha-panel-config";
import { showZoneDetailDialog } from "./show-dialog-zone-detail"; import { showZoneDetailDialog } from "./show-dialog-zone-detail";
import "../../../components/ha-svg-icon";
import { mdiPlus } from "@mdi/js";
@customElement("ha-config-zone") @customElement("ha-config-zone")
export class HaConfigZone extends SubscribeMixin(LitElement) { export class HaConfigZone extends SubscribeMixin(LitElement) {
@@ -244,13 +246,14 @@ export class HaConfigZone extends SubscribeMixin(LitElement) {
: ""} : ""}
</hass-tabs-subpage> </hass-tabs-subpage>
<ha-fab <mwc-fab
?is-wide=${this.isWide} ?is-wide=${this.isWide}
?narrow=${this.narrow} ?narrow=${this.narrow}
icon="hass:plus"
title="${hass.localize("ui.panel.config.zone.add_zone")}" title="${hass.localize("ui.panel.config.zone.add_zone")}"
@click=${this._createZone} @click=${this._createZone}
></ha-fab> >
<ha-svg-icon slot="icon" path=${mdiPlus}></ha-svg-icon>
</mwc-fab>
`; `;
} }
@@ -526,17 +529,17 @@ export class HaConfigZone extends SubscribeMixin(LitElement) {
ha-card paper-item { ha-card paper-item {
cursor: pointer; cursor: pointer;
} }
ha-fab { mwc-fab {
position: fixed; position: fixed;
bottom: 16px; bottom: 16px;
right: 16px; right: 16px;
z-index: 1; z-index: 1;
} }
ha-fab[is-wide] { mwc-fab[is-wide] {
bottom: 24px; bottom: 24px;
right: 24px; right: 24px;
} }
ha-fab[narrow] { mwc-fab[narrow] {
bottom: 84px; bottom: 84px;
} }
`; `;

View File

@@ -1,13 +1,18 @@
import "@material/mwc-ripple"; import "@material/mwc-ripple";
import type { Ripple } from "@material/mwc-ripple";
import { RippleHandlers } from "@material/mwc-ripple/ripple-handlers";
import { HassEntity } from "home-assistant-js-websocket"; import { HassEntity } from "home-assistant-js-websocket";
import { import {
css, css,
CSSResult, CSSResult,
customElement, customElement,
eventOptions,
html, html,
internalProperty,
LitElement, LitElement,
property, property,
PropertyValues, PropertyValues,
queryAsync,
TemplateResult, TemplateResult,
} from "lit-element"; } from "lit-element";
import { ifDefined } from "lit-html/directives/if-defined"; import { ifDefined } from "lit-html/directives/if-defined";
@@ -69,6 +74,10 @@ export class HuiButtonCard extends LitElement implements LovelaceCard {
@property() private _config?: ButtonCardConfig; @property() private _config?: ButtonCardConfig;
@queryAsync("mwc-ripple") private _ripple!: Promise<Ripple | null>;
@internalProperty() private _shouldRenderRipple = false;
public getCardSize(): number { public getCardSize(): number {
return 2; return 2;
} }
@@ -149,6 +158,13 @@ export class HuiButtonCard extends LitElement implements LovelaceCard {
return html` return html`
<ha-card <ha-card
@action=${this._handleAction} @action=${this._handleAction}
@focus="${this.handleRippleFocus}"
@blur="${this.handleRippleBlur}"
@mousedown="${this.handleRippleActivate}"
@mouseup="${this.handleRippleDeactivate}"
@touchstart="${this.handleRippleActivate}"
@touchend="${this.handleRippleDeactivate}"
@touchcancel="${this.handleRippleDeactivate}"
.actionHandler=${actionHandler({ .actionHandler=${actionHandler({
hasHold: hasAction(this._config!.hold_action), hasHold: hasAction(this._config!.hold_action),
hasDoubleClick: hasAction(this._config!.double_tap_action), hasDoubleClick: hasAction(this._config!.double_tap_action),
@@ -189,7 +205,7 @@ export class HuiButtonCard extends LitElement implements LovelaceCard {
</span> </span>
` `
: ""} : ""}
<mwc-ripple></mwc-ripple> ${this._shouldRenderRipple ? html`<mwc-ripple></mwc-ripple>` : ""}
</ha-card> </ha-card>
`; `;
} }
@@ -214,6 +230,28 @@ export class HuiButtonCard extends LitElement implements LovelaceCard {
} }
} }
private _rippleHandlers: RippleHandlers = new RippleHandlers(() => {
this._shouldRenderRipple = true;
return this._ripple;
});
@eventOptions({ passive: true })
private handleRippleActivate(evt?: Event) {
this._rippleHandlers.startPress(evt);
}
private handleRippleDeactivate() {
this._rippleHandlers.endPress();
}
private handleRippleFocus() {
this._rippleHandlers.startFocus();
}
private handleRippleBlur() {
this._rippleHandlers.endFocus();
}
static get styles(): CSSResult { static get styles(): CSSResult {
return css` return css`
ha-card { ha-card {
@@ -227,11 +265,11 @@ export class HuiButtonCard extends LitElement implements LovelaceCard {
height: 100%; height: 100%;
box-sizing: border-box; box-sizing: border-box;
justify-content: center; justify-content: center;
position: relative;
} }
ha-card:focus { ha-card:focus {
outline: none; outline: none;
background: var(--divider-color);
} }
ha-icon { ha-icon {

View File

@@ -170,12 +170,12 @@ class ActionHandler extends HTMLElement implements ActionHandler {
display: null, display: null,
}); });
this.ripple.disabled = false; this.ripple.disabled = false;
this.ripple.activate(); this.ripple.startPress();
this.ripple.unbounded = true; this.ripple.unbounded = true;
} }
private stopAnimation() { private stopAnimation() {
this.ripple.deactivate(); this.ripple.endPress();
this.ripple.disabled = true; this.ripple.disabled = true;
this.style.display = "none"; this.style.display = "none";
} }

View File

@@ -1,4 +1,3 @@
import "@material/mwc-ripple";
import { import {
css, css,
CSSResult, CSSResult,
@@ -78,7 +77,6 @@ export class HuiButtonsBase extends LitElement {
? entityConf.name || computeStateName(stateObj) ? entityConf.name || computeStateName(stateObj)
: ""} : ""}
</span> </span>
<mwc-ripple unbounded></mwc-ripple>
</div> </div>
`; `;
})} })}
@@ -108,6 +106,7 @@ export class HuiButtonsBase extends LitElement {
cursor: pointer; cursor: pointer;
align-items: center; align-items: center;
display: inline-flex; display: inline-flex;
outline: none;
} }
`; `;
} }

View File

@@ -1,3 +1,4 @@
import "@material/mwc-fab";
import { import {
css, css,
CSSResult, CSSResult,
@@ -20,7 +21,6 @@ import type {
SelectionChangedEvent, SelectionChangedEvent,
} from "../../../../components/data-table/ha-data-table"; } from "../../../../components/data-table/ha-data-table";
import "../../../../components/entity/state-badge"; import "../../../../components/entity/state-badge";
import "../../../../components/ha-fab";
import "../../../../components/ha-icon"; import "../../../../components/ha-icon";
import "../../../../components/ha-relative-time"; import "../../../../components/ha-relative-time";
import type { LovelaceConfig } from "../../../../data/lovelace"; import type { LovelaceConfig } from "../../../../data/lovelace";
@@ -28,6 +28,8 @@ import type { HomeAssistant } from "../../../../types";
import { computeUnusedEntities } from "../../common/compute-unused-entities"; import { computeUnusedEntities } from "../../common/compute-unused-entities";
import type { Lovelace } from "../../types"; import type { Lovelace } from "../../types";
import { addEntitiesToLovelaceView } from "../add-entities-to-view"; import { addEntitiesToLovelaceView } from "../add-entities-to-view";
import "../../../../components/ha-svg-icon";
import { mdiPlus } from "@mdi/js";
@customElement("hui-unused-entities") @customElement("hui-unused-entities")
export class HuiUnusedEntities extends LitElement { export class HuiUnusedEntities extends LitElement {
@@ -173,16 +175,17 @@ export class HuiUnusedEntities extends LitElement {
${this._selectedEntities.length ${this._selectedEntities.length
? html` ? html`
<ha-fab <mwc-fab
class="${classMap({ class="${classMap({
rtl: computeRTL(this.hass), rtl: computeRTL(this.hass),
})}" })}"
icon="hass:plus"
.label=${this.hass.localize( .label=${this.hass.localize(
"ui.panel.lovelace.editor.edit_card.add" "ui.panel.lovelace.editor.edit_card.add"
)} )}
@click=${this._addToLovelaceView} @click=${this._addToLovelaceView}
></ha-fab> >
<ha-svg-icon slot="icon" path=${mdiPlus}></ha-svg-icon>
</mwc-fab>
` `
: ""} : ""}
`; `;
@@ -238,13 +241,13 @@ export class HuiUnusedEntities extends LitElement {
flex-grow: 1; flex-grow: 1;
margin-top: -20px; margin-top: -20px;
} }
ha-fab { mwc-fab {
position: absolute; position: absolute;
right: 16px; right: 16px;
bottom: 16px; bottom: 16px;
z-index: 1; z-index: 1;
} }
ha-fab.rtl { mwc-fab.rtl {
left: 16px; left: 16px;
right: auto; right: auto;
} }

View File

@@ -1,3 +1,3 @@
// hui-view dependencies for when in edit mode. // hui-view dependencies for when in edit mode.
import "../../../components/ha-fab"; import "@material/mwc-fab";
import "../components/hui-card-options"; import "../components/hui-card-options";

View File

@@ -23,6 +23,8 @@ import { createBadgeElement } from "../create-element/create-badge-element";
import { createCardElement } from "../create-element/create-card-element"; import { createCardElement } from "../create-element/create-card-element";
import { showEditCardDialog } from "../editor/card-editor/show-edit-card-dialog"; import { showEditCardDialog } from "../editor/card-editor/show-edit-card-dialog";
import { Lovelace, LovelaceBadge, LovelaceCard } from "../types"; import { Lovelace, LovelaceBadge, LovelaceCard } from "../types";
import "../../../components/ha-svg-icon";
import { mdiPlus } from "@mdi/js";
let editCodeLoaded = false; let editCodeLoaded = false;
@@ -95,8 +97,7 @@ export class HUIView extends LitElement {
<div id="columns"></div> <div id="columns"></div>
${this.lovelace!.editMode ${this.lovelace!.editMode
? html` ? html`
<ha-fab <mwc-fab
icon="hass:plus"
title="${this.hass!.localize( title="${this.hass!.localize(
"ui.panel.lovelace.editor.edit_card.add" "ui.panel.lovelace.editor.edit_card.add"
)}" )}"
@@ -104,7 +105,9 @@ export class HUIView extends LitElement {
class="${classMap({ class="${classMap({
rtl: computeRTL(this.hass!), rtl: computeRTL(this.hass!),
})}" })}"
></ha-fab> >
<ha-svg-icon slot="icon" path=${mdiPlus}></ha-svg-icon>
</mwc-fab>
` `
: ""} : ""}
`; `;
@@ -151,7 +154,7 @@ export class HUIView extends LitElement {
margin: 4px 4px 8px; margin: 4px 4px 8px;
} }
ha-fab { mwc-fab {
position: sticky; position: sticky;
float: right; float: right;
bottom: 16px; bottom: 16px;
@@ -159,7 +162,7 @@ export class HUIView extends LitElement {
z-index: 1; z-index: 1;
} }
ha-fab.rtl { mwc-fab.rtl {
float: left; float: left;
right: auto; right: auto;
left: 16px; left: 16px;

View File

@@ -21,6 +21,7 @@ export const renderMarkdown = (
whiteListNormal = { whiteListNormal = {
...filterXSS.whiteList, ...filterXSS.whiteList,
"ha-icon": ["icon"], "ha-icon": ["icon"],
"ha-svg-icon": ["path"],
}; };
} }

View File

@@ -231,6 +231,7 @@
} }
}, },
"common": { "common": {
"and": "and",
"previous": "Previous", "previous": "Previous",
"loading": "Loading", "loading": "Loading",
"refresh": "Refresh", "refresh": "Refresh",
@@ -590,7 +591,9 @@
"unit_system_metric": "Metric", "unit_system_metric": "Metric",
"imperial_example": "Fahrenheit, pounds", "imperial_example": "Fahrenheit, pounds",
"metric_example": "Celsius, kilograms", "metric_example": "Celsius, kilograms",
"save_button": "Save" "save_button": "Save",
"external_url": "External URL",
"internal_url": "Internal URL"
} }
} }
} }

View File

@@ -0,0 +1 @@
{}

View File

@@ -0,0 +1 @@
{}

View File

@@ -0,0 +1 @@
{}

View File

@@ -199,6 +199,8 @@
"stopped": "Gestop" "stopped": "Gestop"
}, },
"default": { "default": {
"off": "Af",
"on": "Aan",
"unavailable": "Nie beskikbaar nie", "unavailable": "Nie beskikbaar nie",
"unknown": "Onbekend" "unknown": "Onbekend"
}, },
@@ -1010,8 +1012,10 @@
} }
}, },
"integrations": { "integrations": {
"add_integration": "Stel 'n nuwe integrasie op",
"caption": "Integrasies", "caption": "Integrasies",
"config_entry": { "config_entry": {
"delete": "Verwyder",
"delete_confirm": "Is u seker u wil hierdie integrasie skrap?", "delete_confirm": "Is u seker u wil hierdie integrasie skrap?",
"device_unavailable": "toestel nie beskikbaar nie", "device_unavailable": "toestel nie beskikbaar nie",
"entity_unavailable": "entiteit nie beskikbaar nie", "entity_unavailable": "entiteit nie beskikbaar nie",
@@ -1021,7 +1025,10 @@
"no_area": "Geen Gebied", "no_area": "Geen Gebied",
"no_device": "Entiteite sonder toestelle", "no_device": "Entiteite sonder toestelle",
"no_devices": "Hierdie integrasie het geen toestelle nie.", "no_devices": "Hierdie integrasie het geen toestelle nie.",
"restart_confirm": "Herbegin Home Assistant om hierdie integrasie te voltooi" "options": "Opsies",
"rename": "Hernoem",
"restart_confirm": "Herbegin Home Assistant om hierdie integrasie te voltooi",
"system_options": "Stelselopsies"
}, },
"config_flow": { "config_flow": {
"aborted": "Gestaak", "aborted": "Gestaak",
@@ -1055,7 +1062,12 @@
}, },
"integration_not_found": "Integrasie nie gevind nie.", "integration_not_found": "Integrasie nie gevind nie.",
"new": "Stel 'n nuwe integrasie op", "new": "Stel 'n nuwe integrasie op",
"none": "Nog niks is opgestel nie" "no_integrations": "Lyk asof jy nog nie enige integations gekonfigureer het nie. Klik op die knoppie hieronder om jou eerste integrasie te voeg!",
"none": "Nog niks is opgestel nie",
"none_found": "Geen integrasies gevind nie",
"none_found_detail": "Verstel jou soekkriteria.",
"rename_dialog": "Redigeer die naam van hierdie config-inskrywing",
"rename_input_label": "Inskrywingsnaam"
}, },
"introduction": "Hier is dit moontlik om u komponente en Home Assistant op te stel. Tans kan alles in verband met die gebruikerskoppelvlak nog nie hier opgestel word nie, maar ons werk daaraan.", "introduction": "Hier is dit moontlik om u komponente en Home Assistant op te stel. Tans kan alles in verband met die gebruikerskoppelvlak nog nie hier opgestel word nie, maar ons werk daaraan.",
"lovelace": { "lovelace": {
@@ -1515,7 +1527,8 @@
}, },
"warning": { "warning": {
"entity_non_numeric": "Entiteit is nie-numeriese: {entity}", "entity_non_numeric": "Entiteit is nie-numeriese: {entity}",
"entity_not_found": "Entiteit nie beskikbaar nie: {entity}" "entity_not_found": "Entiteit nie beskikbaar nie: {entity}",
"entity_unavailable": "{entity} is nie tans beskikbaar nie."
} }
}, },
"mailbox": { "mailbox": {

View File

@@ -178,6 +178,8 @@
"stopped": "موقف" "stopped": "موقف"
}, },
"default": { "default": {
"off": "مطفئ",
"on": "مشغل",
"unavailable": "غير متوفر", "unavailable": "غير متوفر",
"unknown": "غير معروف" "unknown": "غير معروف"
}, },
@@ -267,9 +269,19 @@
"returning": "العودة" "returning": "العودة"
}, },
"weather": { "weather": {
"clear-night": "صافي، ليلا",
"cloudy": "Bewolkt", "cloudy": "Bewolkt",
"fog": "Mist", "fog": "Mist",
"sunny": "مشمس" "lightning": "برق",
"lightning-rainy": "برق ، ممطر",
"partlycloudy": "غائم جزئيا",
"pouring": "أمطار غزيرة",
"rainy": "ماطر",
"snowy": "ثلوج",
"snowy-rainy": "ثلوج، ماطر",
"sunny": "مشمس",
"windy": "عاصف",
"windy-variant": "عاصف"
}, },
"zwave": { "zwave": {
"default": { "default": {
@@ -292,7 +304,16 @@
}, },
"card": { "card": {
"alarm_control_panel": { "alarm_control_panel": {
"arm_custom_bypass": "تجاوز مخصص" "arm_away": "تفعيل خارج المنزل",
"arm_custom_bypass": "تجاوز مخصص",
"arm_home": "تفعيل في المنزل",
"clear_code": "مسح",
"code": "الرمز",
"disarm": "تعطيل"
},
"automation": {
"last_triggered": "آخر تشغيل",
"trigger": "تشغيل"
}, },
"camera": { "camera": {
"not_available": "الصورة غير متاحة" "not_available": "الصورة غير متاحة"
@@ -326,6 +347,12 @@
"persistent_notification": { "persistent_notification": {
"dismiss": "رفض" "dismiss": "رفض"
}, },
"scene": {
"activate": "تفعيل"
},
"script": {
"execute": "نفذ"
},
"vacuum": { "vacuum": {
"actions": { "actions": {
"resume_cleaning": "استئناف التنظيف", "resume_cleaning": "استئناف التنظيف",
@@ -344,8 +371,14 @@
}, },
"weather": { "weather": {
"attributes": { "attributes": {
"precipitation": "ترسب" "air_pressure": "الضغط الجوي",
"humidity": "الرطوبة",
"precipitation": "ترسب",
"temperature": "الحرارة",
"visibility": "الرؤية",
"wind_speed": "سرعة الرياح"
}, },
"forecast": "التوقعات",
"high": "عالي", "high": "عالي",
"low": "منخفض" "low": "منخفض"
} }
@@ -354,6 +387,9 @@
"cancel": "إلغاء", "cancel": "إلغاء",
"delete": "حذف", "delete": "حذف",
"loading": "جار التحميل", "loading": "جار التحميل",
"next": "التالى",
"previous": "السابق",
"refresh": "تحديث",
"successfully_deleted": "تم الحذف بنجاح", "successfully_deleted": "تم الحذف بنجاح",
"undo": "تراجع" "undo": "تراجع"
}, },
@@ -363,6 +399,10 @@
"entity": "الجهاز" "entity": "الجهاز"
} }
}, },
"history_charts": {
"loading_history": "جارٍ تحميل سجل الحالات ...",
"no_history_found": "لم يتم العثور على سجل الحالات."
},
"relative_time": { "relative_time": {
"never": "Nooit" "never": "Nooit"
}, },
@@ -415,7 +455,19 @@
"password": "كلمه السر", "password": "كلمه السر",
"remember": "تذكر" "remember": "تذكر"
}, },
"notification_drawer": {
"click_to_configure": "انقر هنا لتعديل {entity}",
"empty": "لا إشعارات",
"title": "إشعارات"
},
"notification_toast": {
"connection_lost": "انقطع الاتصال. جارٍ إعادة الاتصال ..."
},
"panel": { "panel": {
"calendar": {
"my_calendars": "تقاويمي",
"today": "اليوم"
},
"config": { "config": {
"areas": { "areas": {
"data_table": { "data_table": {
@@ -476,6 +528,9 @@
"learn_more": "معرفة المزيد عن الشروط", "learn_more": "معرفة المزيد عن الشروط",
"type_select": "نوع الشرط", "type_select": "نوع الشرط",
"type": { "type": {
"not": {
"label": "ليس"
},
"numeric_state": { "numeric_state": {
"above": "فوق", "above": "فوق",
"below": "تحت", "below": "تحت",
@@ -682,6 +737,7 @@
"new": "إعداد تكامل جديد", "new": "إعداد تكامل جديد",
"no_integrations": "يبدوأن ليس هناك أي integations بعد. انقر على الزر أدناه لإضافة واحدة!", "no_integrations": "يبدوأن ليس هناك أي integations بعد. انقر على الزر أدناه لإضافة واحدة!",
"none": "لم يتم الإعداد بعد", "none": "لم يتم الإعداد بعد",
"none_found_detail": "اضبط معايير البحث.",
"rename_dialog": "تعديل الاسم", "rename_dialog": "تعديل الاسم",
"rename_input_label": "الاسم" "rename_input_label": "الاسم"
}, },
@@ -924,6 +980,7 @@
}, },
"save_config": { "save_config": {
"cancel": "لا يهم", "cancel": "لا يهم",
"close": "إغلاق",
"empty_config": "ابدأ بلوحة معلومات فارغة" "empty_config": "ابدأ بلوحة معلومات فارغة"
}, },
"view": { "view": {
@@ -957,6 +1014,7 @@
"playback_title": "تشغيل الرسالة" "playback_title": "تشغيل الرسالة"
}, },
"page-authorize": { "page-authorize": {
"abort_intro": "إلغاء الدخول",
"form": { "form": {
"providers": { "providers": {
"command_line": { "command_line": {
@@ -969,13 +1027,17 @@
} }
} }
} }
} },
} "working": "الرجاء الانتظار"
},
"initializing": "جار التهيئة"
}, },
"page-onboarding": { "page-onboarding": {
"user": { "user": {
"data": { "data": {
"password_confirm": "تأكيد كلمة السر" "password": "كلمه السر",
"password_confirm": "تأكيد كلمة السر",
"username": "المستخدم"
}, },
"error": { "error": {
"password_not_match": "كلمة السر غير مطابقة", "password_not_match": "كلمة السر غير مطابقة",

View File

@@ -206,6 +206,8 @@
"stopped": "Спряна" "stopped": "Спряна"
}, },
"default": { "default": {
"off": "Изключен",
"on": "Включен",
"unavailable": "Недостъпен", "unavailable": "Недостъпен",
"unknown": "Неизвестно" "unknown": "Неизвестно"
}, },
@@ -425,6 +427,7 @@
"attributes": { "attributes": {
"air_pressure": "Въздушно налягане", "air_pressure": "Въздушно налягане",
"humidity": "Влажност", "humidity": "Влажност",
"precipitation": "Валежи",
"temperature": "Температура", "temperature": "Температура",
"visibility": "Видимост", "visibility": "Видимост",
"wind_speed": "Скорост на вятъра" "wind_speed": "Скорост на вятъра"
@@ -452,8 +455,10 @@
}, },
"common": { "common": {
"cancel": "Отмени", "cancel": "Отмени",
"delete": "Изтриване",
"loading": "Зареждане", "loading": "Зареждане",
"save": "Запазване", "save": "Запазване",
"successfully_deleted": "Успешно изтриване",
"successfully_saved": "Успешно запазено" "successfully_saved": "Успешно запазено"
}, },
"components": { "components": {
@@ -491,6 +496,24 @@
"enable_new_entities_label": "Активирай новодобавените устройства.", "enable_new_entities_label": "Активирай новодобавените устройства.",
"title": "Системни опции за {integration}" "title": "Системни опции за {integration}"
}, },
"entity_registry": {
"editor": {
"delete": "Изтриване",
"update": "Актуализация"
},
"no_unique_id": "Този обект няма уникален идентификатор, затова неговите настройки не могат да бъдат управлявани от потребителския интерфейс."
},
"helper_settings": {
"input_number": {
"step": "Размер на стъпката"
},
"input_text": {
"max": "Максимална дължина",
"min": "Минимална дължина"
},
"platform_not_loaded": "{platform} интеграцията не е заредена. Моля, добавете я във вашата конфигурация като добавите 'default_config:' или '{platform}:'.",
"yaml_not_editable": "Настройките на този обект не могат да бъдат редактирани. Могат да се конфигурират само обектите, създадени от потребителския интерфейс."
},
"more_info_control": { "more_info_control": {
"script": { "script": {
"last_action": "Последно задействане" "last_action": "Последно задействане"
@@ -504,6 +527,12 @@
"title": "Инструкции за актуализиране" "title": "Инструкции за актуализиране"
} }
}, },
"mqtt_device_debug_info": {
"entities": "Обекти",
"no_entities": "Няма обекти",
"recent_messages": "{n} последно получено(и) съобщение(я)",
"show_as_yaml": "Покажи като YAML"
},
"options_flow": { "options_flow": {
"form": { "form": {
"header": "Опции" "header": "Опции"
@@ -517,6 +546,9 @@
"label_voice": "Въведете и натиснете „Enter“ или докоснете микрофона, за да говорите" "label_voice": "Въведете и натиснете „Enter“ или докоснете микрофона, за да говорите"
}, },
"zha_device_info": { "zha_device_info": {
"buttons": {
"zigbee_information": "Zigbee информация"
},
"manuf": "от {manufacturer}", "manuf": "от {manufacturer}",
"no_area": "Без област", "no_area": "Без област",
"services": { "services": {
@@ -556,6 +588,13 @@
"config": { "config": {
"areas": { "areas": {
"caption": "Регистър на областите", "caption": "Регистър на областите",
"data_table": {
"area": "Област",
"devices": "Устройства"
},
"delete": {
"confirmation_title": "Сигурни ли сте, че искате да изтриете тази област?"
},
"description": "Преглед на всички области във Вашия дом.", "description": "Преглед на всички области във Вашия дом.",
"editor": { "editor": {
"create": "СЪЗДАВАНЕ", "create": "СЪЗДАВАНЕ",
@@ -564,10 +603,12 @@
"update": "АКТУАЛИЗАЦИЯ" "update": "АКТУАЛИЗАЦИЯ"
}, },
"picker": { "picker": {
"create_area": "Създайте област",
"header": "Регистър на областите", "header": "Регистър на областите",
"integrations_page": "Интеграции", "integrations_page": "Интеграции",
"introduction": "Областите се използват за организиране на местоположението на устройствата. Тази информация ще се използва в Home Assistant, за да ви помогне при организирането на Вашия интерфейс, права за достъп и интеграции с други системи.", "introduction": "Областите се използват за организиране на местоположението на устройствата. Тази информация ще се използва в Home Assistant, за да ви помогне при организирането на Вашия интерфейс, права за достъп и интеграции с други системи.",
"introduction2": "За да поставите устройства в дадена област, използвайте връзката по-долу, за да отидете на страницата за интеграции, след което кликнете върху конфигурирана интеграция, за да видите картите на устройството." "introduction2": "За да поставите устройства в дадена област, използвайте връзката по-долу, за да отидете на страницата за интеграции, след което кликнете върху конфигурирана интеграция, за да видите картите на устройството.",
"no_areas": "Изглежда, че все още нямате области!"
} }
}, },
"automation": { "automation": {
@@ -756,6 +797,9 @@
"picker": { "picker": {
"add_automation": "Добавяне на автоматизация", "add_automation": "Добавяне на автоматизация",
"header": "Редактор на автоматизации", "header": "Редактор на автоматизации",
"headers": {
"name": "Име"
},
"introduction": "Редакторът на автоматизации позволява да създавате и редактирате автоматизации. Моля, последвайте препратката по-долу за да прочетете инструкциите за да се уверите, че Home Assistant е правилно конфигуриран.", "introduction": "Редакторът на автоматизации позволява да създавате и редактирате автоматизации. Моля, последвайте препратката по-долу за да прочетете инструкциите за да се уверите, че Home Assistant е правилно конфигуриран.",
"learn_more": "Научете повече за автоматизациите", "learn_more": "Научете повече за автоматизациите",
"no_automations": "Не можахме да намерим никакви автоматизации подлежащи на редакция", "no_automations": "Не можахме да намерим никакви автоматизации подлежащи на редакция",
@@ -763,6 +807,14 @@
} }
}, },
"cloud": { "cloud": {
"account": {
"alexa": {
"config_documentation": "Документация за конфигурацията"
},
"google": {
"config_documentation": "Документация за конфигурацията"
}
},
"caption": "Home Assistant Cloud", "caption": "Home Assistant Cloud",
"description_features": "Контролирайте дома си, и когато не сте вкъщи, активирайте интегрирациите с Alexa и Google Assistant.", "description_features": "Контролирайте дома си, и когато не сте вкъщи, активирайте интегрирациите с Alexa и Google Assistant.",
"description_login": "Влезли сте като {email}", "description_login": "Влезли сте като {email}",
@@ -803,7 +855,13 @@
}, },
"devices": { "devices": {
"caption": "Устройства", "caption": "Устройства",
"description": "Управление на свързани устройства" "confirm_delete": "Сигурни ли сте, че искате да изтриете устройството?",
"delete": "Изтриване",
"description": "Управление на свързани устройства",
"entities": {
"add_entities_lovelace": "Добавете към Lovelace"
},
"no_devices": "Няма устройства"
}, },
"entities": { "entities": {
"caption": "Регистър на обектите", "caption": "Регистър на обектите",
@@ -814,10 +872,16 @@
"introduction2": "Използвайте регистъра на обектите, за да промените името, идентификатора на обекта или да премахнете записа от Home Assistant. Моля имайте на предвид, че премахването на записа от регистъра на обектите няма да премахне обекта. За да направите това, следвайте препратката по-долу и я премахнете от страницата за интеграции." "introduction2": "Използвайте регистъра на обектите, за да промените името, идентификатора на обекта или да премахнете записа от Home Assistant. Моля имайте на предвид, че премахването на записа от регистъра на обектите няма да премахне обекта. За да направите това, следвайте препратката по-долу и я премахнете от страницата за интеграции."
} }
}, },
"filtering": {
"clear": "Изчистване",
"filtering_by": "Филтриране по"
},
"header": "Конфигуриране на Home Assistant", "header": "Конфигуриране на Home Assistant",
"integrations": { "integrations": {
"add_integration": "Добавяне на интеграция",
"caption": "Интеграции", "caption": "Интеграции",
"config_entry": { "config_entry": {
"delete": "Изтриване",
"delete_confirm": "Сигурни ли сте, че искате да изтриете интеграцията?", "delete_confirm": "Сигурни ли сте, че искате да изтриете интеграцията?",
"device_unavailable": "недостъпно устройство", "device_unavailable": "недостъпно устройство",
"entity_unavailable": "недостъпен", "entity_unavailable": "недостъпен",
@@ -827,7 +891,10 @@
"no_area": "Без област", "no_area": "Без област",
"no_device": "Обекти без устройства", "no_device": "Обекти без устройства",
"no_devices": "Тази интеграция няма устройства.", "no_devices": "Тази интеграция няма устройства.",
"restart_confirm": "Рестартирайте Home Assistant за да завършите премахването на интеграцията" "options": "Настройки",
"rename": "Преименуване",
"restart_confirm": "Рестартирайте Home Assistant за да завършите премахването на интеграцията",
"system_options": "Системни настройки"
}, },
"config_flow": { "config_flow": {
"external_step": { "external_step": {
@@ -839,10 +906,33 @@
"configured": "Конфигуриран", "configured": "Конфигуриран",
"description": "Управление и настройка на интеграции", "description": "Управление и настройка на интеграции",
"discovered": "Открити", "discovered": "Открити",
"integration": "интеграция",
"new": "Настройте нова интеграция", "new": "Настройте нова интеграция",
"none": "Нищо не е конфигурирано към момента" "no_integrations": "Изглежда, че все още нямате конфигурирани интеграции. Кликнете върху бутона по-долу, за да добавите първата си интеграция!",
"none": "Нищо не е конфигурирано към момента",
"none_found": "Не са намерени интеграции",
"none_found_detail": "Коригирайте критериите си за търсене.",
"rename_dialog": "Редактирайте името на този запис в конфигурацията"
}, },
"introduction": "Тук е възможно да конфигурирате Вашите компоненти и Home Assistant. Не всичко е възможно да се конфигурира от Интерфейса, но работим по върпоса.", "introduction": "Тук е възможно да конфигурирате Вашите компоненти и Home Assistant. Не всичко е възможно да се конфигурира от Интерфейса, но работим по върпоса.",
"lovelace": {
"dashboards": {
"cant_edit_default": "Стандартното Lovelace табло не може да се редактира от потребителския интерфейс. Можете да го скриете, като зададете друго табло по подразбиране.",
"cant_edit_yaml": "Табла, дефинирани в YAML, не могат да бъдат редактирани от потребителския интерфейс. Променете ги в configuration.yaml.",
"default_dashboard": "Това е таблото по подразбиране",
"detail": {
"icon": "Икона",
"title": "Заглавие",
"url_error_msg": "URL адресът трябва да съдържа '-' и не може да съдържа интервали или специални символи, с изключение на '_' и '-'"
},
"picker": {
"open": "Отворен"
}
},
"resources": {
"cant_edit_yaml": "Използвате Lovelace в YAML режим, следователно не можете да управлявате ресурсите си чрез потребителския интерфейс. Управлявайте ги в configuration.yaml."
}
},
"person": { "person": {
"caption": "Хора", "caption": "Хора",
"description": "Управлявайте хората, които следите от Home Assistant.", "description": "Управлявайте хората, които следите от Home Assistant.",
@@ -853,9 +943,22 @@
"name": "Име" "name": "Име"
} }
}, },
"scene": {
"picker": {
"headers": {
"name": "Име"
}
}
},
"script": { "script": {
"caption": "Скриптове", "caption": "Скриптове",
"description": "Създаване и редактиране на скриптове" "description": "Създаване и редактиране на скриптове",
"picker": {
"headers": {
"name": "Име"
},
"show_info": "Показване на информация за скрипта"
}
}, },
"server_control": { "server_control": {
"caption": "Управление на сървъра", "caption": "Управление на сървъра",
@@ -865,7 +968,7 @@
"automation": "Презареждане на автоматизациите", "automation": "Презареждане на автоматизациите",
"core": "Презареждане на местоположението и персонализациите", "core": "Презареждане на местоположението и персонализациите",
"group": "Презареждане на гурпите", "group": "Презареждане на гурпите",
"heading": "Презареждане на конфигурацията", "heading": "Презареждане на YAML конфигурацията",
"introduction": "Някои части от Home Assistant могат да се презаредят без да е необходимо рестартиране. Натискането на Презареди ще отхвърли настоящата конфигурация и ще зареди новата конфигурация.", "introduction": "Някои части от Home Assistant могат да се презаредят без да е необходимо рестартиране. Натискането на Презареди ще отхвърли настоящата конфигурация и ще зареди новата конфигурация.",
"scene": "Презареди сцените", "scene": "Презареди сцените",
"script": "Презареждане на скриптовете" "script": "Презареждане на скриптовете"
@@ -899,10 +1002,19 @@
"description": "Управление на потребителите", "description": "Управление на потребителите",
"editor": { "editor": {
"activate_user": "Активиране на потребител", "activate_user": "Активиране на потребител",
"admin": "Администратор",
"caption": "Преглед на потребителя", "caption": "Преглед на потребителя",
"change_password": "Смяна на парола", "change_password": "Смяна на парола",
"deactivate_user": "Деактивиране на потребителя", "deactivate_user": "Деактивиране на потребителя",
"delete_user": "Изтриване на потребител" "delete_user": "Изтриване на потребител",
"name": "Име",
"system_generated_users_not_editable": "Неуспешно обновяване на системно генерираните потребители"
},
"picker": {
"headers": {
"group": "Група",
"name": "Име"
}
} }
}, },
"zha": { "zha": {
@@ -912,7 +1024,13 @@
"spinner": "Търсене на ZHA Zigbee устройства..." "spinner": "Търсене на ZHA Zigbee устройства..."
}, },
"caption": "ZHA", "caption": "ZHA",
"description": "Управление на Zigbee мрежата за домашна автоматизация" "description": "Управление на Zigbee мрежата за домашна автоматизация",
"node_management": {
"hint_wakeup": "Някои устройства като сензорите Xiaomi имат бутон за събуждане, който можете да натискате на интервали от ~ 5 секунди, които поддържат устройствата будни, докато взаимодействате с тях."
}
},
"zone": {
"edit_home_zone": "Радиусът на зоната \"Дом\" все още не може да бъде редактиран. Плъзнете маркера на картата, за да преместите въпросната зона."
}, },
"zwave": { "zwave": {
"caption": "Z-Wave", "caption": "Z-Wave",
@@ -1026,6 +1144,9 @@
"entities": { "entities": {
"toggle": "Превключване на обекти." "toggle": "Превключване на обекти."
}, },
"iframe": {
"name": "Уеб страница"
},
"vertical-stack": { "vertical-stack": {
"name": "Вертикална колона" "name": "Вертикална колона"
}, },
@@ -1033,6 +1154,9 @@
"name": "Прогноза за времето" "name": "Прогноза за времето"
} }
}, },
"cardpicker": {
"no_description": "Няма налично описание."
},
"edit_card": { "edit_card": {
"add": "Добавяне на карта", "add": "Добавяне на карта",
"delete": "Изтриване на карта", "delete": "Изтриване на карта",
@@ -1051,7 +1175,10 @@
"add": "Добавяне на изглед", "add": "Добавяне на изглед",
"delete": "Изтриване на изгледа", "delete": "Изтриване на изгледа",
"edit": "Редактиране на изгледа", "edit": "Редактиране на изгледа",
"header": "Конфигурация на изглед" "header": "Конфигурация на изглед",
"visibility": {
"select_users": "Изберете кои потребители да виждат този изглед в навигацията"
}
}, },
"header": "Редактиране на потребителския интерфейс", "header": "Редактиране на потребителския интерфейс",
"menu": { "menu": {
@@ -1065,6 +1192,7 @@
"para_no_id": "Този елемент няма идентификатор. Моля, добавете идентификатор към този елемент в \"ui-lovelace.yaml\"." "para_no_id": "Този елемент няма идентификатор. Моля, добавете идентификатор към този елемент в \"ui-lovelace.yaml\"."
}, },
"raw_editor": { "raw_editor": {
"error_remove": "Конфигурацията не може да бъде премахната: {error}",
"header": "Редактиране на конфигурацията", "header": "Редактиране на конфигурацията",
"save": "Запазване", "save": "Запазване",
"saved": "Запазено", "saved": "Запазено",
@@ -1075,7 +1203,13 @@
"header": "Поемете контрол над потребителския интерфейс на Lovelace", "header": "Поемете контрол над потребителския интерфейс на Lovelace",
"para": "По подразбиране Home Assistant поддържа потребителския интерфейс, като го актуализира, когато нови обекти или компоненти на Lovelace станат достъпни. Ако поемете контрол, ние вече няма да правим автоматично промени вместо вас.", "para": "По подразбиране Home Assistant поддържа потребителския интерфейс, като го актуализира, когато нови обекти или компоненти на Lovelace станат достъпни. Ако поемете контрол, ние вече няма да правим автоматично промени вместо вас.",
"para_sure": "Наистина ли искате да поемете управлението на потребителския интерфейс?", "para_sure": "Наистина ли искате да поемете управлението на потребителския интерфейс?",
"save": "Поемете контрола" "save": "Поемете контрола",
"yaml_mode": "Използвате YAML режим за това табло, което означава, че не можете да промените вашата Lovelace конфигурация от потребителския интерфейс. Ако искате да управлявате това табло от потребителския интерфейс, премахнете „mode: yaml“ от вашата Lovelace конфигурация в „configuration.yaml.“."
},
"view": {
"panel_mode": {
"warning_multiple_cards": "Този изглед съдържа повече от една карта, но изгледът на панел може да показва само 1 карта."
}
} }
}, },
"menu": { "menu": {
@@ -1084,9 +1218,14 @@
"refresh": "Обновяване" "refresh": "Обновяване"
}, },
"reload_lovelace": "Презареждане на Lovelace", "reload_lovelace": "Презареждане на Lovelace",
"views": {
"confirm_delete": "Изтриване на изгледа?"
},
"warning": { "warning": {
"attribute_not_found": "Атрибут {attribute} не е наличен в: {entity}",
"entity_non_numeric": "Обектът не е числов: {entity}", "entity_non_numeric": "Обектът не е числов: {entity}",
"entity_not_found": "Обектът е недостъпен: {entity}" "entity_not_found": "Обектът е недостъпен: {entity}",
"entity_unavailable": "{entity} в момента не е наличен"
} }
}, },
"mailbox": { "mailbox": {
@@ -1267,6 +1406,7 @@
}, },
"profile": { "profile": {
"advanced_mode": { "advanced_mode": {
"description": "Отключва разширени функции.",
"title": "Разширен режим" "title": "Разширен режим"
}, },
"change_password": { "change_password": {
@@ -1278,6 +1418,10 @@
"submit": "Промяна" "submit": "Промяна"
}, },
"current_user": "В момента сте влезли като {fullName}.", "current_user": "В момента сте влезли като {fullName}.",
"dashboard": {
"dropdown_label": "Табло",
"header": "Табло"
},
"force_narrow": { "force_narrow": {
"description": "Това ще скрие страничната лента по подразбиране, подобно на изгледа в мобилната версия.", "description": "Това ще скрие страничната лента по подразбиране, подобно на изгледа в мобилната версия.",
"header": "Винаги скривай страничната лента" "header": "Винаги скривай страничната лента"

View File

@@ -206,6 +206,8 @@
"stopped": "Aturat" "stopped": "Aturat"
}, },
"default": { "default": {
"off": "Off",
"on": "On",
"unavailable": "No disponible", "unavailable": "No disponible",
"unknown": "Desconegut" "unknown": "Desconegut"
}, },
@@ -471,11 +473,15 @@
} }
}, },
"common": { "common": {
"and": "i",
"cancel": "Cancel·la", "cancel": "Cancel·la",
"close": "Tanca", "close": "Tanca",
"delete": "Elimina", "delete": "Elimina",
"loading": "Carregant", "loading": "Carregant",
"next": "Següent",
"no": "No", "no": "No",
"previous": "Anterior",
"refresh": "Actualitza",
"save": "Desa", "save": "Desa",
"successfully_deleted": "S'ha eliminat correctament", "successfully_deleted": "S'ha eliminat correctament",
"successfully_saved": "S'ha desat correctament", "successfully_saved": "S'ha desat correctament",
@@ -542,7 +548,7 @@
}, },
"dialogs": { "dialogs": {
"config_entry_system_options": { "config_entry_system_options": {
"enable_new_entities_description": "Si està desactivat, les entitats recentment descobertes per a {integration} no safegiran automàticament a Home Assistant.", "enable_new_entities_description": "Si està desactivat, les entitats descobertes recentment per a {integration} no s'afegiran automàticament a Home Assistant.",
"enable_new_entities_label": "Activa entitats afegides recentment.", "enable_new_entities_label": "Activa entitats afegides recentment.",
"title": "Opcions del sistema per a {integration}", "title": "Opcions del sistema per a {integration}",
"update": "Actualitza" "update": "Actualitza"
@@ -557,8 +563,8 @@
"confirm_delete": "Estàs segur que vols eliminar aquesta entrada?", "confirm_delete": "Estàs segur que vols eliminar aquesta entrada?",
"delete": "Elimina", "delete": "Elimina",
"enabled_cause": "Desactivada per {cause}.", "enabled_cause": "Desactivada per {cause}.",
"enabled_description": "Les entitats desactivades no safegiran a Home Assistant.", "enabled_description": "Les entitats desactivades no s'afegiran a Home Assistant.",
"enabled_label": "Activa lentitat", "enabled_label": "Activa l'entitat",
"entity_id": "ID de l'entitat", "entity_id": "ID de l'entitat",
"icon": "Sustitució d'icona", "icon": "Sustitució d'icona",
"icon_error": "Els icones han de tenir el format 'prefix:nom_icona', per exemple: 'mdi:home'", "icon_error": "Els icones han de tenir el format 'prefix:nom_icona', per exemple: 'mdi:home'",
@@ -643,7 +649,7 @@
}, },
"vacuum": { "vacuum": {
"clean_spot": "Zona neta", "clean_spot": "Zona neta",
"commands": "Comandes de laspirador:", "commands": "Comandes de l'aspirador:",
"fan_speed": "Velocitat del ventilador", "fan_speed": "Velocitat del ventilador",
"locate": "Localitza", "locate": "Localitza",
"pause": "Pausa", "pause": "Pausa",
@@ -735,6 +741,10 @@
"triggered": "{name} disparat/ada" "triggered": "{name} disparat/ada"
}, },
"panel": { "panel": {
"calendar": {
"my_calendars": "Calendaris",
"today": "Avui"
},
"config": { "config": {
"advanced_mode": { "advanced_mode": {
"hint_enable": "Falten opcions de configuració? Activa el mode avançat", "hint_enable": "Falten opcions de configuració? Activa el mode avançat",
@@ -837,6 +847,9 @@
}, },
"label": "Dispositiu" "label": "Dispositiu"
}, },
"not": {
"label": "No"
},
"numeric_state": { "numeric_state": {
"above": "Per sobre de", "above": "Per sobre de",
"below": "Per sota de", "below": "Per sota de",
@@ -886,7 +899,7 @@
"enable_disable": "Activa/desactiva automatització", "enable_disable": "Activa/desactiva automatització",
"introduction": "Utilitza les automatitzacions per donar més vida a la teva casa", "introduction": "Utilitza les automatitzacions per donar més vida a la teva casa",
"load_error_not_editable": "Només es poden editar les automatitzacions de l'arxiu automations.yaml.", "load_error_not_editable": "Només es poden editar les automatitzacions de l'arxiu automations.yaml.",
"load_error_unknown": "Error en carregar lautomatització ({err_no}).", "load_error_unknown": "Error en carregar l'automatització ({err_no}).",
"save": "Desa", "save": "Desa",
"triggers": { "triggers": {
"add": "Afegeix disparador", "add": "Afegeix disparador",
@@ -1005,9 +1018,9 @@
"disable": "desactiva", "disable": "desactiva",
"enable": "activa", "enable": "activa",
"enable_ha_skill": "Activa l'auxiliar de Home Assistant per Alexa", "enable_ha_skill": "Activa l'auxiliar de Home Assistant per Alexa",
"enable_state_reporting": "Activa els informes destat", "enable_state_reporting": "Activa els informes d'estat",
"info": "Amb la integració d'Alexa per Home Assistant Cloud podràs controlar tots els dispositius de Home Assistant a través dels dispositius compatibles amb Alexa.", "info": "Amb la integració d'Alexa per Home Assistant Cloud podràs controlar tots els dispositius de Home Assistant a través dels dispositius compatibles amb Alexa.",
"info_state_reporting": "Si actives els informes d'estat, Home Assistant enviarà a Amazon tots els canvis destat de les entitats exposades. Això et permetrà veure els últims estats a laplicació Alexa i utilitzar-los per crear rutines.", "info_state_reporting": "Si actives els informes d'estat, Home Assistant enviarà a Amazon tots els canvis d'estat de les entitats exposades. Això et permetrà veure els últims estats a l'aplicació Alexa i utilitzar-los per crear rutines.",
"manage_entities": "Gestió d'entitats", "manage_entities": "Gestió d'entitats",
"state_reporting_error": "No s'ha pogut {enable_disable} l'informe d'estat.", "state_reporting_error": "No s'ha pogut {enable_disable} l'informe d'estat.",
"sync_entities": "Sincronitza les entitats", "sync_entities": "Sincronitza les entitats",
@@ -1021,12 +1034,12 @@
"config_documentation": "Documentació de configuració", "config_documentation": "Documentació de configuració",
"devices_pin": "PIN dels dispositius de seguretat", "devices_pin": "PIN dels dispositius de seguretat",
"enable_ha_skill": "Activa l'auxiliar de Home Assistant per Google Assistant", "enable_ha_skill": "Activa l'auxiliar de Home Assistant per Google Assistant",
"enable_state_reporting": "Activa els informes destat", "enable_state_reporting": "Activa els informes d'estat",
"enter_pin_error": "No s'ha pogut desar el pin:", "enter_pin_error": "No s'ha pogut desar el pin:",
"enter_pin_hint": "Introdueix un PIN per utilitzar dispositius de seguretat", "enter_pin_hint": "Introdueix un PIN per utilitzar dispositius de seguretat",
"enter_pin_info": "Introdueix un codi PIN per interactuar amb dispositius de seguretat. Aquests dispositius són portes, garatges o panys, per exemple. Se't demanarà que introdueixis (o diguis) aquest PIN quan interactuïs amb aquests dispositius mitjançant Google Assistant.", "enter_pin_info": "Introdueix un codi PIN per interactuar amb dispositius de seguretat. Aquests dispositius són portes, garatges o panys, per exemple. Se't demanarà que introdueixis (o diguis) aquest PIN quan interactuïs amb aquests dispositius mitjançant Google Assistant.",
"info": "Amb la integració de Google Assistant per Home Assistant Cloud podràs controlar tots els dispositius de Home Assistant a través dels dispositius compatibles amb Google Assistant.", "info": "Amb la integració de Google Assistant per Home Assistant Cloud podràs controlar tots els dispositius de Home Assistant a través dels dispositius compatibles amb Google Assistant.",
"info_state_reporting": "Si actives els informes d'estat, Home Assistant enviarà a Google tots els canvis destat de les entitats exposades. Això et permetrà veure els últims estats a laplicació de Google.", "info_state_reporting": "Si actives els informes d'estat, Home Assistant enviarà a Google tots els canvis d'estat de les entitats exposades. Això et permetrà veure els últims estats a l'aplicació de Google.",
"manage_entities": "Gestió d'entitats", "manage_entities": "Gestió d'entitats",
"security_devices": "Dispositius de seguretat", "security_devices": "Dispositius de seguretat",
"sync_entities": "Sincronitza les entitats amb Google", "sync_entities": "Sincronitza les entitats amb Google",
@@ -1034,14 +1047,14 @@
"title": "Google Assistant" "title": "Google Assistant"
}, },
"integrations": "Integracions", "integrations": "Integracions",
"integrations_introduction": "Les integracions per Home Assistant Cloud et permeten connectar-vos a d'altres serveis al núvol sense haver dexposar la teva instància de Home Assistant públicament a Internet.", "integrations_introduction": "Les integracions per Home Assistant Cloud et permeten connectar-vos a d'altres serveis al núvol sense haver d'exposar la teva instància de Home Assistant públicament a Internet.",
"integrations_introduction2": "Consulta el lloc web per ", "integrations_introduction2": "Consulta el lloc web per ",
"integrations_link_all_features": "totes les funcions disponibles", "integrations_link_all_features": "totes les funcions disponibles",
"manage_account": "Gestió del compte", "manage_account": "Gestió del compte",
"nabu_casa_account": "Compte Nabu Casa", "nabu_casa_account": "Compte Nabu Casa",
"not_connected": "No connectat", "not_connected": "No connectat",
"remote": { "remote": {
"access_is_being_prepared": "Sestà preparant laccés remot. Tavisarem quan estigui a punt.", "access_is_being_prepared": "S'està preparant l'accés remot. T'avisarem quan estigui a punt.",
"certificate_info": "Informació del certificat", "certificate_info": "Informació del certificat",
"info": "Home Assistant Cloud t'ofereix una connexió remota i segura amb la teva instància mentre siguis fora de casa", "info": "Home Assistant Cloud t'ofereix una connexió remota i segura amb la teva instància mentre siguis fora de casa",
"instance_is_available": "La teva instància està disponible a", "instance_is_available": "La teva instància està disponible a",
@@ -1083,7 +1096,7 @@
"will_be_auto_renewed": "Es renovarà automàticament" "will_be_auto_renewed": "Es renovarà automàticament"
}, },
"dialog_cloudhook": { "dialog_cloudhook": {
"available_at": "El webhook està disponible a lURL següent:", "available_at": "El webhook està disponible a l'URL següent:",
"close": "Tanca", "close": "Tanca",
"confirm_disable": "Estàs segur que vols desactivar aquest webhook?", "confirm_disable": "Estàs segur que vols desactivar aquest webhook?",
"copied_to_clipboard": "Copiat al porta-retalls", "copied_to_clipboard": "Copiat al porta-retalls",
@@ -1112,8 +1125,8 @@
"title": "Google Assistant" "title": "Google Assistant"
}, },
"login": { "login": {
"alert_email_confirm_necessary": "Has de confirmar el teu correu electrònic abans diniciar sessió.", "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 diniciar sessió.", "alert_password_change_required": "Has de canviar la teva contrasenya abans d'iniciar sessió.",
"dismiss": "Desestimar", "dismiss": "Desestimar",
"email": "Correu electrònic", "email": "Correu electrònic",
"email_error_msg": "Correu electrònic invàlid", "email_error_msg": "Correu electrònic invàlid",
@@ -1121,7 +1134,7 @@
"introduction": "Home Assistant Cloud t'ofereix una connexió remota i segura amb la teva instància mentre siguis fora de casa. També et permet connectar-te amb els serveis disponibles al núvol: Amazon Alexa i Google Assistant.", "introduction": "Home Assistant Cloud t'ofereix una connexió remota i segura amb la teva instància mentre siguis fora de casa. També et permet connectar-te amb els serveis disponibles al núvol: Amazon Alexa i Google Assistant.",
"introduction2": "Aquest servei està gestionat pel nostre soci ", "introduction2": "Aquest servei està gestionat pel nostre soci ",
"introduction2a": ", una empresa fundada pels creadors de Home Assistant i Hass.io.", "introduction2a": ", una empresa fundada pels creadors de Home Assistant i Hass.io.",
"introduction3": "Home Assistant Cloud és un servei de subscripció amb una prova gratuïta dun mes. No és necessària la informació de pagament.", "introduction3": "Home Assistant Cloud és un servei de subscripció amb una prova gratuïta d'un mes. No és necessària la informació de pagament.",
"learn_more_link": "Més informació sobre Home Assistant Cloud", "learn_more_link": "Més informació sobre Home Assistant Cloud",
"password": "Contrasenya", "password": "Contrasenya",
"password_error_msg": "La contrasenya han de tenir un mínim de 8 caràcters", "password_error_msg": "La contrasenya han de tenir un mínim de 8 caràcters",
@@ -1140,7 +1153,7 @@
"feature_remote_control": "Control de Home Assistant fora de casa", "feature_remote_control": "Control de Home Assistant fora de casa",
"feature_webhook_apps": "Fàcil integració amb aplicacions basades an webhook com OwnTracks", "feature_webhook_apps": "Fàcil integració amb aplicacions basades an webhook com OwnTracks",
"headline": "Inicia la prova gratuïta", "headline": "Inicia la prova gratuïta",
"information": "Crea un compte per iniciar la prova gratuïta dun mes amb Home Assistant Cloud. No és necessària la informació de pagament.", "information": "Crea un compte per iniciar la prova gratuïta d'un mes amb Home Assistant Cloud. No és necessària la informació de pagament.",
"information2": "La prova et donarà accés a tots els avantatges de Home Assistant Cloud, inclosos:", "information2": "La prova et donarà accés a tots els avantatges de Home Assistant Cloud, inclosos:",
"information3": "Aquest servei està gestionat pel nostre soci ", "information3": "Aquest servei està gestionat pel nostre soci ",
"information3a": ", una empresa fundada pels creadors de Home Assistant i Hass.io.", "information3a": ", una empresa fundada pels creadors de Home Assistant i Hass.io.",
@@ -1168,7 +1181,9 @@
"edit_requires_storage": "L'editor està desactivat ja que la configuració es troba a configuration.yaml.", "edit_requires_storage": "L'editor està desactivat ja que la configuració es troba a configuration.yaml.",
"elevation": "Altitud", "elevation": "Altitud",
"elevation_meters": "metres", "elevation_meters": "metres",
"external_url": "URL extern",
"imperial_example": "Fahrenheit, lliures", "imperial_example": "Fahrenheit, lliures",
"internal_url": "URL intern",
"latitude": "Latitud", "latitude": "Latitud",
"location_name": "Nom de la instal·lació de Home Assistant", "location_name": "Nom de la instal·lació de Home Assistant",
"longitude": "Longitud", "longitude": "Longitud",
@@ -1192,7 +1207,7 @@
"attributes_set": "Els següents atributs d'entitat s'estableixen programàticament.", "attributes_set": "Els següents atributs d'entitat s'estableixen programàticament.",
"caption": "Personalització", "caption": "Personalització",
"description": "Personalitza les entitats", "description": "Personalitza les entitats",
"different_include": "Possiblement a través dun domini o una altra inclusió diferent.", "different_include": "Possiblement a través d'un domini o una altra inclusió diferent.",
"pick_attribute": "Selecciona un atribut per substituir-lo", "pick_attribute": "Selecciona un atribut per substituir-lo",
"picker": { "picker": {
"header": "Personalització", "header": "Personalització",
@@ -1201,7 +1216,7 @@
"warning": { "warning": {
"include_link": "inclou customize.yaml", "include_link": "inclou customize.yaml",
"include_sentence": "Sembla que la teva configuració a configuration.yaml no", "include_sentence": "Sembla que la teva configuració a configuration.yaml no",
"not_applied": "Els canvis realitzats aquí es desen, però no saplicaran fins que es torni a carregar la configuració, tret que la inclusió estigui present." "not_applied": "Els canvis realitzats aquí es desen, però no s'aplicaran fins que es torni a carregar la configuració, tret que la inclusió estigui present."
} }
}, },
"devices": { "devices": {
@@ -1223,7 +1238,7 @@
"cant_edit": "Només pots editar els elements creats a la interfície d'usuari (UI).", "cant_edit": "Només pots editar els elements creats a la interfície d'usuari (UI).",
"caption": "Dispositius", "caption": "Dispositius",
"confirm_delete": "Estàs segur que vols eliminar aquest dispositiu?", "confirm_delete": "Estàs segur que vols eliminar aquest dispositiu?",
"confirm_rename_entity_ids": "Vols, també, canviar el nom dels ID's dentitat de les entitats?", "confirm_rename_entity_ids": "Vols, també, canviar el nom dels ID's d'entitat de les entitats?",
"data_table": { "data_table": {
"area": "Àrea", "area": "Àrea",
"battery": "Bateria", "battery": "Bateria",
@@ -1235,6 +1250,7 @@
}, },
"delete": "Elimina", "delete": "Elimina",
"description": "Gestiona els dispositius connectats", "description": "Gestiona els dispositius connectats",
"device_info": "Informació del dispositiu",
"device_not_found": "Dispositiu no trobat.", "device_not_found": "Dispositiu no trobat.",
"entities": { "entities": {
"add_entities_lovelace": "Afegeix a Lovelace", "add_entities_lovelace": "Afegeix a Lovelace",
@@ -1265,7 +1281,7 @@
"picker": { "picker": {
"disable_selected": { "disable_selected": {
"button": "Desactiva seleccionada/es", "button": "Desactiva seleccionada/es",
"confirm_text": "Les entitats desactivades no safegiran a Home Assistant.", "confirm_text": "Les entitats desactivades no s'afegiran a Home Assistant.",
"confirm_title": "Vols desactivar {number} entitat/s?" "confirm_title": "Vols desactivar {number} entitat/s?"
}, },
"enable_selected": { "enable_selected": {
@@ -1328,7 +1344,7 @@
} }
}, },
"types": { "types": {
"input_boolean": "Commuta", "input_boolean": "Interruptor",
"input_datetime": "Data i/o hora", "input_datetime": "Data i/o hora",
"input_number": "Número", "input_number": "Número",
"input_select": "Desplegable", "input_select": "Desplegable",
@@ -1377,13 +1393,13 @@
}, },
"configure": "Configurar", "configure": "Configurar",
"configured": "Configurades", "configured": "Configurades",
"description": "Gestiona i configura la integració", "description": "Gestionar i configurar integracións",
"details": "Detalls de la integració", "details": "Detalls de la integració",
"discovered": "Descobertes", "discovered": "Descobertes",
"home_assistant_website": "lloc web de Home Assistant", "home_assistant_website": "lloc web de Home Assistant",
"ignore": { "ignore": {
"confirm_delete_ignore": "Això farà que quan la integració es descobreixi torni a aparèixer a les integracions descobertes. Pot ser que tardi una estona o es necessiti reiniciar.", "confirm_delete_ignore": "Això farà que quan la integració es descobreixi torni a aparèixer a les integracions descobertes. Pot ser que tardi una estona o es necessiti reiniciar.",
"confirm_delete_ignore_title": "Vols deixar dignorar {name}?", "confirm_delete_ignore_title": "Vols deixar d'ignorar {name}?",
"confirm_ignore": "Estàs segur que no vols per a configurar aquesta integració? Pots desfer-ho fent clic a 'Mostra les integracions ignorades' al menú de la part superior dreta.", "confirm_ignore": "Estàs segur que no vols per a configurar aquesta integració? Pots desfer-ho fent clic a 'Mostra les integracions ignorades' al menú de la part superior dreta.",
"confirm_ignore_title": "Ignorar descobriment de {name}?", "confirm_ignore_title": "Ignorar descobriment de {name}?",
"hide_ignored": "Amaga les integracions ignorades", "hide_ignored": "Amaga les integracions ignorades",
@@ -1397,10 +1413,12 @@
"new": "Configura una nova integració", "new": "Configura una nova integració",
"no_integrations": "Sembla que encara no tens cap integració configurada. Prem al botó de sota per afegir la teva primera integració!", "no_integrations": "Sembla que encara no tens cap integració configurada. Prem al botó de sota per afegir la teva primera integració!",
"none": "Encara no hi ha res configurat", "none": "Encara no hi ha res configurat",
"none_found": "No s'han trobat integracions",
"none_found_detail": "Ajusta els paràmetres de cerca.",
"note_about_integrations": "Encara no es poden configurar totes les integracions a través de la UI.", "note_about_integrations": "Encara no es poden configurar totes les integracions a través de la UI.",
"note_about_website_reference": "N'hi ha més disponibles al ", "note_about_website_reference": "N'hi ha més disponibles al ",
"rename_dialog": "Edita el nom de l'entrada de configuració", "rename_dialog": "Edita el nom de l'entrada de configuració",
"rename_input_label": "Nom de lentrada" "rename_input_label": "Nom de l'entrada"
}, },
"introduction": "Aquí pots configurar Home Assistant i els seus components. Encara no és possible configurar-ho tot des de la interfície d'usuari, però hi estem treballant.", "introduction": "Aquí pots configurar Home Assistant i els seus components. Encara no és possible configurar-ho tot des de la interfície d'usuari, però hi estem treballant.",
"lovelace": { "lovelace": {
@@ -1470,10 +1488,10 @@
}, },
"no_resources": "Sense recursos" "no_resources": "Sense recursos"
}, },
"refresh_body": "Has dactualitzar la pàgina per completar leliminació. Vols actualitzar-la ara?", "refresh_body": "Has d'actualitzar la pàgina per completar l'eliminació. Vols actualitzar-la ara?",
"refresh_header": "Vols actualitzar?", "refresh_header": "Vols actualitzar?",
"types": { "types": {
"css": "Fitxer destils", "css": "Fitxer d'estils",
"html": "HTML (obsolet)", "html": "HTML (obsolet)",
"js": "Fitxer JavaScript (obsolet)", "js": "Fitxer JavaScript (obsolet)",
"module": "Mòdul JavaScript" "module": "Mòdul JavaScript"
@@ -1528,7 +1546,7 @@
}, },
"introduction": "Utilitza les escenes per donar més vida a la teva llar.", "introduction": "Utilitza les escenes per donar més vida a la teva llar.",
"load_error_not_editable": "Només es poden editar les escenes de l'arxiu scenes.yaml.", "load_error_not_editable": "Només es poden editar les escenes de l'arxiu scenes.yaml.",
"load_error_unknown": "Error en carregar lescena ({err_no}).", "load_error_unknown": "Error en carregar l'escena ({err_no}).",
"name": "Nom", "name": "Nom",
"save": "Desa", "save": "Desa",
"unsaved_confirm": "Hi han canvis no desats. Segur que vols sortir?" "unsaved_confirm": "Hi han canvis no desats. Segur que vols sortir?"
@@ -1538,7 +1556,7 @@
"delete_confirm": "Estàs segur que vols eliminar aquesta escena?", "delete_confirm": "Estàs segur que vols eliminar aquesta escena?",
"delete_scene": "Elimina l'escena", "delete_scene": "Elimina l'escena",
"edit_scene": "Edita escena", "edit_scene": "Edita escena",
"header": "Editor descenes", "header": "Editor d'escenes",
"headers": { "headers": {
"name": "Nom" "name": "Nom"
}, },
@@ -1559,11 +1577,11 @@
"delete_confirm": "Estàs segur que vols eliminar aquest script?", "delete_confirm": "Estàs segur que vols eliminar aquest script?",
"delete_script": "Elimina l'script", "delete_script": "Elimina l'script",
"header": "Script: {name}", "header": "Script: {name}",
"introduction": "Utilitza els scripts per executar seqüències daccions.", "introduction": "Utilitza els scripts per executar seqüències d'accions.",
"link_available_actions": "Més informació sobre les accions disponibles.", "link_available_actions": "Més informació sobre les accions disponibles.",
"load_error_not_editable": "Només es poden editar els scripts dins de l'arxiu scripts.yaml.", "load_error_not_editable": "Només es poden editar els scripts dins de l'arxiu scripts.yaml.",
"sequence": "Seqüència", "sequence": "Seqüència",
"sequence_sentence": "Seqüència daccions de l'script." "sequence_sentence": "Seqüència d'accions de l'script."
}, },
"picker": { "picker": {
"add_script": "Afegeix script", "add_script": "Afegeix script",
@@ -1650,7 +1668,7 @@
}, },
"zha": { "zha": {
"add_device_page": { "add_device_page": {
"discovery_text": "Els dispositius descoberts apareixeran aquí. Segueix les instruccions del teu dispositiu/s i posa el dispositiu/s en mode demparellament.", "discovery_text": "Els dispositius descoberts apareixeran aquí. Segueix les instruccions del/s teu/s dispositiu/s i posa el dispositiu/s en mode d'emparellament.",
"header": "Domòtica amb Zigbee - Afegir dispositius", "header": "Domòtica amb Zigbee - Afegir dispositius",
"search_again": "Torna a cercar", "search_again": "Torna a cercar",
"spinner": "S'estan cercant dispositius ZHA Zigbee..." "spinner": "S'estan cercant dispositius ZHA Zigbee..."
@@ -1665,7 +1683,7 @@
"get_zigbee_attribute": "Obtenir l'atribut Zigbee", "get_zigbee_attribute": "Obtenir l'atribut Zigbee",
"header": "Atributs clúster", "header": "Atributs clúster",
"help_attribute_dropdown": "Selecciona un atribut per visualitzar-ne o definiu-ne el valor.", "help_attribute_dropdown": "Selecciona un atribut per visualitzar-ne o definiu-ne el valor.",
"help_get_zigbee_attribute": "Obté el valor de latribut seleccionat.", "help_get_zigbee_attribute": "Obté el valor de l'atribut seleccionat.",
"help_set_zigbee_attribute": "Estableix el valor d'atribut pel clúster especificat a l'entitat especificada.", "help_set_zigbee_attribute": "Estableix el valor d'atribut pel clúster especificat a l'entitat especificada.",
"introduction": "Consulta i edita els atributs del clúster.", "introduction": "Consulta i edita els atributs del clúster.",
"set_zigbee_attribute": "Estableix l'atribut Zigbee" "set_zigbee_attribute": "Estableix l'atribut Zigbee"
@@ -1763,7 +1781,7 @@
"name": "Nom", "name": "Nom",
"new_zone": "Zona nova", "new_zone": "Zona nova",
"passive": "Passiva", "passive": "Passiva",
"passive_note": "Les zones passives estan amagades i no sutilitzen com a ubicacions per a dispositius rastrejables. Però són utils per a la creació d'automatitzacions.", "passive_note": "Les zones passives estan amagades i no s'utilitzen com a ubicacions per a dispositius rastrejables. Però són utils per a la creació d'automatitzacions.",
"radius": "Radi", "radius": "Radi",
"required_error_msg": "Aquest camp és obligatori", "required_error_msg": "Aquest camp és obligatori",
"update": "Actualitza" "update": "Actualitza"
@@ -1772,7 +1790,7 @@
"edit_home_zone_narrow": "El radi de la zona principal (casa) encara no es pot editar des del \"frontend\". Sí que pots canviar-ne la ubicació des de la configuració general.", "edit_home_zone_narrow": "El radi de la zona principal (casa) encara no es pot editar des del \"frontend\". Sí que pots canviar-ne la ubicació des de la configuració general.",
"go_to_core_config": "Anar a la configuració general?", "go_to_core_config": "Anar a la configuració general?",
"home_zone_core_config": "La ubicació de la zona principal (casa) és pot canviar des de la pàgina de configuració general. El radi d'aquesta zona encara no es pot editar des d'aquí. Vols anar a la configuració general?", "home_zone_core_config": "La ubicació de la zona principal (casa) és pot canviar des de la pàgina de configuració general. El radi d'aquesta zona encara no es pot editar des d'aquí. Vols anar a la configuració general?",
"introduction": "Les zones et permeten definir certes regions del planeta. Quan una persona es trobi dins duna zona, lestat prendrà el nom d'aquesta zona. També es poden utilitzar com a disparadors o condicions durant la creació d'automatitzacions.", "introduction": "Les zones et permeten definir certes regions del planeta. Quan una persona es trobi dins d'una zona, l'estat prendrà el nom d'aquesta zona. També es poden utilitzar com a disparadors o condicions durant la creació d'automatitzacions.",
"no_zones_created_yet": "Sembla que encara no has creat cap zona." "no_zones_created_yet": "Sembla que encara no has creat cap zona."
}, },
"zwave": { "zwave": {
@@ -1805,12 +1823,12 @@
"header": "Opcions de configuració del node", "header": "Opcions de configuració del node",
"seconds": "segons", "seconds": "segons",
"set_config_parameter": "Defineix el paràmetre de configuració", "set_config_parameter": "Defineix el paràmetre de configuració",
"set_wakeup": "Estableix linterval en despertar", "set_wakeup": "Estableix l'interval en despertar",
"true": "Cert" "true": "Cert"
}, },
"ozw_log": { "ozw_log": {
"header": "Registre d'OZW", "header": "Registre d'OZW",
"introduction": "Consulta el registre. 0 és el mínim (carrega el registre complet) i 1000 és el màxim. La càrrega mostrarà un registre estàtic i la cua sactualitzarà automàticament amb lúltim número de línies especificat." "introduction": "Consulta el registre. 0 és el mínim (carrega el registre complet) i 1000 és el màxim. La càrrega mostrarà un registre estàtic i la cua s'actualitzarà automàticament amb l'últim número de línies especificat."
}, },
"services": { "services": {
"add_node": "Afegeix node", "add_node": "Afegeix node",
@@ -1851,7 +1869,7 @@
"listening_to": "Escoltant a", "listening_to": "Escoltant a",
"notification_event_fired": "L'esdeveniment {type} s'ha cridat correctament", "notification_event_fired": "L'esdeveniment {type} s'ha cridat correctament",
"start_listening": "Comença a escoltar", "start_listening": "Comença a escoltar",
"stop_listening": "Deixa descoltar", "stop_listening": "Deixa d'escoltar",
"subscribe_to": "Esdeveniment al qual subscriure's", "subscribe_to": "Esdeveniment al qual subscriure's",
"title": "Esdeveniments", "title": "Esdeveniments",
"type": "Tipus d'esdeveniment" "type": "Tipus d'esdeveniment"
@@ -1890,7 +1908,7 @@
"payload": "Dades/missatge (plantilla permesa)", "payload": "Dades/missatge (plantilla permesa)",
"publish": "Publica", "publish": "Publica",
"start_listening": "Comença a escoltar", "start_listening": "Comença a escoltar",
"stop_listening": "Deixa descoltar", "stop_listening": "Deixa d'escoltar",
"subscribe_to": "Tòpic al qual subscriure's", "subscribe_to": "Tòpic al qual subscriure's",
"title": "MQTT", "title": "MQTT",
"topic": "tòpic" "topic": "tòpic"
@@ -1903,14 +1921,14 @@
"column_parameter": "Paràmetre", "column_parameter": "Paràmetre",
"data": "Dades del servei (en YAML, opcionals)", "data": "Dades del servei (en YAML, opcionals)",
"description": "L'eina Serveis et permet fer crides a qualsevol servei disponible a Home Assistant.", "description": "L'eina Serveis et permet fer crides a qualsevol servei disponible a Home Assistant.",
"fill_example_data": "Omple amb dades dexemple", "fill_example_data": "Omple amb dades d'exemple",
"no_description": "No hi ha cap descripció disponible", "no_description": "No hi ha cap descripció disponible",
"no_parameters": "Aquest servei no té paràmetres.", "no_parameters": "Aquest servei no té paràmetres.",
"select_service": "Selecciona un servei per veure'n la descripció", "select_service": "Selecciona un servei per veure'n la descripció",
"title": "Serveis" "title": "Serveis"
}, },
"states": { "states": {
"alert_entity_field": "Lentitat és un camp obligatori", "alert_entity_field": "L'entitat és un camp obligatori",
"attributes": "Atributs", "attributes": "Atributs",
"current_entities": "Entitats actuals", "current_entities": "Entitats actuals",
"description1": "Defineix la representació d'un dispositiu a Home Assistant.", "description1": "Defineix la representació d'un dispositiu a Home Assistant.",
@@ -1941,7 +1959,7 @@
"showing_entries": "Mostrant entrades de" "showing_entries": "Mostrant entrades de"
}, },
"logbook": { "logbook": {
"entries_not_found": "No shan trobat entrades al registre.", "entries_not_found": "No s'han trobat entrades al registre.",
"period": "Període", "period": "Període",
"showing_entries": "Mostrant entrades de" "showing_entries": "Mostrant entrades de"
}, },
@@ -1971,7 +1989,7 @@
"url": "Obre un finestra a {url_path}" "url": "Obre un finestra a {url_path}"
}, },
"safe-mode": { "safe-mode": {
"description": "Home Assistant ha tingut algun problema en carregar la configuració i ara s'està executant en mode segur. Mira el registre derrors per veure què ha anat malament.", "description": "Home Assistant ha tingut algun problema en carregar la configuració i ara s'està executant en mode segur. Mira el registre d'errors per veure què ha anat malament.",
"header": "Mode segur activat" "header": "Mode segur activat"
}, },
"shopping-list": { "shopping-list": {
@@ -2239,14 +2257,14 @@
"menu": { "menu": {
"close": "Tanca", "close": "Tanca",
"configure_ui": "Configurar la interfície d'usuari", "configure_ui": "Configurar la interfície d'usuari",
"exit_edit_mode": "Surt del mode dedició d'interfície", "exit_edit_mode": "Surt del mode d'edició d'interfície",
"help": "Ajuda", "help": "Ajuda",
"refresh": "Actualitzar", "refresh": "Actualitzar",
"reload_resources": "Actualitza recursos" "reload_resources": "Actualitza recursos"
}, },
"reload_lovelace": "Recarrega Lovelace", "reload_lovelace": "Recarrega Lovelace",
"reload_resources": { "reload_resources": {
"refresh_body": "Has dactualitzar la pàgina per completar la càrrega. Vols actualitzar-la ara?", "refresh_body": "Has d'actualitzar la pàgina per completar la càrrega. Vols actualitzar-la ara?",
"refresh_header": "Vols actualitzar?" "refresh_header": "Vols actualitzar?"
}, },
"unused_entities": { "unused_entities": {
@@ -2377,7 +2395,7 @@
"cards": { "cards": {
"demo": { "demo": {
"demo_by": "per {name}", "demo_by": "per {name}",
"introduction": "Benvingut a casa! Has arribat a la demo de Home Assistant on es mostren algunes de les millors interfícies dusuari creades per la comunitat.", "introduction": "Benvingut a casa! Has arribat a la demo de Home Assistant on es mostren algunes de les millors interfícies d'usuari creades per la comunitat.",
"learn_more": "Més informació sobre Home Assistant", "learn_more": "Més informació sobre Home Assistant",
"next_demo": "Següent mostra" "next_demo": "Següent mostra"
} }
@@ -2482,18 +2500,18 @@
"logout_text": "Estàs segur que vols tancar la sessió?", "logout_text": "Estàs segur que vols tancar la sessió?",
"logout_title": "Tancar sessió?", "logout_title": "Tancar sessió?",
"long_lived_access_tokens": { "long_lived_access_tokens": {
"confirm_delete": "Estàs segur que vols eliminar el testimoni d'autenticació d'accés per {name}?", "confirm_delete": "Estàs segur que vols eliminar el token d'autenticació d'accés per {name}?",
"create": "Crea un testimoni d'autenticació", "create": "Crea un token d'autenticació",
"create_failed": "No s'ha pogut crear el testimoni d'autenticació d'accés.", "create_failed": "No s'ha pogut crear el token d'autenticació d'accés.",
"created_at": "Creat el {date}", "created_at": "Creat el {date}",
"delete_failed": "No s'ha pogut eliminar el testimoni d'autenticació d'accés.", "delete_failed": "No s'ha pogut eliminar el token d'autenticació d'accés.",
"description": "Crea testimonis d'autenticació d'accés de llarga durada per permetre als teus programes (scripts) interactuar amb la instància de Home Assistant. Cada testimoni d'autenticació serà vàlid durant deu anys després de la seva creació. Els següents testimonis d'autenticació d'accés de llarga durada estan actius actualment.", "description": "Crea tokens d'autenticació d'accés de llarga durada per permetre als teus programes (scripts) interactuar amb la instància de Home Assistant. Cada token d'autenticació serà vàlid durant deu anys després de la seva creació. Els següents tokens d'autenticació d'accés de llarga durada estan actius actualment.",
"empty_state": "Encara no tens testimonis d'autenticaciós d'accés de llarga durada.", "empty_state": "Encara no tens tokens d'autenticaciós d'accés de llarga durada.",
"header": "Testimonis d'autenticació d'accés de llarga durada", "header": "Tokens d'autenticació d'accés de llarga durada",
"last_used": "Darrer ús el {date} des de {location}", "last_used": "Darrer ús el {date} des de {location}",
"learn_auth_requests": "Aprèn a fer sol·licituds autenticades.", "learn_auth_requests": "Aprèn a fer sol·licituds autenticades.",
"not_used": "Mai no s'ha utilitzat", "not_used": "Mai no s'ha utilitzat",
"prompt_copy_token": "Copia't el testimoni d'autenticació (token) d'accés. No es tornarà a mostrar més endavant.", "prompt_copy_token": "Copia't el token d'autenticació d'accés. No es tornarà a mostrar més endavant.",
"prompt_name": "Nom?" "prompt_name": "Nom?"
}, },
"mfa_setup": { "mfa_setup": {
@@ -2518,15 +2536,15 @@
"push_notifications": "Notificacions push" "push_notifications": "Notificacions push"
}, },
"refresh_tokens": { "refresh_tokens": {
"confirm_delete": "Estàs segur que vols eliminar el testimoni d'actualització per a {name}?", "confirm_delete": "Estàs segur que vols eliminar el token d'actualització per a {name}?",
"created_at": "Creat el {date}", "created_at": "Creat el {date}",
"current_token_tooltip": "No s'ha pogut eliminar el testimoni d'autenticació d'actualització.", "current_token_tooltip": "No s'ha pogut eliminar el token d'autenticació d'actualització.",
"delete_failed": "No s'ha pogut eliminar el testimoni d'autenticació d'actualització.", "delete_failed": "No s'ha pogut eliminar el token d'autenticació d'actualització.",
"description": "Cada testimoni d'autenticació d'actualització representa un inici de sessió diferent. Els testimonis d'autenticació d'actualització s'eliminaran automàticament quan tanquis la sessió. A sota hi ha una llista de testimonis d'autenticació d'actualització que estan actius actualment al teu compte.", "description": "Cada token d'autenticació d'actualització representa un inici de sessió diferent. Els tokens d'autenticació d'actualització s'eliminaran automàticament quan tanquis la sessió. A sota hi ha una llista de tokens d'autenticació d'actualització que estan actius actualment al teu compte.",
"header": "Refresca els testimonis d'autenticació", "header": "Refresca els tokens d'autenticació",
"last_used": "Darrer ús el {date} des de {location}", "last_used": "Darrer ús el {date} des de {location}",
"not_used": "Mai no s'ha utilitzat", "not_used": "Mai no s'ha utilitzat",
"token_title": "Testimoni d'actualització de {clientId}" "token_title": "Token d'actualització de {clientId}"
}, },
"themes": { "themes": {
"dropdown_label": "Tema", "dropdown_label": "Tema",
@@ -2535,7 +2553,7 @@
"link_promo": "Crea temes personalitzats" "link_promo": "Crea temes personalitzats"
}, },
"vibrate": { "vibrate": {
"description": "Activa o desactiva la vibració en daquest dispositiu.", "description": "Activa o desactiva la vibració en d'aquest dispositiu.",
"header": "Vibra" "header": "Vibra"
} }
}, },
@@ -2546,7 +2564,7 @@
} }
}, },
"sidebar": { "sidebar": {
"external_app_configuration": "Configuració de laplicació", "external_app_configuration": "Configuració de l'aplicació",
"sidebar_toggle": "Commutació de la barra lateral" "sidebar_toggle": "Commutació de la barra lateral"
} }
} }

View File

@@ -137,7 +137,7 @@
"on": "Vlhko" "on": "Vlhko"
}, },
"motion": { "motion": {
"off": "Bez pohybu", "off": "Žádný pohyb",
"on": "Zaznamenán pohyb" "on": "Zaznamenán pohyb"
}, },
"occupancy": { "occupancy": {
@@ -206,6 +206,8 @@
"stopped": "Zastaveno" "stopped": "Zastaveno"
}, },
"default": { "default": {
"off": "Vypnuto",
"on": "Zapnuto",
"unavailable": "Není k dispozici", "unavailable": "Není k dispozici",
"unknown": "Nezjištěno" "unknown": "Nezjištěno"
}, },
@@ -288,7 +290,7 @@
}, },
"vacuum": { "vacuum": {
"cleaning": "Čistí", "cleaning": "Čistí",
"docked": "V stanici", "docked": "Ve stanici",
"error": "Chyba", "error": "Chyba",
"idle": "Nečinný", "idle": "Nečinný",
"off": "Off", "off": "Off",
@@ -442,6 +444,7 @@
"attributes": { "attributes": {
"air_pressure": "Tlak vzduchu", "air_pressure": "Tlak vzduchu",
"humidity": "Vlhkost vzduchu", "humidity": "Vlhkost vzduchu",
"precipitation": "Srážky",
"temperature": "Teplota", "temperature": "Teplota",
"visibility": "Viditelnost", "visibility": "Viditelnost",
"wind_speed": "Rychlost větru" "wind_speed": "Rychlost větru"
@@ -476,6 +479,7 @@
"save": "Uložit", "save": "Uložit",
"successfully_deleted": "Úspěšně smazáno", "successfully_deleted": "Úspěšně smazáno",
"successfully_saved": "Úspěšně uloženo", "successfully_saved": "Úspěšně uloženo",
"undo": "Zpět",
"yes": "Ano" "yes": "Ano"
}, },
"components": { "components": {
@@ -650,6 +654,17 @@
"stop": "Stop" "stop": "Stop"
} }
}, },
"mqtt_device_debug_info": {
"deserialize": "Pokus o parsování MQTT zpráv jako JSON",
"entities": "Entity",
"no_entities": "Žádné entity",
"no_triggers": "Žádné spouštěče",
"payload_display": "Zobrazení MQTT zprávy",
"recent_messages": "{n} naposledy přijaté zprávy",
"show_as_yaml": "Zobrazit jako YAML",
"title": "Ladicí informace {device}",
"triggers": "Spouštěče"
},
"options_flow": { "options_flow": {
"form": { "form": {
"header": "Nastavení" "header": "Nastavení"
@@ -670,11 +685,13 @@
"buttons": { "buttons": {
"add": "Přidat zařízení", "add": "Přidat zařízení",
"reconfigure": "Překonfigurovat zařízení", "reconfigure": "Překonfigurovat zařízení",
"remove": "Odebrat zařízení" "remove": "Odebrat zařízení",
"zigbee_information": "Informace o Zigbee"
}, },
"confirmations": { "confirmations": {
"remove": "Opravdu chcete zařízení odebrat?" "remove": "Opravdu chcete zařízení odebrat?"
}, },
"device_signature": "Podpis zařízení Zigbee",
"last_seen": "Naposledy viděn", "last_seen": "Naposledy viděn",
"manuf": "od {manufacturer}", "manuf": "od {manufacturer}",
"no_area": "Žádná oblast", "no_area": "Žádná oblast",
@@ -683,7 +700,8 @@
"services": { "services": {
"reconfigure": "Překonfigurovat zařízení ZHA (opravit zařízení). Použijte, pokud se zařízením máte problémy. Je-li dotyčné zařízení napájené bateriemi, ujistěte se prosím, že je při používání této služby spuštěné a přijímá příkazy.", "reconfigure": "Překonfigurovat zařízení ZHA (opravit zařízení). Použijte, pokud se zařízením máte problémy. Je-li dotyčné zařízení napájené bateriemi, ujistěte se prosím, že je při používání této služby spuštěné a přijímá příkazy.",
"remove": "Odebrat zařízení ze sítě Zigbee.", "remove": "Odebrat zařízení ze sítě Zigbee.",
"updateDeviceName": "Nastavte vlastní název tohoto zařízení v registru zařízení." "updateDeviceName": "Nastavte vlastní název tohoto zařízení v registru zařízení.",
"zigbee_information": "Zobrazit Zigbee informace zařízení."
}, },
"unknown": "Neznámý", "unknown": "Neznámý",
"zha_device_card": { "zha_device_card": {
@@ -724,6 +742,10 @@
}, },
"areas": { "areas": {
"caption": "Registr oblastí", "caption": "Registr oblastí",
"data_table": {
"area": "Oblast",
"devices": "Zařízení"
},
"delete": { "delete": {
"confirmation_text": "Všechna zařízení v této oblasti budou nastavena jako nepřiřazena.", "confirmation_text": "Všechna zařízení v této oblasti budou nastavena jako nepřiřazena.",
"confirmation_title": "Opravdu chcete tuto oblast smazat?" "confirmation_title": "Opravdu chcete tuto oblast smazat?"
@@ -731,14 +753,17 @@
"description": "Přehled všech oblastí ve vaší domácnosti.", "description": "Přehled všech oblastí ve vaší domácnosti.",
"editor": { "editor": {
"create": "VYTVOŘIT", "create": "VYTVOŘIT",
"default_name": "Nová oblast",
"delete": "Odstranit", "delete": "Odstranit",
"update": "UPRAVIT" "update": "UPRAVIT"
}, },
"picker": { "picker": {
"create_area": "Vytvořit oblast",
"header": "Registr oblastí", "header": "Registr oblastí",
"integrations_page": "Stránka integrací", "integrations_page": "Stránka integrací",
"introduction": "Oblasti se používají k uspořádání zařízení podle místa kde jsou. Tato informace bude použita k organizaci rozhraní, k nastavení oprávnění a v integraci s ostatnímy systémy.", "introduction": "Oblasti se používají k uspořádání zařízení podle místa kde jsou. Tato informace bude použita k organizaci rozhraní, k nastavení oprávnění a v integraci s ostatnímy systémy.",
"introduction2": "Pro přídání zařízení do oblasti přejděte na stránku integrací pomocí odkazu níže tam klikněte na nakonfigurovanou integraci abyste se dostali na kartu zažízení." "introduction2": "Pro přídání zařízení do oblasti přejděte na stránku integrací pomocí odkazu níže tam klikněte na nakonfigurovanou integraci abyste se dostali na kartu zažízení.",
"no_areas": "Vypadá to, že ještě nemáte žádné oblasti!"
} }
}, },
"automation": { "automation": {
@@ -962,6 +987,9 @@
"delete_confirm": "Opravdu chcete odstranit tuto automatizaci?", "delete_confirm": "Opravdu chcete odstranit tuto automatizaci?",
"edit_automation": "Upravit automatizaci", "edit_automation": "Upravit automatizaci",
"header": "Editor automatizací", "header": "Editor automatizací",
"headers": {
"name": "Název"
},
"introduction": "Editor automatizací umožňuje vytvářet a upravovat automatizace. Přečtěte si prosím [pokyny] (https://home-assistant.io/docs/automation/editor/), abyste se ujistili, že jste aplikaci Home Assistant nakonfigurovali správně.", "introduction": "Editor automatizací umožňuje vytvářet a upravovat automatizace. Přečtěte si prosím [pokyny] (https://home-assistant.io/docs/automation/editor/), abyste se ujistili, že jste aplikaci Home Assistant nakonfigurovali správně.",
"learn_more": "Další informace o automatizacích", "learn_more": "Další informace o automatizacích",
"no_automations": "Nemohli jsme najít žádné upravitelné automatizace", "no_automations": "Nemohli jsme najít žádné upravitelné automatizace",
@@ -1214,6 +1242,7 @@
"none": "Toto zařízení nemá žádné entity" "none": "Toto zařízení nemá žádné entity"
}, },
"name": "Jméno", "name": "Jméno",
"no_devices": "Žádná zařízení",
"scene": { "scene": {
"create": "Vytvořit scénu se zařízením", "create": "Vytvořit scénu se zařízením",
"no_scenes": "Žádné scény", "no_scenes": "Žádné scény",
@@ -1276,6 +1305,10 @@
} }
} }
}, },
"filtering": {
"clear": "Vymazat",
"filtering_by": "Filtrování podle"
},
"header": "Konfigurace Home Assistant", "header": "Konfigurace Home Assistant",
"helpers": { "helpers": {
"caption": "Pomocníci", "caption": "Pomocníci",
@@ -1303,9 +1336,11 @@
} }
}, },
"integrations": { "integrations": {
"add_integration": "Přidat integraci",
"caption": "Integrace", "caption": "Integrace",
"config_entry": { "config_entry": {
"area": "V {area}", "area": "V {area}",
"delete": "Smazat",
"delete_button": "Smazat {integration}", "delete_button": "Smazat {integration}",
"delete_confirm": "Opravdu chcete odstranit tuto integraci?", "delete_confirm": "Opravdu chcete odstranit tuto integraci?",
"device_unavailable": "zařízení není k dispozici", "device_unavailable": "zařízení není k dispozici",
@@ -1316,8 +1351,11 @@
"no_area": "Žádná oblast", "no_area": "Žádná oblast",
"no_device": "Entity bez zařízení", "no_device": "Entity bez zařízení",
"no_devices": "Tato integrace nemá žádná zařízení.", "no_devices": "Tato integrace nemá žádná zařízení.",
"options": "Možnosti",
"rename": "Přejmenovat",
"restart_confirm": "Restartujte Home Assistant pro odstranění této integrace", "restart_confirm": "Restartujte Home Assistant pro odstranění této integrace",
"settings_button": "Upravit nastavení pro {integration}", "settings_button": "Upravit nastavení pro {integration}",
"system_options": "Systémové možnosti pro {integration}",
"system_options_button": "Systémové možnosti pro {integration}" "system_options_button": "Systémové možnosti pro {integration}"
}, },
"config_flow": { "config_flow": {
@@ -1352,11 +1390,17 @@
"show_ignored": "Zobrazit ignorované integrace", "show_ignored": "Zobrazit ignorované integrace",
"stop_ignore": "Přestat ignorovat" "stop_ignore": "Přestat ignorovat"
}, },
"integration": "integrace",
"integration_not_found": "Integrace nebyla nalezena.", "integration_not_found": "Integrace nebyla nalezena.",
"new": "Nastavte novou integraci", "new": "Nastavte novou integraci",
"no_integrations": "Vypadá to, že ještě nemáte nakonfigurovány žádné integrace. Kliknutím na tlačítko níže přidáte svou první integraci!",
"none": "Zatím nic nezkonfigurováno", "none": "Zatím nic nezkonfigurováno",
"none_found": "Žádné integrace nenalezeny.",
"none_found_detail": "Upravte kritéria vyhledávání.",
"note_about_integrations": "Ne všechny integrace lze prozatím konfigurovat prostřednictvím uživatelského rozhraní.", "note_about_integrations": "Ne všechny integrace lze prozatím konfigurovat prostřednictvím uživatelského rozhraní.",
"note_about_website_reference": "Další jsou k dispozici na " "note_about_website_reference": "Další jsou k dispozici na ",
"rename_dialog": "Upravit název této položky nastavení",
"rename_input_label": "Název položky"
}, },
"introduction": "Zde je možné konfigurovat vaše komponenty a Home Assistant.\nZ uživatelského rozhraní sice zatím není možné konfigurovat vše, ale pracujeme na tom.", "introduction": "Zde je možné konfigurovat vaše komponenty a Home Assistant.\nZ uživatelského rozhraní sice zatím není možné konfigurovat vše, ale pracujeme na tom.",
"lovelace": { "lovelace": {
@@ -1495,6 +1539,9 @@
"delete_scene": "Smazat scénu", "delete_scene": "Smazat scénu",
"edit_scene": "Upravit scénu", "edit_scene": "Upravit scénu",
"header": "Editor scén", "header": "Editor scén",
"headers": {
"name": "Název"
},
"introduction": "Editor scén vám umožňuje vytvářet a upravovat scény. Postupujte podle níže uvedeného odkazu a přečtěte si pokyny, abyste se ujistili, že jste Home Assistant nakonfigurovali správně.", "introduction": "Editor scén vám umožňuje vytvářet a upravovat scény. Postupujte podle níže uvedeného odkazu a přečtěte si pokyny, abyste se ujistili, že jste Home Assistant nakonfigurovali správně.",
"learn_more": "Další informace o scénách", "learn_more": "Další informace o scénách",
"no_scenes": "Nemohli jsme najít žádné upravitelné scény", "no_scenes": "Nemohli jsme najít žádné upravitelné scény",
@@ -1522,9 +1569,13 @@
"add_script": "Přidat skript", "add_script": "Přidat skript",
"edit_script": "Upravit skript", "edit_script": "Upravit skript",
"header": "Editor skriptů", "header": "Editor skriptů",
"headers": {
"name": "Název"
},
"introduction": "Editor skriptů umožňuje vytvářet a upravovat skripty. Postupujte podle níže uvedeného odkazu a přečtěte si pokyny, abyste se ujistili, že jste Home Assistant nakonfigurovali správně.", "introduction": "Editor skriptů umožňuje vytvářet a upravovat skripty. Postupujte podle níže uvedeného odkazu a přečtěte si pokyny, abyste se ujistili, že jste Home Assistant nakonfigurovali správně.",
"learn_more": "Další informace o skriptech", "learn_more": "Další informace o skriptech",
"no_scripts": "Nemohli jsme najít žádné editovatelné skripty", "no_scripts": "Nemohli jsme najít žádné editovatelné skripty",
"show_info": "Zobrazit informace o skriptu",
"trigger_script": "Spustit skript" "trigger_script": "Spustit skript"
} }
}, },
@@ -1573,6 +1624,7 @@
"editor": { "editor": {
"activate_user": "Aktivovat uživatele", "activate_user": "Aktivovat uživatele",
"active": "Aktivní", "active": "Aktivní",
"admin": "Administrátor",
"caption": "Zobrazit uživatele", "caption": "Zobrazit uživatele",
"change_password": "Změnit heslo", "change_password": "Změnit heslo",
"confirm_user_deletion": "Opravdu chcete smazat {name} ?", "confirm_user_deletion": "Opravdu chcete smazat {name} ?",
@@ -1580,10 +1632,20 @@
"delete_user": "Odstranit uživatele", "delete_user": "Odstranit uživatele",
"group": "Skupina", "group": "Skupina",
"id": "ID", "id": "ID",
"name": "Jméno",
"owner": "Vlastník", "owner": "Vlastník",
"system_generated": "Generovaný systémem", "system_generated": "Generovaný systémem",
"system_generated_users_not_editable": "Nelze aktualizovat uživatele generované systémem.",
"system_generated_users_not_removable": "Nelze odebrat uživatele generované systémem.", "system_generated_users_not_removable": "Nelze odebrat uživatele generované systémem.",
"unnamed_user": "Nepojmenovaný uživatel" "unnamed_user": "Nepojmenovaný uživatel",
"update_user": "Aktualizovat"
},
"picker": {
"headers": {
"group": "Skupina",
"name": "Název",
"system": "Systémový"
}
} }
}, },
"zha": { "zha": {
@@ -1706,7 +1768,7 @@
"required_error_msg": "Toto pole je povinné", "required_error_msg": "Toto pole je povinné",
"update": "Aktualizovat" "update": "Aktualizovat"
}, },
"edit_home_zone": "Umístění vašeho domova lze změnit v konfiguraci.", "edit_home_zone": "Poloměr domovské zóny zatím nelze upravit z frontendu. Z frontendu se dá změnit jen poloha domovské zóny.",
"edit_home_zone_narrow": "Poloměr domovské zóny zatím nelze upravit z frontendu. Umístění lze změnit z obecné konfigurace.", "edit_home_zone_narrow": "Poloměr domovské zóny zatím nelze upravit z frontendu. Umístění lze změnit z obecné konfigurace.",
"go_to_core_config": "Přejít na obecnou konfiguraci?", "go_to_core_config": "Přejít na obecnou konfiguraci?",
"home_zone_core_config": "Umístění vaší domovské zóny lze upravit na stránce obecné konfigurace. Poloměr domovské zóny zatím nelze upravit z frontendu. Chcete přejít na obecnou konfiguraci?", "home_zone_core_config": "Umístění vaší domovské zóny lze upravit na stránce obecné konfigurace. Poloměr domovské zóny zatím nelze upravit z frontendu. Chcete přejít na obecnou konfiguraci?",
@@ -1958,6 +2020,10 @@
"description": "Karta Filtr entit umožňuje definovat seznam entit, které chcete sledovat pouze v určitém stavu.", "description": "Karta Filtr entit umožňuje definovat seznam entit, které chcete sledovat pouze v určitém stavu.",
"name": "Filtr entit" "name": "Filtr entit"
}, },
"entity": {
"description": "Karta Entity vám poskytuje rychlý přehled o stavu vaší entity.",
"name": "Entita"
},
"gauge": { "gauge": {
"description": "Karta Ručičkový ukazatel je základní karta pro vizuální zobrazení hodnoty senzoru.", "description": "Karta Ručičkový ukazatel je základní karta pro vizuální zobrazení hodnoty senzoru.",
"name": "Ručičkový ukazatel", "name": "Ručičkový ukazatel",
@@ -1970,8 +2036,10 @@
}, },
"generic": { "generic": {
"aspect_ratio": "Poměr stran", "aspect_ratio": "Poměr stran",
"attribute": "Atribut",
"camera_image": "Entita kamery", "camera_image": "Entita kamery",
"camera_view": "Zobrazení kamery", "camera_view": "Zobrazení kamery",
"double_tap_action": "Akce při dvojitém poklepání",
"entities": "Entity", "entities": "Entity",
"entity": "Entita", "entity": "Entita",
"hold_action": "Akce při podržení", "hold_action": "Akce při podržení",
@@ -2022,6 +2090,7 @@
"default_zoom": "Výchozí zvětšení", "default_zoom": "Výchozí zvětšení",
"description": "Karta Mapa umožňuje zobrazit entity na mapě.", "description": "Karta Mapa umožňuje zobrazit entity na mapě.",
"geo_location_sources": "Zdroje geolokace", "geo_location_sources": "Zdroje geolokace",
"hours_to_show": "Hodin k zobrazení",
"name": "Mapa", "name": "Mapa",
"source": "Zdroj" "source": "Zdroj"
}, },
@@ -2078,6 +2147,10 @@
"name": "Předpověď počasí" "name": "Předpověď počasí"
} }
}, },
"cardpicker": {
"custom_card": "Vlastní",
"no_description": "Žádný popis není k dispozici."
},
"edit_card": { "edit_card": {
"add": "Přidat kartu", "add": "Přidat kartu",
"delete": "Odstranit", "delete": "Odstranit",
@@ -2127,7 +2200,7 @@
"confirm_remove_config_text": "Pokud odeberete nastavení Lovelace, automaticky vygenerujeme vaše zobrazení Lovelace s vašimi oblastmi a zařízeními.", "confirm_remove_config_text": "Pokud odeberete nastavení Lovelace, automaticky vygenerujeme vaše zobrazení Lovelace s vašimi oblastmi a zařízeními.",
"confirm_remove_config_title": "Opravdu chcete odstranit nastavení Lovelace? Automaticky vygenerujeme vaše zobrazení Lovelace s vašimi oblastmi a zařízeními.", "confirm_remove_config_title": "Opravdu chcete odstranit nastavení Lovelace? Automaticky vygenerujeme vaše zobrazení Lovelace s vašimi oblastmi a zařízeními.",
"confirm_unsaved_changes": "Máte neuložené změny. Opravdu chcete odejít?", "confirm_unsaved_changes": "Máte neuložené změny. Opravdu chcete odejít?",
"confirm_unsaved_comments": "Vaše konfigurace obsahuje komentáře, které se neuloží. Chceš pokračovat?", "confirm_unsaved_comments": "Vaše konfigurace obsahuje komentáře, které se neuloží. Chcete pokračovat?",
"error_invalid_config": "Vaše konfigurace není platná: {error}", "error_invalid_config": "Vaše konfigurace není platná: {error}",
"error_parse_yaml": "Chyba při parsování YAML: {error}", "error_parse_yaml": "Chyba při parsování YAML: {error}",
"error_remove": "Nelze odstranit nastavení: {error}", "error_remove": "Nelze odstranit nastavení: {error}",
@@ -2141,6 +2214,7 @@
"save_config": { "save_config": {
"cancel": "Zahodit změnu", "cancel": "Zahodit změnu",
"close": "Zavřít", "close": "Zavřít",
"empty_config": "Začít s prázdným dashboardem",
"header": "Převzít kontrolu nad vaší Lovelace UI", "header": "Převzít kontrolu nad vaší Lovelace UI",
"para": "Ve výchozím nastavení bude Home Assistant spravovat vaše uživatelské rozhraní aktualizovat jej při přidání nové entity nebo Lovelace komponenty. Pokud převezmete kontrolu, nebudeme již provádět změny automaticky za vás.", "para": "Ve výchozím nastavení bude Home Assistant spravovat vaše uživatelské rozhraní aktualizovat jej při přidání nové entity nebo Lovelace komponenty. Pokud převezmete kontrolu, nebudeme již provádět změny automaticky za vás.",
"para_sure": "Opravdu chcete převzít kontrolu nad uživalským rohraním ?", "para_sure": "Opravdu chcete převzít kontrolu nad uživalským rohraním ?",
@@ -2193,7 +2267,8 @@
"warning": { "warning": {
"attribute_not_found": "Atribut {attribute} není k dispozici v: {entity}", "attribute_not_found": "Atribut {attribute} není k dispozici v: {entity}",
"entity_non_numeric": "Entita není číselná: {entity}", "entity_non_numeric": "Entita není číselná: {entity}",
"entity_not_found": "Entita není k dispozici: {entity}" "entity_not_found": "Entita není k dispozici: {entity}",
"entity_unavailable": "Entita {entity} není aktuálně k dispozici."
} }
}, },
"mailbox": { "mailbox": {
@@ -2388,6 +2463,11 @@
"submit": "Odeslat" "submit": "Odeslat"
}, },
"current_user": "Nyní jste přihlášeni jako {fullName}.", "current_user": "Nyní jste přihlášeni jako {fullName}.",
"dashboard": {
"description": "Vyberte výchozí dashboard pro toto zařízení.",
"dropdown_label": "Dashboard",
"header": "Dashboard"
},
"force_narrow": { "force_narrow": {
"description": "Tato volba skryje postranním panelu jako výchozí nastavení, podobně jako na mobilním zažízení.", "description": "Tato volba skryje postranním panelu jako výchozí nastavení, podobně jako na mobilním zažízení.",
"header": "Vždy skrýt postranní panel" "header": "Vždy skrýt postranní panel"

View File

@@ -206,6 +206,8 @@
"stopped": "Stoppet" "stopped": "Stoppet"
}, },
"default": { "default": {
"off": "Fra",
"on": "Til",
"unavailable": "Utilgængelig", "unavailable": "Utilgængelig",
"unknown": "Ukendt" "unknown": "Ukendt"
}, },
@@ -475,7 +477,10 @@
"close": "Luk", "close": "Luk",
"delete": "Slet", "delete": "Slet",
"loading": "Indlæser", "loading": "Indlæser",
"next": "Næste",
"no": "Nej", "no": "Nej",
"previous": "Forrige",
"refresh": "Opdater",
"save": "Gem", "save": "Gem",
"successfully_deleted": "Slettet", "successfully_deleted": "Slettet",
"successfully_saved": "Gemt", "successfully_saved": "Gemt",
@@ -735,6 +740,10 @@
"triggered": "Udløste {name}" "triggered": "Udløste {name}"
}, },
"panel": { "panel": {
"calendar": {
"my_calendars": "Mine kalendere",
"today": "I dag"
},
"config": { "config": {
"advanced_mode": { "advanced_mode": {
"hint_enable": "Mangler der konfigurationsindstillinger? Aktivér avanceret tilstand", "hint_enable": "Mangler der konfigurationsindstillinger? Aktivér avanceret tilstand",
@@ -837,6 +846,9 @@
}, },
"label": "Enhed" "label": "Enhed"
}, },
"not": {
"label": "Ikke"
},
"numeric_state": { "numeric_state": {
"above": "Over", "above": "Over",
"below": "Under", "below": "Under",
@@ -1235,6 +1247,7 @@
}, },
"delete": "Slet", "delete": "Slet",
"description": "Administrer tilsluttede enheder", "description": "Administrer tilsluttede enheder",
"device_info": "Enhedsoplysninger",
"device_not_found": "Enhed blev ikke fundet.", "device_not_found": "Enhed blev ikke fundet.",
"entities": { "entities": {
"add_entities_lovelace": "Tilføj til Lovelace", "add_entities_lovelace": "Tilføj til Lovelace",
@@ -1344,6 +1357,8 @@
"delete_button": "Slet {integration}", "delete_button": "Slet {integration}",
"delete_confirm": "Er du sikker på, at du vil fjerne denne integration?", "delete_confirm": "Er du sikker på, at du vil fjerne denne integration?",
"device_unavailable": "entitet utilgængelig", "device_unavailable": "entitet utilgængelig",
"devices": "{count} {count, plural,\n one {enhed}\n other {enheder}\n}",
"entities": "{count} {count, plural,\n one {entitet}\n other {entiteter}\n}",
"entity_unavailable": "entitet utilgængelig", "entity_unavailable": "entitet utilgængelig",
"firmware": "Firmware: {version}", "firmware": "Firmware: {version}",
"hub": "Forbundet via", "hub": "Forbundet via",
@@ -1395,6 +1410,8 @@
"new": "Opret en ny integration", "new": "Opret en ny integration",
"no_integrations": "Det ser ud til, at du ikke har konfigureret nogen integrationer endnu. Klik på knappen nedenfor for at tilføje din første integration!", "no_integrations": "Det ser ud til, at du ikke har konfigureret nogen integrationer endnu. Klik på knappen nedenfor for at tilføje din første integration!",
"none": "Intet konfigureret endnu", "none": "Intet konfigureret endnu",
"none_found": "Ingen integrationer fundet",
"none_found_detail": "Juster dine søgekriterier.",
"note_about_integrations": "Ikke alle integrationer kan konfigureres via brugerfladen endnu.", "note_about_integrations": "Ikke alle integrationer kan konfigureres via brugerfladen endnu.",
"note_about_website_reference": "Flere er tilgængelige på ", "note_about_website_reference": "Flere er tilgængelige på ",
"rename_dialog": "Rediger navnet på denne konfigurationspost", "rename_dialog": "Rediger navnet på denne konfigurationspost",
@@ -2214,12 +2231,12 @@
"close": "Luk", "close": "Luk",
"empty_config": "Start med et tomt betjeningspanel", "empty_config": "Start med et tomt betjeningspanel",
"header": "Tag kontrol over din 'Lovelace'-brugerflade", "header": "Tag kontrol over din 'Lovelace'-brugerflade",
"para": "Som standard vil Home Assistant vedligeholde din brugerflade ved at opdatere den, når nye entiteter eller Lovelace-brugerfladekomponenter bliver tilgængelige. Hvis du overtager kontrollen, vil vi ikke længere foretage ændringer automatisk for dig.", "para": "Dette betjeningspanel vedligeholdes i øjeblikket af Home Assistant. Det opdateres automatisk, når nye entiteter eller Lovelace-brugerfladekomponenter bliver tilgængelige. Hvis du overtager kontrollen, opdateres dette betjeningspanel ikke længere automatisk. Du kan altid oprette et nyt betjeningspanel at lege med i konfigurationen.",
"para_sure": "Er du sikker på du ønsker at tage kontrol over din brugerflade?", "para_sure": "Er du sikker på du ønsker at tage kontrol over din brugerflade?",
"save": "Tag kontrol", "save": "Tag kontrol",
"yaml_config": "For at hjælpe dig med at starte, er her den aktuelle konfiguration af dette betjeningspanel:", "yaml_config": "For at hjælpe dig med at starte, er her den aktuelle konfiguration af dette betjeningspanel:",
"yaml_control": "For at tage kontrol i YAML-tilstand skal du oprette en YAML-fil med det navn, du har angivet i din konfiguration for dette betjeningspanel, eller standard-'ui-lovelace.yaml'-filen.", "yaml_control": "For at tage kontrol i YAML-tilstand skal du oprette en YAML-fil med det navn, du har angivet i din konfiguration for dette betjeningspanel, eller standard-'ui-lovelace.yaml'-filen.",
"yaml_mode": "Du bruger YAML-tilstand. Det betyder, at du ikke kan ændre din Lovelace-konfiguration fra brugerfladen. Hvis du vil ændre Lovelace fra brugerfladen, skal du fjerne 'mode: yaml' fra din Lovelace-konfiguration i 'configuration.yaml.'" "yaml_mode": "Du bruger YAML-tilstand for dette betjeningspanel. Det betyder, at du ikke kan ændre din Lovelace-konfiguration fra brugerfladen. Hvis du vil ændre dette betjeningspanel fra brugerfladen, skal du fjerne 'mode: yaml' fra din Lovelace-konfiguration i 'configuration.yaml.'"
}, },
"suggest_card": { "suggest_card": {
"add": "Tilføj til Lovelace-brugerflade", "add": "Tilføj til Lovelace-brugerflade",

View File

@@ -206,6 +206,8 @@
"stopped": "Angehalten" "stopped": "Angehalten"
}, },
"default": { "default": {
"off": "Aus",
"on": "An",
"unavailable": "Nicht verfügbar", "unavailable": "Nicht verfügbar",
"unknown": "Unbekannt" "unknown": "Unbekannt"
}, },
@@ -475,7 +477,10 @@
"close": "Schließen", "close": "Schließen",
"delete": "Löschen", "delete": "Löschen",
"loading": "Laden", "loading": "Laden",
"next": "Weiter",
"no": "Nein", "no": "Nein",
"previous": "Vorher",
"refresh": "Aktualisieren",
"save": "Speichern", "save": "Speichern",
"successfully_deleted": "Erfolgreich gelöscht", "successfully_deleted": "Erfolgreich gelöscht",
"successfully_saved": "Erfolgreich gespeichert", "successfully_saved": "Erfolgreich gespeichert",
@@ -655,9 +660,11 @@
} }
}, },
"mqtt_device_debug_info": { "mqtt_device_debug_info": {
"deserialize": "Versuchen MQTT-Nachrichten als JSON zu parsen",
"entities": "Entitäten", "entities": "Entitäten",
"no_entities": "Keine Entitäten", "no_entities": "Keine Entitäten",
"no_triggers": "Keine Auslöser", "no_triggers": "Keine Auslöser",
"payload_display": "Payload anzeigen",
"recent_messages": "{n} zuletzt empfangene Nachricht(en)", "recent_messages": "{n} zuletzt empfangene Nachricht(en)",
"show_as_yaml": "Als YAML anzeigen", "show_as_yaml": "Als YAML anzeigen",
"title": "{device} Debug-Informationen", "title": "{device} Debug-Informationen",
@@ -699,7 +706,7 @@
"reconfigure": "Konfigurieren Sie das ZHA-Gerät neu (Gerät heilen). Verwenden Sie diese Option, wenn Sie Probleme mit dem Gerät haben. Wenn es sich bei dem fraglichen Gerät um ein batteriebetriebenes Gerät handelt, vergewissern Sie sich, dass es wach ist und Befehle akzeptiert, wenn Sie diesen Dienst nutzen.", "reconfigure": "Konfigurieren Sie das ZHA-Gerät neu (Gerät heilen). Verwenden Sie diese Option, wenn Sie Probleme mit dem Gerät haben. Wenn es sich bei dem fraglichen Gerät um ein batteriebetriebenes Gerät handelt, vergewissern Sie sich, dass es wach ist und Befehle akzeptiert, wenn Sie diesen Dienst nutzen.",
"remove": "Ein Gerät aus dem ZigBee-Netzwerk entfernen.", "remove": "Ein Gerät aus dem ZigBee-Netzwerk entfernen.",
"updateDeviceName": "Lege einen benutzerdefinierten Namen für dieses Gerät in der Geräteregistrierung fest.", "updateDeviceName": "Lege einen benutzerdefinierten Namen für dieses Gerät in der Geräteregistrierung fest.",
"zigbee_information": "Zeigen Sie die ZigBee-Informationen für das Gerät an." "zigbee_information": "Zeige die ZigBee-Informationen für das Gerät an."
}, },
"unknown": "Unbekannt", "unknown": "Unbekannt",
"zha_device_card": { "zha_device_card": {
@@ -733,6 +740,10 @@
"triggered": "{name} ausgelöst" "triggered": "{name} ausgelöst"
}, },
"panel": { "panel": {
"calendar": {
"my_calendars": "Meine Kalender",
"today": "Heute"
},
"config": { "config": {
"advanced_mode": { "advanced_mode": {
"hint_enable": "Fehlende Konfigurationsoptionen? Aktiviere den erweiterten Modus.", "hint_enable": "Fehlende Konfigurationsoptionen? Aktiviere den erweiterten Modus.",
@@ -835,6 +846,9 @@
}, },
"label": "Gerät" "label": "Gerät"
}, },
"not": {
"label": "Nicht"
},
"numeric_state": { "numeric_state": {
"above": "Über", "above": "Über",
"below": "Unter", "below": "Unter",
@@ -1233,6 +1247,7 @@
}, },
"delete": "Löschen", "delete": "Löschen",
"description": "Verwalte verbundene Geräte", "description": "Verwalte verbundene Geräte",
"device_info": "Geräteinformationen",
"device_not_found": "Gerät nicht gefunden.", "device_not_found": "Gerät nicht gefunden.",
"entities": { "entities": {
"add_entities_lovelace": "Zu Lovelace hinzufügen", "add_entities_lovelace": "Zu Lovelace hinzufügen",
@@ -1343,7 +1358,7 @@
"delete_confirm": "Möchtest du diese Integration wirklich löschen?", "delete_confirm": "Möchtest du diese Integration wirklich löschen?",
"device_unavailable": "Gerät nicht verfügbar", "device_unavailable": "Gerät nicht verfügbar",
"devices": "{count} {count, plural,\n one {Gerät}\n other {Geräte}\n}", "devices": "{count} {count, plural,\n one {Gerät}\n other {Geräte}\n}",
"entities": "{count} {count, plural,\none {Einheit}\nother {Einheiten}\n}", "entities": "{count} {count, plural,\none {Entität}\nother {Entitäten}\n}",
"entity_unavailable": "Entität nicht verfügbar", "entity_unavailable": "Entität nicht verfügbar",
"firmware": "Firmware: {version}", "firmware": "Firmware: {version}",
"hub": "Verbunden über", "hub": "Verbunden über",
@@ -1393,11 +1408,13 @@
"integration": "Integration", "integration": "Integration",
"integration_not_found": "Integration nicht gefunden.", "integration_not_found": "Integration nicht gefunden.",
"new": "Richte eine neue Integration ein", "new": "Richte eine neue Integration ein",
"no_integrations": "Sie haben anscheinend noch keine Integrationen konfiguriert. Klicken Sie auf die Schaltfläche unten, um Ihre erste Integration hinzuzufügen!", "no_integrations": "Du hast anscheinend noch keine Integrationen konfiguriert. Klicke auf die Schaltfläche unten, um Deine erste Integration hinzuzufügen!",
"none": "Noch nichts konfiguriert", "none": "Noch nichts konfiguriert",
"none_found": "Keine Integrationen gefunden",
"none_found_detail": "Passe Deine Suchkriterien an.",
"note_about_integrations": "Nicht alle Integrationen können über die Benutzeroberfläche konfiguriert werden.", "note_about_integrations": "Nicht alle Integrationen können über die Benutzeroberfläche konfiguriert werden.",
"note_about_website_reference": "Weitere Informationen finden Sie auf der ", "note_about_website_reference": "Weitere Informationen findest Du auf der ",
"rename_dialog": "Bearbeiten Sie den Namen dieses Konfigurationseintrags", "rename_dialog": "Bearbeite den Namen dieses Konfigurationseintrags",
"rename_input_label": "Eintragsname" "rename_input_label": "Eintragsname"
}, },
"introduction": "Hier ist es möglich, deine Komponenten und Home Assistant zu konfigurieren. Noch ist nicht alles über die GUI einstellbar, aber wir arbeiten daran.", "introduction": "Hier ist es möglich, deine Komponenten und Home Assistant zu konfigurieren. Noch ist nicht alles über die GUI einstellbar, aber wir arbeiten daran.",
@@ -1468,7 +1485,7 @@
}, },
"no_resources": "keine Ressourcen" "no_resources": "keine Ressourcen"
}, },
"refresh_body": "Die Seite muss aktualisiert werden, um das Entfernen abzuschließen. Möchtest du sie jetzt aktualisieren?", "refresh_body": "Die Seite muss aktualisiert werden, um das Entfernen abzuschließen. Möchtest Du sie jetzt aktualisieren?",
"refresh_header": "Möchtest du aktualisieren?", "refresh_header": "Möchtest du aktualisieren?",
"types": { "types": {
"css": "Stylesheet", "css": "Stylesheet",
@@ -1761,7 +1778,7 @@
"name": "Name", "name": "Name",
"new_zone": "Neue Zone", "new_zone": "Neue Zone",
"passive": "Passiv", "passive": "Passiv",
"passive_note": "Passive Zonen sind im Frontend versteckt und werden nicht als Ort für Device Tracker verwendet. Dies ist nützlich, wenn du sie nur für Automatisierungen verwenden möchtest.", "passive_note": "Passive Zonen sind im Frontend versteckt und werden nicht als Ort für Device Tracker verwendet. Dies ist nützlich, wenn Du sie nur für Automatisierungen verwenden möchtest.",
"radius": "Radius", "radius": "Radius",
"required_error_msg": "Dieses Feld ist erforderlich", "required_error_msg": "Dieses Feld ist erforderlich",
"update": "Aktualisieren" "update": "Aktualisieren"
@@ -1771,7 +1788,7 @@
"go_to_core_config": "Zur allgemeinen Konfiguration gehen?", "go_to_core_config": "Zur allgemeinen Konfiguration gehen?",
"home_zone_core_config": "Der Standort deiner Homezone kann auf der allgemeinen Konfigurationsseite bearbeitet werden. Der Radius der Homezone kann vom Frontend aus noch nicht bearbeitet werden. Möchtest du zur allgemeinen Konfiguration gehen?", "home_zone_core_config": "Der Standort deiner Homezone kann auf der allgemeinen Konfigurationsseite bearbeitet werden. Der Radius der Homezone kann vom Frontend aus noch nicht bearbeitet werden. Möchtest du zur allgemeinen Konfiguration gehen?",
"introduction": "Mit Zonen kannst du bestimmte Regionen auf der Erde angeben. Befindet sich eine Person in einer Zone, übernimmt der Zustand den Namen aus der Zone. Zonen können auch als Auslöser oder Bedingung in Automatisierungs-Setups verwendet werden.", "introduction": "Mit Zonen kannst du bestimmte Regionen auf der Erde angeben. Befindet sich eine Person in einer Zone, übernimmt der Zustand den Namen aus der Zone. Zonen können auch als Auslöser oder Bedingung in Automatisierungs-Setups verwendet werden.",
"no_zones_created_yet": "Es sieht so aus, als hättest du noch keine Zonen erstellt." "no_zones_created_yet": "Es sieht so aus, als hättest Du noch keine Zonen erstellt."
}, },
"zwave": { "zwave": {
"caption": "Z-Wave", "caption": "Z-Wave",
@@ -1969,7 +1986,7 @@
"url": "Fenster zu {url_path} öffnen" "url": "Fenster zu {url_path} öffnen"
}, },
"safe-mode": { "safe-mode": {
"description": "Home Assistant hatte beim Laden Ihrer Konfiguration Probleme und wird jetzt im abgesicherten Modus ausgeführt. Sieh dir das Fehlerprotokoll an, um zu erkennen, was schiefgelaufen ist.", "description": "Home Assistant hatte beim Laden Ihrer Konfiguration Probleme und wird jetzt im abgesicherten Modus ausgeführt. Sieh Dir das Fehlerprotokoll an, um zu erkennen, was schiefgelaufen ist.",
"header": "Abgesicherter Modus aktiviert" "header": "Abgesicherter Modus aktiviert"
}, },
"shopping-list": { "shopping-list": {
@@ -2019,7 +2036,7 @@
"name": "Entität Filter" "name": "Entität Filter"
}, },
"entity": { "entity": {
"description": "Mit der Entitätskarte erhalten Sie einen schnellen Überblick über den Status Ihrer Entität.", "description": "Mit der Entitätskarte erhältst Du einen schnellen Überblick über den Status Ihrer Entität.",
"name": "Entität" "name": "Entität"
}, },
"gauge": { "gauge": {
@@ -2212,14 +2229,14 @@
"save_config": { "save_config": {
"cancel": "Abbrechen", "cancel": "Abbrechen",
"close": "Schließen", "close": "Schließen",
"empty_config": "Beginnen Sie mit einem leeren Dashboard", "empty_config": "Beginne mit einem leeren Dashboard",
"header": "Lovelace Userinterface selbst verwalten", "header": "Lovelace Userinterface selbst verwalten",
"para": "Dieses Dashboard wird derzeit von Home Assistant verwaltet. Es wird automatisch aktualisiert, wenn neue Entitäten oder Lovelace-UI-Komponenten verfügbar werden. Wenn Sie die Kontrolle übernehmen, wird dieses Dashboard nicht mehr automatisch aktualisiert. Sie können jederzeit ein neues Dashboard in der Konfiguration erstellen, mit dem Sie herumspielen können.", "para": "Dieses Dashboard wird derzeit von Home Assistant verwaltet. Es wird automatisch aktualisiert, wenn neue Entitäten oder Lovelace-UI-Komponenten verfügbar werden. Wenn Sie die Kontrolle übernehmen, wird dieses Dashboard nicht mehr automatisch aktualisiert. Sie können jederzeit ein neues Dashboard in der Konfiguration erstellen, mit dem Sie herumspielen können.",
"para_sure": "Bist du dir sicher, dass du die Benutzeroberfläche selbst verwalten möchtest?", "para_sure": "Bist du dir sicher, dass du die Benutzeroberfläche selbst verwalten möchtest?",
"save": "Kontrolle übernehmen", "save": "Kontrolle übernehmen",
"yaml_config": "Um dir den Einstieg zu erleichtern, findest du hier die aktuelle Konfiguration dieses Dashboards:", "yaml_config": "Um dir den Einstieg zu erleichtern, findest du hier die aktuelle Konfiguration dieses Dashboards:",
"yaml_control": "Um die Kontrolle im YAML-Modus zu übernehmen, erstellen Sie eine YAML-Datei mit dem Namen, den Sie in Ihrer Konfiguration für dieses Dashboard angegeben haben, oder mit der Standardeinstellung 'ui-lovelace.yaml'.", "yaml_control": "Um die Kontrolle im YAML-Modus zu übernehmen, erstelle eine YAML-Datei mit dem Namen, den Du in Deiner Konfiguration für dieses Dashboard angegeben hast, oder mit der Standardeinstellung 'ui-lovelace.yaml'.",
"yaml_mode": "Sie verwenden den YAML-Modus für dieses Dashboard. Dies bedeutet, dass Sie Ihre Lovelace-Konfiguration nicht über die Benutzeroberfläche ändern können. Wenn Sie dieses Dashboard über die Benutzeroberfläche verwalten möchten, entfernen Sie \"mode: yaml\" aus Ihrer Lovelace-Konfiguration in \"configuration.yaml\"." "yaml_mode": "Du verwendest den YAML-Modus für dieses Dashboard. Dies bedeutet, dass Du Deine Lovelace-Konfiguration nicht über die Benutzeroberfläche ändern kannst. Wenn Du dieses Dashboard über die Benutzeroberfläche verwalten möchtest, entferne \"mode: yaml\" aus Deiner Lovelace-Konfiguration in \"configuration.yaml\"."
}, },
"suggest_card": { "suggest_card": {
"add": "Zu Lovelace hinzufügen", "add": "Zu Lovelace hinzufügen",
@@ -2462,7 +2479,7 @@
}, },
"current_user": "Sie sind derzeit als {fullName} angemeldet.", "current_user": "Sie sind derzeit als {fullName} angemeldet.",
"dashboard": { "dashboard": {
"description": "Wählen Sie ein Standard-Dashboard für dieses Gerät.", "description": "Wähle ein Standard-Dashboard für dieses Gerät.",
"dropdown_label": "Dashboard", "dropdown_label": "Dashboard",
"header": "Dashboard" "header": "Dashboard"
}, },

View File

@@ -0,0 +1 @@
{}

View File

@@ -206,6 +206,8 @@
"stopped": "Stopped" "stopped": "Stopped"
}, },
"default": { "default": {
"off": "Off",
"on": "On",
"unavailable": "Unavailable", "unavailable": "Unavailable",
"unknown": "Unknown" "unknown": "Unknown"
}, },
@@ -471,11 +473,15 @@
} }
}, },
"common": { "common": {
"and": "and",
"cancel": "Cancel", "cancel": "Cancel",
"close": "Close", "close": "Close",
"delete": "Delete", "delete": "Delete",
"loading": "Loading", "loading": "Loading",
"next": "Next",
"no": "No", "no": "No",
"previous": "Previous",
"refresh": "Refresh",
"save": "Save", "save": "Save",
"successfully_deleted": "Successfully deleted", "successfully_deleted": "Successfully deleted",
"successfully_saved": "Successfully saved", "successfully_saved": "Successfully saved",
@@ -735,6 +741,10 @@
"triggered": "Triggered {name}" "triggered": "Triggered {name}"
}, },
"panel": { "panel": {
"calendar": {
"my_calendars": "My Calendars",
"today": "Today"
},
"config": { "config": {
"advanced_mode": { "advanced_mode": {
"hint_enable": "Missing config options? Enable advanced mode on", "hint_enable": "Missing config options? Enable advanced mode on",
@@ -837,6 +847,9 @@
}, },
"label": "Device" "label": "Device"
}, },
"not": {
"label": "Not"
},
"numeric_state": { "numeric_state": {
"above": "Above", "above": "Above",
"below": "Below", "below": "Below",
@@ -1168,7 +1181,9 @@
"edit_requires_storage": "Editor disabled because config stored in configuration.yaml.", "edit_requires_storage": "Editor disabled because config stored in configuration.yaml.",
"elevation": "Elevation", "elevation": "Elevation",
"elevation_meters": "meters", "elevation_meters": "meters",
"external_url": "External URL",
"imperial_example": "Fahrenheit, pounds", "imperial_example": "Fahrenheit, pounds",
"internal_url": "Internal URL",
"latitude": "Latitude", "latitude": "Latitude",
"location_name": "Name of your Home Assistant installation", "location_name": "Name of your Home Assistant installation",
"longitude": "Longitude", "longitude": "Longitude",
@@ -1235,6 +1250,7 @@
}, },
"delete": "Delete", "delete": "Delete",
"description": "Manage connected devices", "description": "Manage connected devices",
"device_info": "Device info",
"device_not_found": "Device not found.", "device_not_found": "Device not found.",
"entities": { "entities": {
"add_entities_lovelace": "Add to Lovelace", "add_entities_lovelace": "Add to Lovelace",
@@ -1397,6 +1413,8 @@
"new": "Set up a new integration", "new": "Set up a new integration",
"no_integrations": "Seems like you don't have any integations configured yet. Click on the button below to add your first integration!", "no_integrations": "Seems like you don't have any integations configured yet. Click on the button below to add your first integration!",
"none": "Nothing configured yet", "none": "Nothing configured yet",
"none_found": "No integrations found",
"none_found_detail": "Adjust your search criteria.",
"note_about_integrations": "Not all integrations can be configured via the UI yet.", "note_about_integrations": "Not all integrations can be configured via the UI yet.",
"note_about_website_reference": "More are available on the ", "note_about_website_reference": "More are available on the ",
"rename_dialog": "Edit the name of this config entry", "rename_dialog": "Edit the name of this config entry",

View File

@@ -52,11 +52,11 @@
}, },
"state_badge": { "state_badge": {
"alarm_control_panel": { "alarm_control_panel": {
"armed": "Activado", "armed": "Armado",
"armed_away": "Activado", "armed_away": "Armado",
"armed_custom_bypass": "Activado", "armed_custom_bypass": "Armado",
"armed_home": "Activada", "armed_home": "Activada",
"armed_night": "Activado", "armed_night": "Armado",
"arming": "Activando", "arming": "Activando",
"disarmed": "Desactivado", "disarmed": "Desactivado",
"disarming": "Desarmar", "disarming": "Desarmar",
@@ -206,6 +206,8 @@
"stopped": "Detenido" "stopped": "Detenido"
}, },
"default": { "default": {
"off": "Apagado",
"on": "Encendido",
"unavailable": "No disponible", "unavailable": "No disponible",
"unknown": "Desconocido" "unknown": "Desconocido"
}, },
@@ -475,7 +477,10 @@
"close": "Cerrar", "close": "Cerrar",
"delete": "Eliminar", "delete": "Eliminar",
"loading": "Cargando", "loading": "Cargando",
"next": "Siguiente",
"no": "No", "no": "No",
"previous": "Anterior",
"refresh": "Actualizar",
"save": "Guardar", "save": "Guardar",
"successfully_deleted": "Eliminado exitosamente", "successfully_deleted": "Eliminado exitosamente",
"successfully_saved": "Guardado correctamente", "successfully_saved": "Guardado correctamente",
@@ -654,6 +659,17 @@
"stop": "Detener" "stop": "Detener"
} }
}, },
"mqtt_device_debug_info": {
"deserialize": "Intentar analizar mensajes MQTT como JSON",
"entities": "Entidades",
"no_entities": "No hay entidades",
"no_triggers": "Sin disparadores",
"payload_display": "Pantalla de carga útil",
"recent_messages": "{n} mensajes recibidos más recientemente",
"show_as_yaml": "Mostrar como YAML",
"title": "{device} información de depuración",
"triggers": "Disparadores"
},
"options_flow": { "options_flow": {
"form": { "form": {
"header": "Opciones" "header": "Opciones"
@@ -724,6 +740,10 @@
"triggered": "{name} activado" "triggered": "{name} activado"
}, },
"panel": { "panel": {
"calendar": {
"my_calendars": "Mis calendarios",
"today": "Hoy"
},
"config": { "config": {
"advanced_mode": { "advanced_mode": {
"hint_enable": "¿Faltan opciones de configuración? Habilitar el modo avanzado en", "hint_enable": "¿Faltan opciones de configuración? Habilitar el modo avanzado en",
@@ -826,6 +846,9 @@
}, },
"label": "Dispositivo" "label": "Dispositivo"
}, },
"not": {
"label": "No"
},
"numeric_state": { "numeric_state": {
"above": "Por encima de", "above": "Por encima de",
"below": "Por debajo de", "below": "Por debajo de",
@@ -1294,6 +1317,10 @@
} }
} }
}, },
"filtering": {
"clear": "Limpiar",
"filtering_by": "Filtrar por"
},
"header": "Configurar Home Assistant", "header": "Configurar Home Assistant",
"helpers": { "helpers": {
"caption": "Auxiliares", "caption": "Auxiliares",
@@ -1321,12 +1348,16 @@
} }
}, },
"integrations": { "integrations": {
"add_integration": "Agregar integración",
"caption": "Integraciones", "caption": "Integraciones",
"config_entry": { "config_entry": {
"area": "En {area}", "area": "En {area}",
"delete": "Eliminar",
"delete_button": "Eliminar {integration}", "delete_button": "Eliminar {integration}",
"delete_confirm": "¿Estás seguro de que quieres eliminar esta integración?", "delete_confirm": "¿Estás seguro de que quieres eliminar esta integración?",
"device_unavailable": "dispositivo no disponible", "device_unavailable": "dispositivo no disponible",
"devices": "{count} {count, plural,\n one {dispositivo}\n other {dispositivos}\n}",
"entities": "{count} {count, plural,\n one {entidad}\n other {entidades}\n}",
"entity_unavailable": "entidad no disponible", "entity_unavailable": "entidad no disponible",
"firmware": "Firmware: {version}", "firmware": "Firmware: {version}",
"hub": "Conectado a través de", "hub": "Conectado a través de",
@@ -1334,8 +1365,11 @@
"no_area": "Ninguna área", "no_area": "Ninguna área",
"no_device": "Entidades sin dispositivos", "no_device": "Entidades sin dispositivos",
"no_devices": "Esta integración no tiene dispositivos.", "no_devices": "Esta integración no tiene dispositivos.",
"options": "Opciones",
"rename": "Renombrar",
"restart_confirm": "Reinicie Home Assistant para terminar de eliminar esta integración.", "restart_confirm": "Reinicie Home Assistant para terminar de eliminar esta integración.",
"settings_button": "Editar configuración para {integration}", "settings_button": "Editar configuración para {integration}",
"system_options": "Opciones de Sistema",
"system_options_button": "Opciones del sistema para {integration}" "system_options_button": "Opciones del sistema para {integration}"
}, },
"config_flow": { "config_flow": {
@@ -1370,11 +1404,17 @@
"show_ignored": "Mostrar integraciones ignoradas", "show_ignored": "Mostrar integraciones ignoradas",
"stop_ignore": "Dejar de ignorar" "stop_ignore": "Dejar de ignorar"
}, },
"integration": "Integración",
"integration_not_found": "Integración no encontrada.", "integration_not_found": "Integración no encontrada.",
"new": "Configurar una nueva integración.", "new": "Configurar una nueva integración.",
"no_integrations": "Al parecer no tienes ninguna integración configurada todavía. Haga click en el botón de abajo para agregar su primera integración",
"none": "No hay nada configurado", "none": "No hay nada configurado",
"none_found": "No se encontraron integraciones",
"none_found_detail": "Ajuste sus criterios de búsqueda",
"note_about_integrations": "No todas las integraciones se pueden configurar a través de la interfaz de usuario.", "note_about_integrations": "No todas las integraciones se pueden configurar a través de la interfaz de usuario.",
"note_about_website_reference": "Hay más disponibles en " "note_about_website_reference": "Hay más disponibles en ",
"rename_dialog": "Editar el nombre de esta entrada de configuración",
"rename_input_label": "Ingresar Nombre"
}, },
"introduction": "Aquí es posible configurar sus componentes y Home Assistant. Todavía no es posible configurar todo desde la interfaz de usuario, pero estamos trabajando en ello.", "introduction": "Aquí es posible configurar sus componentes y Home Assistant. Todavía no es posible configurar todo desde la interfaz de usuario, pero estamos trabajando en ello.",
"lovelace": { "lovelace": {
@@ -2195,7 +2235,7 @@
"save": "Tomar el control", "save": "Tomar el control",
"yaml_config": "Para ayudarlo a comenzar, aquí está la configuración actual de este tablero:", "yaml_config": "Para ayudarlo a comenzar, aquí está la configuración actual de este tablero:",
"yaml_control": "Para tomar el control en modo YAML, cree un archivo YAML con el nombre que especificó en su configuración para este tablero, o el valor predeterminado 'ui-lovelace.yaml'.", "yaml_control": "Para tomar el control en modo YAML, cree un archivo YAML con el nombre que especificó en su configuración para este tablero, o el valor predeterminado 'ui-lovelace.yaml'.",
"yaml_mode": "Está utilizando el modo YAML, lo que significa que no puede cambiar su configuración de Lovelace desde la interfaz de usuario. Si desea cambiar Lovelace desde la interfaz de usuario, elimine 'mode: yaml' de su configuración de Lovelace en 'configuration.yaml'." "yaml_mode": "Está utilizando el modo YAML para este panel, lo que significa que no puede cambiar su configuración de Lovelace desde la interfaz de usuario. Si desea administrar este panel de control desde la interfaz de usuario, elimine 'mode: yaml' de su configuración de Lovelace en 'configuration.yaml.'."
}, },
"suggest_card": { "suggest_card": {
"add": "Agregar a Lovelace UI", "add": "Agregar a Lovelace UI",
@@ -2241,7 +2281,8 @@
"warning": { "warning": {
"attribute_not_found": "El atributo {attribute} no está disponible en: {entity}", "attribute_not_found": "El atributo {attribute} no está disponible en: {entity}",
"entity_non_numeric": "Entidad no es numérica: {entity}", "entity_non_numeric": "Entidad no es numérica: {entity}",
"entity_not_found": "Entidad no disponible: {entity}" "entity_not_found": "Entidad no disponible: {entity}",
"entity_unavailable": "{entidad} no se encuentra disponible"
} }
}, },
"mailbox": { "mailbox": {

View File

@@ -206,6 +206,8 @@
"stopped": "Detenido" "stopped": "Detenido"
}, },
"default": { "default": {
"off": "Apagado",
"on": "Encendido",
"unavailable": "No disponible", "unavailable": "No disponible",
"unknown": "Desconocido" "unknown": "Desconocido"
}, },
@@ -475,7 +477,10 @@
"close": "Cerrar", "close": "Cerrar",
"delete": "Eliminar", "delete": "Eliminar",
"loading": "Cargando", "loading": "Cargando",
"next": "Siguiente",
"no": "No", "no": "No",
"previous": "Anterior",
"refresh": "Actualizar",
"save": "Guardar", "save": "Guardar",
"successfully_deleted": "Eliminado correctamente", "successfully_deleted": "Eliminado correctamente",
"successfully_saved": "Guardado correctamente", "successfully_saved": "Guardado correctamente",
@@ -735,6 +740,10 @@
"triggered": "Activado {name}" "triggered": "Activado {name}"
}, },
"panel": { "panel": {
"calendar": {
"my_calendars": "Mis Calendarios",
"today": "Hoy"
},
"config": { "config": {
"advanced_mode": { "advanced_mode": {
"hint_enable": "¿Faltan opciones de configuración? Activa el modo avanzado", "hint_enable": "¿Faltan opciones de configuración? Activa el modo avanzado",
@@ -837,6 +846,9 @@
}, },
"label": "Dispositivo" "label": "Dispositivo"
}, },
"not": {
"label": "Negar"
},
"numeric_state": { "numeric_state": {
"above": "Por encima de", "above": "Por encima de",
"below": "Por debajo de", "below": "Por debajo de",
@@ -1235,6 +1247,7 @@
}, },
"delete": "Eliminar", "delete": "Eliminar",
"description": "Administrar dispositivos conectados", "description": "Administrar dispositivos conectados",
"device_info": "Información del dispositivo",
"device_not_found": "Dispositivo no encontrado.", "device_not_found": "Dispositivo no encontrado.",
"entities": { "entities": {
"add_entities_lovelace": "Añadir a Lovelace", "add_entities_lovelace": "Añadir a Lovelace",
@@ -1397,8 +1410,10 @@
"new": "Configurar una nueva integración.", "new": "Configurar una nueva integración.",
"no_integrations": "Parece que todavía no tienes ninguna integración configurada. ¡Pulsa en el botón de abajo para añadir tu primera integración!", "no_integrations": "Parece que todavía no tienes ninguna integración configurada. ¡Pulsa en el botón de abajo para añadir tu primera integración!",
"none": "Todavía no hay nada configurado", "none": "Todavía no hay nada configurado",
"none_found": "No se han encontrado integraciones",
"none_found_detail": "Ajusta tus criterios de búsqueda.",
"note_about_integrations": "Todavía no se pueden configurar todas las integraciones a través de la interfaz de usuario.", "note_about_integrations": "Todavía no se pueden configurar todas las integraciones a través de la interfaz de usuario.",
"note_about_website_reference": "Más están disponibles en el", "note_about_website_reference": "Hay más disponibles en el ",
"rename_dialog": "Edita el nombre de esta entrada de configuración", "rename_dialog": "Edita el nombre de esta entrada de configuración",
"rename_input_label": "Nombre de la entrada" "rename_input_label": "Nombre de la entrada"
}, },
@@ -2216,12 +2231,12 @@
"close": "Cerrar", "close": "Cerrar",
"empty_config": "Empezar con un panel de control vacío", "empty_config": "Empezar con un panel de control vacío",
"header": "Tomar el control de la interfaz de usuario Lovelace", "header": "Tomar el control de la interfaz de usuario Lovelace",
"para": "Por defecto Home Assistant se encargará de tu interfaz de usuario, actualizándola cuando haya nuevas entidades o componentes Lovelace disponibles. Si asumes el control, ya no haremos más cambios automáticamente por ti.", "para": "Este panel de control está siendo mantenido actualmente por Home Assistant. Se actualiza automáticamente cada vez que nuevas entidades o componentes de la IU Lovelace están disponibles. Si asumes el control, este panel de control ya no se actualizará automáticamente. Siempre podrás crear un nuevo panel de control en la configuración con el que jugar.",
"para_sure": "¿Estás seguro de que quieres tomar el control de tu interfaz de usuario?", "para_sure": "¿Estás seguro de que quieres tomar el control de tu interfaz de usuario?",
"save": "Tomar el control", "save": "Tomar el control",
"yaml_config": "Para ayudarte a empezar aquí está la configuración actual de este panel:", "yaml_config": "Para ayudarte a empezar aquí está la configuración actual de este panel:",
"yaml_control": "Para tomar el control en modo YAML, crea un archivo YAML con el nombre que especificaste en la configuración para este panel de control, o el valor predeterminado 'ui-lovelace.yaml'.", "yaml_control": "Para tomar el control en modo YAML, crea un archivo YAML con el nombre que especificaste en la configuración para este panel de control, o el valor predeterminado 'ui-lovelace.yaml'.",
"yaml_mode": "Estás utilizando el modo YAML, lo que significa que no puedes cambiar la configuración de Lovelace desde la IU. Si deseas cambiar Lovelace desde la IU, elimina 'mode: yaml' de la configuración de Lovelace en 'configuration.yaml.'" "yaml_mode": "Estás utilizando el modo YAML para este panel de control, lo que significa que no puedes cambiar la configuración de Lovelace desde la IU. Si quieres gestionar este panel de control desde la IU, elimina 'mode: yaml' de la configuración de Lovelace en 'configuration.yaml.'"
}, },
"suggest_card": { "suggest_card": {
"add": "Añadir a la IU Lovelace", "add": "Añadir a la IU Lovelace",

View File

@@ -21,6 +21,13 @@
"auto": "خودکار", "auto": "خودکار",
"off": "خاموش", "off": "خاموش",
"on": "روشن" "on": "روشن"
},
"hvac_action": {
"cooling": "Racire",
"drying": "Uscare",
"fan": "Ventilator",
"heating": "Incalzire",
"off": "Oprit"
} }
} }
}, },
@@ -165,6 +172,7 @@
"dry": "خشک", "dry": "خشک",
"fan_only": "فقط پنکه", "fan_only": "فقط پنکه",
"heat": "حرارت", "heat": "حرارت",
"heat_cool": "Incalzire/Racire",
"off": "خاموش" "off": "خاموش"
}, },
"configurator": { "configurator": {
@@ -179,6 +187,8 @@
"stopped": "متوقف" "stopped": "متوقف"
}, },
"default": { "default": {
"off": "Oprit",
"on": "Pornit",
"unavailable": "غیرقابل دسترس", "unavailable": "غیرقابل دسترس",
"unknown": "نامشخص" "unknown": "نامشخص"
}, },
@@ -267,6 +277,7 @@
}, },
"weather": { "weather": {
"cloudy": "ابری", "cloudy": "ابری",
"exceptional": "Exceptional",
"fog": "مه", "fog": "مه",
"hail": "تگرگ", "hail": "تگرگ",
"lightning": "رعد و برق", "lightning": "رعد و برق",
@@ -316,6 +327,8 @@
"away_mode": "حالت بیرون", "away_mode": "حالت بیرون",
"currently": "در حال حاضر", "currently": "در حال حاضر",
"fan_mode": "حالت فن", "fan_mode": "حالت فن",
"high": "inalt",
"low": "jos",
"on_off": "روشن/خاموش", "on_off": "روشن/خاموش",
"operation": "عملیات", "operation": "عملیات",
"swing_mode": "حالت چرخش", "swing_mode": "حالت چرخش",
@@ -355,6 +368,14 @@
"script": { "script": {
"execute": "اجرا کردن" "execute": "اجرا کردن"
}, },
"timer": {
"actions": {
"cancel": "anuleaza",
"finish": "termina",
"pause": "pauza",
"start": "incepe"
}
},
"water_heater": { "water_heater": {
"away_mode": "حالت بیرون", "away_mode": "حالت بیرون",
"currently": "در حال حاضر", "currently": "در حال حاضر",
@@ -389,10 +410,23 @@
}, },
"common": { "common": {
"cancel": "لغو", "cancel": "لغو",
"close": "Inchide",
"delete": "Elimina",
"loading": "در حال بارگذاری", "loading": "در حال بارگذاری",
"save": "ذخیره" "save": "ذخیره",
"successfully_deleted": "Eliminat cu succes",
"successfully_saved": "Salvat cu succes"
}, },
"components": { "components": {
"area-picker": {
"add_dialog": {
"add": "Adauga",
"failed_create_area": "Nu s-a reusit creerea zonei",
"name": "Nume",
"text": "Introdu numele noii zone",
"title": "Adauga zona noua"
}
},
"entity": { "entity": {
"entity-picker": { "entity-picker": {
"entity": "نهاد" "entity": "نهاد"
@@ -402,6 +436,11 @@
"loading_history": "بارگیری وضعیت تاریخچه", "loading_history": "بارگیری وضعیت تاریخچه",
"no_history_found": "هیچ دولتی سابقه یافت." "no_history_found": "هیچ دولتی سابقه یافت."
}, },
"related-items": {
"area": "Zona",
"device": "Dispozitiv",
"integration": "Integrare"
},
"relative_time": { "relative_time": {
"duration": { "duration": {
"day": "{count} {تعداد, جمع,\nیکی {روز}\nدیگر {روز}\n}", "day": "{count} {تعداد, جمع,\nیکی {روز}\nدیگر {روز}\n}",
@@ -416,15 +455,44 @@
} }
}, },
"dialogs": { "dialogs": {
"domain_toggler": {
"title": "Comuta domeniile"
},
"generic": {
"close": "inchide"
},
"helper_settings": { "helper_settings": {
"input_datetime": { "input_datetime": {
"date": "تاریخ", "date": "تاریخ",
"datetime": "تاریخ و زمان", "datetime": "تاریخ و زمان",
"mode": "چه چیزی را می خواهید وارد کنید", "mode": "چه چیزی را می خواهید وارد کنید",
"time": "زمان" "time": "زمان"
},
"input_number": {
"max": "Valoare maxima",
"min": "Valoare minima",
"mode": "Mod de vizualizare",
"unit_of_measurement": "Unitate de masura"
},
"input_select": {
"add": "Adauga",
"add_option": "Adauga optiune",
"no_options": "Nu exista inca optiuni",
"options": "Optiuni"
},
"input_text": {
"mode": "Mod de vizualizare",
"password": "Parola",
"text": "Text"
} }
}, },
"more_info_control": { "more_info_control": {
"restored": {
"confirm_remove_text": "Esti sigur ca vrei sa elimini aceasta entitate?",
"confirm_remove_title": "Eliminati entitatea?",
"not_provided": "Aceasta entitate este momentan indisponibila fiind un orfan al unei entitati sau unui dispozitiv eliminat, schimbat sau disfunctional",
"remove_action": "Eliminati entitatea"
},
"script": { "script": {
"last_action": "آخرین اقدام" "last_action": "آخرین اقدام"
}, },
@@ -435,6 +503,45 @@
}, },
"updater": { "updater": {
"title": "دستورالعمل به روز رسانی" "title": "دستورالعمل به روز رسانی"
},
"vacuum": {
"commands": "Comenzi aspirator:",
"fan_speed": "Viteza ventilator",
"locate": "Localizare",
"pause": "Pauza",
"return_home": "Intoarcere acasa",
"start": "Start",
"start_pause": "Start/Pauza",
"status": "Status",
"stop": "Stop"
}
},
"mqtt_device_debug_info": {
"deserialize": "Incearca sa analizezi mesajele MQTT ca si JSON",
"entities": "Entitati",
"no_entities": "Nicio entitate",
"no_triggers": "Niciun mecanism de declansare",
"payload_display": "Afiseaza incarcatura",
"recent_messages": "\n{n} mesaje cele mai recente",
"show_as_yaml": "Arata in format YAML",
"title": "{dispozitiv} informatii depanare",
"triggers": "Mecanism de declansare"
},
"zha_device_info": {
"buttons": {
"zigbee_information": "Informatii Zigbee"
},
"device_signature": "Semnatura dispozitiv Zigbee",
"manuf": "de catre {fabricant}",
"no_area": "Nicio Zona ",
"services": {
"remove": "Elimina un dispozitiv din reteaua Zigbee",
"zigbee_information": "Vizualizeaza informatiile Zigbee pentru acest dispozitiv "
},
"zha_device_card": {
"area_picker_label": "Zona",
"device_name_placeholder": "Prenume utilizator",
"update_name_button": "Actualizeaza nume"
} }
} }
}, },
@@ -462,6 +569,10 @@
"config": { "config": {
"areas": { "areas": {
"caption": "ثبت نام منطقه", "caption": "ثبت نام منطقه",
"data_table": {
"area": "Zona",
"devices": "Dispozitive"
},
"delete": { "delete": {
"confirmation_text": "هیچیک از درستگاه های این ناحیه اختصاص داده نشده اند", "confirmation_text": "هیچیک از درستگاه های این ناحیه اختصاص داده نشده اند",
"confirmation_title": "آیا مطمئنید که می خواهید این ناحیه را حذف کنید ؟" "confirmation_title": "آیا مطمئنید که می خواهید این ناحیه را حذف کنید ؟"
@@ -500,11 +611,20 @@
"delay": "تاخیر", "delay": "تاخیر",
"label": "تاخیر" "label": "تاخیر"
}, },
"device_id": {
"extra_fields": {
"code": "Cod"
},
"label": "Dispozitiv"
},
"event": { "event": {
"event": "اتفاق", "event": "اتفاق",
"label": "رویداد آتش", "label": "رویداد آتش",
"service_data": "اطلاعات خدمات" "service_data": "اطلاعات خدمات"
}, },
"scene": {
"label": "Activeaza scena"
},
"service": { "service": {
"label": "خدمات تماس", "label": "خدمات تماس",
"service_data": "داده های خدمات" "service_data": "داده های خدمات"
@@ -527,12 +647,26 @@
"learn_more": "درباره شرایط بیشتر بدانید", "learn_more": "درباره شرایط بیشتر بدانید",
"type_select": "نوع وضعیت", "type_select": "نوع وضعیت",
"type": { "type": {
"and": {
"label": "Si"
},
"device": {
"extra_fields": {
"above": "Deasupra",
"below": "Dedesubt",
"for": "Durata"
},
"label": "Dispozitiv"
},
"numeric_state": { "numeric_state": {
"above": "بالاتر", "above": "بالاتر",
"below": "پایین تر", "below": "پایین تر",
"label": "Numeric state", "label": "Numeric state",
"value_template": "قالب مقدار (اختیاری)" "value_template": "قالب مقدار (اختیاری)"
}, },
"or": {
"label": "Sau"
},
"state": { "state": {
"label": "حالت", "label": "حالت",
"state": "حالت" "state": "حالت"
@@ -564,6 +698,10 @@
"unsupported_condition": "شرایط غیرقابل پشتیبانی: {condition}" "unsupported_condition": "شرایط غیرقابل پشتیبانی: {condition}"
}, },
"default_name": "اضافه کردن اتوماسیون", "default_name": "اضافه کردن اتوماسیون",
"description": {
"label": "Descriere",
"placeholder": "Descriere optionala"
},
"introduction": "از اتوماسیون استفاده کنید برای زنده کردن خانه", "introduction": "از اتوماسیون استفاده کنید برای زنده کردن خانه",
"load_error_not_editable": "فقط اتوماسیون در automations.yaml قابل ویرایش هستند.", "load_error_not_editable": "فقط اتوماسیون در automations.yaml قابل ویرایش هستند.",
"load_error_unknown": "خطا در بارگذاری اتوماسیون ({err_no}).", "load_error_unknown": "خطا در بارگذاری اتوماسیون ({err_no}).",
@@ -628,18 +766,90 @@
}, },
"picker": { "picker": {
"add_automation": "اضافه کردن اتوماسیون", "add_automation": "اضافه کردن اتوماسیون",
"delete_automation": "Elimina automatizare",
"delete_confirm": "Esti sigur ca vrei sa elimini aceasta automatizare?",
"edit_automation": "Editeaza automatizare",
"header": "ویرایشگر اتوماسیون", "header": "ویرایشگر اتوماسیون",
"headers": {
"name": "Nume"
},
"introduction": "ویرایشگر اتوماسیون اجازه می دهد تا شما را به ایجاد و ویرایش اتوماسیون بپردازید . لطفا پیوند زیر را بخوانید تا دستورالعمل ها را بخواند تا مطمئن شوید که صفحه اصلی دستیار را به درستی پیکربندی کرده اید.", "introduction": "ویرایشگر اتوماسیون اجازه می دهد تا شما را به ایجاد و ویرایش اتوماسیون بپردازید . لطفا پیوند زیر را بخوانید تا دستورالعمل ها را بخواند تا مطمئن شوید که صفحه اصلی دستیار را به درستی پیکربندی کرده اید.",
"learn_more": "درباره اتوماسیون بیشتر بدانید", "learn_more": "درباره اتوماسیون بیشتر بدانید",
"no_automations": "هیچ اتوماسیون قابل ویرایشی پیدا نشد", "no_automations": "هیچ اتوماسیون قابل ویرایشی پیدا نشد",
"pick_automation": "انتخاب اتوماسیون برای ویرایش" "only_editable": "Doar automatizarile definite in automations.yaml sunt editabile",
"pick_automation": "انتخاب اتوماسیون برای ویرایش",
"show_info_automation": "Afiseaza informatii despre automatizare"
} }
}, },
"cloud": { "cloud": {
"account": {
"integrations": "Integrari",
"integrations_introduction2": "Verifica website-ul pentru",
"integrations_link_all_features": "toate caracteristicile disponibile",
"manage_account": "Administrare Cont",
"nabu_casa_account": "Cont Nabu Casa",
"webhooks": {
"loading": "Se incarca..."
}
},
"alexa": {
"title": "Alexa"
},
"caption": "home assistant ابر", "caption": "home assistant ابر",
"description_features": "کنترل کردن از خانه، ادغام با Alexa و Google Assistant.", "description_features": "کنترل کردن از خانه، ادغام با Alexa و Google Assistant.",
"description_login": "وارد شده به عنوان {email}", "description_login": "وارد شده به عنوان {email}",
"description_not_login": "وارد نشده اید" "description_not_login": "وارد نشده اید",
"dialog_certificate": {
"certificate_expiration_date": "Data expirare certificat",
"certificate_information": "Informatii certificat",
"will_be_auto_renewed": "Va fi reinnoit in mod automat"
},
"dialog_cloudhook": {
"close": "Inchide",
"confirm_disable": "Esti sigur ca vrei sa dezactivezi acest webhook?",
"copied_to_clipboard": "Copiat in clipboard",
"info_disable_webhook": "Daca nu mai doresti sa folosesti acest webhook, poti sa",
"link_disable_webhook": "dezactiveaza",
"view_documentation": "Vizualizeaza documentatie"
},
"login": {
"alert_email_confirm_necessary": "Trebuie sa iti confirmi adresa de email inainte de a te conecta",
"alert_password_change_required": "Trebuie sa iti schimbi parola inainte de a te conecta",
"dismiss": "Revoca",
"email": "Adresa de email",
"email_error_msg": "Adresa de email invalida",
"forgot_password": "Ai uitat parola?",
"introduction2": "Acest serviciu este condus de catre partenerul nostru",
"learn_more_link": "Afla mai multe despre Home Assistant Coud",
"password": "Parola",
"password_error_msg": "Parolele au cel putin 8 caractere",
"sign_in": "Conecteaza-te",
"start_trial": "Incepe perioada de proba de o luna",
"title": "Conectare in Cloud",
"trial_info": "Nu sunt necesare informatii de plata"
},
"register": {
"account_created": "Cont creat! Verifica email-ul pentru instructiuni cum sa iti activezi contul",
"create_account": "Creaza cont",
"email_address": "Adresa de email",
"email_error_msg": "Adresa de email invalida",
"feature_amazon_alexa": "Integrare cu Amazon Alexa",
"feature_google_home": "Integrare cu Google Assistant",
"feature_remote_control": "Controleaza Home Asisstant cand nu esti acasa",
"headline": "Incepe perioada de proba gratuita",
"information": "Creaza un cont pentru a incepe perioada de proba de o luna cu Home Assistant Cloud. Nu sunt necesare informatii de plata",
"information2": "Perioada de proba va va da acces la toate beneficiile Home Assistant Cloud, incluzand",
"information3": "Acest serviciu este condus de catre partenerul nostru",
"information3a": ", o companie creata de fondatorii Home Assistant si Hass.io",
"information4": "Prin inregistrarea unui cont esti de acord cu urmatorii termeni si conditii",
"link_privacy_policy": "Politica de Confidentialitate",
"link_terms_conditions": "Termeni si Conditii",
"password": "Parola",
"password_error_msg": "Parolele au cel putin 8 caractere",
"resend_confirm_email": "Retrimite email-ul de confirmare",
"start_trial": "Incepe perioada de proba",
"title": "Inregistreaza Cont"
}
}, },
"core": { "core": {
"caption": "عمومی", "caption": "عمومی",
@@ -666,32 +876,126 @@
} }
}, },
"customize": { "customize": {
"attributes_not_set": "Urmatoarele atribute nu au fost fixate. Fixeaza-le daca vrei",
"pick_attribute": "Alege un atribut pentru a trece peste acesta",
"picker": { "picker": {
"header": "سفارشی سازی ها", "header": "سفارشی سازی ها",
"introduction": "نویسه ویژگی های هر سازمانی. سفارشی سازی اضافه شده / ویرایش شده فورا اثر می کند. سفارشی های حذف شده هنگامی که موجودیت به روز می شود اثر می کند." "introduction": "نویسه ویژگی های هر سازمانی. سفارشی سازی اضافه شده / ویرایش شده فورا اثر می کند. سفارشی های حذف شده هنگامی که موجودیت به روز می شود اثر می کند."
},
"warning": {
"include_link": "Include customize.yaml"
} }
}, },
"devices": { "devices": {
"automation": {
"automations": "Automatizari",
"conditions": {
"caption": "Fa ceva doar daca..."
},
"create": "Creaza automatizare cu acest dispozitiv",
"no_automations": "Nu exista automatizari",
"no_device_automations": "Nu exista automatizari disponibile pentru acest dispozitiv",
"triggers": {
"caption": "Fa ceva cand..."
}
},
"cant_edit": "Puteti edita doar elemente create in Interfata Utilizator",
"caption": "Dispozitive",
"confirm_delete": "Esti sigur ca vrei sa elimini acest dispozitiv?",
"confirm_rename_entity_ids": "Vrei de asemenea sa redenumesti Entity ID-ul entitatilor tale?",
"data_table": { "data_table": {
"area": "Zona",
"battery": "Baterie",
"device": "Dispozitiv",
"integration": "Integrare",
"manufacturer": "Fabricant",
"model": "Model",
"no_devices": "دستگاهی وجود ندارد" "no_devices": "دستگاهی وجود ندارد"
} },
"delete": "Elimina",
"device_not_found": "Nu s-a descoperit dispozitivul.",
"entities": {
"add_entities_lovelace": "Adauga la Lovelace",
"entities": "Entitati",
"none": "Acest dispozitiv nu are nicio entitate"
},
"name": "Nume",
"no_devices": "Nu exista dispozitive",
"scene": {
"create": "Creaza scena cu acest dispozitiv",
"no_scenes": "Nu exista scene",
"scenes": "Scene"
},
"scenes": "Scene",
"script": {
"create": "Creaza script cu acest dispozitiv",
"no_scripts": "Nu exista scripturi",
"scripts": "Scripturi"
},
"scripts": "Scripturi",
"unknown_error": "Eroare necunoscuta",
"unnamed_device": "Dispozitiv nedenumit",
"update": "Actualizeaza"
}, },
"entities": { "entities": {
"caption": "ثبت منطقه", "caption": "ثبت منطقه",
"description": "مرور کلیه اشخاص شناخته شده.", "description": "مرور کلیه اشخاص شناخته شده.",
"picker": { "picker": {
"filter": {
"filter": "Filtru",
"show_disabled": "Afiseaza entitatile dezactivate",
"show_unavailable": "Afiseaza entitatile indisponibile"
},
"header": "ثبت منطقه", "header": "ثبت منطقه",
"headers": {
"entity_id": "ID Entitate",
"integration": "Integrare",
"name": "Nume",
"status": "Status"
},
"introduction": "دستیار خانه نگهداری رجیستری از هر نهاد که تا به حال دیده است که می تواند منحصر به فرد شناسایی شده است. هر یک از این نهاد ها یک شناسه نهادی اختصاص داده است که فقط برای این نهاد محفوظ خواهد ماند.", "introduction": "دستیار خانه نگهداری رجیستری از هر نهاد که تا به حال دیده است که می تواند منحصر به فرد شناسایی شده است. هر یک از این نهاد ها یک شناسه نهادی اختصاص داده است که فقط برای این نهاد محفوظ خواهد ماند.",
"introduction2": "از رجیستر entity استفاده کنید تا نام را عوض کند، شناسه موجودیت را تغییر دهید یا ورودی را از صفحه اصلی دستیار حذف کنید. توجه داشته باشید، از بین بردن ورودی رجیستر entity entity entity را حذف نخواهد کرد. برای انجام این کار، پیوند زیر را دنبال کنید و آن را از صفحه ی ادغام حذف کنید.", "introduction2": "از رجیستر entity استفاده کنید تا نام را عوض کند، شناسه موجودیت را تغییر دهید یا ورودی را از صفحه اصلی دستیار حذف کنید. توجه داشته باشید، از بین بردن ورودی رجیستر entity entity entity را حذف نخواهد کرد. برای انجام این کار، پیوند زیر را دنبال کنید و آن را از صفحه ی ادغام حذف کنید.",
"status": { "status": {
"restored": "بازیابی شد" "disabled": "Dezactivat",
"ok": "OK",
"restored": "بازیابی شد",
"unavailable": "Indisponibil"
} }
} }
}, },
"filtering": {
"clear": "Elimina",
"filtering_by": "Filtreaza dupa"
},
"header": "پیکربندی HOME ASSistant", "header": "پیکربندی HOME ASSistant",
"helpers": {
"caption": "Ajutoare",
"description": "Elemente ce pot ajuta la construirea de automatizari",
"dialog": {
"add_helper": "Adauga ajutor",
"add_platform": "Adauga {platforma}",
"create": "Creaza"
},
"picker": {
"add_helper": "Adauga ajutor",
"headers": {
"editable": "Editabil",
"name": "Nume",
"type": "Tip"
}
},
"types": {
"input_boolean": "Comutare",
"input_datetime": "Data si/sau ora",
"input_number": "Numar",
"input_text": "Text"
}
},
"integrations": { "integrations": {
"add_integration": "Adauga integrare",
"caption": "یکپارچگی", "caption": "یکپارچگی",
"config_entry": { "config_entry": {
"delete": "Sterge",
"device_unavailable": "دستگاه در دسترس نیست", "device_unavailable": "دستگاه در دسترس نیست",
"entity_unavailable": "نهاد در دسترس نیست", "entity_unavailable": "نهاد در دسترس نیست",
"firmware": "سیستم عامل: {version}", "firmware": "سیستم عامل: {version}",
@@ -700,52 +1004,156 @@
"no_area": "بدون منطقه", "no_area": "بدون منطقه",
"no_device": " بدون دستگاه", "no_device": " بدون دستگاه",
"no_devices": "این ادغام هیچ دستگاهی ندارد.", "no_devices": "این ادغام هیچ دستگاهی ندارد.",
"restart_confirm": "راه اندازی مجدد home assistant به پایان بردن این ادغام" "options": "Optiuni",
"rename": "Redenumeste",
"restart_confirm": "راه اندازی مجدد home assistant به پایان بردن این ادغام",
"system_options": "Optiuni de sistem"
}, },
"config_flow": { "config_flow": {
"aborted": "Esuat",
"close": "Inchide",
"created_config": "Configurare creata pentru {nume}",
"external_step": { "external_step": {
"description": "این مرحله نیاز به بازدید از وب سایت خارجی دارد که باید تکمیل شود.", "description": "این مرحله نیاز به بازدید از وب سایت خارجی دارد که باید تکمیل شود.",
"open_site": "باز کردن سایت" "open_site": "باز کردن سایت"
}, },
"loading_first_time": "لطفاً منتظر بمانید تا ادغام نصب شود" "finish": "Termina",
"loading_first_time": "لطفاً منتظر بمانید تا ادغام نصب شود",
"not_all_required_fields": "Nu toate campurile necesare sunt completate",
"submit": "Trimite"
}, },
"configure": "پیکربندی", "configure": "پیکربندی",
"configured": "پیکربندی شده", "configured": "پیکربندی شده",
"description": "مدیریت دستگاهها و خدمات متصل شده", "description": "مدیریت دستگاهها و خدمات متصل شده",
"discovered": "کشف شده", "discovered": "کشف شده",
"ignore": {
"hide_ignored": "Ascunde integrarile ignorate",
"ignore": "Ignora",
"ignored": "Ignorat",
"show_ignored": "Afiseaza integrarile ignorate"
},
"integration": "integrare",
"integration_not_found": "Nu s-a gasit integrarea",
"new": "تنظیم ادغام جدید", "new": "تنظیم ادغام جدید",
"none": "هیچ چیز پیکربندی نشده است" "no_integrations": "Se pare ca nu ai configurat nicio integrare inca. Apasa pe butonul de mai jos pentru a adauga prima integrare",
"none": "هیچ چیز پیکربندی نشده است",
"none_found": "Nu s-au gasit integrari",
"none_found_detail": "Ajusteaza criteriul de cautare ",
"note_about_integrations": "Nu toate integrarile pot fi configurate inca folosind interfata utilizator",
"note_about_website_reference": "Mai multe sunt disponibile la",
"rename_dialog": "Editeaza numele acestei optiuni de configurare",
"rename_input_label": "Introdu nume"
}, },
"introduction": "در اینجا می توانید اجزای خود و صفحه اصلی دستیار را پیکربندی کنید. ", "introduction": "در اینجا می توانید اجزای خود و صفحه اصلی دستیار را پیکربندی کنید. ",
"lovelace": { "lovelace": {
"dashboards": { "dashboards": {
"default_dashboard": "این داشبورد پیش فرض است", "default_dashboard": "این داشبورد پیش فرض است",
"detail": { "detail": {
"title_required": "عنوان مورد نیاز است." "create": "Creaza",
"delete": "Elimina",
"require_admin": "Doar administratorul",
"title_required": "عنوان مورد نیاز است.",
"update": "Actualizeaza",
"url": "URL"
} }
}, },
"resources": { "resources": {
"caption": "Resurse",
"confirm_delete": "Esti sigur ca vrei sa elimini aceasta resursa?",
"detail": { "detail": {
"create": "ایجاد کن", "create": "ایجاد کن",
"delete": "پاک کن", "delete": "پاک کن",
"update": "به روز رسانی" "dismiss": "Inchide",
"new_resource": "Adauga resursa noua",
"type": "Tipul resursei",
"update": "به روز رسانی",
"url": "URL",
"url_error_msg": "URL este un camp necesar",
"warning_header": "Mare atentie!"
}, },
"picker": { "picker": {
"add_resource": "Adauga resursa",
"headers": {
"type": "Tip",
"url": "URL"
},
"no_resources": "منابعی وجود ندارد" "no_resources": "منابعی وجود ندارد"
},
"refresh_header": "Vrei sa reimprospatezi? ",
"types": {
"module": "Modul JavaScript"
} }
} }
}, },
"person": { "person": {
"add_person": "Adauga Persoana",
"caption": "افراد", "caption": "افراد",
"confirm_delete": "Esti sigur ca vrei sa elimini aceasta persoana?",
"confirm_delete2": "Toate dispozitivele apartinand acestei persoane vor deveni neatribuite",
"create_person": "Creaza Persoana",
"description": "مدیریت افراد خانه هوشمند", "description": "مدیریت افراد خانه هوشمند",
"detail": { "detail": {
"create": "Creaza",
"delete": "Elimina",
"device_tracker_intro": "دستگاه هایی که متعلق به این شخص هستند را انتخاب کنید.", "device_tracker_intro": "دستگاه هایی که متعلق به این شخص هستند را انتخاب کنید.",
"device_tracker_pick": "دستگاه را برای پیگیری انتخاب کنید", "device_tracker_pick": "دستگاه را برای پیگیری انتخاب کنید",
"device_tracker_picked": "پیگیری دستگاه", "device_tracker_picked": "پیگیری دستگاه",
"name": "نام" "link_integrations_page": "Pagina Integrari",
"link_presence_detection_integrations": "Integrari detectie prezenta",
"linked_user": "Utilizator corelat",
"name": "نام",
"name_error_msg": "Este necesar numele",
"new_person": "Persoana Noua",
"update": "Actualizeaza"
},
"introduction": "Aici poti defini fiecare persoana de interes in Home Assistant",
"no_persons_created_yet": "Se pare ca nu ai creat nicio persoana deocamdata"
},
"scene": {
"caption": "Scene",
"description": "Creaza si editeaza scene",
"editor": {
"entities": {
"add": "Adauga entitate",
"delete": "Elimina entitatea",
"device_entities": "Daca adaugi o entitate care apartine unui dispozitiv, acel dispozitiv va fi adaugat"
}
},
"picker": {
"header": "Editor de scene",
"headers": {
"name": "Nume"
},
"introduction": "Editorul de scene permite crearea si editare de scene. Va rugam folositi link-ul de mai jos pentru a citi instructiunile si a va asigurat ca ati configurat corect Home Assistant",
"learn_more": "Invata mai multe despre scene"
}
},
"script": {
"editor": {
"default_name": "Script nou",
"delete_confirm": "Esti sigur ca vrei sa elimini acest script?",
"delete_script": "Elimina script",
"introduction": "Foloseste script-uri pentru a executa mai multe actiuni succesive",
"link_available_actions": "Afla mai multe despre actiunile disponibile",
"load_error_not_editable": "Doar scripturile definite in scripts.yaml sunt editabile",
"sequence": "Secventa",
"sequence_sentence": "Ordinea actiunilor in acest script"
},
"picker": {
"add_script": "Adauga script",
"edit_script": "Editeaza script",
"header": "Editor de scripturi",
"headers": {
"name": "Nume"
},
"learn_more": "Afla mai multe despre scripturi",
"no_scripts": "Nu s-au gasit scripturi editabile",
"show_info": "Afiseaza informatii despre script",
"trigger_script": "Declanseaza script"
} }
}, },
"server_control": { "server_control": {
"caption": "Controale Server",
"section": { "section": {
"reloading": { "reloading": {
"automation": "بارگیری مجدد اتوماسیون", "automation": "بارگیری مجدد اتوماسیون",
@@ -780,7 +1188,17 @@
"confirm_user_deletion": "آیا مطمئنید می خواهید {name} را حذف کنید ؟", "confirm_user_deletion": "آیا مطمئنید می خواهید {name} را حذف کنید ؟",
"deactivate_user": "غیر فعال کردن کاربر", "deactivate_user": "غیر فعال کردن کاربر",
"delete_user": "حذف کاربر", "delete_user": "حذف کاربر",
"unnamed_user": "کاربر نامشخص" "name": "Nume",
"owner": "Proprietar",
"unnamed_user": "کاربر نامشخص",
"update_user": "Actualizeaza"
},
"picker": {
"headers": {
"group": "Grup",
"name": "Nume",
"system": "Sistem"
}
} }
}, },
"zha": { "zha": {
@@ -790,6 +1208,9 @@
"search_again": "جستجوی مجدد", "search_again": "جستجوی مجدد",
"spinner": "جستجو برای دستگاه های ZHY Zigbee ..." "spinner": "جستجو برای دستگاه های ZHY Zigbee ..."
}, },
"add": {
"caption": "Adauga dispozitive"
},
"caption": "ZHA", "caption": "ZHA",
"common": { "common": {
"add_devices": "افزودن دستگاهها", "add_devices": "افزودن دستگاهها",
@@ -797,6 +1218,22 @@
"value": "مقدار" "value": "مقدار"
}, },
"description": "صفحه اصلی اتوماسیون مدیریت شبکه Zigbee", "description": "صفحه اصلی اتوماسیون مدیریت شبکه Zigbee",
"groups": {
"add_members": "Adauga membri",
"adding_members": "Se adauga membri",
"create": "Creaza grup",
"creating_group": "Se creaza grup",
"group_details": "Acestea sunt toate detaliile pentru grupul Zigbee selectat",
"group_info": "Informatii Grup",
"group_name_placeholder": "Nume grup",
"group_not_found": "Nu s-a gasit grup!",
"introduction": "Creaza si editeaza grupuri zigbee",
"members": "Membri",
"remove_groups": "Elimina grupuri",
"remove_members": "Elimina membri",
"removing_groups": "Se elimina grupuri",
"removing_members": "Se elimina membri"
},
"network_management": { "network_management": {
"header": "مدیریت شبکه", "header": "مدیریت شبکه",
"introduction": "دستوراتی که روی کل شبکه تأثیر می گذارند" "introduction": "دستوراتی که روی کل شبکه تأثیر می گذارند"
@@ -805,10 +1242,25 @@
"header": "مدیریت دستگاه" "header": "مدیریت دستگاه"
} }
}, },
"zone": {
"add_zone": "Adauga zona",
"caption": "Zone",
"confirm_delete": "Esti sigur ca vrei sa elimini aceasta zona?",
"create_zone": "Creaza zona",
"detail": {
"icon": "Iconita",
"name": "Nume",
"new_zone": "Zona noua",
"radius": "Raza"
},
"no_zones_created_yet": "Se pare ca inca nu ai creat nicio zona"
},
"zwave": { "zwave": {
"caption": "Z-Wave", "caption": "Z-Wave",
"common": { "common": {
"index": "Index",
"unknown": "نامشخص", "unknown": "نامشخص",
"value": "Valoare",
"wakeup_interval": "فاصله Wakeup" "wakeup_interval": "فاصله Wakeup"
}, },
"node_config": { "node_config": {
@@ -820,6 +1272,13 @@
"set_config_parameter": "تنظیم پارامتر پیکربندی", "set_config_parameter": "تنظیم پارامتر پیکربندی",
"set_wakeup": "تنظیم فاصله Wakeup", "set_wakeup": "تنظیم فاصله Wakeup",
"true": "صحیح" "true": "صحیح"
},
"services": {
"add_node": "Adauga Nod",
"cancel_command": "Anuleaza Comanda",
"remove_node": "Elimina Nodul",
"save_config": "Salveaza Configuratie",
"test_network": "Testare Retea"
} }
} }
}, },
@@ -829,8 +1288,11 @@
"title": "رویدادها" "title": "رویدادها"
}, },
"info": { "info": {
"built_using": "Construit cu ajutorul",
"home_assistant_logo": "Logo Home Assistant",
"icons_by": "آیکون توسط", "icons_by": "آیکون توسط",
"server": "سرور", "server": "سرور",
"source": "Sursa:",
"title": "اطلاعات" "title": "اطلاعات"
}, },
"logs": { "logs": {
@@ -838,12 +1300,31 @@
"title": "وقایع" "title": "وقایع"
}, },
"mqtt": { "mqtt": {
"publish": "Publica",
"subscribe_to": "Subiect pentru abonare",
"title": "MQTT" "title": "MQTT"
}, },
"services": { "services": {
"call_service": "Apeleaza serviciul",
"column_description": "Descriere",
"column_example": "Exemplu",
"column_parameter": "Parametru",
"no_description": "Nu este disponibila nicio descriere",
"no_parameters": "Acest serviciu nu accepta parametri",
"select_service": "Selecteaza un serviciu pentru a-i vedea descrierea",
"title": "خدمات" "title": "خدمات"
}, },
"states": { "states": {
"attributes": "Atribute",
"current_entities": "Entitati curente",
"description2": "Acesta nu va comunica cu dispozitivul",
"entity": "Entitate",
"filter_attributes": "Filtreaza atributele",
"filter_entities": "Filtreaza entitatile",
"filter_states": "Filtreaza starile",
"set_state": "Fixeaza stare",
"state": "Stare",
"state_attributes": "Stare atribute *(YAML, optional)",
"title": "وضعیت" "title": "وضعیت"
}, },
"templates": { "templates": {
@@ -855,11 +1336,13 @@
"showing_entries": "نمایش نوشته ها برای" "showing_entries": "نمایش نوشته ها برای"
}, },
"logbook": { "logbook": {
"entries_not_found": "Nu s-au gasit intrari in logbook",
"period": "دوره", "period": "دوره",
"showing_entries": "نمایش نامه برای" "showing_entries": "نمایش نامه برای"
}, },
"lovelace": { "lovelace": {
"cards": { "cards": {
"confirm_delete": "Esti sigur ca vrei sa elimini acest card?",
"empty_state": { "empty_state": {
"go_to_integrations_page": "به صفحه ادغام بروید.", "go_to_integrations_page": "به صفحه ادغام بروید.",
"no_devices": "این صفحه به شما اجازه می دهد تا دستگاه های خود را کنترل کنید، با این حال به نظر می رسد که هیچ دستگاهی تنظیم نشده است. برای شروع به صفحه ادغام بروید.", "no_devices": "این صفحه به شما اجازه می دهد تا دستگاه های خود را کنترل کنید، با این حال به نظر می رسد که هیچ دستگاهی تنظیم نشده است. برای شروع به صفحه ادغام بروید.",
@@ -884,17 +1367,37 @@
}, },
"editor": { "editor": {
"card": { "card": {
"alarm-panel": {
"available_states": "Stari disponibile",
"name": "Panou de alarma"
},
"conditional": { "conditional": {
"card": "کارت", "card": "کارت",
"conditions": "شرایط", "conditions": "شرایط",
"current_state": "جاری" "current_state": "جاری",
"name": "Conditional"
},
"config": {
"optional": "Optional",
"required": "Necesar"
},
"entities": {
"name": "Entitati"
},
"entity-filter": {
"name": "Filtru entitate"
},
"entity": {
"name": "Entitate"
}, },
"generic": { "generic": {
"attribute": "Atribut",
"manual": "دستی", "manual": "دستی",
"manual_description": "آیا نیاز به اضافه کردن کارت سفارشی دارید یا فقط می خواهید yaml را به صورت دستی بنویسید؟", "manual_description": "آیا نیاز به اضافه کردن کارت سفارشی دارید یا فقط می خواهید yaml را به صورت دستی بنویسید؟",
"maximum": "بیشترین", "maximum": "بیشترین",
"minimum": "کمترین", "minimum": "کمترین",
"name": "نام", "name": "نام",
"no_theme": "Nicio tema",
"refresh_interval": "فاصله رفرش", "refresh_interval": "فاصله رفرش",
"show_icon": "نمایش آیکون؟", "show_icon": "نمایش آیکون؟",
"show_name": "نمایش نام؟", "show_name": "نمایش نام؟",
@@ -905,6 +1408,12 @@
"unit": "واحد", "unit": "واحد",
"url": "آدرس" "url": "آدرس"
}, },
"glance": {
"name": "Privire"
},
"iframe": {
"name": "Pagina web"
},
"light": { "light": {
"name": "چراغ" "name": "چراغ"
}, },
@@ -924,18 +1433,28 @@
"picture": { "picture": {
"name": "تصویر" "name": "تصویر"
}, },
"plant-status": {
"description": "Cardul Plant Status este pentru toti iubitorii de plante"
},
"sensor": { "sensor": {
"description": "Cardul Sensor va ofera o viziune rapida a starii senzorilor cu un grafic optional pentru a vizualiza schimbarile produse in timp",
"graph_detail": "نمودار جزئیات", "graph_detail": "نمودار جزئیات",
"graph_type": "نوع نمودار", "graph_type": "نوع نمودار",
"name": "سنسور" "name": "سنسور"
}, },
"shopping-list": { "shopping-list": {
"description": "Cardul Shopping List va permite sa adaugati, editati, verificati sau eliminati elemente din lista de cumparaturi",
"name": "لیست خرید" "name": "لیست خرید"
}, },
"thermostat": { "thermostat": {
"description": "Cardul Thermostat va da control asupra entitatii ce controleaza clima. Acesta permite schimbarea temperaturii si a modului de operare al acestei entitati",
"name": "ترموستات" "name": "ترموستات"
}, },
"vertical-stack": {
"description": "Cardul Vertical Stack va permite gruparea mai multor carduri astfel incat acestea intotdeauna sa stea in aceeasi coloana"
},
"weather-forecast": { "weather-forecast": {
"description": "Cardul Weather Forecast afiseaza vremea. Foarte util a se include in interfate ce vor fi afisate pe perete",
"name": "پیش بینی آب و هوا" "name": "پیش بینی آب و هوا"
} }
}, },
@@ -947,6 +1466,9 @@
"pick_card": "کارتی را که می خواهید اضافه کنید انتخاب کنید ؛", "pick_card": "کارتی را که می خواهید اضافه کنید انتخاب کنید ؛",
"toggle_editor": "تغییر ویرایشگر" "toggle_editor": "تغییر ویرایشگر"
}, },
"edit_lovelace": {
"explanation": "Acest titlu este afisat deasupra tuturor vizualizarilor in Lovelace"
},
"edit_view": { "edit_view": {
"add": "افزودن نمایه", "add": "افزودن نمایه",
"edit": "ویرایش نما", "edit": "ویرایش نما",
@@ -973,13 +1495,23 @@
"save_config": { "save_config": {
"cancel": "بیخیال", "cancel": "بیخیال",
"close": "ببند", "close": "ببند",
"empty_config": "Incepe cu un tablou de bord gol",
"header": "کنترل UI Lovelace خود را بگیرید", "header": "کنترل UI Lovelace خود را بگیرید",
"para": "به طور پیش فرض Home Assistant رابط کاربر خود را حفظ می کند، آن را به روز می کند زمانی که موجودیت های جدید و یا اجزای Lovelace در دسترس قرار گیرد. اگر کنترل داشته باشید دیگر تغییرات را برای شما انجام نخواهیم داد.", "para": "به طور پیش فرض Home Assistant رابط کاربر خود را حفظ می کند، آن را به روز می کند زمانی که موجودیت های جدید و یا اجزای Lovelace در دسترس قرار گیرد. اگر کنترل داشته باشید دیگر تغییرات را برای شما انجام نخواهیم داد.",
"para_sure": "آیا مطمئن هستید که میخواهید کنترل رابط کاربری خود را کنترل کنید؟", "para_sure": "آیا مطمئن هستید که میخواهید کنترل رابط کاربری خود را کنترل کنید؟",
"save": "کنترل را به دست گرفتن" "save": "کنترل را به دست گرفتن"
},
"suggest_card": {
"header": "Am creat o sugestie pentru tine"
},
"view": {
"panel_mode": {
"warning_multiple_cards": "Aceasta vizualizare contine mai mult de un card, dar un panou de vizualizare poate arata doar un card"
}
} }
}, },
"menu": { "menu": {
"close": "Inchide",
"help": "کمک", "help": "کمک",
"refresh": "تازه کردن", "refresh": "تازه کردن",
"reload_resources": "بارگذاری مجدد منابع" "reload_resources": "بارگذاری مجدد منابع"
@@ -989,13 +1521,24 @@
"refresh_body": "شما باید صفحه را تازه سازی کنید تا بارگذاری مجدد را کامل کنید ، آیا می خواهید اکنون دوباره آن را تازه کنید ؟", "refresh_body": "شما باید صفحه را تازه سازی کنید تا بارگذاری مجدد را کامل کنید ، آیا می خواهید اکنون دوباره آن را تازه کنید ؟",
"refresh_header": "آیا می خواهید تازه سازی کنید ؟" "refresh_header": "آیا می خواهید تازه سازی کنید ؟"
}, },
"unused_entities": {
"available_entities": "Acestea sunt entitatile disponibile care nu se afla inca in Lovelace",
"domain": "Domeniu",
"entity": "Entitate",
"entity_id": "ID Entitate",
"last_changed": "Modificat ultima data",
"select_to_add": "Selecteaza entitatile pe care doresti sa le adaugi la un card si apasa butonul add card",
"title": "Entitati nefolosite"
},
"views": { "views": {
"confirm_delete": "Elimini vizualizare?",
"confirm_delete_existing_cards": "با حذف این نمای کارت ها نیز حذف می شود" "confirm_delete_existing_cards": "با حذف این نمای کارت ها نیز حذف می شود"
}, },
"warning": { "warning": {
"attribute_not_found": "ویژگی {attribute} در دسترس نیست:: {entity}", "attribute_not_found": "ویژگی {attribute} در دسترس نیست:: {entity}",
"entity_non_numeric": "نهاد غیر عددی است: {entity}", "entity_non_numeric": "نهاد غیر عددی است: {entity}",
"entity_not_found": "نهاد موجود نیست: {entity}" "entity_not_found": "نهاد موجود نیست: {entity}",
"entity_unavailable": "{entitate} indisponibila in acest moment"
} }
}, },
"mailbox": { "mailbox": {
@@ -1068,6 +1611,24 @@
"logging_in_with": "ورود با ** {authProviderName} **.", "logging_in_with": "ورود با ** {authProviderName} **.",
"pick_auth_provider": "یا وارد سیستم شوید" "pick_auth_provider": "یا وارد سیستم شوید"
}, },
"page-demo": {
"cards": {
"demo": {
"learn_more": "Afla mai multe despre Home Assistant "
}
},
"config": {
"arsaboo": {
"names": {
"family_room": "Living",
"hallway": "Hol",
"kitchen": "Bucatarie",
"master_bedroom": "Dormitor Principal",
"upstairs": "Etaj"
}
}
}
},
"page-onboarding": { "page-onboarding": {
"core-config": { "core-config": {
"button_detect": "تشخیص", "button_detect": "تشخیص",
@@ -1108,6 +1669,12 @@
"new_password": "رمز جدید" "new_password": "رمز جدید"
}, },
"current_user": "شما در حال حاضر به عنوان {fullName} وارد شده اید.", "current_user": "شما در حال حاضر به عنوان {fullName} وارد شده اید.",
"dashboard": {
"header": "Tablou de bord"
},
"logout": "Deconectare",
"logout_text": "Esti sigur ca vrei sa te deconectezi?",
"logout_title": "Deconectare?",
"long_lived_access_tokens": { "long_lived_access_tokens": {
"confirm_delete": "آیا مطمئن هستید که میخواهید token زیر را برای {name} حذف کنید؟", "confirm_delete": "آیا مطمئن هستید که میخواهید token زیر را برای {name} حذف کنید؟",
"created_at": "ایجاد شده در {date}", "created_at": "ایجاد شده در {date}",

View File

@@ -206,6 +206,8 @@
"stopped": "Pysäytetty" "stopped": "Pysäytetty"
}, },
"default": { "default": {
"off": "Pois",
"on": "Päällä",
"unavailable": "Ei saatavissa", "unavailable": "Ei saatavissa",
"unknown": "Tuntematon" "unknown": "Tuntematon"
}, },
@@ -329,7 +331,7 @@
"ui": { "ui": {
"auth_store": { "auth_store": {
"ask": "Haluatko pysyä kirjautuneena sisään?", "ask": "Haluatko pysyä kirjautuneena sisään?",
"confirm": "Tallenna käyttäjätunnus", "confirm": "Kyllä",
"decline": "Ei kiitos" "decline": "Ei kiitos"
}, },
"card": { "card": {
@@ -475,7 +477,10 @@
"close": "Sulje", "close": "Sulje",
"delete": "Poista", "delete": "Poista",
"loading": "Ladataan", "loading": "Ladataan",
"next": "Seuraava",
"no": "Ei", "no": "Ei",
"previous": "Edellinen",
"refresh": "Päivitä",
"save": "Tallenna", "save": "Tallenna",
"successfully_deleted": "Poistettu onnistuneesti", "successfully_deleted": "Poistettu onnistuneesti",
"successfully_saved": "Tallennus onnistui", "successfully_saved": "Tallennus onnistui",
@@ -499,12 +504,14 @@
"device-picker": { "device-picker": {
"clear": "Tyhjennä", "clear": "Tyhjennä",
"device": "Laite", "device": "Laite",
"show_devices": "Näytä laitteet" "show_devices": "Näytä laitteet",
"toggle": "Vaihda"
}, },
"entity": { "entity": {
"entity-picker": { "entity-picker": {
"clear": "Tyhjennä", "clear": "Tyhjennä",
"entity": "Kohde" "entity": "Kohde",
"show_entities": "Näytä kohteet"
} }
}, },
"history_charts": { "history_charts": {
@@ -518,6 +525,7 @@
"entity": "Liittyvät kohteet", "entity": "Liittyvät kohteet",
"group": "Osa seuraavia ryhmiä", "group": "Osa seuraavia ryhmiä",
"integration": "Integraatio", "integration": "Integraatio",
"no_related_found": "Aiheeseen liittyviä komponentteja ei löytynyt.",
"scene": "Osa seuraavia tilanteita", "scene": "Osa seuraavia tilanteita",
"script": "Osa seuraavia skriptejä" "script": "Osa seuraavia skriptejä"
}, },
@@ -544,6 +552,9 @@
"title": "Järjestelmäasetukset kohteelle {integration}", "title": "Järjestelmäasetukset kohteelle {integration}",
"update": "Päivitä" "update": "Päivitä"
}, },
"domain_toggler": {
"title": "Kytke verkkotunnukset"
},
"entity_registry": { "entity_registry": {
"control": "Ohjaus", "control": "Ohjaus",
"dismiss": "Hylkää", "dismiss": "Hylkää",
@@ -555,12 +566,14 @@
"enabled_label": "Ota kohte käyttöön", "enabled_label": "Ota kohte käyttöön",
"entity_id": "Kohde ID", "entity_id": "Kohde ID",
"icon": "Kuvakkeen yliajo", "icon": "Kuvakkeen yliajo",
"icon_error": "Kuvakkeen tulisi olla muodossa etuliite:ikoni, esimerkiksi: mdi:home",
"name": "Nimen yliajo", "name": "Nimen yliajo",
"note": "Huomaa: tämä ei ehkä vielä toimi kaikissa integraatioissa.", "note": "Huomaa: tämä ei ehkä vielä toimi kaikissa integraatioissa.",
"unavailable": "Tämä kohde ei ole tällä hetkellä käytettävissä.", "unavailable": "Tämä kohde ei ole tällä hetkellä käytettävissä.",
"update": "Päivitä" "update": "Päivitä"
}, },
"related": "liittyvä", "no_unique_id": "Tällä kohteella ei ole yksilöivää tunnusta, joten sen asetuksia ei voida hallita käyttöliittymästä.",
"related": "Liittyvät",
"settings": "Asetukset" "settings": "Asetukset"
}, },
"generic": { "generic": {
@@ -590,7 +603,9 @@
"unit_of_measurement": "Mittayksikkö" "unit_of_measurement": "Mittayksikkö"
}, },
"input_select": { "input_select": {
"add": "Lisää",
"add_option": "Lisää vaihtoehto", "add_option": "Lisää vaihtoehto",
"no_options": "Valintoja ei vielä ole.",
"options": "Asetukset" "options": "Asetukset"
}, },
"input_text": { "input_text": {
@@ -598,16 +613,25 @@
"min": "Vähimmäispituus", "min": "Vähimmäispituus",
"mode": "Näyttötila", "mode": "Näyttötila",
"password": "Salasana", "password": "Salasana",
"pattern": "Regex-malli käyttäjäpuolen validointia varten.",
"text": "Teksti" "text": "Teksti"
} },
"platform_not_loaded": "Integrointia {platform} ei ole ladattu. Voit ladata sen llisäämällä \"default_config:\" tai {platform}: konfiguraatiotiedostoon.",
"required_error_msg": "Tämä kenttä on pakollinen",
"yaml_not_editable": "Tämän kohteen asetuksia ei voi muokata käyttöliittymästä. Vain käyttöliittymästä määritetyt kohteet ovat määritettävissä käyttöliittymästä."
}, },
"more_info_control": { "more_info_control": {
"dismiss": "Sulje ikkuna", "dismiss": "Sulje ikkuna",
"edit": "Muokkaa kohdetta", "edit": "Muokkaa kohdetta",
"person": {
"create_zone": "Luo vyöhyke nykyisestä sijainnista"
},
"restored": { "restored": {
"confirm_remove_text": "Haluatko varmasti poistaa tämän kohteen?", "confirm_remove_text": "Haluatko varmasti poistaa tämän kohteen?",
"confirm_remove_title": "Poistetaanko kohde?", "confirm_remove_title": "Poistetaanko kohde?",
"remove_action": "Poista kohde" "not_provided": "Tämä kohde ei ole tällä hetkellä käytettävissä ja se on orpo poistetulle, muutetulle tai virheelliselle integraatiolle tai laitteelle.",
"remove_action": "Poista kohde",
"remove_intro": "Jos kokonaisuutta ei enää käytetä, voit puhdistaa sen poistamalla sen."
}, },
"script": { "script": {
"last_action": "Edellinen toiminto", "last_action": "Edellinen toiminto",
@@ -624,6 +648,7 @@
}, },
"vacuum": { "vacuum": {
"clean_spot": "Puhdista paikka", "clean_spot": "Puhdista paikka",
"commands": "Pölynimurin komennot:",
"fan_speed": "Tuulettimen nopeus", "fan_speed": "Tuulettimen nopeus",
"locate": "Paikanna", "locate": "Paikanna",
"pause": "Tauko", "pause": "Tauko",
@@ -635,9 +660,14 @@
} }
}, },
"mqtt_device_debug_info": { "mqtt_device_debug_info": {
"deserialize": "Yritetään jäsentää MQTT-viestejä JSON-muodossa",
"entities": "Kohteet",
"no_entities": "Ei kohteita",
"no_triggers": "Ei laukaisimia", "no_triggers": "Ei laukaisimia",
"payload_display": "Tietosisältönäyttö", "payload_display": "Tietosisältönäyttö",
"recent_messages": "{n} viimeksi vastaanotettua viestiä",
"show_as_yaml": "Näytä YAML-muodossa", "show_as_yaml": "Näytä YAML-muodossa",
"title": "{device} vianetsintätiedot",
"triggers": "Laukaisimet" "triggers": "Laukaisimet"
}, },
"options_flow": { "options_flow": {
@@ -710,8 +740,13 @@
"triggered": "Laukaisi kohteen {name}" "triggered": "Laukaisi kohteen {name}"
}, },
"panel": { "panel": {
"calendar": {
"my_calendars": "Omat kalenterit",
"today": "Tänään"
},
"config": { "config": {
"advanced_mode": { "advanced_mode": {
"hint_enable": "Puuttuvatko asetusvaihtoehdot? Ota edistynyt tila käyttöön",
"link_profile_page": "profiilisivusi" "link_profile_page": "profiilisivusi"
}, },
"areas": { "areas": {
@@ -721,6 +756,7 @@
"devices": "Laitteet" "devices": "Laitteet"
}, },
"delete": { "delete": {
"confirmation_text": "Tälle alueelle kuuluvien laitteiden osoitus poistetaan.",
"confirmation_title": "Haluatko varmasti poistaa tämän alueen?" "confirmation_title": "Haluatko varmasti poistaa tämän alueen?"
}, },
"description": "Yleiskuva kaikista kotisi alueista.", "description": "Yleiskuva kaikista kotisi alueista.",
@@ -810,6 +846,9 @@
}, },
"label": "Laite" "label": "Laite"
}, },
"not": {
"label": "Ei"
},
"numeric_state": { "numeric_state": {
"above": "Yli", "above": "Yli",
"below": "Alle", "below": "Alle",
@@ -856,6 +895,7 @@
}, },
"edit_ui": "Muokkaa käyttöliittymässä", "edit_ui": "Muokkaa käyttöliittymässä",
"edit_yaml": "Muokkaa YAML-tiedostona", "edit_yaml": "Muokkaa YAML-tiedostona",
"enable_disable": "Ota automaatio käyttöön tai poista se käytöstä",
"introduction": "Käytä automaatioita herättääksesi kotisi eloon", "introduction": "Käytä automaatioita herättääksesi kotisi eloon",
"load_error_not_editable": "Vain automaatiot tiedostossa automations.yaml ovat muokattavissa.", "load_error_not_editable": "Vain automaatiot tiedostossa automations.yaml ovat muokattavissa.",
"load_error_unknown": "Virhe ladatessa automaatiota ( {err_no} )", "load_error_unknown": "Virhe ladatessa automaatiota ( {err_no} )",
@@ -979,6 +1019,7 @@
"enable_ha_skill": "Ota Kotiavustajan taito käyttöön Alexassa", "enable_ha_skill": "Ota Kotiavustajan taito käyttöön Alexassa",
"enable_state_reporting": "Ota tilaraportointi käyttöön", "enable_state_reporting": "Ota tilaraportointi käyttöön",
"info": "Alexa Integraatio Home Assistant Cloudille mahdollistaa Home Assistant laitteiden ohjaamisen miltä tahansa Alexa laitteelta.", "info": "Alexa Integraatio Home Assistant Cloudille mahdollistaa Home Assistant laitteiden ohjaamisen miltä tahansa Alexa laitteelta.",
"info_state_reporting": "Jos otat tilaraportoinnin käyttöön, Home Assistant lähettää kaikki julkistettujen kohteiden tilamuutokset Amazonille. Tämän avulla voit aina nähdä uusimmat tilat Alexa-sovelluksessa ja käyttää tilamuutoksia rutiinien luomiseen.",
"manage_entities": "Hallitse kohteita", "manage_entities": "Hallitse kohteita",
"state_reporting_error": "Tilaa {enable_disable} .ei ole saatavilla", "state_reporting_error": "Tilaa {enable_disable} .ei ole saatavilla",
"sync_entities": "Synkronoi kohteet", "sync_entities": "Synkronoi kohteet",
@@ -995,10 +1036,13 @@
"enable_state_reporting": "Ota tilaraportointi käyttöön", "enable_state_reporting": "Ota tilaraportointi käyttöön",
"enter_pin_error": "PIN-koodin tallentaminen ei onnistu:", "enter_pin_error": "PIN-koodin tallentaminen ei onnistu:",
"enter_pin_hint": "Anna PIN-koodi turvalaitteiden käyttämistä varten", "enter_pin_hint": "Anna PIN-koodi turvalaitteiden käyttämistä varten",
"enter_pin_info": "Anna turvalaitteille, kuten oville, autotalleille ja lukoille PIN-koodi. Tätä koodia tullaan sinulta kysymään käyttäessäsi edellä mainittuja laitteita Google Assistantin kautta.",
"info": "Google Assistant Integraatio Home Assistant Cloudille mahdollistaa Home Assistant laitteiden ohjaamisen miltä tahansa Google Assistant laitteelta.", "info": "Google Assistant Integraatio Home Assistant Cloudille mahdollistaa Home Assistant laitteiden ohjaamisen miltä tahansa Google Assistant laitteelta.",
"info_state_reporting": "Jos otat tilaraportoinnin käyttöön, Home Assistant lähettää kaikki julkistettujen kohteiden tilamuutokset Googlelle. Tämän avulla voit aina nähdä uusimmat tilat Google-sovelluksessa.",
"manage_entities": "Hallitse kohteita", "manage_entities": "Hallitse kohteita",
"security_devices": "Turvalaitteet", "security_devices": "Turvalaitteet",
"sync_entities": "Synkronoi kohteet Googleen", "sync_entities": "Synkronoi kohteet Googleen",
"sync_entities_404_message": "Kohteiden synkronointi Googlelle epäonnistui. Kysy \"Hey Google, sync my devices\" synkronoidaksesi kohteet.",
"title": "Google Assistant" "title": "Google Assistant"
}, },
"integrations": "Integraatiot", "integrations": "Integraatiot",
@@ -1021,6 +1065,7 @@
"thank_you_note": "Kiitos, että olet osa Home Assistant Cloudia. Sinun kaltaisten ihmisten takia pystymme tarjoamaan loistavan kodin automaatiokokemuksen kaikille. Kiitos!", "thank_you_note": "Kiitos, että olet osa Home Assistant Cloudia. Sinun kaltaisten ihmisten takia pystymme tarjoamaan loistavan kodin automaatiokokemuksen kaikille. Kiitos!",
"webhooks": { "webhooks": {
"disable_hook_error_msg": "Webhookin poistaminen epäonnistui:", "disable_hook_error_msg": "Webhookin poistaminen epäonnistui:",
"info": "Kaikille, jotka ovat määritetty käynnistymään webhookin avulla, voidaan antaa julkisesti saatavilla oleba URL jotta voit lähettää tietoja takaisin Home Assistant mistä tahansa, paljastamatta järjestelmääsi Internetiin.",
"link_learn_more": "Lisätietoja webhook-pohjaisten automaatioiden luomisesta.", "link_learn_more": "Lisätietoja webhook-pohjaisten automaatioiden luomisesta.",
"loading": "Ladataan...", "loading": "Ladataan...",
"manage": "Hallitse", "manage": "Hallitse",
@@ -1032,13 +1077,14 @@
} }
}, },
"alexa": { "alexa": {
"banner": "Tämän käyttöliittymän kautta näkyvien kohteiden muokkaaminen on poistettu käytöstä, koska olet määrittänyt kohdesuodattimet kohteessa configuration.yaml.",
"expose": "Julkista Alexalle", "expose": "Julkista Alexalle",
"exposed_entities": "Julkistetut kohteet", "exposed_entities": "Julkistetut kohteet",
"not_exposed_entities": "eJulk", "not_exposed_entities": "eJulk",
"title": "Alexa" "title": "Alexa"
}, },
"caption": "Home Assistant Cloud", "caption": "Home Assistant Cloud",
"description_features": "Ohjaus possa kotoa, käytä Alexaa ja Google Assistentia", "description_features": "Ohjaus poissa kotoa Alexan tai Google Assistantin avulla.",
"description_login": "Kirjautunut sisään {email}", "description_login": "Kirjautunut sisään {email}",
"description_not_login": "Et ole kirjautunut", "description_not_login": "Et ole kirjautunut",
"dialog_certificate": { "dialog_certificate": {
@@ -1069,6 +1115,7 @@
"title": "Unohtuiko salasana?" "title": "Unohtuiko salasana?"
}, },
"google": { "google": {
"banner": "Tämän käyttöliittymän kautta näkyvien kihteiden muokkaaminen on poistettu käytöstä, koska olet määrittänyt kohdesuodattimet kohteessa configuration.yaml.",
"disable_2FA": "Poista kaksivaiheinen tunnistautuminen", "disable_2FA": "Poista kaksivaiheinen tunnistautuminen",
"expose": "Julkista Google Assistantille", "expose": "Julkista Google Assistantille",
"exposed_entities": "Julkistetut kohteet", "exposed_entities": "Julkistetut kohteet",
@@ -1157,13 +1204,16 @@
"attributes_set": "Seuraavat kohteet määritteet asetetaan ohjelmallisesti.", "attributes_set": "Seuraavat kohteet määritteet asetetaan ohjelmallisesti.",
"caption": "Muokkaukset", "caption": "Muokkaukset",
"description": "Muokkaa laitteita", "description": "Muokkaa laitteita",
"different_include": "Mahdollisesti verkkotunnuksen, glob-kaavan tai muun sisällön kautta.",
"pick_attribute": "Valitse yliajettava määrite", "pick_attribute": "Valitse yliajettava määrite",
"picker": { "picker": {
"header": "Räätälöinti", "header": "Räätälöinti",
"introduction": "Muotoile ominaisuuksia olemuskohtaisesti. Lisäykset/muokkaukset tulevat välittömästi voimaan. Poistetut mukautukset tulevat voimaan, kun olemus päivitetään." "introduction": "Muotoile ominaisuuksia olemuskohtaisesti. Lisäykset/muokkaukset tulevat välittömästi voimaan. Poistetut mukautukset tulevat voimaan, kun olemus päivitetään."
}, },
"warning": { "warning": {
"include_link": "sisällytä customize.yaml" "include_link": "sisällytä customize.yaml",
"include_sentence": "Näyttää siltä, että configuration.yaml ei oikein",
"not_applied": "Täällä tehdyt muutokset on kirjoitettu siihen, mutta niitä ei sovelleta kokoonpanon uudelleenlatauksen jälkeen, ellei niitä oteta käyttöön."
} }
}, },
"devices": { "devices": {
@@ -1175,6 +1225,7 @@
"conditions": { "conditions": {
"caption": "Tee jotain vain, jos..." "caption": "Tee jotain vain, jos..."
}, },
"create": "Luo automaatio laitteella",
"no_automations": "Ei automaatioita", "no_automations": "Ei automaatioita",
"no_device_automations": "Tälle laitteelle ei ole käytettävissä automaatioita.", "no_device_automations": "Tälle laitteelle ei ole käytettävissä automaatioita.",
"triggers": { "triggers": {
@@ -1195,7 +1246,7 @@
"no_devices": "Ei laitteita" "no_devices": "Ei laitteita"
}, },
"delete": "Poista", "delete": "Poista",
"description": "Hallitse yhdistettyjä laitteita", "description": "Hallitse yhdistettyjä laitteita.",
"device_not_found": "Laitetta ei löydy.", "device_not_found": "Laitetta ei löydy.",
"entities": { "entities": {
"add_entities_lovelace": "Lisää Lovelace näkymään", "add_entities_lovelace": "Lisää Lovelace näkymään",
@@ -1221,23 +1272,26 @@
"update": "Päivitä" "update": "Päivitä"
}, },
"entities": { "entities": {
"caption": "Olemusrekisteri", "caption": "Kohteet",
"description": "Yleiskuva kaikista tunnetuista entiteeteistä.", "description": "Yleiskuva kaikista tunnetuista entiteeteistä.",
"picker": { "picker": {
"disable_selected": { "disable_selected": {
"button": "Poista valitut käytöstä", "button": "Poista valitut käytöstä",
"confirm_text": "Käytöstä poistettuja kohteita ei lisätä Home Assistantiin." "confirm_text": "Käytöstä poistettuja kohteita ei lisätä Home Assistantiin.",
"confirm_title": "Haluatko poistaa käytöstä {number} kohdetta?"
}, },
"enable_selected": { "enable_selected": {
"button": "Ota valitut käyttöön", "button": "Ota valitut käyttöön",
"confirm_text": "Tämä tekee ne saataville Home Assistantissa, jos ne ovat nyt poistettu käytöstä.",
"confirm_title": "Haluatko ottaa {number} kohdetta käyttöön?" "confirm_title": "Haluatko ottaa {number} kohdetta käyttöön?"
}, },
"filter": { "filter": {
"filter": "Suodatin", "filter": "Suodatin",
"show_disabled": "Näytä käytöstä poistetut kohteet", "show_disabled": "Näytä käytöstä poistetut kohteet",
"show_readonly": "Näytä vain luku -kohteet" "show_readonly": "Näytä vain luku -kohteet",
"show_unavailable": "Näytä ei-käytettävissä olevat kohteet"
}, },
"header": "Olemusrekisteri", "header": "Kohteet",
"headers": { "headers": {
"entity_id": "Kohde ID", "entity_id": "Kohde ID",
"integration": "Integraatio", "integration": "Integraatio",
@@ -1245,14 +1299,15 @@
"status": "Tila" "status": "Tila"
}, },
"introduction": "Home Assistant pitää rekisteriä jokaisesta havaitetusta olemuksesta, joka voidaan yksilöidä. Kullekin näille yksiköille määritetään olemus-ID, varattu juuri tälle yksikölle.", "introduction": "Home Assistant pitää rekisteriä jokaisesta havaitetusta olemuksesta, joka voidaan yksilöidä. Kullekin näille yksiköille määritetään olemus-ID, varattu juuri tälle yksikölle.",
"introduction2": "Yksikkörekisterin avulla voit ohittaa nimeä, muuttaa yksikön tunnusta tai poistaa merkinnän Home Assistantista. Huomaa, että rekisterimerkinnän poistaminen ei poista yksikköä sinäänsä. Sitä voit seuraamalla alla olevaa linkkiä ja poistamalla sitä integrointisivulta.", "introduction2": "Kohderekisterin avulla voit yliajaa nimen, muuttaa sen ID-tunnusta tai poistaa sen Home Assistantista. Huomaa, että rekisterimerkinnän poistaminen ei poista kohdetta.",
"remove_selected": { "remove_selected": {
"button": "Poista valitut", "button": "Poista valitut",
"confirm_partly_text": "Voit poistaa vain {removable} valittujen {selected} entiteetin. Entiteetit voidaan poistaa vain, jos integrointi ei enää tarjoa entiteettejä. Joskus Home Assistant on käynnistettävä uudelleen, ennen kuin voit poistaa poistetun integroinnin entiteetit. Haluatko varmasti poistaa siirrettävät entiteetit?",
"confirm_partly_title": "Vain {number} valittua entiteettiä voidaan poistaa.", "confirm_partly_title": "Vain {number} valittua entiteettiä voidaan poistaa.",
"confirm_text": "Sinun tulisi poistaa ne Lovelace-käyttöliittymästä ja automaatioista, jos ne sisältävät näitä kohteita.", "confirm_text": "Sinun tulisi poistaa ne Lovelace-käyttöliittymästä ja automaatioista, jos ne sisältävät näitä kohteita.",
"confirm_title": "Haluatko poistaa {number} kohdetta?" "confirm_title": "Haluatko poistaa {number} kohdetta?"
}, },
"selected": "{numero} valittuna", "selected": "{number} valittuna",
"status": { "status": {
"disabled": "Poistettu käytöstä", "disabled": "Poistettu käytöstä",
"ok": "Ok", "ok": "Ok",
@@ -1263,12 +1318,15 @@
} }
}, },
"filtering": { "filtering": {
"clear": "Tyhjennä" "clear": "Tyhjennä",
"filtering_by": "Suodatus"
}, },
"header": "Säädä Home Assistanttia", "header": "Säädä Home Assistanttia",
"helpers": { "helpers": {
"caption": "Auttajat",
"description": "Elementit, jotka voivat auttaa rakentamaan automaatioita.",
"dialog": { "dialog": {
"add_helper": "Lisää apustin", "add_helper": "Lisää auttaja",
"add_platform": "Lisää {platform}", "add_platform": "Lisää {platform}",
"create": "Luo" "create": "Luo"
}, },
@@ -1284,18 +1342,22 @@
"types": { "types": {
"input_boolean": "Kytkin", "input_boolean": "Kytkin",
"input_datetime": "Päivämäärä ja/tai kellonaika", "input_datetime": "Päivämäärä ja/tai kellonaika",
"input_select": "Alasvetovalikko" "input_number": "Numero",
"input_select": "Alasvetovalikko",
"input_text": "Teksti"
} }
}, },
"integrations": { "integrations": {
"add_integration": "Lisää integraatio", "add_integration": "Lisää integraatio",
"caption": "Integraatiot", "caption": "Integraatiot",
"config_entry": { "config_entry": {
"area": "Alueessa {alue}", "area": "Alueessa {area}",
"delete": "Poista", "delete": "Poista",
"delete_button": "Poista {integration}", "delete_button": "Poista {integration}",
"delete_confirm": "Haluatko varmasti poistaa tämän integraation?", "delete_confirm": "Haluatko varmasti poistaa tämän integraation?",
"device_unavailable": "laite ei saatavissa", "device_unavailable": "laite ei saatavissa",
"devices": "{count} {count, plural,\n one {laite}\n other {laitteet}\n}",
"entities": "{count} {count, plural,\n one {kohde}\n other {kohteet}\n}",
"entity_unavailable": "kohde ei saatavilla", "entity_unavailable": "kohde ei saatavilla",
"firmware": "Laiteohjelmisto: {version}", "firmware": "Laiteohjelmisto: {version}",
"hub": "Yhdistetty kautta", "hub": "Yhdistetty kautta",
@@ -1306,9 +1368,9 @@
"options": "Asetukset", "options": "Asetukset",
"rename": "Nimeä uudelleen", "rename": "Nimeä uudelleen",
"restart_confirm": "Käynnistä Home Assistant uudellen viimeistelläksesi tämän integraation poistamisen", "restart_confirm": "Käynnistä Home Assistant uudellen viimeistelläksesi tämän integraation poistamisen",
"settings_button": "Muokkaa {Integration}-asetuksia", "settings_button": "Muokkaa {integration}-asetuksia",
"system_options": "Järjestelmäasetukset", "system_options": "Järjestelmäasetukset",
"system_options_button": "{Integration}-järjestelmän asetukset" "system_options_button": "{integration}-järjestelmän asetukset"
}, },
"config_flow": { "config_flow": {
"aborted": "Keskeytetty", "aborted": "Keskeytetty",
@@ -1332,6 +1394,10 @@
"discovered": "Löydetty", "discovered": "Löydetty",
"home_assistant_website": "Home Assistant sivusto", "home_assistant_website": "Home Assistant sivusto",
"ignore": { "ignore": {
"confirm_delete_ignore": "Tämä saa integroinnin näkymään löydetyissä integroinneissa uudelleen, kun se löydetään. Tämä saattaa vaatia uudelleenkäynnistyksen tai kestää jonkin aikaa.",
"confirm_delete_ignore_title": "Lopeta integraation {name} ohittaminen?",
"confirm_ignore": "Oletko varma, ettet halua määrittää tätä integrointia? Voit kumota tämän napsauttamalla oikeassa yläkulmassa olevasta valikosta \"Näytä ohitetut integroinnit\".",
"confirm_ignore_title": "Ohitetaanko kohteen {name} etsintä?",
"hide_ignored": "Piilota ohitetut integraatiot", "hide_ignored": "Piilota ohitetut integraatiot",
"ignore": "Ohita", "ignore": "Ohita",
"ignored": "Ohitettu", "ignored": "Ohitettu",
@@ -1341,7 +1407,10 @@
"integration": "integraatio", "integration": "integraatio",
"integration_not_found": "Integraatiota ei löydy.", "integration_not_found": "Integraatiota ei löydy.",
"new": "Määritä uusi integraatio", "new": "Määritä uusi integraatio",
"no_integrations": "Näyttää ettei yhtään integraatiota ole määritetty. Lisää ensimmäinen integraatio klikkaamalla painiketta alhaalta!",
"none": "Mitään ei ole vielä määritetty", "none": "Mitään ei ole vielä määritetty",
"none_found": "Integraatioita ei löytynyt",
"none_found_detail": "Muokkaa haku ehtojasi",
"note_about_integrations": "Kaikkia integraatioita ei voi vielä määrittää käyttöliittymän kautta.", "note_about_integrations": "Kaikkia integraatioita ei voi vielä määrittää käyttöliittymän kautta.",
"note_about_website_reference": "Lisää saatavilla", "note_about_website_reference": "Lisää saatavilla",
"rename_dialog": "Muokkaa tämän määritysmerkinnän nimeä", "rename_dialog": "Muokkaa tämän määritysmerkinnän nimeä",
@@ -1351,6 +1420,7 @@
"lovelace": { "lovelace": {
"caption": "Lovelace-kojelaudat", "caption": "Lovelace-kojelaudat",
"dashboards": { "dashboards": {
"cant_edit_default": "Lovelace-koontinäyttöä ei voi muokata käyttöliittymästä. Voit piilottaa sen määrittämällä toisen koontinäytön oletukseksi.",
"cant_edit_yaml": "YAML-tiedostossa määritettyjä kojelautoja ei voi muokata käyttöliittymästä. Muuta niitä tiedostossa configuration.yaml.", "cant_edit_yaml": "YAML-tiedostossa määritettyjä kojelautoja ei voi muokata käyttöliittymästä. Muuta niitä tiedostossa configuration.yaml.",
"caption": "Kojelaudat", "caption": "Kojelaudat",
"conf_mode": { "conf_mode": {
@@ -1414,7 +1484,7 @@
}, },
"no_resources": "Ei resursseja" "no_resources": "Ei resursseja"
}, },
"refresh_body": "Sinun on päivitettävä sivu suorittaaksesi poiston loppuun. Haluatko päivittää nyt?", "refresh_body": "Sinun on päivitettävä sivu suorittaaksesi poisto loppuun. Haluatko päivittää nyt?",
"refresh_header": "Haluatko päivittää?", "refresh_header": "Haluatko päivittää?",
"types": { "types": {
"css": "Tyylitiedosto", "css": "Tyylitiedosto",
@@ -1447,7 +1517,8 @@
"update": "Päivitä" "update": "Päivitä"
}, },
"introduction": "Täällä voit määritellä jokaisen kiinnostavan henkilön Home Assistantissa.", "introduction": "Täällä voit määritellä jokaisen kiinnostavan henkilön Home Assistantissa.",
"no_persons_created_yet": "Näyttää siltä, ettet ole vielä luonut yhtään henkilöä." "no_persons_created_yet": "Näyttää siltä, ettet ole vielä luonut yhtään henkilöä.",
"note_about_persons_configured_in_yaml": "Huomaa: configuration.yaml-tiedoston kautta määritettyjä henkilöitä ei voi muokata käyttöliittymän kautta."
}, },
"scene": { "scene": {
"activated": "Aktivoitu tilanne {name}.", "activated": "Aktivoitu tilanne {name}.",
@@ -1466,7 +1537,7 @@
"delete": "Poista kohde", "delete": "Poista kohde",
"device_entities": "Jos lisäät kohteen, joka kuuluu laitteeseen, laite lisätään.", "device_entities": "Jos lisäät kohteen, joka kuuluu laitteeseen, laite lisätään.",
"header": "Kohteet", "header": "Kohteet",
"introduction": "Kohteet jotka eivät kuulu laitteisiin voidaan asettaa täällä.", "introduction": "Kohteet, jotka eivät kuulu laitteisiin, voidaan asettaa täällä.",
"without_device": "Kohteet ilman laitetta" "without_device": "Kohteet ilman laitetta"
}, },
"introduction": "Käytä tilanteita herättääksesi kotisi eloon.", "introduction": "Käytä tilanteita herättääksesi kotisi eloon.",
@@ -1578,6 +1649,7 @@
"name": "Nimi", "name": "Nimi",
"owner": "Omistaja", "owner": "Omistaja",
"system_generated": "Järjestelmän luoma", "system_generated": "Järjestelmän luoma",
"system_generated_users_not_editable": "Järjestelmän luomia käyttäjiä ei voi päivittää.",
"system_generated_users_not_removable": "Järjestelmän luomia käyttäjiä ei voi poistaa.", "system_generated_users_not_removable": "Järjestelmän luomia käyttäjiä ei voi poistaa.",
"unnamed_user": "Nimeämätön käyttäjä", "unnamed_user": "Nimeämätön käyttäjä",
"update_user": "Päivitä" "update_user": "Päivitä"
@@ -1608,6 +1680,7 @@
"header": "Klusterin määritteet", "header": "Klusterin määritteet",
"help_attribute_dropdown": "Valitse määrite, jonka arvoa haluat tarkastella tai määrittää.", "help_attribute_dropdown": "Valitse määrite, jonka arvoa haluat tarkastella tai määrittää.",
"help_get_zigbee_attribute": "Hae valitun määritteen arvo.", "help_get_zigbee_attribute": "Hae valitun määritteen arvo.",
"help_set_zigbee_attribute": "Määritä määritetyn kohteen määritetyn klusterin määritteen arvo.",
"introduction": "Tarkastele ja muokkaa klusterimääritteitä.", "introduction": "Tarkastele ja muokkaa klusterimääritteitä.",
"set_zigbee_attribute": "Aseta Zigbee-ominaisuus" "set_zigbee_attribute": "Aseta Zigbee-ominaisuus"
}, },
@@ -1635,11 +1708,14 @@
"header": "Zigbee-kotiautomaatio - laite" "header": "Zigbee-kotiautomaatio - laite"
}, },
"group_binding": { "group_binding": {
"bind_button_help": "Sido valittu ryhmä valittuihin laiteklustereihin.",
"bind_button_label": "Sido ryhmä", "bind_button_label": "Sido ryhmä",
"cluster_selection_help": "Valitse valittuun ryhmään sidottavat klusterit.",
"group_picker_help": "Valitse ryhmä, jos haluat antaa sidontakomennon.", "group_picker_help": "Valitse ryhmä, jos haluat antaa sidontakomennon.",
"group_picker_label": "Sidottavat ryhmät", "group_picker_label": "Sidottavat ryhmät",
"header": "Ryhmäsidonta", "header": "Ryhmäsidonta",
"introduction": "Sido ja pura ryhmiä", "introduction": "Sido ja pura ryhmiä",
"unbind_button_help": "Pura valitun ryhmän sidonta valituista laiteklustereista.",
"unbind_button_label": "Pura ryhmän sidonta" "unbind_button_label": "Pura ryhmän sidonta"
}, },
"groups": { "groups": {
@@ -1678,6 +1754,8 @@
"node_management": { "node_management": {
"header": "Laitehallinta", "header": "Laitehallinta",
"help_node_dropdown": "Valitse laite tarkastellaksesi laitekohtaisia vaihtoehtoja.", "help_node_dropdown": "Valitse laite tarkastellaksesi laitekohtaisia vaihtoehtoja.",
"hint_battery_devices": "Huomautus: Nukkuvien (akkukäyttöisten) laitteiden on oltava hereillä, kun niitä vastaan suoritetaan komentoja. Voit yleensä herättää uneliaan laitteen käynnistämällä sen.",
"hint_wakeup": "Joissakin laitteissa, kuten Xiaomi-antureissa, on herätyspainike, jota voit painaa 5 sekunnin välein, jotka pitävät laitteet hereillä, kun olet vuorovaikutuksessa niiden kanssa.",
"introduction": "Suorita ZHA-komennot, jotka vaikuttavat yhteen laitteeseen. Valitse laite nähdäksesi luettelon käytettävissä olevista komennoista." "introduction": "Suorita ZHA-komennot, jotka vaikuttavat yhteen laitteeseen. Valitse laite nähdäksesi luettelon käytettävissä olevista komennoista."
}, },
"title": "Zigbee-kotiautomaatio" "title": "Zigbee-kotiautomaatio"
@@ -1685,6 +1763,7 @@
"zone": { "zone": {
"add_zone": "Lisää vyöhyke", "add_zone": "Lisää vyöhyke",
"caption": "Alueet", "caption": "Alueet",
"configured_in_yaml": "Configuration.yaml-tiedoston kautta määritettyjä vyöhykkeitä ei voi muokata käyttöliittymän kautta.",
"confirm_delete": "Haluatko varmasti poistaa tämän vyöhykkeen?", "confirm_delete": "Haluatko varmasti poistaa tämän vyöhykkeen?",
"create_zone": "Luo alue", "create_zone": "Luo alue",
"description": "Hallitse vyöhykkeitä, joissa haluat seurata ihmisiä.", "description": "Hallitse vyöhykkeitä, joissa haluat seurata ihmisiä.",
@@ -1703,7 +1782,10 @@
"required_error_msg": "Tämä kenttä on pakollinen", "required_error_msg": "Tämä kenttä on pakollinen",
"update": "Päivitä" "update": "Päivitä"
}, },
"edit_home_zone": "Voit asettaa kotisi sijainnin kohdasta Asetukset>Yleinen.", "edit_home_zone": "Kotivyöhykkeen sädettä ei voi vielä määrittää käyttöliittymästä. Raahaa merkkiä kartalla muuttaaksesi kotivyöhykettä.",
"edit_home_zone_narrow": "Kotivyöhykkeen sädettä ei voi vielä muokata käyttöliittymästä. Paikka voidaan muuttaa yleisestä konfiguraatiosta.",
"go_to_core_config": "Siirry yleisiin asetuksiin?",
"home_zone_core_config": "Kotivyöhykkeen sijaintia voi muokata yleiset asetukset-sivulta. Koti-alueen sädettä ei voi vielä muokata Frontendistä. Haluatko siirtyä yleisiin asetuksiin?",
"introduction": "Vyöhykkeiden avulla voit määrittää alueita maan päällä. Kun henkilö on vyöhykkeellä, tila saa vyöhykkeen nimen. Vyöhykkeitä voidaan käyttää myös laukaisimina tai ehtoina automaatioissa.", "introduction": "Vyöhykkeiden avulla voit määrittää alueita maan päällä. Kun henkilö on vyöhykkeellä, tila saa vyöhykkeen nimen. Vyöhykkeitä voidaan käyttää myös laukaisimina tai ehtoina automaatioissa.",
"no_zones_created_yet": "Näyttää siltä, että et ole vielä luonut vyöhykkeitä." "no_zones_created_yet": "Näyttää siltä, että et ole vielä luonut vyöhykkeitä."
}, },
@@ -1761,6 +1843,13 @@
} }
} }
}, },
"custom": {
"external_panel": {
"complete_access": "Se voi käyttää kaikkia Home Assistantin tietoja.",
"hide_message": "Tarkista panel_custom-komponentin dokumentaatio piilottaaksesi tämän viestin",
"question_trust": "Luotatko ulkoiseen paneeliin {name} osoitteessa {link} ?"
}
},
"developer-tools": { "developer-tools": {
"tabs": { "tabs": {
"events": { "events": {
@@ -1790,8 +1879,10 @@
"home_assistant_logo": "Home Assistant-logo", "home_assistant_logo": "Home Assistant-logo",
"icons_by": "Kuvakkeet luonut", "icons_by": "Kuvakkeet luonut",
"license": "Julkaistu Apache 2.0-lisenssillä", "license": "Julkaistu Apache 2.0-lisenssillä",
"path_configuration": "Polku configuration.yaml-tiedostoon: {path}",
"server": "palvelin", "server": "palvelin",
"source": "Lähde:", "source": "Lähde:",
"system_health_error": "Järjestelmän kunto-komponenttia ei ole ladattu. Lisää 'system_health:' kohteeseen configuration.yaml",
"title": "Tiedot" "title": "Tiedot"
}, },
"logs": { "logs": {
@@ -1799,6 +1890,7 @@
"details": "Lokitiedot ( {level} )", "details": "Lokitiedot ( {level} )",
"load_full_log": "Lataa Home Assistantin koko loki", "load_full_log": "Lataa Home Assistantin koko loki",
"loading_log": "Ladataan virhelokia...", "loading_log": "Ladataan virhelokia...",
"multiple_messages": "Viesti esiintyi ensimmäisen kerran {time} ja tämän jälkeen {counter} kertaa",
"no_errors": "Virheitä ei ole ilmoitettu.", "no_errors": "Virheitä ei ole ilmoitettu.",
"no_issues": "Ei uusia aiheita!", "no_issues": "Ei uusia aiheita!",
"refresh": "Päivitä", "refresh": "Päivitä",
@@ -1824,6 +1916,7 @@
"column_example": "Esimerkki", "column_example": "Esimerkki",
"column_parameter": "Parametri", "column_parameter": "Parametri",
"data": "Palvelutiedot (YAML, valinnainen)", "data": "Palvelutiedot (YAML, valinnainen)",
"description": "Service dev -työkalun avulla voit kutsua mitMitä tahansa käytettävissä olevaan palvelua Home Assistant -sovelluksessa.",
"fill_example_data": "Täytä esimerkkitiedoilla", "fill_example_data": "Täytä esimerkkitiedoilla",
"no_description": "Kuvausta ei ole saatavilla", "no_description": "Kuvausta ei ole saatavilla",
"no_parameters": "Tämä palvelu ei ota parametreja.", "no_parameters": "Tämä palvelu ei ota parametreja.",
@@ -1831,8 +1924,11 @@
"title": "Palvelut" "title": "Palvelut"
}, },
"states": { "states": {
"alert_entity_field": "Kohde on pakollinen kenttä",
"attributes": "Määritteet", "attributes": "Määritteet",
"current_entities": "Nykyiset kohteet", "current_entities": "Nykyiset kohteet",
"description1": "Aseta laitteen esitys Home Assistant -sovelluksessa.",
"description2": "Tämä ei kommunikoi varsinaisen laitteen kanssa.",
"entity": "Kohde", "entity": "Kohde",
"filter_attributes": "Suodata määritteitä", "filter_attributes": "Suodata määritteitä",
"filter_entities": "Suodata kohteita", "filter_entities": "Suodata kohteita",
@@ -1841,11 +1937,16 @@
"no_entities": "Ei kohteita", "no_entities": "Ei kohteita",
"set_state": "Aseta tila", "set_state": "Aseta tila",
"state": "Tila", "state": "Tila",
"state_attributes": "Tilamääritteet (YAML, valinnainen)",
"title": "Tilat" "title": "Tilat"
}, },
"templates": { "templates": {
"description": "Mallit tehdään Jinja2-mallimoottorilla, joissa on joitain Home Assistant -kohtaisia laajennuksia.",
"editor": "Mallieditori", "editor": "Mallieditori",
"title": "Malli" "jinja_documentation": "Jinja2-mallin dokumentaatio",
"template_extensions": "Home Assistant -mallilaajennukset",
"title": "Malli",
"unknown_error_template": "Tuntematon virhe mallin renderöinnissa"
} }
} }
}, },
@@ -1884,6 +1985,7 @@
"url": "Avaa ikkuna {url_path}" "url": "Avaa ikkuna {url_path}"
}, },
"safe-mode": { "safe-mode": {
"description": "Home Assistant joutui vaikeuksiin kokoonpanoa ladattaessa, ja se on nyt käynnissä vikasietotilassa. Katso virhelokistua mikä meni pieleen.",
"header": "Vikasietotila aktivoitu" "header": "Vikasietotila aktivoitu"
}, },
"shopping-list": { "shopping-list": {
@@ -1900,16 +2002,20 @@
"card": { "card": {
"alarm-panel": { "alarm-panel": {
"available_states": "Käytettävissä olevat tilat", "available_states": "Käytettävissä olevat tilat",
"description": "Hälytyspaneelikortin kortin avulla voit virittää ja purkaa hälytyksen ohjauspaneelin integrointeja.",
"name": "Hälytyspaneeli" "name": "Hälytyspaneeli"
}, },
"button": { "button": {
"description": "Painikekortti antaa sinun lisätä painikkeita tehtävien suorittamiseen.",
"name": "Painike" "name": "Painike"
}, },
"conditional": { "conditional": {
"card": "Kortti", "card": "Kortti",
"change_type": "Muuta tyyppiä", "change_type": "Muuta tyyppiä",
"condition_explanation": "Kortti näytetään, kun kaikki alla olevat ehdot täyttyvät.",
"conditions": "Ehdot", "conditions": "Ehdot",
"current_state": "Nykyinen", "current_state": "Nykyinen",
"description": "Ehdollinen kortti näyttää toisen kortin kohteen tilan perusteella.",
"name": "Ehdollinen", "name": "Ehdollinen",
"state_equal": "Tila on yhtä suuri kuin", "state_equal": "Tila on yhtä suuri kuin",
"state_not_equal": "Tila ei ole yhtä suuri kuin" "state_not_equal": "Tila ei ole yhtä suuri kuin"
@@ -1919,13 +2025,17 @@
"required": "Vaadittu" "required": "Vaadittu"
}, },
"entities": { "entities": {
"description": "Kohde-kortti on yleisin korttityyppi. Se ryhmittelee kohteet yhteen luetteloiksi.",
"name": "Kohteet", "name": "Kohteet",
"show_header_toggle": "Näytä otsikkokytkin?" "show_header_toggle": "Näytä otsikkokytkin?",
"toggle": "Ota kohteet käyttöön tai poista käytöstä"
}, },
"entity-filter": { "entity-filter": {
"description": "Kohdesuodatin-kortin avulla voit määrittää luettelon kohteista, joita haluat seurata vain tietyssä tilassa.",
"name": "Kohteen suodatus" "name": "Kohteen suodatus"
}, },
"entity": { "entity": {
"description": "Kohdekortti antaa sinulle nopean yleiskatsauksen kohteen tilasta.",
"name": "Kohde" "name": "Kohde"
}, },
"gauge": { "gauge": {
@@ -1952,6 +2062,7 @@
"icon_height": "Kuvakkeen korkeus", "icon_height": "Kuvakkeen korkeus",
"image": "Kuvan polku", "image": "Kuvan polku",
"manual": "Manuaalinen", "manual": "Manuaalinen",
"manual_description": "Haluatko lisätä mukautetun kortin tai vain kirjoittaa YAML:in manuaalisesti?",
"maximum": "Enimmäismäärä", "maximum": "Enimmäismäärä",
"minimum": "Vähimmäismäärä", "minimum": "Vähimmäismäärä",
"name": "Nimi", "name": "Nimi",
@@ -1969,18 +2080,23 @@
}, },
"glance": { "glance": {
"columns": "Sarakkeet", "columns": "Sarakkeet",
"description": "Glance-kortti on hyödyllinen useiden anturien ryhmittelemiseksi kompaktiin yleiskuvaan.",
"name": "Pikavilkaisu" "name": "Pikavilkaisu"
}, },
"history-graph": { "history-graph": {
"description": "Historiakaavio-kortin avulla voit näyttää kaavion kullekin luettelossa olevalle kohteelle.",
"name": "Historiakuvaaja" "name": "Historiakuvaaja"
}, },
"horizontal-stack": { "horizontal-stack": {
"description": "Vaakapinokortin avulla voit pinota yhteen useita kortteja, jolloin ne ovat aina vierekkäin yhden sarakkeen tilassa.",
"name": "Vaakapino" "name": "Vaakapino"
}, },
"iframe": { "iframe": {
"description": "Verkkosivukortin avulla voit upottaa suosikkiverkkosivusi suoraan Home Assistantiin.",
"name": "iFrame" "name": "iFrame"
}, },
"light": { "light": {
"description": "Valokortti antaa sinun muuttaa valon kirkkautta.",
"name": "Valo" "name": "Valo"
}, },
"map": { "map": {
@@ -1998,38 +2114,50 @@
"name": "Merkintä" "name": "Merkintä"
}, },
"media-control": { "media-control": {
"description": "Media Control -korttia käytetään mediasoittimen näyttämiseen käyttöliittymässä, jossa on helppokäyttöiset ohjaimet.",
"name": "Mediaohjaus" "name": "Mediaohjaus"
}, },
"picture-elements": { "picture-elements": {
"description": "Picture Elements -kortti on yksi monipuolisimmista korttityypeistä. Korttien avulla voit sijoittaa kuvakkeita tai tekstiä ja jopa palveluja! Koordinaatteihin perustuvassa kuvassa.",
"name": "Kuvaelementit" "name": "Kuvaelementit"
}, },
"picture-entity": { "picture-entity": {
"description": "Kuvakohde -kortti näyttää kohteen kuvan muodossa. URL-osoitteesta saatujen kuvien sijasta se voi myös näyttää kameran kuvan.",
"name": "Kuvakohde" "name": "Kuvakohde"
}, },
"picture-glance": { "picture-glance": {
"description": "Picture Glance -kortissa näkyy kuva ja vastaava kohde näkyy kuvakkeena. Oikealla puolella olevat kohteet sallivat vaihtotoiminnot, toiset näyttävät enemmän tietoja -valintaikkunan.",
"name": "Kuva pikavilkaisu" "name": "Kuva pikavilkaisu"
}, },
"picture": { "picture": {
"description": "Kuvakortti antaa sinun asettaa kuvan, jota käytetään navigointiin käyttöliittymän eri poluille tai palvelun suorittamiseen.",
"name": "Kuva" "name": "Kuva"
}, },
"plant-status": { "plant-status": {
"description": "Kasvien tila -kortti on tarkoitettu kaikille siellä oleville ihanille kotikasvitieteilijöille.",
"name": "Kasvin tila" "name": "Kasvin tila"
}, },
"sensor": { "sensor": {
"description": "Anturikortti antaa sinulle nopean yleiskatsauksen antureiden tilasta valinnaisella kaaviolla, joka kuvaa muutosta ajan myötä.",
"graph_detail": "Kaavion tiedot", "graph_detail": "Kaavion tiedot",
"graph_type": "Kaavion tyyppi", "graph_type": "Kaavion tyyppi",
"name": "Sensori" "name": "Sensori"
}, },
"shopping-list": { "shopping-list": {
"description": "Ostolistakortti antaa sinun lisätä, muokata, tarkistaa ja tyhjentää kohteita ostoslistaltasi.",
"integration_not_loaded": "Tämä kortti vaatii `shopping_list` -integraation ottamisen käyttöön.",
"name": "Ostoslista" "name": "Ostoslista"
}, },
"thermostat": { "thermostat": {
"description": "Termostaatti-kortti antaa sinun hallita ilmastokohteita. Voit muuttaa kohteen lämpötilaa ja toimintaa.",
"name": "Termostaatti" "name": "Termostaatti"
}, },
"vertical-stack": { "vertical-stack": {
"description": "Pystypino-kortti antaa sinun ryhmitellä useita kortteja niin, että ne ovat aina samassa sarakkeessa.",
"name": "Pystypino" "name": "Pystypino"
}, },
"weather-forecast": { "weather-forecast": {
"description": "Sääennustekortti näyttää säätiedot. Erittäin hyödyllinen sisällyttää käyttöliittymiin, joita ihmiset näkevät seinällä.",
"name": "Sääennuste" "name": "Sääennuste"
} }
}, },
@@ -2046,6 +2174,7 @@
"move": "Siirrä", "move": "Siirrä",
"options": "Lisää vaihtoehtoja", "options": "Lisää vaihtoehtoja",
"pick_card": "Valitse kortti jonka haluat lisätä", "pick_card": "Valitse kortti jonka haluat lisätä",
"pick_card_view_title": "Minkä kortin haluat lisätä {name} -näkymääsi?",
"show_code_editor": "Näytä koodieditori", "show_code_editor": "Näytä koodieditori",
"show_visual_editor": "Näytä visuaalinen editori", "show_visual_editor": "Näytä visuaalinen editori",
"toggle_editor": "Vaihda editori" "toggle_editor": "Vaihda editori"
@@ -2060,12 +2189,15 @@
"delete": "Poista näkymä", "delete": "Poista näkymä",
"edit": "Muokkaa näkymää", "edit": "Muokkaa näkymää",
"header": "Näytä asetukset", "header": "Näytä asetukset",
"header_name": "{nimi} Näytä asetukset", "header_name": "{name} Näytä asetukset",
"move_left": "Siirrä näkymää vasemmalle", "move_left": "Siirrä näkymää vasemmalle",
"move_right": "Siirrä näkymää oikealle", "move_right": "Siirrä näkymää oikealle",
"tab_badges": "Merkit", "tab_badges": "Merkit",
"tab_settings": "Asetukset", "tab_settings": "Asetukset",
"tab_visibility": "Näkyvyys" "tab_visibility": "Näkyvyys",
"visibility": {
"select_users": "Valitse ketkä käyttäjät näkevät tämän näkymän navigoinnissa"
}
}, },
"header": "Muokkaa käyttöliittymää", "header": "Muokkaa käyttöliittymää",
"menu": { "menu": {
@@ -2088,6 +2220,7 @@
"error_remove": "Asetusta ei voida poistaa: {error}", "error_remove": "Asetusta ei voida poistaa: {error}",
"error_save_yaml": "YAML-tiedostoa ei voi tallentaa: {error}", "error_save_yaml": "YAML-tiedostoa ei voi tallentaa: {error}",
"header": "Muokkaa asetuksia", "header": "Muokkaa asetuksia",
"resources_moved": "Resursseja ei enää lisätä Lovelace-kokoonpanoon, mutta ne voidaan lisätä Lovelace config -paneeliin.",
"save": "Tallenna", "save": "Tallenna",
"saved": "Tallennettu", "saved": "Tallennettu",
"unsaved_changes": "Tallentamattomat muutokset" "unsaved_changes": "Tallentamattomat muutokset"
@@ -2100,7 +2233,9 @@
"para": "Oletuksena Home Assistant ylläpitää käyttöliittymääsi, päivittäen sitä uusien yksiköiden tai Lovelace komponenttien tullessa saataville. Jos muokkaat käyttöliittymääsi, emme enää tee muutoksia automaattisesti.", "para": "Oletuksena Home Assistant ylläpitää käyttöliittymääsi, päivittäen sitä uusien yksiköiden tai Lovelace komponenttien tullessa saataville. Jos muokkaat käyttöliittymääsi, emme enää tee muutoksia automaattisesti.",
"para_sure": "Oletko varma, että haluat ottaa haltuun käyttöliittymän?", "para_sure": "Oletko varma, että haluat ottaa haltuun käyttöliittymän?",
"save": "Ota hallintaan", "save": "Ota hallintaan",
"yaml_mode": "Käytät YAML-tilaa, mikä tarkoittaa, että et voi muuttaa Lovelace-kokoonpanoa käyttöliittymästä. Jos haluat muuttaa Lovelace-sovellusta käyttöliittymästä, poista 'mode: yaml' Lovelace-määrityksestäsi tiedostossa 'configuration.yaml'." "yaml_config": "Tämän aloittamisen helpottamiseksi on tämä hallintapaneelin nykyinen kokoonpano:",
"yaml_control": "Jos haluat hallita YAML-tilaa, luo YAML-tiedosto, jonka nimi on määritetty tämän kojelaudan kokoonpanossa, tai oletusarvoinen 'ui-lovelace.yaml'.",
"yaml_mode": "Käytät YAML-tilaa, mikä tarkoittaa, että et voi muuttaa Lovelace-asetuksia käyttöliittymästä. Jos haluat muuttaa Lovelacea käyttöliittymästä, poista 'mode: yaml' Lovelace-määrityksestäsi tiedostossa 'configuration.yaml'."
}, },
"suggest_card": { "suggest_card": {
"add": "Lisää Lovelace-käyttöliittymään", "add": "Lisää Lovelace-käyttöliittymään",
@@ -2109,7 +2244,9 @@
}, },
"view": { "view": {
"panel_mode": { "panel_mode": {
"title": "Paneelitila?" "description": "Tämä renderöi ensimmäisen kortin täydellä leveydellä. Muita kortteja tässä näkymässä ei näytetä.",
"title": "Paneelitila?",
"warning_multiple_cards": "Tämä näkymä sisältää useamman kuin yhden kortin, paneelinäkymä tukee vain yhtä korttia."
} }
} }
}, },
@@ -2118,10 +2255,12 @@
"configure_ui": "Määrittele käyttöliittymä", "configure_ui": "Määrittele käyttöliittymä",
"exit_edit_mode": "Poistu käyttöliittymän muokkaustilasta", "exit_edit_mode": "Poistu käyttöliittymän muokkaustilasta",
"help": "Apua", "help": "Apua",
"refresh": "Päivitä" "refresh": "Päivitä",
"reload_resources": "Lataa resurssit uudelleen"
}, },
"reload_lovelace": "Lataa Lovelace uudelleen", "reload_lovelace": "Lataa Lovelace uudelleen",
"reload_resources": { "reload_resources": {
"refresh_body": "Sinun täytyy päivittää sivu viimeistelläksesi uudelleenlatauksen, haluatko päivittää nyt?",
"refresh_header": "Haluatko päivittää?" "refresh_header": "Haluatko päivittää?"
}, },
"unused_entities": { "unused_entities": {
@@ -2130,14 +2269,17 @@
"entity": "Kohde", "entity": "Kohde",
"entity_id": "Kohde ID", "entity_id": "Kohde ID",
"last_changed": "Viimeksi muutettu", "last_changed": "Viimeksi muutettu",
"select_to_add": "Valitse kohteet, jotka haluat lisätä korttiin, ja napsauta sitten Lisää kortti -painiketta.",
"title": "Käyttämättömät entiteetit" "title": "Käyttämättömät entiteetit"
}, },
"views": { "views": {
"confirm_delete": "Oletko varma, että haluat poistaa tämän näkymän?", "confirm_delete": "Oletko varma, että haluat poistaa tämän näkymän?",
"confirm_delete_existing_cards": "Tämän näkymän poistaminen poistaa myös kortit", "confirm_delete_existing_cards": "Tämän näkymän poistaminen poistaa myös kortit",
"confirm_delete_existing_cards_text": "Haluatko varmasti poistaa näkymän {name}? Näkymä sisältää {number}-kortteja, jotka poistetaan. Tätä toimintoa ei voi kumota.",
"confirm_delete_text": "Haluatko varmasti poistaa '{name}' -näkymäsi?" "confirm_delete_text": "Haluatko varmasti poistaa '{name}' -näkymäsi?"
}, },
"warning": { "warning": {
"attribute_not_found": "Määrite {attribute} ei ole käytettävissä kohteessa {entity}",
"entity_non_numeric": "Yksikkö ei ole numeerinen: {entity}", "entity_non_numeric": "Yksikkö ei ole numeerinen: {entity}",
"entity_not_found": "Yksikkö ei ole käytettävissä: {entity}", "entity_not_found": "Yksikkö ei ole käytettävissä: {entity}",
"entity_unavailable": "{entity} ei ole tällä hetkellä käytettävissä" "entity_unavailable": "{entity} ei ole tällä hetkellä käytettävissä"
@@ -2279,6 +2421,7 @@
"mirror": "Peili", "mirror": "Peili",
"patio": "Terassi", "patio": "Terassi",
"right": "Oikea", "right": "Oikea",
"temperature_study": "Lämpötilaoppi",
"upstairs": "Yläkerta" "upstairs": "Yläkerta"
}, },
"unit": { "unit": {

View File

@@ -206,6 +206,8 @@
"stopped": "Arrêté" "stopped": "Arrêté"
}, },
"default": { "default": {
"off": "Off",
"on": "On",
"unavailable": "Indisponible", "unavailable": "Indisponible",
"unknown": "Inconnu" "unknown": "Inconnu"
}, },
@@ -471,11 +473,15 @@
} }
}, },
"common": { "common": {
"and": "et",
"cancel": "Annuler", "cancel": "Annuler",
"close": "Fermer", "close": "Fermer",
"delete": "Supprimer", "delete": "Supprimer",
"loading": "Chargement", "loading": "Chargement",
"next": "Suivant",
"no": "Non", "no": "Non",
"previous": "Précédent",
"refresh": "Rafraîchir",
"save": "Enregistrer", "save": "Enregistrer",
"successfully_deleted": "Supprimé avec succès", "successfully_deleted": "Supprimé avec succès",
"successfully_saved": "Enregistré avec succès", "successfully_saved": "Enregistré avec succès",
@@ -526,11 +532,11 @@
}, },
"relative_time": { "relative_time": {
"duration": { "duration": {
"day": "{count} {count, plural,\none {jour}\nother {jours}\n}", "day": "{count} {count, plural,\nzero {jour}\none {jour}\nother {jours}\n}",
"hour": "{count} {count, plural,\none {heure}\nother {heures}\n}", "hour": "{count} {count, plural,\nzero {heure}\none {heure}\nother {heures}\n}",
"minute": "{count} {count, plural,\none {minute}\nother {minutes}\n}", "minute": "{count} {count, plural,\nzero {minute}\none {minute}\nother {minutes}\n}",
"second": "{count} {count, plural,\none {seconde}\nother {secondes}\n}", "second": "{count} {count, plural,\nzero {seconde}\none {seconde}\nother {secondes}\n}",
"week": "{count} {count, plural,\none {semaine}\nother {semaines}\n}" "week": "{count} {count, plural,\nzero {semaine}\none {semaine}\nother {semaines}\n}"
}, },
"future": "Dans {time}", "future": "Dans {time}",
"never": "Jamais", "never": "Jamais",
@@ -655,8 +661,13 @@
} }
}, },
"mqtt_device_debug_info": { "mqtt_device_debug_info": {
"deserialize": "Tentative d'analyse des messages MQTT en tant que JSON",
"entities": "Entités", "entities": "Entités",
"no_entities": "Aucune entité", "no_entities": "Aucune entité",
"no_triggers": "Pas de déclencheur",
"payload_display": "Affichage de la charge utile",
"recent_messages": "{n} dernier(s) message(s) reçu(s)",
"show_as_yaml": "Afficher en tant que YAML",
"title": "{device} informations de débogage", "title": "{device} informations de débogage",
"triggers": "Déclencheurs" "triggers": "Déclencheurs"
}, },
@@ -707,11 +718,11 @@
} }
}, },
"duration": { "duration": {
"day": "{count} {count, plural,\none {jour}\nother {jours}\n}", "day": "{count} {count, plural,\nzero {jour}\none {jour}\nother {jours}\n}",
"hour": "{count} {count, plural,\none {heure}\nother {heures}\n}", "hour": "{count} {count, plural,\nzero {heure}\none {heure}\nother {heures}\n}",
"minute": "{count} {count, plural,\none {minute}\nother {minutes}\n}", "minute": "{count} {count, plural,\nzero {minute}\none {minute}\nother {minutes}\n}",
"second": "{count} {count, plural,\none {seconde}\nother {secondes}\n}", "second": "{count} {count, plural,\nzero {seconde}\none {seconde}\nother {secondes}\n}",
"week": "{count} {count, plural,\none {semaine}\nother {semaines}\n}" "week": "{count} {count, plural,\nzero {semaine}\none {semaine}\nother {semaines}\n}"
}, },
"login-form": { "login-form": {
"log_in": "Connexion", "log_in": "Connexion",
@@ -730,6 +741,10 @@
"triggered": "{name} déclenché" "triggered": "{name} déclenché"
}, },
"panel": { "panel": {
"calendar": {
"my_calendars": "Mes calendriers",
"today": "Aujourd'hui"
},
"config": { "config": {
"advanced_mode": { "advanced_mode": {
"hint_enable": "Options de configuration manquantes? Activer le mode avancé", "hint_enable": "Options de configuration manquantes? Activer le mode avancé",
@@ -832,6 +847,9 @@
}, },
"label": "Appareil" "label": "Appareil"
}, },
"not": {
"label": "Pas"
},
"numeric_state": { "numeric_state": {
"above": "Au-Dessus", "above": "Au-Dessus",
"below": "En-Dessous", "below": "En-Dessous",
@@ -1163,7 +1181,9 @@
"edit_requires_storage": "L'éditeur est désactivé car la configuration est stockée dans configuration.yaml.", "edit_requires_storage": "L'éditeur est désactivé car la configuration est stockée dans configuration.yaml.",
"elevation": "Élévation", "elevation": "Élévation",
"elevation_meters": "mètres", "elevation_meters": "mètres",
"external_url": "URL externe",
"imperial_example": "Fahrenheit, livres", "imperial_example": "Fahrenheit, livres",
"internal_url": "URL interne",
"latitude": "Latitude", "latitude": "Latitude",
"location_name": "Nom de votre installation Home Assistant", "location_name": "Nom de votre installation Home Assistant",
"longitude": "Longitude", "longitude": "Longitude",
@@ -1230,6 +1250,7 @@
}, },
"delete": "Supprimer", "delete": "Supprimer",
"description": "Gérer les appareils connectés", "description": "Gérer les appareils connectés",
"device_info": "Informations sur lappareil",
"device_not_found": "Appareil non trouvé.", "device_not_found": "Appareil non trouvé.",
"entities": { "entities": {
"add_entities_lovelace": "Ajouter à Lovelace", "add_entities_lovelace": "Ajouter à Lovelace",
@@ -1339,6 +1360,8 @@
"delete_button": "Supprimer {integration}", "delete_button": "Supprimer {integration}",
"delete_confirm": "Êtes-vous sûr de vouloir supprimer cette intégration?", "delete_confirm": "Êtes-vous sûr de vouloir supprimer cette intégration?",
"device_unavailable": "appareil indisponible", "device_unavailable": "appareil indisponible",
"devices": "{count} {count, plural,\n zero {appareil}\n one {appareil}\n other {appareils}\n}",
"entities": "{count} {count, plural,\n zero {entité}\n one {entité}\n other {entités}\n}",
"entity_unavailable": "entité indisponible", "entity_unavailable": "entité indisponible",
"firmware": "Firmware: {version}", "firmware": "Firmware: {version}",
"hub": "Connecté via", "hub": "Connecté via",
@@ -1388,9 +1411,13 @@
"integration": "intégration", "integration": "intégration",
"integration_not_found": "Intégration introuvable.", "integration_not_found": "Intégration introuvable.",
"new": "Configurer une nouvelle intégration", "new": "Configurer une nouvelle intégration",
"no_integrations": "Il semble que vous n'ayez pas encore configuré d'intégrations. Cliquez sur le bouton ci-dessous pour ajouter votre première intégration!",
"none": "Rien n'est encore configuré", "none": "Rien n'est encore configuré",
"none_found": "Aucune intégration trouvée",
"none_found_detail": "Ajustez vos critères de recherche.",
"note_about_integrations": "Toutes les intégrations ne peuvent pas encore être configurées via l'interface utilisateur.", "note_about_integrations": "Toutes les intégrations ne peuvent pas encore être configurées via l'interface utilisateur.",
"note_about_website_reference": "D'autres sont disponibles sur le ", "note_about_website_reference": "D'autres sont disponibles sur le ",
"rename_dialog": "Modifier le nom de cette entrée de configuration",
"rename_input_label": "Nom de l'entrée" "rename_input_label": "Nom de l'entrée"
}, },
"introduction": "Ici, il est possible de configurer vos composants et Home Assistant. Tout n'est pas encore possible de configurer à partir de l'interface utilisateur, mais nous y travaillons.", "introduction": "Ici, il est possible de configurer vos composants et Home Assistant. Tout n'est pas encore possible de configurer à partir de l'interface utilisateur, mais nous y travaillons.",
@@ -2207,12 +2234,12 @@
"close": "Fermer", "close": "Fermer",
"empty_config": "Commencez avec un tableau de bord vide", "empty_config": "Commencez avec un tableau de bord vide",
"header": "Prenez le contrôle de votre Interface Lovelace", "header": "Prenez le contrôle de votre Interface Lovelace",
"para": "Par défaut, Home Assistant maintient votre interface utilisateur, la met à jour lorsque de nouvelles entités ou de nouveaux composants Lovelace UI sont disponibles. Si vous prenez le contrôle, nous ne ferons plus les changements automatiquement pour vous.", "para": "Par défaut, Home Assistant maintient votre interface utilisateur et la met à jour lorsque de nouvelles entités ou de nouveaux composants Lovelace UI sont disponibles. Si vous prenez le contrôle, nous ne ferons plus les changements automatiquement pour vous.",
"para_sure": "Êtes-vous sûr de vouloir prendre le contrôle de l'interface utilisateur?", "para_sure": "Êtes-vous sûr de vouloir prendre le contrôle de l'interface utilisateur?",
"save": "Prenez le contrôle", "save": "Prenez le contrôle",
"yaml_config": "Pour vous aider à démarrer, voici la configuration actuelle de ce tableau de bord:", "yaml_config": "Pour vous aider à démarrer, voici la configuration actuelle de ce tableau de bord:",
"yaml_control": "Pour prendre le contrôle en mode YAML, créez un fichier YAML avec le nom que vous avez spécifié dans votre configuration pour ce tableau de bord, ou le 'ui-lovelace.yaml' par défaut.", "yaml_control": "Pour prendre le contrôle en mode YAML, créez un fichier YAML avec le nom que vous avez spécifié dans votre configuration pour ce tableau de bord, ou le 'ui-lovelace.yaml' par défaut.",
"yaml_mode": "Vous utilisez le mode YAML, ce qui signifie que vous ne pouvez pas modifier votre configuration Lovelace depuis l'interface utilisateur. Si vous souhaitez modifier Lovelace de l'interface utilisateur, supprimez «mode: yaml» de votre configuration Lovelace dans «configuration.yaml»." "yaml_mode": "Vous utilisez le mode YAML pour ce tableau de bord, ce qui signifie que vous ne pouvez pas modifier votre configuration Lovelace depuis l'interface utilisateur. Si vous souhaitez gérer votre tableau de bord via l'interface utilisateur, supprimez «mode: yaml» de votre configuration Lovelace dans «configuration.yaml»."
}, },
"suggest_card": { "suggest_card": {
"add": "Ajouter à Lovelace UI", "add": "Ajouter à Lovelace UI",
@@ -2258,7 +2285,8 @@
"warning": { "warning": {
"attribute_not_found": "Attribut {attribute} non disponible dans: {entity}", "attribute_not_found": "Attribut {attribute} non disponible dans: {entity}",
"entity_non_numeric": "L'entité est non numérique: {entity}", "entity_non_numeric": "L'entité est non numérique: {entity}",
"entity_not_found": "Entité non disponible: {entity}" "entity_not_found": "Entité non disponible: {entity}",
"entity_unavailable": "{entity} n'est pas disponible actuellement"
} }
}, },
"mailbox": { "mailbox": {

View File

@@ -0,0 +1 @@
{}

View File

@@ -0,0 +1 @@
{}

View File

@@ -147,6 +147,8 @@
"stopped": "Gstoppt" "stopped": "Gstoppt"
}, },
"default": { "default": {
"off": "Aus",
"on": "An",
"unavailable": "Nid verfüägbar", "unavailable": "Nid verfüägbar",
"unknown": "Unbekannt" "unknown": "Unbekannt"
}, },
@@ -345,7 +347,10 @@
} }
}, },
"common": { "common": {
"loading": "Lade" "loading": "Lade",
"next": "Weiter",
"previous": "Zurück",
"refresh": "Neu laden"
}, },
"components": { "components": {
"device-picker": { "device-picker": {
@@ -370,6 +375,10 @@
"connection_lost": "Vrbindig vrlore. Neu verbinde..." "connection_lost": "Vrbindig vrlore. Neu verbinde..."
}, },
"panel": { "panel": {
"calendar": {
"my_calendars": "Meine Kalender",
"today": "Heute"
},
"config": { "config": {
"automation": { "automation": {
"caption": "Automation", "caption": "Automation",
@@ -396,6 +405,9 @@
"conditions": { "conditions": {
"header": "Bedingig", "header": "Bedingig",
"type": { "type": {
"not": {
"label": "Nicht"
},
"sun": { "sun": {
"after": "Nachhär:", "after": "Nachhär:",
"before": "Vorhär:", "before": "Vorhär:",
@@ -462,6 +474,7 @@
"caption": "Home Assistant Cloud" "caption": "Home Assistant Cloud"
}, },
"devices": { "devices": {
"device_info": "Geräteinformationen",
"scripts": "Scripts" "scripts": "Scripts"
}, },
"integrations": { "integrations": {
@@ -474,7 +487,9 @@
}, },
"configure": "Konfiguriärä", "configure": "Konfiguriärä",
"configured": "Konfiguriärt", "configured": "Konfiguriärt",
"discovered": "Erkennt" "discovered": "Erkennt",
"none_found": "Keine Integrationen gefunden",
"none_found_detail": "Passen Sie Ihre Suchkriterien an."
}, },
"users": { "users": {
"caption": "Benutzer", "caption": "Benutzer",

View File

@@ -206,6 +206,8 @@
"stopped": "עצור" "stopped": "עצור"
}, },
"default": { "default": {
"off": "מופסק",
"on": "מופעל",
"unavailable": "לא זמין", "unavailable": "לא זמין",
"unknown": "לא ידוע" "unknown": "לא ידוע"
}, },
@@ -1096,6 +1098,7 @@
"caption": "אינטגרציות", "caption": "אינטגרציות",
"config_entry": { "config_entry": {
"area": "ב {area}", "area": "ב {area}",
"delete": "מחק",
"delete_button": "מחק {integration}", "delete_button": "מחק {integration}",
"delete_confirm": "האם אתה בטוח שברצונך למחוק אינטגרציה זו?", "delete_confirm": "האם אתה בטוח שברצונך למחוק אינטגרציה זו?",
"device_unavailable": "התקן אינו זמין", "device_unavailable": "התקן אינו זמין",
@@ -1106,8 +1109,11 @@
"no_area": "ללא אזור", "no_area": "ללא אזור",
"no_device": "ישויות ללא מכשירים", "no_device": "ישויות ללא מכשירים",
"no_devices": "לאינטגרציה זו אין התקנים.", "no_devices": "לאינטגרציה זו אין התקנים.",
"options": "אפשרויות",
"rename": "שנה שם",
"restart_confirm": "הפעל מחדש את Home Assistant כדי להשלים את הסרת האינטגרציה", "restart_confirm": "הפעל מחדש את Home Assistant כדי להשלים את הסרת האינטגרציה",
"settings_button": "ערוך הגדרות עבור {integration}", "settings_button": "ערוך הגדרות עבור {integration}",
"system_options": "אפשרויות מערכת",
"system_options_button": "אפשרויות מערכת עבור {integration}" "system_options_button": "אפשרויות מערכת עבור {integration}"
}, },
"config_flow": { "config_flow": {
@@ -1132,6 +1138,8 @@
"integration_not_found": "האינטגרציה לא נמצאה.", "integration_not_found": "האינטגרציה לא נמצאה.",
"new": "הגדר אינטגרציה", "new": "הגדר אינטגרציה",
"none": "כלום אינו הוגדר עדיין", "none": "כלום אינו הוגדר עדיין",
"none_found": "לא נמצאו אינטגרציות",
"none_found_detail": "התאם את קריטריוני החיפוש שלך.",
"note_about_integrations": "קיימות אינטגרציות שלא ניתן עדיין להגדירן ע\"י ממשק המשתמש.", "note_about_integrations": "קיימות אינטגרציות שלא ניתן עדיין להגדירן ע\"י ממשק המשתמש.",
"note_about_website_reference": "מידע נוסף זמין ב:" "note_about_website_reference": "מידע נוסף זמין ב:"
}, },
@@ -1751,7 +1759,8 @@
}, },
"warning": { "warning": {
"entity_non_numeric": "הישות אינה מספרית: {entity}", "entity_non_numeric": "הישות אינה מספרית: {entity}",
"entity_not_found": "הישות אינה זמינה: {entity}" "entity_not_found": "הישות אינה זמינה: {entity}",
"entity_unavailable": "כרגע {entity} אינו זמין"
} }
}, },
"mailbox": { "mailbox": {

View File

@@ -92,6 +92,8 @@
"off": "बंद" "off": "बंद"
}, },
"default": { "default": {
"off": "बंद",
"on": "चालू",
"unavailable": "अनुपलब्ध", "unavailable": "अनुपलब्ध",
"unknown": "अनजान" "unknown": "अनजान"
}, },
@@ -153,8 +155,31 @@
} }
}, },
"ui": { "ui": {
"card": {
"weather": {
"attributes": {
"precipitation": "वर्षण"
},
"high": "उच्च",
"low": "कम"
}
},
"common": { "common": {
"undo": "Undo" "undo": "पूर्ववत करें"
},
"dialogs": {
"mqtt_device_debug_info": {
"entities": "संस्थाएं",
"no_entities": "कोई संस्थाएं नहीं",
"no_triggers": "कोई ट्रिगर नहीं",
"show_as_yaml": "YAML के रूप में दिखाएं",
"triggers": "ट्रिगर"
},
"zha_device_info": {
"services": {
"zigbee_information": "डिवाइस के लिए Zigbee जानकारी देखें।"
}
}
}, },
"duration": { "duration": {
"day": "{count} {count, plural,\n one {दिन}\n other {दिन}\n}", "day": "{count} {count, plural,\n one {दिन}\n other {दिन}\n}",
@@ -170,6 +195,9 @@
"editor": { "editor": {
"conditions": { "conditions": {
"type": { "type": {
"not": {
"label": "नहीं"
},
"sun": { "sun": {
"after": "बाद:", "after": "बाद:",
"before": "पहले:", "before": "पहले:",
@@ -203,12 +231,49 @@
} }
} }
} }
},
"picker": {
"headers": {
"name": "नाम"
}
}
},
"filtering": {
"clear": "विशद",
"filtering_by": "द्वारा छान रहे हैं"
},
"integrations": {
"add_integration": "एकीकरण जोड़ें",
"config_entry": {
"delete": "हटाएं",
"rename": "नाम बदलें",
"system_options": "सिस्टम विकल्प"
},
"integration": "एकीकरण",
"no_integrations": "लगता है जैसे आपके पास अभी तक कोई भी पूर्णांक कॉन्फ़िगर नहीं है। अपना पहला एकीकरण जोड़ने के लिए नीचे दिए गए बटन पर क्लिक करें!",
"rename_dialog": "इस कॉन्फ़िगरेशन प्रविष्टि का नाम संपादित करें",
"rename_input_label": "प्रवेश का नाम"
},
"script": {
"picker": {
"headers": {
"name": "नाम"
}
} }
}, },
"users": { "users": {
"editor": { "editor": {
"admin": "admin", "admin": "प्रशासक",
"system_generated_users_not_editable": "ARAVIN" "name": "नाम",
"system_generated_users_not_editable": "सिस्टम जनरेट किए गए उपयोगकर्ताओं को अपडेट करने में असमर्थ।",
"update_user": "अपडेट"
},
"picker": {
"headers": {
"group": "समूह",
"name": "नाम",
"system": "सिस्टम"
}
} }
}, },
"zha": { "zha": {
@@ -248,7 +313,10 @@
"editor": { "editor": {
"card": { "card": {
"entity": { "entity": {
"description": "KARNATAKA" "description": "एंटिटी कार्ड आपको अपनी इकाई की स्थिति का त्वरित अवलोकन देता है।"
},
"generic": {
"double_tap_action": "डबल टैप एक्शन"
}, },
"map": { "map": {
"hours_to_show": "hours to show" "hours_to_show": "hours to show"
@@ -258,6 +326,12 @@
"custom_card": "custom_ card", "custom_card": "custom_ card",
"no_description": "description" "no_description": "description"
} }
},
"reload_resources": {
"refresh_header": "क्या आप रिफ्रेश करना चाहते हैं?"
},
"warning": {
"entity_unavailable": "{entity} वर्तमान में अनुपलब्ध है"
} }
}, },
"page-authorize": { "page-authorize": {
@@ -284,6 +358,11 @@
} }
}, },
"profile": { "profile": {
"dashboard": {
"description": "इस उपकरण के लिए एक डिफ़ॉल्ट डैशबोर्ड चुनें।",
"dropdown_label": "डैशबोर्ड",
"header": "डैशबोर्ड"
},
"language": { "language": {
"link_promo": "अनुवाद करने में सहायता करें" "link_promo": "अनुवाद करने में सहायता करें"
} }

View File

@@ -206,6 +206,8 @@
"stopped": "Megállítva" "stopped": "Megállítva"
}, },
"default": { "default": {
"off": "Ki",
"on": "Be",
"unavailable": "Nem elérhető", "unavailable": "Nem elérhető",
"unknown": "Ismeretlen" "unknown": "Ismeretlen"
}, },
@@ -344,7 +346,7 @@
}, },
"automation": { "automation": {
"last_triggered": "Utoljára aktiválva", "last_triggered": "Utoljára aktiválva",
"trigger": "Aktivál" "trigger": "Végrehajt"
}, },
"camera": { "camera": {
"not_available": "Kép nem áll rendelkezésre" "not_available": "Kép nem áll rendelkezésre"
@@ -475,7 +477,10 @@
"close": "Bezárás", "close": "Bezárás",
"delete": "Törlés", "delete": "Törlés",
"loading": "Betöltés", "loading": "Betöltés",
"next": "Tovább",
"no": "Nem", "no": "Nem",
"previous": "Előző",
"refresh": "Frissítés",
"save": "Mentés", "save": "Mentés",
"successfully_deleted": "Sikeresen törölve", "successfully_deleted": "Sikeresen törölve",
"successfully_saved": "Sikeresen elmentve", "successfully_saved": "Sikeresen elmentve",
@@ -660,7 +665,7 @@
"no_entities": "Nincsenek entitások", "no_entities": "Nincsenek entitások",
"no_triggers": "Nincsenek eseményindítók", "no_triggers": "Nincsenek eseményindítók",
"payload_display": "Payload megjelenítése", "payload_display": "Payload megjelenítése",
"recent_messages": "{n} legfrissebb fogadott üzenet", "recent_messages": "{n} legfrissebb fogadott üzenet(ek)",
"show_as_yaml": "Megjelenítés YAML-ként", "show_as_yaml": "Megjelenítés YAML-ként",
"title": "{device} debug infók", "title": "{device} debug infók",
"triggers": "Eseményindítók" "triggers": "Eseményindítók"
@@ -735,6 +740,10 @@
"triggered": "Aktiválva {name}" "triggered": "Aktiválva {name}"
}, },
"panel": { "panel": {
"calendar": {
"my_calendars": "Saját naptáraim",
"today": "Ma"
},
"config": { "config": {
"advanced_mode": { "advanced_mode": {
"hint_enable": "Hiányzó konfigurációs beállítások? Kapcsold be a haladó üzemmódot", "hint_enable": "Hiányzó konfigurációs beállítások? Kapcsold be a haladó üzemmódot",
@@ -837,6 +846,9 @@
}, },
"label": "Eszköz" "label": "Eszköz"
}, },
"not": {
"label": "Nem"
},
"numeric_state": { "numeric_state": {
"above": "Felett", "above": "Felett",
"below": "Alatt", "below": "Alatt",
@@ -1397,6 +1409,8 @@
"new": "Új integráció beállítása", "new": "Új integráció beállítása",
"no_integrations": "Úgy tűnik, még nincs beállítva egyetlen integráció sem. Kattints az alábbi gombra az első integráció hozzáadásához!", "no_integrations": "Úgy tűnik, még nincs beállítva egyetlen integráció sem. Kattints az alábbi gombra az első integráció hozzáadásához!",
"none": "Még semmi sincs beállítva", "none": "Még semmi sincs beállítva",
"none_found": "Nincsenek integrációk",
"none_found_detail": "Módosítsd a keresési feltételeket.",
"note_about_integrations": "Még nem minden integráció konfigurálható a felhasználói felületen keresztül.", "note_about_integrations": "Még nem minden integráció konfigurálható a felhasználói felületen keresztül.",
"note_about_website_reference": "Továbbiak érhetőek el itt: ", "note_about_website_reference": "Továbbiak érhetőek el itt: ",
"rename_dialog": "A konfigurációs bejegyzés nevének szerkesztése", "rename_dialog": "A konfigurációs bejegyzés nevének szerkesztése",
@@ -2216,12 +2230,12 @@
"close": "Bezárás", "close": "Bezárás",
"empty_config": "Kezdj egy üres irányítópulttal", "empty_config": "Kezdj egy üres irányítópulttal",
"header": "Vedd át az irányítást a Lovelace UI felett", "header": "Vedd át az irányítást a Lovelace UI felett",
"para": "Alapértelmezés szerint a Home Assistant kezeli a felhasználói felületet, és frissíti azt, amikor új entitások vagy Lovelace komponensek válnak elérhetővé. Ha átveszed az irányítást, többé nem fogunk automatikusan módosításokat végezni számodra.", "para": "Ezt az irányítópultot jelenleg a Home Assistant kezeli. Automatikusan frissül, amikor új entitások vagy Lovelace komponensek válnak elérhetővé. Ha átveszed az irányítást, akkor ez az irányítópult nem fog többé automatikusan frissülni. Bármikor létre tudsz hozni egy új irányítópultot a konfigurációban a próbálgatáshoz.",
"para_sure": "Biztosan át szeretnéd venni az irányítást a felhasználói felületed felett?", "para_sure": "Biztosan át szeretnéd venni az irányítást a felhasználói felületed felett?",
"save": "Irányítás átvétele", "save": "Irányítás átvétele",
"yaml_config": "A kezdéshez itt a jelenlegi konfigurációja ennek az irányítópultnak:", "yaml_config": "A kezdéshez itt a jelenlegi konfigurációja ennek az irányítópultnak:",
"yaml_control": "Ahhoz, hogy átvedd az irányítást YAML módban, hozz létre egy YAML fájlt az irányítópult konfigurációjában megadott vagy az alapértelmezett 'ui-lovelace.yaml' névvel.", "yaml_control": "Ahhoz, hogy átvedd az irányítást YAML módban, hozz létre egy YAML fájlt az irányítópult konfigurációjában megadott vagy az alapértelmezett 'ui-lovelace.yaml' névvel.",
"yaml_mode": "YAML módot használsz, ezért nem módosíthatod a Lovelace konfigurációt a felhasználói felületről. Ha mégis onnan szeretnéd, akkor távolítsd el a 'mode: yaml' bejegyzést a Lovelace konfigurációból a 'configuration.yaml' fájlban." "yaml_mode": "YAML módot használsz ehhez az irányítópulthoz, ezért nem módosíthatod a Lovelace konfigurációt a felhasználói felületről. Ha mégis onnan szeretnéd, akkor távolítsd el a 'mode: yaml' bejegyzést a Lovelace konfigurációból a 'configuration.yaml' fájlban."
}, },
"suggest_card": { "suggest_card": {
"add": "Hozzáadás a Lovelace-hez", "add": "Hozzáadás a Lovelace-hez",

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