diff --git a/cast/src/receiver/layout/hc-main.ts b/cast/src/receiver/layout/hc-main.ts index 564665846f..d5f462ad1b 100644 --- a/cast/src/receiver/layout/hc-main.ts +++ b/cast/src/receiver/layout/hc-main.ts @@ -192,6 +192,8 @@ export class HcMain extends HassElement { this._handleNewLovelaceConfig(lovelaceConfig) ); } catch (err) { + // eslint-disable-next-line + console.log("Error fetching Lovelace configuration", err, msg); // Generate a Lovelace config. this._unsubLovelace = () => undefined; await this._generateLovelaceConfig(); diff --git a/hassio/src/hassio-main.ts b/hassio/src/hassio-main.ts index 1efee0500b..37abf78279 100644 --- a/hassio/src/hassio-main.ts +++ b/hassio/src/hassio-main.ts @@ -14,7 +14,9 @@ import { createHassioSession, fetchHassioHomeAssistantInfo, fetchHassioSupervisorInfo, + fetchHassioInfo, HassioHomeAssistantInfo, + HassioInfo, HassioPanelInfo, HassioSupervisorInfo, } from "../../src/data/hassio/supervisor"; @@ -75,6 +77,8 @@ class HassioMain extends ProvideHassLitMixin(HassRouterPage) { @property() private _hostInfo: HassioHostInfo; + @property() private _hassioInfo?: HassioInfo; + @property() private _hassOsInfo?: HassioHassOSInfo; @property() private _hassInfo: HassioHomeAssistantInfo; @@ -147,6 +151,7 @@ class HassioMain extends ProvideHassLitMixin(HassRouterPage) { hass: this.hass, narrow: this.narrow, supervisorInfo: this._supervisorInfo, + hassioInfo: this._hassioInfo, hostInfo: this._hostInfo, hassInfo: this._hassInfo, hassOsInfo: this._hassOsInfo, @@ -156,6 +161,7 @@ class HassioMain extends ProvideHassLitMixin(HassRouterPage) { el.hass = this.hass; el.narrow = this.narrow; el.supervisorInfo = this._supervisorInfo; + el.hassioInfo = this._hassioInfo; el.hostInfo = this._hostInfo; el.hassInfo = this._hassInfo; el.hassOsInfo = this._hassOsInfo; @@ -169,12 +175,14 @@ class HassioMain extends ProvideHassLitMixin(HassRouterPage) { return; } - const [supervisorInfo, hostInfo, hassInfo] = await Promise.all([ + const [supervisorInfo, hostInfo, hassInfo, hassioInfo] = await Promise.all([ fetchHassioSupervisorInfo(this.hass), fetchHassioHostInfo(this.hass), fetchHassioHomeAssistantInfo(this.hass), + fetchHassioInfo(this.hass), ]); this._supervisorInfo = supervisorInfo; + this._hassioInfo = hassioInfo; this._hostInfo = hostInfo; this._hassInfo = hassInfo; diff --git a/hassio/src/hassio-panel-router.ts b/hassio/src/hassio-panel-router.ts index 3025fe2f9a..00830423b0 100644 --- a/hassio/src/hassio-panel-router.ts +++ b/hassio/src/hassio-panel-router.ts @@ -3,6 +3,7 @@ import { HassioHassOSInfo, HassioHostInfo } from "../../src/data/hassio/host"; import { HassioHomeAssistantInfo, HassioSupervisorInfo, + HassioInfo, } from "../../src/data/hassio/supervisor"; import { HassRouterPage, @@ -26,6 +27,8 @@ class HassioPanelRouter extends HassRouterPage { @property({ attribute: false }) public supervisorInfo: HassioSupervisorInfo; + @property({ attribute: false }) public hassioInfo!: HassioInfo; + @property({ attribute: false }) public hostInfo: HassioHostInfo; @property({ attribute: false }) public hassInfo: HassioHomeAssistantInfo; @@ -54,6 +57,7 @@ class HassioPanelRouter extends HassRouterPage { el.route = this.route; el.narrow = this.narrow; el.supervisorInfo = this.supervisorInfo; + el.hassioInfo = this.hassioInfo; el.hostInfo = this.hostInfo; el.hassInfo = this.hassInfo; el.hassOsInfo = this.hassOsInfo; diff --git a/hassio/src/hassio-panel.ts b/hassio/src/hassio-panel.ts index 1e92ec923b..e61b5605f0 100644 --- a/hassio/src/hassio-panel.ts +++ b/hassio/src/hassio-panel.ts @@ -10,6 +10,7 @@ import { HassioHassOSInfo, HassioHostInfo } from "../../src/data/hassio/host"; import { HassioHomeAssistantInfo, HassioSupervisorInfo, + HassioInfo, } from "../../src/data/hassio/supervisor"; import type { PageNavigation } from "../../src/layouts/hass-tabs-subpage"; import { HomeAssistant, Route } from "../../src/types"; @@ -48,6 +49,8 @@ class HassioPanel extends LitElement { @property({ attribute: false }) public supervisorInfo!: HassioSupervisorInfo; + @property({ attribute: false }) public hassioInfo!: HassioInfo; + @property({ attribute: false }) public hostInfo!: HassioHostInfo; @property({ attribute: false }) public hassInfo!: HassioHomeAssistantInfo; @@ -61,6 +64,7 @@ class HassioPanel extends LitElement { .hass=${this.hass} .narrow=${this.narrow} .supervisorInfo=${this.supervisorInfo} + .hassioInfo=${this.hassioInfo} .hostInfo=${this.hostInfo} .hassInfo=${this.hassInfo} .hassOsInfo=${this.hassOsInfo} diff --git a/hassio/src/system/hassio-host-info.ts b/hassio/src/system/hassio-host-info.ts index 0573d150b3..6413788b88 100644 --- a/hassio/src/system/hassio-host-info.ts +++ b/hassio/src/system/hassio-host-info.ts @@ -19,6 +19,7 @@ import { shutdownHost, updateOS, } from "../../../src/data/hassio/host"; +import { HassioInfo } from "../../../src/data/hassio/supervisor"; import { showAlertDialog, showConfirmationDialog, @@ -35,6 +36,8 @@ class HassioHostInfo extends LitElement { @property() public hostInfo!: HassioHostInfoType; + @property({ attribute: false }) public hassioInfo!: HassioInfo; + @property() public hassOsInfo!: HassioHassOSInfo; @property() private _errors?: string; @@ -54,6 +57,12 @@ class HassioHostInfo extends LitElement { System ${this.hostInfo.operating_system} + ${!this.hostInfo.features.includes("hassos") + ? html` + Docker version + ${this.hassioInfo.docker} + ` + : ""} ${this.hostInfo.deployment ? html` diff --git a/hassio/src/system/hassio-system.ts b/hassio/src/system/hassio-system.ts index 5db8cc409c..7391ebe5bf 100644 --- a/hassio/src/system/hassio-system.ts +++ b/hassio/src/system/hassio-system.ts @@ -11,7 +11,10 @@ import { HassioHassOSInfo, HassioHostInfo, } from "../../../src/data/hassio/host"; -import { HassioSupervisorInfo } from "../../../src/data/hassio/supervisor"; +import { + HassioSupervisorInfo, + HassioInfo, +} from "../../../src/data/hassio/supervisor"; import "../../../src/layouts/hass-tabs-subpage"; import { haStyle } from "../../../src/resources/styles"; import { HomeAssistant, Route } from "../../../src/types"; @@ -31,9 +34,11 @@ class HassioSystem extends LitElement { @property() public supervisorInfo!: HassioSupervisorInfo; + @property({ attribute: false }) public hassioInfo!: HassioInfo; + @property() public hostInfo!: HassioHostInfo; - @property() public hassOsInfo!: HassioHassOSInfo; + @property({ attribute: false }) public hassOsInfo!: HassioHassOSInfo; public render(): TemplateResult | void { return html` @@ -55,6 +60,7 @@ class HassioSystem extends LitElement { > diff --git a/package.json b/package.json index 78d0f054ff..24a13c5954 100644 --- a/package.json +++ b/package.json @@ -74,6 +74,7 @@ "@thomasloven/round-slider": "0.5.0", "@vaadin/vaadin-combo-box": "^5.0.10", "@vaadin/vaadin-date-picker": "^4.0.7", + "@vue/web-component-wrapper": "^1.2.0", "@webcomponents/webcomponentsjs": "^2.2.7", "chart.js": "~2.8.0", "chartjs-chart-timeline": "^0.3.0", @@ -106,6 +107,8 @@ "roboto-fontface": "^0.10.0", "superstruct": "^0.6.1", "unfetch": "^4.1.0", + "vue": "^2.6.11", + "vue2-daterange-picker": "^0.5.1", "web-animations-js": "^2.3.2", "workbox-core": "^5.1.3", "workbox-precaching": "^5.1.3", diff --git a/setup.py b/setup.py index 173b315ffa..9b6e254ff5 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name="home-assistant-frontend", - version="20200613.0", + version="20200620.0", description="The Home Assistant frontend", url="https://github.com/home-assistant/home-assistant-polymer", author="The Home Assistant Authors", diff --git a/src/auth/ha-authorize.ts b/src/auth/ha-authorize.ts index db9023efab..b96eac0aff 100644 --- a/src/auth/ha-authorize.ts +++ b/src/auth/ha-authorize.ts @@ -6,19 +6,18 @@ import { property, PropertyValues, } from "lit-element"; -import { AuthProvider, fetchAuthProviders } from "../data/auth"; +import { + AuthProvider, + fetchAuthProviders, + AuthUrlSearchParams, +} from "../data/auth"; import { litLocalizeLiteMixin } from "../mixins/lit-localize-lite-mixin"; import { registerServiceWorker } from "../util/register-service-worker"; import "./ha-auth-flow"; +import { extractSearchParamsObject } from "../common/url/search-params"; import(/* webpackChunkName: "pick-auth-provider" */ "./ha-pick-auth-provider"); -interface QueryParams { - client_id?: string; - redirect_uri?: string; - state?: string; -} - class HaAuthorize extends litLocalizeLiteMixin(LitElement) { @property() public clientId?: string; @@ -33,14 +32,7 @@ class HaAuthorize extends litLocalizeLiteMixin(LitElement) { constructor() { super(); this.translationFragment = "page-authorize"; - const query: QueryParams = {}; - const values = location.search.substr(1).split("&"); - for (const item of values) { - const value = item.split("="); - if (value.length > 1) { - query[decodeURIComponent(value[0])] = decodeURIComponent(value[1]); - } - } + const query = extractSearchParamsObject() as AuthUrlSearchParams; if (query.client_id) { this.clientId = query.client_id; } @@ -145,7 +137,7 @@ class HaAuthorize extends litLocalizeLiteMixin(LitElement) { response.status === 400 && authProviders.code === "onboarding_required" ) { - location.href = "/?"; + location.href = `/onboarding.html${location.search}`; return; } diff --git a/src/common/url/search-params.ts b/src/common/url/search-params.ts new file mode 100644 index 0000000000..5894823b69 --- /dev/null +++ b/src/common/url/search-params.ts @@ -0,0 +1,8 @@ +export const extractSearchParamsObject = (): { [key: string]: string } => { + const query = {}; + const searchParams = new URLSearchParams(location.search); + for (const [key, value] of searchParams.entries()) { + query[key] = value; + } + return query; +}; diff --git a/src/components/buttons/ha-progress-button.js b/src/components/buttons/ha-progress-button.js index 50212e9967..f9f7927172 100644 --- a/src/components/buttons/ha-progress-button.js +++ b/src/components/buttons/ha-progress-button.js @@ -8,6 +8,9 @@ class HaProgressButton extends PolymerElement { static get template() { return html` - - - - - - -
[[localize('panel.history')]]
-
-
- -
-
- - - - - [[localize('ui.duration.day', 'count', 1)]] - [[localize('ui.duration.day', 'count', 3)]] - [[localize('ui.duration.week', 'count', 1)]] - - -
- - -
-
- `; - } - - static get properties() { - return { - hass: Object, - narrow: Boolean, - - stateHistory: { - type: Object, - value: null, - }, - - _periodIndex: { - type: Number, - value: 0, - }, - - isLoadingData: { - type: Boolean, - value: false, - }, - - endTime: { - type: Object, - computed: "_computeEndTime(_currentDate, _periodIndex)", - }, - - // ISO8601 formatted date string - _currentDate: { - type: String, - value: function () { - var value = new Date(); - var today = new Date( - Date.UTC(value.getFullYear(), value.getMonth(), value.getDate()) - ); - return today.toISOString().split("T")[0]; - }, - }, - - _filterType: { - type: String, - value: "date", - }, - - rtl: { - type: Boolean, - reflectToAttribute: true, - computed: "_computeRTL(hass)", - }, - }; - } - - datepickerFocus() { - this.datePicker.adjustPosition(); - } - - connectedCallback() { - super.connectedCallback(); - // We are unable to parse date because we use intl api to render date - this.$.picker.set("i18n.parseDate", null); - this.$.picker.set("i18n.formatDate", (date) => - formatDate(new Date(date.year, date.month, date.day), this.hass.language) - ); - } - - _computeStartTime(_currentDate) { - if (!_currentDate) return undefined; - var parts = _currentDate.split("-"); - parts[1] = parseInt(parts[1]) - 1; - return new Date(parts[0], parts[1], parts[2]); - } - - _computeEndTime(_currentDate, periodIndex) { - var startTime = this._computeStartTime(_currentDate); - var endTime = new Date(startTime); - endTime.setDate(startTime.getDate() + this._computeFilterDays(periodIndex)); - return endTime; - } - - _computeFilterDays(periodIndex) { - switch (periodIndex) { - case 1: - return 3; - case 2: - return 7; - default: - return 1; - } - } - - _computeRTL(hass) { - return computeRTL(hass); - } -} - -customElements.define("ha-panel-history", HaPanelHistory); diff --git a/src/panels/history/ha-panel-history.ts b/src/panels/history/ha-panel-history.ts new file mode 100644 index 0000000000..e177933923 --- /dev/null +++ b/src/panels/history/ha-panel-history.ts @@ -0,0 +1,204 @@ +import "@polymer/app-layout/app-header-layout/app-header-layout"; +import "@polymer/app-layout/app-header/app-header"; +import "@polymer/app-layout/app-toolbar/app-toolbar"; +import { computeRTL } from "../../common/util/compute_rtl"; +import "../../components/ha-menu-button"; +import "../../components/state-history-charts"; +import { LitElement, css, property, PropertyValues } from "lit-element"; +import { html } from "lit-html"; +import { haStyle } from "../../resources/styles"; +import { HomeAssistant } from "../../types"; +import type { DateRangePickerRanges } from "../../components/ha-date-range-picker"; +import "../../components/ha-date-range-picker"; +import { fetchDate, computeHistory } from "../../data/history"; +import "@polymer/paper-spinner/paper-spinner"; + +class HaPanelHistory extends LitElement { + @property() hass!: HomeAssistant; + + @property({ reflect: true, type: Boolean }) narrow!: boolean; + + @property() _startDate: Date; + + @property() _endDate: Date; + + @property() _entityId = ""; + + @property() _isLoading = false; + + @property() _stateHistory?; + + @property({ reflect: true, type: Boolean }) rtl = false; + + @property() private _ranges?: DateRangePickerRanges; + + public constructor() { + super(); + + const start = new Date(); + start.setHours(start.getHours() - 2); + start.setMinutes(0); + start.setSeconds(0); + this._startDate = start; + + const end = new Date(); + end.setHours(end.getHours() + 1); + end.setMinutes(0); + end.setSeconds(0); + this._endDate = end; + } + + protected render() { + return html` + + + + +
${this.hass.localize("panel.history")}
+
+
+ +
+
+ +
+ ${this._isLoading + ? html`` + : html` + + + `} +
+
+ `; + } + + protected firstUpdated(changedProps: PropertyValues) { + super.firstUpdated(changedProps); + + const today = new Date(); + today.setHours(0, 0, 0, 0); + const todayEnd = new Date(today); + todayEnd.setDate(todayEnd.getDate() + 1); + todayEnd.setMilliseconds(todayEnd.getMilliseconds() - 1); + + const todayCopy = new Date(today); + + const yesterday = new Date(todayCopy.setDate(today.getDate() - 1)); + const yesterdayEnd = new Date(yesterday); + yesterdayEnd.setDate(yesterdayEnd.getDate() + 1); + yesterdayEnd.setMilliseconds(yesterdayEnd.getMilliseconds() - 1); + + const thisWeekStart = new Date( + todayCopy.setDate(today.getDate() - today.getDay()) + ); + const thisWeekEnd = new Date( + todayCopy.setDate(today.getDate() - today.getDay() + 7) + ); + thisWeekEnd.setMilliseconds(thisWeekEnd.getMilliseconds() - 1); + + const lastWeekStart = new Date( + todayCopy.setDate(today.getDate() - today.getDay() - 7) + ); + const lastWeekEnd = new Date( + todayCopy.setDate(today.getDate() - today.getDay()) + ); + lastWeekEnd.setMilliseconds(lastWeekEnd.getMilliseconds() - 1); + + this._ranges = { + [this.hass.localize("ui.panel.history.ranges.today")]: [today, todayEnd], + [this.hass.localize("ui.panel.history.ranges.yesterday")]: [ + yesterday, + yesterdayEnd, + ], + [this.hass.localize("ui.panel.history.ranges.this_week")]: [ + thisWeekStart, + thisWeekEnd, + ], + [this.hass.localize("ui.panel.history.ranges.last_week")]: [ + lastWeekStart, + lastWeekEnd, + ], + }; + } + + protected updated(changedProps: PropertyValues) { + if ( + changedProps.has("_startDate") || + changedProps.has("_endDate") || + changedProps.has("_entityId") + ) { + this._getHistory(); + } + + if (changedProps.has("hass")) { + const oldHass = changedProps.get("hass") as HomeAssistant | undefined; + if (!oldHass || oldHass.language !== this.hass.language) { + this.rtl = computeRTL(this.hass); + } + } + } + + private async _getHistory() { + this._isLoading = true; + const dateHistory = await fetchDate( + this.hass, + this._startDate, + this._endDate + ); + this._stateHistory = computeHistory( + this.hass, + dateHistory, + this.hass.localize, + this.hass.language + ); + this._isLoading = false; + } + + private _dateRangeChanged(ev) { + this._startDate = ev.detail.startDate; + const endDate = ev.detail.endDate; + if (endDate.getHours() === 0 && endDate.getMinutes() === 0) { + endDate.setDate(endDate.getDate() + 1); + endDate.setMilliseconds(endDate.getMilliseconds() - 1); + } + this._endDate = endDate; + } + + static get styles() { + return [ + haStyle, + css` + .content { + padding: 0 16px 16px; + } + paper-spinner { + position: absolute; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + } + `, + ]; + } +} + +customElements.define("ha-panel-history", HaPanelHistory); diff --git a/src/panels/logbook/ha-logbook-data.js b/src/panels/logbook/ha-logbook-data.js deleted file mode 100644 index 461fea1f60..0000000000 --- a/src/panels/logbook/ha-logbook-data.js +++ /dev/null @@ -1,120 +0,0 @@ -/* eslint-plugin-disable lit */ -import { PolymerElement } from "@polymer/polymer/polymer-element"; - -const DATA_CACHE = {}; -const ALL_ENTITIES = "*"; - -class HaLogbookData extends PolymerElement { - static get properties() { - return { - hass: { - type: Object, - observer: "hassChanged", - }, - - filterDate: { - type: String, - observer: "filterDataChanged", - }, - - filterPeriod: { - type: Number, - observer: "filterDataChanged", - }, - - filterEntity: { - type: String, - observer: "filterDataChanged", - }, - - isLoading: { - type: Boolean, - value: true, - readOnly: true, - notify: true, - }, - - entries: { - type: Object, - value: null, - readOnly: true, - notify: true, - }, - }; - } - - hassChanged(newHass, oldHass) { - if (!oldHass && this.filterDate) { - this.updateData(); - } - } - - filterDataChanged(newValue, oldValue) { - if (oldValue !== undefined) { - this.updateData(); - } - } - - updateData() { - if (!this.hass) return; - - this._setIsLoading(true); - - this.getData(this.filterDate, this.filterPeriod, this.filterEntity).then( - (logbookEntries) => { - this._setEntries(logbookEntries); - this._setIsLoading(false); - } - ); - } - - getData(date, period, entityId) { - if (!entityId) entityId = ALL_ENTITIES; - - if (!DATA_CACHE[period]) DATA_CACHE[period] = []; - if (!DATA_CACHE[period][date]) DATA_CACHE[period][date] = []; - - if (DATA_CACHE[period][date][entityId]) { - return DATA_CACHE[period][date][entityId]; - } - - if (entityId !== ALL_ENTITIES && DATA_CACHE[period][date][ALL_ENTITIES]) { - return DATA_CACHE[period][date][ALL_ENTITIES].then(function (entities) { - return entities.filter(function (entity) { - return entity.entity_id === entityId; - }); - }); - } - - DATA_CACHE[period][date][entityId] = this._getFromServer( - date, - period, - entityId - ); - return DATA_CACHE[period][date][entityId]; - } - - _getFromServer(date, period, entityId) { - let url = "logbook/" + date + "?period=" + period; - if (entityId !== ALL_ENTITIES) { - url += "&entity=" + entityId; - } - - return this.hass.callApi("GET", url).then( - function (logbookEntries) { - logbookEntries.reverse(); - return logbookEntries; - }, - function () { - return null; - } - ); - } - - refreshLogbook() { - DATA_CACHE[this.filterPeriod][this.filterDate] = []; - this.updateData(); - } -} - -customElements.define("ha-logbook-data", HaLogbookData); diff --git a/src/panels/logbook/ha-logbook.ts b/src/panels/logbook/ha-logbook.ts index ded1e6a288..507319fb2e 100644 --- a/src/panels/logbook/ha-logbook.ts +++ b/src/panels/logbook/ha-logbook.ts @@ -9,6 +9,7 @@ import { } from "lit-element"; import { scroll } from "lit-virtualizer"; import { formatDate } from "../../common/datetime/format_date"; +import { fetchUsers } from "../../data/user"; import { formatTimeWithSeconds } from "../../common/datetime/format_time"; import { fireEvent } from "../../common/dom/fire_event"; import { domainIcon } from "../../common/entity/domain_icon"; @@ -21,6 +22,9 @@ import { HomeAssistant } from "../../types"; class HaLogbook extends LitElement { @property() public hass!: HomeAssistant; + @property({ attribute: false }) + private _userid_to_name = {}; + @property() public entries: LogbookEntry[] = []; @property({ attribute: "rtl", type: Boolean, reflect: true }) @@ -58,6 +62,20 @@ class HaLogbook extends LitElement { `; } + private async _fetchUsers() { + const users = await fetchUsers(this.hass); + const userid_to_name = {}; + users.forEach((user) => { + userid_to_name[user.id] = user.name; + }); + this._userid_to_name = userid_to_name; + } + + protected firstUpdated(changedProperties: PropertyValues) { + super.firstUpdated(changedProperties); + this._fetchUsers(); + } + private _renderLogbookItem( item: LogbookEntry, index?: number @@ -67,6 +85,8 @@ class HaLogbook extends LitElement { } const previous = this.entries[index - 1]; const state = item.entity_id ? this.hass.states[item.entity_id] : undefined; + const item_username = + item.context_user_id && this._userid_to_name[item.context_user_id]; return html`
${index === 0 || @@ -101,7 +121,11 @@ class HaLogbook extends LitElement { ${item.name} `} - ${item.message} + ${item.message}${item_username + ? ` (${item_username})` + : ``}
diff --git a/src/panels/logbook/ha-panel-logbook.js b/src/panels/logbook/ha-panel-logbook.js deleted file mode 100644 index 293092dc0a..0000000000 --- a/src/panels/logbook/ha-panel-logbook.js +++ /dev/null @@ -1,283 +0,0 @@ -import "@polymer/app-layout/app-header-layout/app-header-layout"; -import "@polymer/app-layout/app-header/app-header"; -import "@polymer/app-layout/app-toolbar/app-toolbar"; -import "../../components/ha-icon-button"; -import "@polymer/paper-input/paper-input"; -import "@polymer/paper-spinner/paper-spinner"; -import { html } from "@polymer/polymer/lib/utils/html-tag"; -/* eslint-plugin-disable lit */ -import { PolymerElement } from "@polymer/polymer/polymer-element"; -import "@vaadin/vaadin-date-picker/theme/material/vaadin-date-picker"; -import { formatDate } from "../../common/datetime/format_date"; -import { computeRTL } from "../../common/util/compute_rtl"; -import "../../components/entity/ha-entity-picker"; -import "../../components/ha-menu-button"; -import LocalizeMixin from "../../mixins/localize-mixin"; -import "../../resources/ha-date-picker-style"; -import "../../styles/polymer-ha-style"; -import "./ha-logbook"; -import "./ha-logbook-data"; - -/* - * @appliesMixin LocalizeMixin - */ -class HaPanelLogbook extends LocalizeMixin(PolymerElement) { - static get template() { - return html` - - - - - - - - -
[[localize('panel.logbook')]]
- -
-
- - - -
- - - - - [[localize('ui.duration.day', 'count', 1)]] - [[localize('ui.duration.day', 'count', 3)]] - [[localize('ui.duration.week', 'count', 1)]] - - - - -
- - -
- `; - } - - static get properties() { - return { - hass: Object, - - narrow: { type: Boolean, reflectToAttribute: true }, - - // ISO8601 formatted date string - _currentDate: { - type: String, - value: function () { - const value = new Date(); - const today = new Date( - Date.UTC(value.getFullYear(), value.getMonth(), value.getDate()) - ); - return today.toISOString().split("T")[0]; - }, - }, - - _periodIndex: { - type: Number, - value: 0, - }, - - _entityId: { - type: String, - value: "", - }, - - entityId: { - type: String, - value: "", - readOnly: true, - }, - - isLoading: { - type: Boolean, - }, - - entries: { - type: Array, - }, - - datePicker: { - type: Object, - }, - - rtl: { - type: Boolean, - reflectToAttribute: true, - computed: "_computeRTL(hass)", - }, - }; - } - - ready() { - super.ready(); - this.hass.loadBackendTranslation("title"); - } - - connectedCallback() { - super.connectedCallback(); - // We are unable to parse date because we use intl api to render date - this.$.picker.set("i18n.parseDate", null); - this.$.picker.set("i18n.formatDate", (date) => - formatDate(new Date(date.year, date.month, date.day), this.hass.language) - ); - } - - _computeFilterDate(_currentDate) { - if (!_currentDate) return undefined; - var parts = _currentDate.split("-"); - parts[1] = parseInt(parts[1]) - 1; - return new Date(parts[0], parts[1], parts[2]).toISOString(); - } - - _computeFilterDays(periodIndex) { - switch (periodIndex) { - case 1: - return 3; - case 2: - return 7; - default: - return 1; - } - } - - _entityPicked(ev) { - this._setEntityId(ev.target.value); - } - - refreshLogbook() { - this.shadowRoot.querySelector("ha-logbook-data").refreshLogbook(); - } - - _computeRTL(hass) { - return computeRTL(hass); - } -} - -customElements.define("ha-panel-logbook", HaPanelLogbook); diff --git a/src/panels/logbook/ha-panel-logbook.ts b/src/panels/logbook/ha-panel-logbook.ts new file mode 100644 index 0000000000..ac59b78f90 --- /dev/null +++ b/src/panels/logbook/ha-panel-logbook.ts @@ -0,0 +1,279 @@ +import "@polymer/app-layout/app-header-layout/app-header-layout"; +import "@polymer/app-layout/app-header/app-header"; +import "@polymer/app-layout/app-toolbar/app-toolbar"; +import "../../components/ha-icon-button"; +import "@polymer/paper-spinner/paper-spinner"; +import { computeRTL } from "../../common/util/compute_rtl"; +import "../../components/entity/ha-entity-picker"; +import "../../components/ha-menu-button"; +import "./ha-logbook"; +import { + LitElement, + property, + customElement, + html, + css, + PropertyValues, +} from "lit-element"; +import { HomeAssistant } from "../../types"; +import { haStyle } from "../../resources/styles"; +import { + clearLogbookCache, + getLogbookData, + LogbookEntry, +} from "../../data/logbook"; +import { mdiRefresh } from "@mdi/js"; +import "../../components/ha-date-range-picker"; +import type { DateRangePickerRanges } from "../../components/ha-date-range-picker"; + +@customElement("ha-panel-logbook") +export class HaPanelLogbook extends LitElement { + @property() hass!: HomeAssistant; + + @property({ reflect: true, type: Boolean }) narrow!: boolean; + + @property() _startDate: Date; + + @property() _endDate: Date; + + @property() _entityId = ""; + + @property() _isLoading = false; + + @property() _entries: LogbookEntry[] = []; + + @property({ reflect: true, type: Boolean }) rtl = false; + + @property() private _ranges?: DateRangePickerRanges; + + public constructor() { + super(); + + const start = new Date(); + start.setHours(start.getHours() - 2); + start.setMinutes(0); + start.setSeconds(0); + this._startDate = start; + + const end = new Date(); + end.setHours(end.getHours() + 1); + end.setMinutes(0); + end.setSeconds(0); + this._endDate = end; + } + + protected render() { + return html` + + + + +
${this.hass.localize("panel.logbook")}
+ + + +
+
+ + ${this._isLoading ? html`` : ""} + +
+ + + +
+ + ${this._isLoading + ? html`` + : html``} +
+ `; + } + + protected firstUpdated(changedProps: PropertyValues) { + super.firstUpdated(changedProps); + this.hass.loadBackendTranslation("title"); + + const today = new Date(); + today.setHours(0, 0, 0, 0); + const todayEnd = new Date(today); + todayEnd.setDate(todayEnd.getDate() + 1); + todayEnd.setMilliseconds(todayEnd.getMilliseconds() - 1); + + const todayCopy = new Date(today); + + const yesterday = new Date(todayCopy.setDate(today.getDate() - 1)); + const yesterdayEnd = new Date(yesterday); + yesterdayEnd.setDate(yesterdayEnd.getDate() + 1); + yesterdayEnd.setMilliseconds(yesterdayEnd.getMilliseconds() - 1); + + const thisWeekStart = new Date( + todayCopy.setDate(today.getDate() - today.getDay()) + ); + const thisWeekEnd = new Date( + todayCopy.setDate(today.getDate() - today.getDay() + 7) + ); + thisWeekEnd.setMilliseconds(thisWeekEnd.getMilliseconds() - 1); + + const lastWeekStart = new Date( + todayCopy.setDate(today.getDate() - today.getDay() - 7) + ); + const lastWeekEnd = new Date( + todayCopy.setDate(today.getDate() - today.getDay()) + ); + lastWeekEnd.setMilliseconds(lastWeekEnd.getMilliseconds() - 1); + + this._ranges = { + [this.hass.localize("ui.panel.logbook.ranges.today")]: [today, todayEnd], + [this.hass.localize("ui.panel.logbook.ranges.yesterday")]: [ + yesterday, + yesterdayEnd, + ], + [this.hass.localize("ui.panel.logbook.ranges.this_week")]: [ + thisWeekStart, + thisWeekEnd, + ], + [this.hass.localize("ui.panel.logbook.ranges.last_week")]: [ + lastWeekStart, + lastWeekEnd, + ], + }; + } + + protected updated(changedProps: PropertyValues) { + if ( + changedProps.has("_startDate") || + changedProps.has("_endDate") || + changedProps.has("_entityId") + ) { + this._getData(); + } + + if (changedProps.has("hass")) { + const oldHass = changedProps.get("hass") as HomeAssistant | undefined; + if (!oldHass || oldHass.language !== this.hass.language) { + this.rtl = computeRTL(this.hass); + } + } + } + + private _dateRangeChanged(ev) { + this._startDate = ev.detail.startDate; + const endDate = ev.detail.endDate; + if (endDate.getHours() === 0 && endDate.getMinutes() === 0) { + endDate.setDate(endDate.getDate() + 1); + endDate.setMilliseconds(endDate.getMilliseconds() - 1); + } + this._endDate = endDate; + } + + private _entityPicked(ev) { + this._entityId = ev.target.value; + } + + private _refreshLogbook() { + this._entries = []; + clearLogbookCache( + this._startDate.toISOString(), + this._endDate.toISOString() + ); + this._getData(); + } + + private async _getData() { + this._isLoading = true; + this._entries = await getLogbookData( + this.hass, + this._startDate.toISOString(), + this._endDate.toISOString(), + this._entityId + ); + this._isLoading = false; + } + + static get styles() { + return [ + haStyle, + css` + ha-logbook { + height: calc(100vh - 136px); + } + + :host([narrow]) ha-logbook { + height: calc(100vh - 198px); + } + + ha-date-range-picker { + margin-right: 16px; + max-width: 100%; + } + + :host([narrow]) ha-date-range-picker { + margin-right: 0; + } + + paper-spinner { + position: absolute; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + } + + .wrap { + margin-bottom: 24px; + } + + .filters { + display: flex; + align-items: flex-end; + padding: 0 16px; + } + + :host([narrow]) .filters { + flex-wrap: wrap; + } + + ha-entity-picker { + display: inline-block; + flex-grow: 1; + max-width: 400px; + --paper-input-suffix: { + height: 24px; + } + } + + :host([narrow]) ha-entity-picker { + max-width: none; + width: 100%; + } + `, + ]; + } +} diff --git a/src/panels/lovelace/cards/hui-entities-card.ts b/src/panels/lovelace/cards/hui-entities-card.ts index d6d61ec7cb..4d7dfed43e 100644 --- a/src/panels/lovelace/cards/hui-entities-card.ts +++ b/src/panels/lovelace/cards/hui-entities-card.ts @@ -228,6 +228,7 @@ class HuiEntitiesCard extends LitElement implements LovelaceCard { display: flex; flex-direction: column; justify-content: space-between; + overflow: hidden; } .card-header { display: flex; diff --git a/src/panels/lovelace/cards/hui-history-graph-card.ts b/src/panels/lovelace/cards/hui-history-graph-card.ts index 404df75173..1e347183c6 100644 --- a/src/panels/lovelace/cards/hui-history-graph-card.ts +++ b/src/panels/lovelace/cards/hui-history-graph-card.ts @@ -12,7 +12,6 @@ import { classMap } from "lit-html/directives/class-map"; import "../../../components/ha-card"; import "../../../components/state-history-charts"; import { CacheConfig, getRecentWithCache } from "../../../data/cached-history"; -import "../../../data/ha-state-history-data"; import { HomeAssistant } from "../../../types"; import { findEntities } from "../common/find-entites"; import { processConfigEntities } from "../common/process-config-entities"; diff --git a/src/panels/lovelace/create-element/create-card-element.ts b/src/panels/lovelace/create-element/create-card-element.ts index cb5748eecf..23b975e0ff 100644 --- a/src/panels/lovelace/create-element/create-card-element.ts +++ b/src/panels/lovelace/create-element/create-card-element.ts @@ -14,6 +14,7 @@ import "../cards/hui-weather-forecast-card"; import { createLovelaceElement, getLovelaceElementClass, + tryCreateLovelaceElement, } from "./create-element-base"; const ALWAYS_LOADED_TYPES = new Set([ @@ -52,6 +53,17 @@ const LAZY_LOAD_TYPES = { picture: () => import("../cards/hui-picture-card"), }; +// This will not return an error card but will throw the error +export const tryCreateCardElement = (config: LovelaceCardConfig) => + tryCreateLovelaceElement( + "card", + config, + ALWAYS_LOADED_TYPES, + LAZY_LOAD_TYPES, + undefined, + undefined + ); + export const createCardElement = (config: LovelaceCardConfig) => createLovelaceElement( "card", diff --git a/src/panels/lovelace/create-element/create-element-base.ts b/src/panels/lovelace/create-element/create-element-base.ts index 1e9c09cf59..b1afedcb28 100644 --- a/src/panels/lovelace/create-element/create-element-base.ts +++ b/src/panels/lovelace/create-element/create-element-base.ts @@ -73,15 +73,8 @@ const _createElement = ( const element = document.createElement( tag ) as CreateElementConfigTypes[T]["element"]; - try { - // @ts-ignore - element.setConfig(config); - } catch (err) { - // eslint-disable-next-line - console.error(tag, err); - // eslint-disable-next-line @typescript-eslint/no-use-before-define - return _createErrorElement(err.message, config); - } + // @ts-ignore + element.setConfig(config); return element; }; @@ -152,9 +145,37 @@ export const createLovelaceElement = ( domainTypes?: { _domain_not_found: string; [domain: string]: string }, // Default type if no type given. If given, entity types will not work. defaultType?: string +): CreateElementConfigTypes[T]["element"] | HuiErrorCard => { + try { + return tryCreateLovelaceElement( + tagSuffix, + config, + alwaysLoadTypes, + lazyLoadTypes, + domainTypes, + defaultType + ); + } catch (err) { + // eslint-disable-next-line + console.error(tagSuffix, config.type, err); + return _createErrorElement(err.message, config); + } +}; + +export const tryCreateLovelaceElement = < + T extends keyof CreateElementConfigTypes +>( + tagSuffix: T, + config: CreateElementConfigTypes[T]["config"], + alwaysLoadTypes?: Set, + lazyLoadTypes?: { [domain: string]: () => Promise }, + // Allow looking at "entity" in config and mapping that to a type + domainTypes?: { _domain_not_found: string; [domain: string]: string }, + // Default type if no type given. If given, entity types will not work. + defaultType?: string ): CreateElementConfigTypes[T]["element"] | HuiErrorCard => { if (!config || typeof config !== "object") { - return _createErrorElement("Config is not an object", config); + throw new Error("Config is not an object"); } if ( @@ -163,7 +184,7 @@ export const createLovelaceElement = ( // If domain types is given, we can derive a type from "entity" (!domainTypes || !("entity" in config)) ) { - return _createErrorElement("No card type configured.", config); + throw new Error("No card type configured."); } const customTag = config.type ? _getCustomTag(config.type) : undefined; @@ -185,7 +206,7 @@ export const createLovelaceElement = ( } if (type === undefined) { - return _createErrorElement(`No type specified`, config); + throw new Error("No type specified."); } const tag = `hui-${type}-${tagSuffix}`; @@ -199,7 +220,7 @@ export const createLovelaceElement = ( return _createElement(tag, config); } - return _createErrorElement(`Unknown type encountered: ${type}.`, config); + throw new Error(`Unknown type encountered: ${type}`); }; export const getLovelaceElementClass = async < diff --git a/src/panels/lovelace/editor/card-editor/hui-card-editor.ts b/src/panels/lovelace/editor/card-editor/hui-card-editor.ts index 4d884e469c..49a7ad7511 100644 --- a/src/panels/lovelace/editor/card-editor/hui-card-editor.ts +++ b/src/panels/lovelace/editor/card-editor/hui-card-editor.ts @@ -158,6 +158,7 @@ export class HuiCardEditor extends LitElement { .error=${this._error} .rtl=${computeRTL(this.hass)} @value-changed=${this._handleYAMLChanged} + @keydown=${this._ignoreKeydown} > `} @@ -280,6 +281,10 @@ export class HuiCardEditor extends LitElement { } } + private _ignoreKeydown(ev: KeyboardEvent) { + ev.stopPropagation(); + } + static get styles(): CSSResult { return css` :host { diff --git a/src/panels/lovelace/editor/card-editor/hui-card-picker.ts b/src/panels/lovelace/editor/card-editor/hui-card-picker.ts index 14bd738d1d..0fea27a87c 100644 --- a/src/panels/lovelace/editor/card-editor/hui-card-picker.ts +++ b/src/panels/lovelace/editor/card-editor/hui-card-picker.ts @@ -27,11 +27,12 @@ import { calcUnusedEntities, computeUsedEntities, } from "../../common/compute-unused-entities"; -import { createCardElement } from "../../create-element/create-card-element"; +import { tryCreateCardElement } from "../../create-element/create-card-element"; import { LovelaceCard } from "../../types"; import { getCardStubConfig } from "../get-card-stub-config"; import { CardPickTarget, Card } from "../types"; import { coreCards } from "../lovelace-cards"; +import { styleMap } from "lit-html/directives/style-map"; interface CardElement { card: Card; @@ -54,6 +55,10 @@ export class HuiCardPicker extends LitElement { private _usedEntities?: string[]; + private _width?: number; + + private _height?: number; + private _filterCards = memoizeOne( (cardElements: CardElement[], filter?: string): CardElement[] => { if (filter) { @@ -92,26 +97,33 @@ export class HuiCardPicker extends LitElement { no-label-float @value-changed=${this._handleSearchChange} > -
- ${this._filterCards(this._cards, this._filter).map( - (cardElement: CardElement) => cardElement.element - )} -
-
-
-
- ${this.hass!.localize( - `ui.panel.lovelace.editor.card.generic.manual_description` - )} -
-
- ${this.hass!.localize( - `ui.panel.lovelace.editor.card.generic.manual` - )} +
+
+ ${this._filterCards(this._cards, this._filter).map( + (cardElement: CardElement) => cardElement.element + )} +
+
+
+
+ ${this.hass!.localize( + `ui.panel.lovelace.editor.card.generic.manual_description` + )} +
+
+ ${this.hass!.localize( + `ui.panel.lovelace.editor.card.generic.manual` + )} +
@@ -153,6 +165,24 @@ export class HuiCardPicker extends LitElement { this._loadCards(); } + protected updated(changedProps) { + super.updated(changedProps); + // Store the width and height so that when we search, box doesn't jump + const div = this.shadowRoot!.querySelector("div")!; + if (!this._width) { + const width = div.clientWidth; + if (width) { + this._width = width; + } + } + if (!this._height) { + const height = div.clientHeight; + if (height) { + this._height = height; + } + } + } + private _loadCards() { let cards: Card[] = coreCards.map((card: Card) => ({ name: this.hass!.localize( @@ -277,8 +307,8 @@ export class HuiCardPicker extends LitElement { fireEvent(this, "config-changed", { config }); } - private _createCardElement(cardConfig: LovelaceCardConfig) { - const element = createCardElement(cardConfig) as LovelaceCard; + private _tryCreateCardElement(cardConfig: LovelaceCardConfig) { + const element = tryCreateCardElement(cardConfig) as LovelaceCard; element.hass = this.hass; element.addEventListener( "ll-rebuild", @@ -295,7 +325,12 @@ export class HuiCardPicker extends LitElement { cardElToReplace: LovelaceCard, config: LovelaceCardConfig ): void { - const newCardEl = this._createCardElement(config); + let newCardEl: LovelaceCard; + try { + newCardEl = this._tryCreateCardElement(config); + } catch (err) { + return; + } if (cardElToReplace.parentElement) { cardElToReplace.parentElement!.replaceChild(newCardEl, cardElToReplace); } @@ -321,7 +356,11 @@ export class HuiCardPicker extends LitElement { ); if (showElement) { - element = this._createCardElement(cardConfig); + try { + element = this._tryCreateCardElement(cardConfig); + } catch (err) { + element = undefined; + } } } diff --git a/src/panels/lovelace/editor/card-editor/hui-dialog-edit-card.ts b/src/panels/lovelace/editor/card-editor/hui-dialog-edit-card.ts index 93ae17ff3f..dae6c63033 100755 --- a/src/panels/lovelace/editor/card-editor/hui-dialog-edit-card.ts +++ b/src/panels/lovelace/editor/card-editor/hui-dialog-edit-card.ts @@ -119,8 +119,8 @@ export class HuiDialogEditCard extends LitElement {
@@ -192,26 +193,33 @@ export class HuiDialogEditCard extends LitElement { ` : ""} - - ${this.hass!.localize("ui.common.cancel")} - - ${this._cardConfig !== undefined - ? html` - - ${this._saving - ? html` ` - : this.hass!.localize("ui.common.save")} - - ` - : ``} +
+ + ${this.hass!.localize("ui.common.cancel")} + + ${this._cardConfig !== undefined + ? html` + + ${this._saving + ? html` + + ` + : this.hass!.localize("ui.common.save")} + + ` + : ``} +
`; } + private _ignoreKeydown(ev: KeyboardEvent) { + ev.stopPropagation(); + } + static get styles(): CSSResultArray { return [ haStyleDialog, @@ -339,12 +347,6 @@ export class HuiDialogEditCard extends LitElement { this._guiModeAvailable = ev.detail.guiModeAvailable; } - private _handleKeyUp(ev: KeyboardEvent) { - if (ev.keyCode === 27) { - this._close(); - } - } - private _handleGUIModeChanged(ev: HASSDomEvent): void { ev.stopPropagation(); this._GUImode = ev.detail.guiMode; @@ -376,6 +378,9 @@ export class HuiDialogEditCard extends LitElement { } private async _save(): Promise { + if (!this._canSave || this._saving) { + return; + } this._saving = true; await this._params!.saveConfig( this._params!.path.length === 1 diff --git a/src/resources/ha-style.ts b/src/resources/ha-style.ts index 6dfbfe1eed..faabedd8f8 100644 --- a/src/resources/ha-style.ts +++ b/src/resources/ha-style.ts @@ -86,6 +86,9 @@ documentContainer.innerHTML = ` /* set our slider style */ --ha-paper-slider-pin-font-size: 15px; + /* markdown styles */ + --markdown-code-background-color: #f6f8fa; + /* rgb */ --rgb-primary-color: 3, 169, 244; --rgb-accent-color: 255, 152, 0; diff --git a/src/translations/en.json b/src/translations/en.json index 637832b9fa..6c19dc6969 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -278,6 +278,11 @@ "failed_create_area": "Failed to create area." } }, + "date-range-picker": { + "start_date": "Start date", + "end_date": "End date", + "select": "Select" + }, "relative_time": { "past": "{time} ago", "future": "In {time}", @@ -443,6 +448,7 @@ "buttons": { "add": "Add Devices via this device", "remove": "Remove Device", + "clusters": "Manage Clusters", "reconfigure": "Reconfigure Device", "zigbee_information": "Zigbee device signature" }, @@ -520,6 +526,11 @@ "hint_enable": "Missing config options? Enable advanced mode on", "link_profile_page": "your profile page" }, + "integration_panel_move": { + "missing_zha": "Missing the ZHA config panel? It was moved to the ZHA entry on the {integrations_page}.", + "missing_zwave": "Missing the Z-Wave config panel? It was moved to the Z-Wave entry on the {integrations_page}.", + "link_integration_page": "integrations page" + }, "common": { "editor": { "confirm_unsaved": "You have unsaved changes. Are you sure you want to leave?" @@ -1501,6 +1512,20 @@ "create": "Create" } }, + "mqtt": { + "button": "Configure", + "title": "MQTT", + "description_publish": "Publish a packet", + "topic": "topic", + "payload": "Payload (template allowed)", + "publish": "Publish", + "description_listen": "Listen to a topic", + "listening_to": "Listening to", + "subscribe_to": "Topic to subscribe to", + "start_listening": "Start listening", + "stop_listening": "Stop listening", + "message_received": "Message {id} received on {topic} at {time}:" + }, "zha": { "button": "Configure", "header": "Configure Zigbee Home Automation", @@ -1689,13 +1714,21 @@ } }, "history": { - "showing_entries": "Showing entries for", - "period": "Period" + "ranges": { + "today": "Today", + "yesterday": "Yesterday", + "this_week": "This week", + "last_week": "Last week" + } }, "logbook": { - "showing_entries": "[%key:ui::panel::history::showing_entries%]", - "period": "Period", - "entries_not_found": "No logbook entries found." + "entries_not_found": "No logbook entries found.", + "ranges": { + "today": "Today", + "yesterday": "Yesterday", + "this_week": "This week", + "last_week": "Last week" + } }, "lovelace": { "cards": { @@ -2294,19 +2327,6 @@ "alert_event_type": "Event type is a mandatory field", "notification_event_fired": "Event {type} successful fired!" }, - "mqtt": { - "title": "MQTT", - "description_publish": "Publish a packet", - "topic": "topic", - "payload": "Payload (template allowed)", - "publish": "Publish", - "description_listen": "Listen to a topic", - "listening_to": "Listening to", - "subscribe_to": "Topic to subscribe to", - "start_listening": "Start listening", - "stop_listening": "Stop listening", - "message_received": "Message {id} received on {topic} at {time}:" - }, "services": { "title": "Services", "description": "The service dev tool allows you to call any available service in Home Assistant.", diff --git a/src/types.ts b/src/types.ts index 2f7493f4b8..67b908761b 100644 --- a/src/types.ts +++ b/src/types.ts @@ -302,6 +302,7 @@ interface ForecastAttribute { datetime: string; templow?: number; precipitation?: number; + precipitation_probability?: number; humidity?: number; condition?: string; } diff --git a/translations/frontend/ca.json b/translations/frontend/ca.json index e9639977d4..a1b2659606 100644 --- a/translations/frontend/ca.json +++ b/translations/frontend/ca.json @@ -483,7 +483,7 @@ "menu": "Menú", "next": "Següent", "no": "No", - "overflow_menu": "Menú de desbordament", + "overflow_menu": "Menú desbordament", "previous": "Anterior", "refresh": "Actualitza", "save": "Desa", @@ -694,10 +694,10 @@ }, "zha_device_info": { "buttons": { - "add": "Afegir dispositius", + "add": "Afegeix dispositius a través d'aquest dispositiu", "reconfigure": "Reconfigurar dispositiu", "remove": "Eliminar dispositiu", - "zigbee_information": "Informació Zigbee" + "zigbee_information": "Signatura Zigbee del dispositiu" }, "confirmations": { "remove": "Estàs segur que vols eliminar el dispositiu?" @@ -717,7 +717,7 @@ "unknown": "Desconeguda", "zha_device_card": { "area_picker_label": "Àrea", - "device_name_placeholder": "Nom donat per l'usuari", + "device_name_placeholder": "Canvia el nom del dispositiu", "update_name_button": "Actualitzar Nom" } } @@ -1375,7 +1375,7 @@ "built_using": "Creat utilitzant", "caption": "Informació", "custom_uis": "Interfícies d'usuari personalitzades:", - "description": "Informació sobre la instal·lació de Home Assistant", + "description": "Informació de la instal·lació de Home Assistant", "developed_by": "Desenvolupat per un munt de gent fantàstica.", "documentation": "Documentació", "frontend": "frontend-ui", @@ -1391,6 +1391,11 @@ "system_health_error": "El component Estat del Sistema no està configurat. Afegeix 'system_health:' a configuration.yaml", "title": "Informació" }, + "integration_panel_move": { + "link_integration_page": "pàgina d'integracions", + "missing_zha": "Trobes a faltar el panell de configuració de ZHA? S'ha traslladat a l'entrada ZHA de la {integrations_page}.", + "missing_zwave": "Trobes a faltar el panell de configuració de Z-Wave? S'ha traslladat a l'entrada Z-Wave de la {integrations_page}." + }, "integrations": { "add_integration": "Afegeix integració", "caption": "Integracions", @@ -1660,11 +1665,11 @@ "core": "Actualitza ubicació i personalitzacions", "group": "Actualitza grups", "heading": "Tornant a carregar la configuració", - "input_boolean": "Torna a carregar booleans d’entrada", - "input_datetime": "Torna a carregar les hores de la data d'entrada", - "input_number": "Recarregar números d'entrada", - "input_select": "Actualitza l'entrada selecciona", - "input_text": "Recarregar textos d'entrada", + "input_boolean": "Actualitza entrades booleanes", + "input_datetime": "Actualitza entrades de data i hora", + "input_number": "Actualitza entrades numèriques", + "input_select": "Actualitza entrades de selecció", + "input_text": "Actualitza entrades de text", "introduction": "Algunes parts de Home Assistant es poden actualitzar sense necessitat reiniciar-lo. Si prems actualitza s'esborrarà la configuració YAML actual i se'n carregarà la nova.", "person": "Actualitza persones", "scene": "Actualitza escenes", @@ -1728,8 +1733,11 @@ }, "zha": { "add_device_page": { + "discovered_text": "Els dispositius apareixeran aquí un cop descoberts.", "discovery_text": "Els dispositius descoberts apareixeran aquí. Segueix les instruccions del/s teu/s dispositiu/s i posa el dispositiu/s en mode d'emparellament.", "header": "Domòtica amb Zigbee - Afegir dispositius", + "no_devices_found": "No s'han trobat dispositius, assegura't que estiguin en mode vinculació i manten-los desperts mentre estiguin intentant ser descoberts.", + "pairing_mode": "Assegura't que els dispositiu estiguin en mode vinculació. Consulta les instruccions del dispositiu per saber com fer-ho.", "search_again": "Torna a cercar", "spinner": "S'estan cercant dispositius ZHA Zigbee..." }, @@ -1737,6 +1745,7 @@ "caption": "Afegeix dispositius", "description": "Afegeix dispositius a la xarxa Zigbee" }, + "button": "Configura", "caption": "ZHA", "cluster_attributes": { "attributes_of_cluster": "Atributs del clúster seleccionat", @@ -1815,6 +1824,9 @@ "header": "Gestió de la xarxa", "introduction": "Comandes que afecten tota la xarxa" }, + "network": { + "caption": "Xarxa" + }, "node_management": { "header": "Gestió del dispositiu", "help_node_dropdown": "Selecciona un dispositiu per visualitzar-ne les opcions (per dispositiu).", @@ -1854,6 +1866,7 @@ "no_zones_created_yet": "Sembla que encara no has creat cap zona." }, "zwave": { + "button": "Configura", "caption": "Z-Wave", "common": { "index": "Índex", diff --git a/translations/frontend/da.json b/translations/frontend/da.json index 3bc6a67e1e..f17be7f07a 100644 --- a/translations/frontend/da.json +++ b/translations/frontend/da.json @@ -1373,7 +1373,9 @@ }, "info": { "built_using": "Bygget ved hjælp af", + "caption": "Oplysninger", "custom_uis": "Tilpassede brugergrænseflader:", + "description": "Oplysninger om din Home Assistant-installation", "developed_by": "Udviklet af en masse fantastiske mennesker.", "documentation": "Dokumentation", "frontend": "brugerflade", @@ -1389,6 +1391,11 @@ "system_health_error": "System Health-komponenten er ikke indlæst. Føj 'system_health:' til 'config.yaml'", "title": "Info" }, + "integration_panel_move": { + "link_integration_page": "integrationssiden", + "missing_zha": "Mangler ZHA-konfigurationspanelet? Det er blevet flyttet til ZHA-posten på {integrations_page}.", + "missing_zwave": "Mangler Z-wave-konfigurationspanelet? Det er blevet flyttet til Z-wave-posten på {integrations_page}." + }, "integrations": { "add_integration": "Tilføj integration", "caption": "Integrationer", @@ -1461,7 +1468,9 @@ }, "introduction": "Her er det muligt at konfigurere dine komponenter og Home Assistant. Ikke alt er muligt at konfigurere fra brugerfladen endnu, men vi arbejder på det.", "logs": { + "caption": "Logs", "clear": "Ryd", + "description": "Se logs for Home Assistant", "details": "Logdetaljer ({level})", "load_full_log": "Indlæs fuld Home Assistant-log", "loading_log": "Indlæser fejllog...", @@ -1656,6 +1665,11 @@ "core": "Genindlæs lokalitet og tilpasninger", "group": "Genindlæs grupper", "heading": "Genindlæsning af YAML-konfiguration", + "input_boolean": "Genindlæs booleske input", + "input_datetime": "Genindlæs inputdatotider", + "input_number": "Genindlæs inputnumre", + "input_select": "Genindlæs inputvalg", + "input_text": "Genindlæs inputtekster", "introduction": "Nogle dele af Home Assistant kan genindlæses uden en genstart. Tryk på genindlæs for at aflæse den nuværende YAML-konfiguration og indlæse den nye.", "person": "Genindlæs personer", "scene": "Genindlæs scener", @@ -1719,8 +1733,11 @@ }, "zha": { "add_device_page": { + "discovered_text": "Enheder vil dukke op her, når de er fundet.", "discovery_text": "Fundne enheder vil dukke op her. Følg instruktionerne for din enhed(er) og sæt enhed(erne) i parringstilstand.", "header": "Zigbee Home Automation - Tilføj enheder", + "no_devices_found": "Ingen enheder blev fundet. Sørg for at de er i paringtilstand, og hold dem vågne, mens opdagelsen kører.", + "pairing_mode": "Sørg for, at dine enheder er i parringstilstand. Se enhedens vejledning i, hvordan du gør dette.", "search_again": "Søg igen", "spinner": "Søger efter ZHA Zigbee-enheder..." }, @@ -1728,6 +1745,7 @@ "caption": "Tilføj enheder", "description": "Føj enheder til Zigbee-netværk" }, + "button": "Konfigurer", "caption": "ZHA", "cluster_attributes": { "attributes_of_cluster": "Egenskaber for den valgte klynge", @@ -1806,6 +1824,9 @@ "header": "Netværksstyring", "introduction": "Kommandoer, der påvirker hele netværket" }, + "network": { + "caption": "Netværk" + }, "node_management": { "header": "Enhedshåndtering", "help_node_dropdown": "Vælg en enhed for at få vist enhedsspecifikke indstillinger.", @@ -1845,6 +1866,7 @@ "no_zones_created_yet": "Det ser ud til, at du ikke har oprettet nogen zoner endnu." }, "zwave": { + "button": "Konfigurer", "caption": "Z-Wave", "common": { "index": "Indeks", @@ -1886,12 +1908,17 @@ "add_node_secure": "Tilføj sikkert knudepunkt", "cancel_command": "Annuller kommando", "heal_network": "Helbred netværk", + "heal_node": "Helbred node", + "node_info": "Node information", + "print_node": "Udskriv node", + "refresh_entity": "Opdater entitet", "remove_node": "Fjern knudepunkt", "save_config": "Gem konfiguration", "soft_reset": "Blød nulstilling", "start_network": "Start netværk", "stop_network": "Stop netværk", - "test_network": "Test netværk" + "test_network": "Test netværk", + "test_node": "Test node" }, "values": { "header": "Knudepunktsværdier" diff --git a/translations/frontend/de.json b/translations/frontend/de.json index d3888be2aa..1df2ac3dba 100644 --- a/translations/frontend/de.json +++ b/translations/frontend/de.json @@ -693,10 +693,10 @@ }, "zha_device_info": { "buttons": { - "add": "Geräte hinzufügen", + "add": "Geräte über dieses Gerät hinzufügen", "reconfigure": "Gerät neu konfigurieren", "remove": "Gerät entfernen", - "zigbee_information": "ZigBee-Informationen" + "zigbee_information": "ZigBee-Gerätesignatur" }, "confirmations": { "remove": "Möchtest du das Gerät wirklich entfernen?" @@ -716,7 +716,7 @@ "unknown": "Unbekannt", "zha_device_card": { "area_picker_label": "Bereich", - "device_name_placeholder": "Benutzerdefinierter Name", + "device_name_placeholder": "Gerätename ändern", "update_name_button": "Aktualisierung Name" } } @@ -1722,8 +1722,11 @@ }, "zha": { "add_device_page": { + "discovered_text": "Geräte werden hier angezeigt sobald sie erkannt worden sind.", "discovery_text": "Erkannte Geräte werden hier angezeigt. Befolgen Sie die Anweisungen für Ihr Gerät und versetzen Sie das Gerät in den Pairing-Modus.", "header": "Zigbee Home Automation - Geräte hinzufügen", + "no_devices_found": "Es wurde keine Geräte erkannt, stelle sicher das sie sich im Pairing Modus befinden und halte sie Aktiv solange die Erkennung läuft,", + "pairing_mode": "Stellen Sie sicher, dass sich Ihre Geräte im Pairing-Modus befinden. Überprüfen Sie dazu die Anweisungen Ihres Geräts.", "search_again": "Erneut suchen", "spinner": "Suche nach ZHA Zigbee Geräten..." }, @@ -1731,6 +1734,7 @@ "caption": "Geräte hinzufügen", "description": "Gerät dem Zigbee-Netzwerk hinzufügen." }, + "button": "Konfigurieren", "caption": "ZHA", "cluster_attributes": { "attributes_of_cluster": "Attribute des ausgewählten Clusters", @@ -1809,6 +1813,9 @@ "header": "Netzwerkverwaltung", "introduction": "Befehle, die das gesamte Netzwerk betreffen" }, + "network": { + "caption": "Netzwerk" + }, "node_management": { "header": "Geräteverwaltung", "help_node_dropdown": "Wähle ein Gerät aus, um die Geräteoptionen anzuzeigen.", @@ -1848,6 +1855,7 @@ "no_zones_created_yet": "Es sieht so aus, als hättest Du noch keine Zonen erstellt." }, "zwave": { + "button": "Konfigurieren", "caption": "Z-Wave", "common": { "index": "Index", @@ -1905,7 +1913,8 @@ "header": "OZW Log", "introduction": "Schauen Sie das Protokoll an. 0 ist das Minimum (lädt das gesamte Protokoll) und 1000 ist das Maximum. Beim Laden wird ein statisches Protokoll angezeigt und das Ende wird automatisch mit der zuletzt angegebenen Anzahl von Zeilen des Protokolls aktualisiert.", "last_log_lines": "Anzahl der letzten Logzeilen", - "load": "Laden" + "load": "Laden", + "tail": "Ende" }, "services": { "add_node": "Knoten hinzufügen", @@ -2352,7 +2361,7 @@ "entity_non_numeric": "Die Entität ist nicht-numerisch: {entity}", "entity_not_found": "Entität nicht verfügbar: {entity}", "entity_unavailable": "{entity} ist derzeit nicht verfügbar", - "starting": "Home Assistant beginnt, vielleicht ist noch nicht alles verfügbar" + "starting": "Home Assistant startet gerade, eventuell ist noch nicht alles verfügbar" } }, "mailbox": { diff --git a/translations/frontend/en.json b/translations/frontend/en.json index e4c67bec94..516e6b30a5 100644 --- a/translations/frontend/en.json +++ b/translations/frontend/en.json @@ -1391,6 +1391,11 @@ "system_health_error": "System Health component is not loaded. Add 'system_health:' to configuration.yaml", "title": "Info" }, + "integration_panel_move": { + "link_integration_page": "integrations page", + "missing_zha": "Missing the ZHA config panel? It was moved to the ZHA entry on the {integrations_page}.", + "missing_zwave": "Missing the Z-Wave config panel? It was moved to the Z-Wave entry on the {integrations_page}." + }, "integrations": { "add_integration": "Add integration", "caption": "Integrations", diff --git a/translations/frontend/es.json b/translations/frontend/es.json index 17e21f29e6..554bee155c 100644 --- a/translations/frontend/es.json +++ b/translations/frontend/es.json @@ -694,10 +694,10 @@ }, "zha_device_info": { "buttons": { - "add": "Añadir dispositivos", + "add": "Añadir dispositivos a través de este dispositivo", "reconfigure": "Reconfigurar dispositivo", "remove": "Eliminar dispositivos", - "zigbee_information": "Información Zigbee" + "zigbee_information": "Firma del dispositivo Zigbee" }, "confirmations": { "remove": "¿Estás seguro de que quieres eliminar este dispositivo?" @@ -717,7 +717,7 @@ "unknown": "Desconocido", "zha_device_card": { "area_picker_label": "Área", - "device_name_placeholder": "Nombre dado por el usuario", + "device_name_placeholder": "Cambiar el nombre del dispositivo", "update_name_button": "Cambiar nombre" } } @@ -1391,6 +1391,11 @@ "system_health_error": "El componente Estado del Sistema no está cargado. Añade 'system_health:' a configuration.yaml", "title": "Información" }, + "integration_panel_move": { + "link_integration_page": "página de integraciones", + "missing_zha": "¿Echas de menos el panel de configuración de ZHA? Se ha movido a la entrada ZHA en la {integrations_page}.", + "missing_zwave": "¿Echas de menos el panel de configuración de Z-Wave? Se ha movido a la entrada Z-Wave en la {integrations_page}." + }, "integrations": { "add_integration": "Añadir integración", "caption": "Integraciones", @@ -1728,8 +1733,11 @@ }, "zha": { "add_device_page": { + "discovered_text": "Los dispositivos aparecerán aquí una vez descubiertos.", "discovery_text": "Los dispositivos detectados aparecerán aquí. Ponlos en modo emparejamiento siguiendo sus instrucciones.", "header": "Domótica Zigbee - Añadir dispositivos", + "no_devices_found": "No se encontraron dispositivos, asegúrate de que están en modo de emparejamiento y mantenlos despiertos mientras el descubrimiento se está ejecutando.", + "pairing_mode": "Asegúrate de que tus dispositivos están en modo de emparejamiento. Consulta las instrucciones de tu dispositivo sobre cómo hacerlo.", "search_again": "Buscar de nuevo", "spinner": "Buscando dispositivos ZHA Zigbee...." }, @@ -1737,6 +1745,7 @@ "caption": "Añadir dispositivos", "description": "Añadir dispositivos a la red Zigbee" }, + "button": "Configurar", "caption": "ZHA", "cluster_attributes": { "attributes_of_cluster": "Atributos del clúster seleccionado", @@ -1815,6 +1824,9 @@ "header": "Administración de la red", "introduction": "Comandos que afectan a toda la red." }, + "network": { + "caption": "Red" + }, "node_management": { "header": "Administración de dispositivos", "help_node_dropdown": "Selecciona un dispositivo para ver las opciones por dispositivo.", @@ -1854,6 +1866,7 @@ "no_zones_created_yet": "Parece que aún no has creado ninguna zona." }, "zwave": { + "button": "Configurar", "caption": "Z-Wave", "common": { "index": "Índice", diff --git a/translations/frontend/fi.json b/translations/frontend/fi.json index d759003877..e7ea019db5 100644 --- a/translations/frontend/fi.json +++ b/translations/frontend/fi.json @@ -483,6 +483,7 @@ "menu": "Valikko", "next": "Seuraava", "no": "Ei", + "overflow_menu": "Ylivuotovalikko", "previous": "Edellinen", "refresh": "Päivitä", "save": "Tallenna", @@ -912,6 +913,8 @@ "introduction": "Käytä automaatioita herättääksesi kotisi eloon", "load_error_not_editable": "Vain automaatiot tiedostossa automations.yaml ovat muokattavissa.", "load_error_unknown": "Virhe ladatessa automaatiota ( {err_no} )", + "move_down": "Siirrä alaspäin", + "move_up": "Siirrä ylöspäin", "save": "Tallenna", "triggers": { "add": "Laukaisuehto", @@ -1370,7 +1373,9 @@ }, "info": { "built_using": "Rakennettu käyttäen", + "caption": "Tiedot", "custom_uis": "Mukautetut käyttöliittymät:", + "description": "Tietoja Home Assistant -asennuksesta", "developed_by": "Kehittänyt joukko mahtavia ihmisiä.", "documentation": "Dokumentointi", "frontend": "frontend-ui", @@ -1386,6 +1391,11 @@ "system_health_error": "Järjestelmän kunto-komponenttia ei ole ladattu. Lisää 'system_health:' kohteeseen configuration.yaml", "title": "Tiedot" }, + "integration_panel_move": { + "link_integration_page": "Integraatiot", + "missing_zha": "Etsitkö ZHA-asetuspaneelia? Se siirrettiin kohtaan ZHA {integrations_page}.", + "missing_zwave": "Etsitkö Z-Wave-asetuspaneelia? Se siirrettiin Z-Wave-kohtaan {integrations_page}." + }, "integrations": { "add_integration": "Lisää integraatio", "caption": "Integraatiot", @@ -1458,7 +1468,9 @@ }, "introduction": "Täällä voit säätää Home Assistanttia ja sen komponentteja. Huomioithan, ettei kaikkea voi vielä säätää käyttöliittymän kautta, mutta teemme jatkuvasti töitä sen mahdollistamiseksi.", "logs": { + "caption": "Lokit", "clear": "Tyhjennä", + "description": "Tarkastele Home Assistant -lokeja", "details": "Lokitiedot ( {level} )", "load_full_log": "Lataa Home Assistantin koko loki", "loading_log": "Ladataan virhelokia...", @@ -1653,6 +1665,11 @@ "core": "Lataa ydin uudelleen", "group": "Lataa ryhmät uudelleen", "heading": "Asetusten uudelleenlataus", + "input_boolean": "Lataa booleanit uudelleen", + "input_datetime": "Lataa syöttöpäivämäärät uudelleen", + "input_number": "Lataa syöttönumerot uudelleen", + "input_select": "Lataa valinnat uudelleen", + "input_text": "Lataa syöttötekstit uudelleen", "introduction": "Jotkut Home Assistantin osat voidaan ladata uudelleen ilman, että tarvitaan uudelleenkäynnistystä. Painamalla uudelleenlatausta yaml-tiedosto luetaan uudelleen.", "person": "Lataa henkilöt uudelleen", "scene": "Lataa tilanteet uudelleen", @@ -1716,8 +1733,11 @@ }, "zha": { "add_device_page": { + "discovered_text": "Laitteet tulevat tänne, kun ne löydetään.", "discovery_text": "Löydetyt laitteet näkyvät täällä. Noudata laitteen (laitteiden) ohjeita ja aseta laite pariliitostilaan.", "header": "Zigbee Home Automation - Lisää laitteita", + "no_devices_found": "Mitään laitteita ei löydy. Varmista, että ne ovat paritustilassa ja pidä ne hereillä havaitsemisen ollessa käynnissä.", + "pairing_mode": "Varmista, että laitteesi ovat paritustilassa. Tarkista laitteen ohjeet, kuinka tämä tehdään.", "search_again": "Etsi uudestaan", "spinner": "Etsitään ZHA Zigbee laitteita..." }, @@ -1725,6 +1745,7 @@ "caption": "Lisää laitteita", "description": "Lisää laitteita Zigbee-verkkoon" }, + "button": "Määritä", "caption": "ZHA", "cluster_attributes": { "attributes_of_cluster": "Valitun klusterin määritteet", @@ -1803,6 +1824,9 @@ "header": "Verkon hallinta", "introduction": "Koko verkkoon vaikuttavat komennot" }, + "network": { + "caption": "Verkko" + }, "node_management": { "header": "Laitehallinta", "help_node_dropdown": "Valitse laite tarkastellaksesi laitekohtaisia vaihtoehtoja.", @@ -1842,6 +1866,7 @@ "no_zones_created_yet": "Näyttää siltä, että et ole vielä luonut vyöhykkeitä." }, "zwave": { + "button": "Määritä", "caption": "Z-Wave", "common": { "index": "Indeksi", diff --git a/translations/frontend/fr.json b/translations/frontend/fr.json index 3c1a91add7..0a7b43f643 100644 --- a/translations/frontend/fr.json +++ b/translations/frontend/fr.json @@ -308,12 +308,12 @@ "lightning-rainy": "Orage / Pluie", "partlycloudy": "Partiellement nuageux", "pouring": "Averses", - "rainy": "Pluie", - "snowy": "Neige", - "snowy-rainy": "Neige / Pluie", - "sunny": "Soleil", - "windy": "Vent", - "windy-variant": "Vent" + "rainy": "Pluvieux", + "snowy": "Neigeux", + "snowy-rainy": "Neigeux, pluvieux", + "sunny": "Ensoleillé", + "windy": "Venteux", + "windy-variant": "Venteux" }, "zwave": { "default": { @@ -1391,6 +1391,11 @@ "system_health_error": "Le composant System Health n'est pas chargé. Ajouter 'system_health:' à configuration.yaml", "title": "Info" }, + "integration_panel_move": { + "link_integration_page": "page d'intégration", + "missing_zha": "Il manque le panneau de configuration de ZHA ? Il a été déplacé vers l'entrée ZHA sur la {integrations_page}.", + "missing_zwave": "Il manque le panneau de configuration Z-Wave ? Il a été déplacé vers l'entrée Z-Wave sur la {integrations_page}." + }, "integrations": { "add_integration": "Ajouter l'intégration", "caption": "Intégrations", @@ -1657,7 +1662,7 @@ "section": { "reloading": { "automation": "Recharger les automatisations", - "core": "Recharger l'emplacement et les personnalisations", + "core": "Recharger les emplacements et personnalisations", "group": "Recharger les groupes", "heading": "Rechargement de la configuration", "input_boolean": "Recharger les booléens d'entrée", @@ -1728,8 +1733,11 @@ }, "zha": { "add_device_page": { + "discovered_text": "Les appareils s'afficheront ici une fois découverts.", "discovery_text": "Les appareils découverts apparaîtront ici. Suivez les instructions pour votre / vos appareil(s) et placez-le(s) en mode de couplage.", "header": "Zigbee Home Automation - Ajout de périphériques", + "no_devices_found": "Aucun appareil n'a été trouvé, assurez-vous qu'ils sont en mode d'appairage et gardez-les éveillés pendant que la découverte est en cours", + "pairing_mode": "Assurez-vous que vos appareils sont en mode d'appairage. Consultez les instructions de votre appareil pour savoir comment procéder.", "search_again": "Rechercher à nouveau", "spinner": "Recherche de périphériques ZHA Zigbee ..." }, @@ -1737,6 +1745,7 @@ "caption": "Ajouter des appareils", "description": "Ajouter des appareils au réseau Zigbee" }, + "button": "Configurer", "caption": "ZHA", "cluster_attributes": { "attributes_of_cluster": "Attributs du cluster sélectionné", @@ -1815,6 +1824,9 @@ "header": "Gestion du réseau", "introduction": "Commandes qui affectent l'ensemble du réseau" }, + "network": { + "caption": "Réseau" + }, "node_management": { "header": "Gestion des appareils", "help_node_dropdown": "Sélectionnez un périphérique pour afficher les options par périphérique.", @@ -1854,6 +1866,7 @@ "no_zones_created_yet": "Il semble que vous n'ayez pas encore créé de zones." }, "zwave": { + "button": "Configurer", "caption": "Z-Wave", "common": { "index": "Index", @@ -2334,7 +2347,7 @@ "refresh": "Actualiser", "reload_resources": "Recharger les ressources" }, - "reload_lovelace": "Recharger Lovelace UI", + "reload_lovelace": "Recharger UI", "reload_resources": { "refresh_body": "Vous devez actualiser la page pour terminer le rechargement, voulez-vous actualiser maintenant?", "refresh_header": "Voulez-vous vous rafraîchir ?" diff --git a/translations/frontend/it.json b/translations/frontend/it.json index 800f058369..b5ffb77bf8 100644 --- a/translations/frontend/it.json +++ b/translations/frontend/it.json @@ -694,10 +694,10 @@ }, "zha_device_info": { "buttons": { - "add": "Aggiungi dispositivi", + "add": "Aggiungi dispositivi tramite questo dispositivo", "reconfigure": "Riconfigura dispositivo", "remove": "Rimuovi dispositivo", - "zigbee_information": "Informazioni Zigbee" + "zigbee_information": "Firma del dispositivo Zigbee" }, "confirmations": { "remove": "Sei sicuro di voler rimuovere il dispositivo?" @@ -717,7 +717,7 @@ "unknown": "Sconosciuto", "zha_device_card": { "area_picker_label": "Area", - "device_name_placeholder": "Nome assegnato dall'utente", + "device_name_placeholder": "Cambia il nome del dispositivo", "update_name_button": "Aggiorna nome" } } @@ -1147,7 +1147,7 @@ "email": "E-mail", "email_error_msg": "E-mail non valida", "forgot_password": "Hai dimenticato la password?", - "introduction": "Home Assistant Cloud fornisce una connessione remota sicura alla tua istanza quando sei lontano da casa. Consente inoltre di connettersi con i servizi cloud: Amazon Alexa e Google Assistant.", + "introduction": "Home Assistant Cloud fornisce una connessione remota sicura alla tua istanza quando sei lontano da casa. Consente inoltre di connettersi con i servizi solo su cloud: Amazon Alexa e Google Assistant.", "introduction2": "Questo servizio è gestito dal nostro partner", "introduction2a": ", una società fondata dai fondatori di Home Assistant e Hass.io.", "introduction3": "Home Assistant Cloud è un servizio in abbonamento con un mese di prova gratuita. Non sono necessarie informazioni di pagamento.", @@ -1228,7 +1228,7 @@ "picker": { "entity": "Entità", "header": "Personalizzazioni", - "introduction": "Modificare gli attributi per entità. Le personalizzazioni aggiunte / modificate avranno effetto immediato. Le personalizzazioni rimosse avranno effetto quando l'entità viene aggiornata." + "introduction": "Modificare gli attributi per entità. \nLe personalizzazioni aggiunte/modificate avranno effetto immediato. \nLe personalizzazioni rimosse avranno effetto quando l'entità sarà aggiornata." }, "warning": { "include_link": "includere customize.yaml", @@ -1350,12 +1350,12 @@ "caption": "Aiutanti", "description": "Elementi che possono aiutare a costruire le automazioni.", "dialog": { - "add_helper": "Aggiungi aiuto", + "add_helper": "Aggiungi aiutante", "add_platform": "Aggiungi {platform}", "create": "Crea" }, "picker": { - "add_helper": "Aggiungi aiuto", + "add_helper": "Aggiungi aiutante", "headers": { "editable": "Modificabile", "entity_id": "ID Entità", @@ -1382,7 +1382,7 @@ "frontend_version": "Versione Frontend: {version} - {type}", "home_assistant_logo": "Logo Home Assistant", "icons_by": "Icone di", - "integrations": "integrazioni", + "integrations": "Integrazioni", "issues": "Problemi", "license": "Pubblicato sotto la licenza Apache 2.0", "path_configuration": "Percorso del file configuration.yaml: {path}", @@ -1391,6 +1391,11 @@ "system_health_error": "Il componente System Health non è caricato. Aggiungere 'system_health:' a configuration.yaml", "title": "Informazioni" }, + "integration_panel_move": { + "link_integration_page": "pagina integrazioni", + "missing_zha": "Manca il pannello di configurazione ZHA? È stato spostato alla voce ZHA nella {integrations_page}.", + "missing_zwave": "Manca il pannello di configurazione di Z-Wave? È stato spostato alla voce Z-Wave nella {integrations_page}." + }, "integrations": { "add_integration": "Aggiungi integrazione", "caption": "Integrazioni", @@ -1427,7 +1432,7 @@ "description": "Questo passaggio richiede di visitare un sito Web esterno per essere completato.", "open_site": "Apri sito Web" }, - "finish": "Finire", + "finish": "Finito", "loading_first_time": "Si prega di attendere durante l'installazione dell'integrazione", "not_all_required_fields": "Non tutti i campi obbligatori sono compilati.", "submit": "Invia" @@ -1476,27 +1481,27 @@ "title": "Registri" }, "lovelace": { - "caption": "Cruscotti Lovelace", + "caption": "Plance di Lovelace", "dashboards": { - "cant_edit_default": "Il cruscotto standard Lovelace non può essere modificato dall'Interfaccia Utente. È possibile nasconderlo impostando un altro cruscotto come predefinito.", - "cant_edit_yaml": "I cruscotti definiti in YAML non possono essere modificati dall'Interfaccia Utente. Modificarli in configuration.yaml.", - "caption": "Cruscotti", + "cant_edit_default": "La plancia standard Lovelace non può essere modificata dall'Interfaccia Utente. È possibile nasconderla impostando un'altra plancia come predefinita.", + "cant_edit_yaml": "Le plance definite in YAML non possono essere modificate dall'Interfaccia Utente. Modificarle in configuration.yaml.", + "caption": "Plance", "conf_mode": { - "storage": "IU controllata", + "storage": "Controllata dell'Interfaccia Utente", "yaml": "File YAML" }, - "confirm_delete": "Sei sicuro di voler eliminare questo cruscotto?", - "default_dashboard": "Questo è il cruscotto predefinito", + "confirm_delete": "Sei sicuro di voler eliminare questa plancia?", + "default_dashboard": "Questa è la plancia predefinita", "detail": { "create": "Crea", "delete": "Elimina", "dismiss": "Chiudi", - "edit_dashboard": "Modifica cruscotto", + "edit_dashboard": "Modifica plancia", "icon": "Icona", - "new_dashboard": "Aggiungi nuovo cruscotto", - "remove_default": "Rimuovi come predefinito su questo dispositivo", + "new_dashboard": "Aggiungi nuova plancia", + "remove_default": "Rimuovi come predefinita su questo dispositivo", "require_admin": "Solo per l'amministratore", - "set_default": "Imposta come predefinito su questo dispositivo", + "set_default": "Imposta come predefinita su questo dispositivo", "show_sidebar": "Mostra nella barra laterale", "title": "Titolo", "title_required": "È richiesto il titolo.", @@ -1505,10 +1510,10 @@ "url_error_msg": "L'URL dovrebbe contenere un - e non può contenere spazi o caratteri speciali, ad eccezione di _ e -" }, "picker": { - "add_dashboard": "Aggiungi cruscotto", + "add_dashboard": "Aggiungi plancia", "headers": { "conf_mode": "Metodo di configurazione", - "default": "Predefinito", + "default": "Predefinita", "filename": "Nome del file", "require_admin": "Solo per l'amministratore", "sidebar": "Mostra nella barra laterale", @@ -1517,7 +1522,7 @@ "open": "Aprire" } }, - "description": "Configurare i cruscotti Lovelace", + "description": "Configura le tue plance di Lovelace", "resources": { "cant_edit_yaml": "Si utilizza Lovelace in modalità YAML, pertanto non è possibile gestire le risorse tramite l'Interfaccia Utente. Gestirli in configuration.yaml.", "caption": "Risorse", @@ -1624,7 +1629,7 @@ }, "script": { "caption": "Script", - "description": "Crea e modifica Script", + "description": "Crea e modifica script", "editor": { "alias": "Nome", "default_name": "Nuovo script", @@ -1666,10 +1671,10 @@ "input_select": "Ricarica input a discesa", "input_text": "Ricarica input testuali", "introduction": "Alcune parti di Home Assistant possono essere ricaricate senza richiedere un riavvio. Premendo su Ricarica si rimuoverà la loro Configurazione YAML attuale e si caricherà la versione aggiornata.", - "person": "Ricarica persone", + "person": "Ricarica le persone", "scene": "Ricarica le Scene", "script": "Ricarica gli Script", - "zone": "Ricarica zone" + "zone": "Ricarica le zone" }, "server_management": { "confirm_restart": "Sei sicuro di voler riavviare Home Assistant?", @@ -1682,7 +1687,7 @@ "validation": { "check_config": "Verifica Configurazione", "heading": "Convalida della configurazione", - "introduction": "Convalidare la configurazione se di recente sono state apportate alcune modifiche alla configurazione e si desidera assicurarsi che sia tutto valido", + "introduction": "Convalidare la configurazione se di recente sono state apportate alcune modifiche alla configurazione e ci si vuole assicurare che sia tutto valido", "invalid": "Configurazione non valida", "valid": "Configurazione valida!" } @@ -1728,8 +1733,11 @@ }, "zha": { "add_device_page": { + "discovered_text": "I dispositivi verranno visualizzati qui una volta scoperti.", "discovery_text": "I dispositivi rilevati verranno visualizzati qui. Seguire le istruzioni per il / i dispositivo / i e posizionare il / i dispositivo / i in modalità accoppiamento.", "header": "Zigbee Home Automation - Aggiungi dispositivi", + "no_devices_found": "Nessun dispositivo trovato, assicurati che siano in modalità di associazione e tienili svegli mentre la scansione è in esecuzione.", + "pairing_mode": "Assicurati che i tuoi dispositivi siano in modalità di associazione. Controlla le istruzioni del tuo dispositivo su come eseguire questa operazione.", "search_again": "Cerca di nuovo", "spinner": "Ricerca di dispositivi ZHA Zigbee ..." }, @@ -1737,6 +1745,7 @@ "caption": "Aggiungi dispositivi", "description": "Aggiungi dispositivi alla rete Zigbee" }, + "button": "Configura", "caption": "ZHA", "cluster_attributes": { "attributes_of_cluster": "Attributi del cluster selezionato", @@ -1815,6 +1824,9 @@ "header": "Gestione della rete", "introduction": "Comandi che influiscono sull'intera rete" }, + "network": { + "caption": "Rete" + }, "node_management": { "header": "Gestione dei dispositivi", "help_node_dropdown": "Selezionare un dispositivo per visualizzare le opzioni per dispositivo.", @@ -1854,6 +1866,7 @@ "no_zones_created_yet": "Sembra che tu non abbia ancora creato nessuna zona." }, "zwave": { + "button": "Configura", "caption": "Z-Wave", "common": { "index": "Indice", @@ -2069,7 +2082,7 @@ } }, "changed_toast": { - "message": "La configurazione dell'Interfaccia Utente di Lovelace per questo cruscotto è stata aggiornata, ricaricare per vedere le modifiche?", + "message": "La configurazione dell'Interfaccia Utente di Lovelace per questa plancia è stata aggiornata, ricaricare per vedere le modifiche?", "refresh": "Aggiorna" }, "editor": { @@ -2304,14 +2317,14 @@ "save_config": { "cancel": "Rinuncia", "close": "Chiudi", - "empty_config": "Iniziare con un cruscotto vuoto", + "empty_config": "Iniziare con una plancia vuota", "header": "Prendi il controllo della tua interfaccia utente di Lovelace", - "para": "Questo cruscotto è attualmente gestito da Home Assistant. E' aggiornato automaticamente quando nuove entità o componenti dell'Interfaccia Utente Lovelace diventano disponibili. Se si assume il controllo, questo cruscotto non verrà più aggiornato automaticamente. È sempre possibile creare un nuovo cruscotto in configurazione con cui esperimentare.", + "para": "Questa plancia è attualmente gestita da Home Assistant. E' aggiornata automaticamente quando nuove entità o componenti dell'Interfaccia Utente Lovelace diventano disponibili. Se si assume il controllo, questa plancia non verrà più aggiornata automaticamente. È sempre possibile creare una nuova plancia in configurazione con cui esperimentare.", "para_sure": "Sei sicuro di voler prendere il controllo della tua interfaccia utente?", "save": "Prendere il controllo", - "yaml_config": "Per aiutarti a iniziare qui c'è la configurazione corrente di questo cruscotto:", - "yaml_control": "Per assumere il controllo in modalità YAML, creare un file YAML con il nome specificato nella configurazione per questo cruscotto, o il predefinito 'ui-lovelace.yaml'.", - "yaml_mode": "Questo cruscotto sta utilizzando la modalità YAML, il che significa che non è possibile modificare la configurazione di Lovelace dall'Interfaccia Utente. Se volete gestire questo cruscotto dall'Interfaccia Utente, rimuovere 'mode: yaml' dalla configurazione di Lovelace in 'configuration.yaml'." + "yaml_config": "Per aiutarti a iniziare qui c'è la configurazione attuale di questa plancia:", + "yaml_control": "Per assumere il controllo in modalità YAML, creare un file YAML con il nome specificato nella tua configurazione per questa plancia, o il predefinito 'ui-lovelace.yaml'.", + "yaml_mode": "Questa plancia sta utilizzando la modalità YAML, il che significa che non è possibile modificare la configurazione di Lovelace dall'Interfaccia Utente. Se volete gestire questa plancia dall'Interfaccia Utente, rimuovere 'mode: yaml' dalla configurazione di Lovelace in 'configuration.yaml'." }, "suggest_card": { "add": "Aggiungi all'interfaccia utente di Lovelace", @@ -2521,7 +2534,7 @@ "location_name_default": "Casa" }, "integration": { - "finish": "Finire", + "finish": "Finito", "intro": "Dispositivi e servizi sono rappresentati in Home Assistant come integrazioni. È possibile impostarli ora, o farlo in seguito dalla schermata di configurazione.", "more_integrations": "Di Più" }, @@ -2558,9 +2571,9 @@ }, "current_user": "Sei attualmente connesso come {fullName}.", "dashboard": { - "description": "Scegliere un cruscotto di default per questo dispositivo.", - "dropdown_label": "Cruscotto", - "header": "Cruscotto" + "description": "Scegliere una plancia di default per questo dispositivo.", + "dropdown_label": "Plancia", + "header": "Plancia" }, "force_narrow": { "description": "Questo nasconderà la barra laterale per impostazione predefinita, in modo simile all'esperienza mobile", diff --git a/translations/frontend/ko.json b/translations/frontend/ko.json index ffb4a9299c..90f59b8ca7 100644 --- a/translations/frontend/ko.json +++ b/translations/frontend/ko.json @@ -694,10 +694,10 @@ }, "zha_device_info": { "buttons": { - "add": "기기 추가", + "add": "이 기기를 통해 기기 추가", "reconfigure": "기기 재설정", "remove": "기기 제거", - "zigbee_information": "Zigbee 정보" + "zigbee_information": "Zigbee 기기 서명" }, "confirmations": { "remove": "이 기기를 제거하시겠습니까?" @@ -717,7 +717,7 @@ "unknown": "알 수 없슴", "zha_device_card": { "area_picker_label": "영역", - "device_name_placeholder": "사용자 지정 이름", + "device_name_placeholder": "기기 이름 변경", "update_name_button": "이름 업데이트" } } @@ -1391,6 +1391,11 @@ "system_health_error": "시스템 상태보기 구성요소가 로드되지 않았습니다. configuration.yaml 에 'system_health:' 를 추가해주세요.", "title": "정보" }, + "integration_panel_move": { + "link_integration_page": "통합 구성요소 페이지", + "missing_zha": "ZHA 구성 패널이 보이지 않으신가요? {integrations_page} 의 ZHA 항목으로 이동되었습니다.", + "missing_zwave": "Z-Wave 구성 패널이 보이지 않으신가요? {integrations_page} 의 ZHA 항목으로 이동되었습니다." + }, "integrations": { "add_integration": "통합 구성요소 추가", "caption": "통합 구성요소", @@ -1728,8 +1733,11 @@ }, "zha": { "add_device_page": { + "discovered_text": "기기가 발견되면 여기에 표시됩니다.", "discovery_text": "발견된 기기가 여기에 표시됩니다. 기기의 설명서를 참고하여 기기를 페어링 모드로 설정해주세요.", "header": "Zigbee Home Automation - 기기 추가", + "no_devices_found": "발견된 기기가 없습니다. 기기를 검색하는 동안 기기가 페어링 모드 상태이고 절전모드가 해제되어있는지 확인해주세요.", + "pairing_mode": "기기가 페어링 모드인지 확인해주세요. 기기의 페어링 모드 설정 방법은 기기의 설명서를 참조해주세요.", "search_again": "다시 검색", "spinner": "ZHA Zigbee 기기를 찾고있습니다..." }, @@ -1737,6 +1745,7 @@ "caption": "기기 추가", "description": "Zigbee 네트워크에 기기를 추가합니다" }, + "button": "설정", "caption": "ZHA", "cluster_attributes": { "attributes_of_cluster": "선택된 클러스터의 속성", @@ -1815,6 +1824,9 @@ "header": "네트워크 관리", "introduction": "전체 네트워크에 영향을 미치는 명령" }, + "network": { + "caption": "네트워크" + }, "node_management": { "header": "기기 관리", "help_node_dropdown": "기기별 옵션을 보려면 기기를 선택해주세요.", @@ -1854,6 +1866,7 @@ "no_zones_created_yet": "아직 설정한 지역이 없는 것 같습니다." }, "zwave": { + "button": "설정", "caption": "Z-Wave", "common": { "index": "색인", diff --git a/translations/frontend/lb.json b/translations/frontend/lb.json index 7beaaba6e0..c99a3e49b3 100644 --- a/translations/frontend/lb.json +++ b/translations/frontend/lb.json @@ -480,6 +480,7 @@ "delete": "Läschen", "error_required": "Erfuerderlech", "loading": "Lued", + "menu": "Menu", "next": "Nächst", "no": "Nee", "previous": "Virdrun", @@ -911,6 +912,8 @@ "introduction": "Benotzt Automatismen fir däin Haus zum Liewen ze bréngen", "load_error_not_editable": "Nëmmen Automatiounen am automations.yaml kënnen editéiert ginn.", "load_error_unknown": "Feeler beim luede vun der Automatioun ({err_no}).", + "move_down": "No ënne réckelen", + "move_up": "No uewe réckelen", "save": "Späicheren", "triggers": { "add": "Ausléiser dobäisetzen", @@ -1369,7 +1372,9 @@ }, "info": { "built_using": "Erstallt mat", + "caption": "Info", "custom_uis": "Personaliséierte Benotzer Interface:", + "description": "Informatioune zu denger Home Assistant Installation", "developed_by": "Entwéckelt vun enger ganzer Rei fantastesche Leit.", "documentation": "Dokumentatioun", "frontend": "frontend-ui", @@ -1385,6 +1390,11 @@ "system_health_error": "System Gesondheet Komponent net gelueden. Setz 'system_health:' zur configuration.yaml dobäi", "title": "Info" }, + "integration_panel_move": { + "link_integration_page": "Integratiouns Säit", + "missing_zha": "Vermëss du ZHA Konfig. Tableau? Et ass op ZHA Entrée op der {integrations_page} geplënnert.", + "missing_zwave": "Vermëss du Z-Wave Konfig. Tableau? Et ass op Z-Wave Entrée op der {integrations_page} geplënnert." + }, "integrations": { "add_integration": "Integratioun dobäisetzen", "caption": "Integratiounen", @@ -1457,7 +1467,9 @@ }, "introduction": "Hei ass et méiglech är Komponenten vum Home Assistant ze konfiguréieren. Net alles ass méiglech fir iwwert den Interface anzestellen, mee mir schaffen drun.", "logs": { + "caption": "Logbicher", "clear": "Läschen", + "description": "Home Assistant Logbicher ukucken", "details": "Detailler vum Log ({level})", "load_full_log": "Kompletten Home Assistant Log lueden", "loading_log": "Feeler Log gëtt gelueden...", @@ -1715,6 +1727,7 @@ }, "zha": { "add_device_page": { + "discovered_text": "Apparater tauchen hei op soubaal se entdeckt sinn.", "discovery_text": "Entdeckten Apparater tauchen op dëser Platz op. Suivéiert d'Instruktiounen fir är Apparater an aktivéiert den Kupplung's Mod.", "header": "Zigbee Home Automation - Apparater dobäisetzen", "search_again": "Nach emol sichen", @@ -1724,6 +1737,7 @@ "caption": "Apparater bäisetzen", "description": "Apparater am Zigbee Netzwierk bäisetzen" }, + "button": "Astellen", "caption": "ZHA", "cluster_attributes": { "attributes_of_cluster": "Attributer vum ausgewielten Cluster", @@ -1802,6 +1816,9 @@ "header": "Verwaltung vum Netzwierk", "introduction": "Kommandoe mat Impakt op d'gesamt Netzwierk" }, + "network": { + "caption": "Netzwierk" + }, "node_management": { "header": "Verwaltung vun den Apparaten", "help_node_dropdown": "Wielt een Apparat aus fir seng spezifesch Optioune ze gesinn.", @@ -1841,6 +1858,7 @@ "no_zones_created_yet": "Et gesäit sou aus wéi wann nach keng Zone erstallt goufen." }, "zwave": { + "button": "Astellen", "caption": "Z-Wave", "common": { "index": "Index", diff --git a/translations/frontend/nb.json b/translations/frontend/nb.json index a1bb3ed50a..6159bccdcc 100644 --- a/translations/frontend/nb.json +++ b/translations/frontend/nb.json @@ -694,10 +694,10 @@ }, "zha_device_info": { "buttons": { - "add": "Legg til enheter", + "add": "Legg til enheter via denne enheten", "reconfigure": "Rekonfigurer enhet", "remove": "Fjern enhet", - "zigbee_information": "Zigbee informasjon" + "zigbee_information": "Zigbee-enhetssignatur" }, "confirmations": { "remove": "Er du sikker på at du vil fjerne enheten?" @@ -717,7 +717,7 @@ "unknown": "Ukjent", "zha_device_card": { "area_picker_label": "Område", - "device_name_placeholder": "Brukers navn", + "device_name_placeholder": "Endre enhetsnavn", "update_name_button": "Oppdater navn" } } @@ -1391,6 +1391,11 @@ "system_health_error": "System tilstand komponenten er ikke lastet inn. Legg til 'system_health:' i configuration.yaml", "title": "Informasjon" }, + "integration_panel_move": { + "link_integration_page": "integrasjonsside", + "missing_zha": "Mangler ZHA-konfigurasjonspanelet? Den ble flyttet til ZHA-oppføringen på {integrations_page} .", + "missing_zwave": "Mangler Z-Wave-konfigurasjonspanelet? Den ble flyttet til Z-Wave-oppføringen på {integrations_page} ." + }, "integrations": { "add_integration": "Legg til integrasjon", "caption": "Integrasjoner", @@ -1728,8 +1733,11 @@ }, "zha": { "add_device_page": { + "discovered_text": "Enheter vises her når de er oppdaget.", "discovery_text": "Oppdagede enheter vises her. Følg instruksjonene for enheten(e) og sett enheten(e) i paringsmodus.", "header": "Zigbee Home Automation - Legg til enheter", + "no_devices_found": "Ingen enheter er funnet, sørg for at de er i paringsmodus og holde dem våken mens du oppdager kjører.", + "pairing_mode": "Kontroller at enhetene er i paringsmodus. Sjekk instruksjonene til enheten om hvordan du gjør dette.", "search_again": "Søk på nytt", "spinner": "Søker etter ZHA Zigbee-enheter..." }, @@ -1737,6 +1745,7 @@ "caption": "Legg til enheter", "description": "Legg til enheter i Zigbee-nettverket" }, + "button": "Konfigurer", "caption": "", "cluster_attributes": { "attributes_of_cluster": "Attributter for den valgte klyngen", @@ -1815,6 +1824,9 @@ "header": "Nettverksadministrasjon", "introduction": "Kommandoer som påvirker hele nettverket" }, + "network": { + "caption": "Nettverk" + }, "node_management": { "header": "Enhetshåndtering", "help_node_dropdown": "Velg en enhet for å vise alternativer per enhet.", @@ -1854,6 +1866,7 @@ "no_zones_created_yet": "Det ser ikke ut som du har opprettet noen soner enda" }, "zwave": { + "button": "Konfigurer", "caption": "Z-Wave", "common": { "index": "Indeks", diff --git a/translations/frontend/nl.json b/translations/frontend/nl.json index a4e068b061..a65fdfb0f1 100644 --- a/translations/frontend/nl.json +++ b/translations/frontend/nl.json @@ -478,9 +478,12 @@ "cancel": "Annuleren", "close": "Sluiten", "delete": "Verwijderen", + "error_required": "Verplicht", "loading": "Bezig met laden", + "menu": "Menu", "next": "Volgende", "no": "Nee", + "overflow_menu": "Overloopmenu", "previous": "Vorige", "refresh": "Vernieuwen", "save": "Opslaan", @@ -691,10 +694,10 @@ }, "zha_device_info": { "buttons": { - "add": "Apparaten toevoegen", + "add": "Apparaten toevoegen via dit apparaat", "reconfigure": "Apparaat opnieuw configureren", "remove": "Verwijder apparaat", - "zigbee_information": "Zigbee Informatie" + "zigbee_information": "Zigbee-apparaathandtekening" }, "confirmations": { "remove": "Weet je zeker dat je het apparaat wilt verwijderen?" @@ -714,7 +717,7 @@ "unknown": "Onbekend", "zha_device_card": { "area_picker_label": "Gebied", - "device_name_placeholder": "Door gebruiker ingegeven naam", + "device_name_placeholder": "Wijzig apparaatnaam", "update_name_button": "Naam bijwerken" } } @@ -740,6 +743,8 @@ "notification_toast": { "connection_lost": "Verbinding verbroken. Opnieuw verbinden...", "service_call_failed": "Kan service {service} niet aanroepen", + "started": "Home Assistant is gestart!", + "starting": "Home Assistant is aan het opstarten, nog niet alles is beschikbaar tot dit is voltooid.", "triggered": "Geactiveerd {name}" }, "panel": { @@ -908,6 +913,8 @@ "introduction": "Gebruik automatiseringen om je huis tot leven te brengen.", "load_error_not_editable": "Alleen automatiseringen in automations.yaml kunnen worden bewerkt.", "load_error_unknown": "Fout bij laden van automatisering ({err_no}).", + "move_down": "Verplaats omlaag", + "move_up": "Verplaats omhoog", "save": "Opslaan", "triggers": { "add": "Trigger toevoegen", @@ -1219,6 +1226,7 @@ "different_include": "Mogelijk via een domein, een glob of een andere include.", "pick_attribute": "Kies een attribuut om te overschrijven", "picker": { + "entity": "Entiteit", "header": "Aanpassingen", "introduction": "Pas attributen per entiteit aan. Toegevoegde/gewijzigde aanpassingen worden onmiddellijk van kracht. Verwijderde aanpassingen worden van kracht wanneer de entiteit wordt bijgewerkt." }, @@ -1365,7 +1373,9 @@ }, "info": { "built_using": "Gebouwd met behulp van", + "caption": "Info", "custom_uis": "Aangepaste UI's:", + "description": "Informatie over je Home Assistant installatie", "developed_by": "Ontwikkeld door een stel geweldige mensen.", "documentation": "Documentatie", "frontend": "Frontend", @@ -1453,7 +1463,9 @@ }, "introduction": "Hier kun je je componenten en Home Assistant configureren. Het is nog niet mogelijk om alles te configureren vanuit de interface, maar we werken er aan.", "logs": { + "caption": "Logboek", "clear": "Wis", + "description": "Home Assistant logboek bekijken", "details": "Logboekdetails ({level})", "load_full_log": "Laad volledige Home Assistant logboek", "loading_log": "Foutenlogboek laden ...", @@ -1706,10 +1718,12 @@ "name": "Naam", "system": "Systeem" } - } + }, + "users_privileges_note": "Gebruikersgroepen zijn nog werk in uitvoering. De gebruiker kan de instantie niet beheren via de interface. We zijn bezig met het uitvoeren van een audit om verzekerd te zijn dat de management API-eindpunten toegang voor beheerders correct beperken." }, "zha": { "add_device_page": { + "discovered_text": "Apparaten zullen hier verschijnen zodra ze zijn ontdekt.", "discovery_text": "Gevonden apparaten worden hier weergegeven. Volg de instructies voor je apparaat of apparaten en plaats het apparaat of de apparaten in de koppelingsmodus.", "header": "Zigbee Home Automation - Apparaten toevoegen", "search_again": "Opnieuw zoeken", @@ -1719,6 +1733,7 @@ "caption": "Apparaten toevoegen", "description": "Voeg apparaten toe aan het Zigbee netwerk" }, + "button": "Configureer", "caption": "ZHA", "cluster_attributes": { "attributes_of_cluster": "Attributen van het geselecteerde cluster", @@ -1797,6 +1812,9 @@ "header": "Netwerkbeheer", "introduction": "Commando's die het hele netwerk beïnvloeden" }, + "network": { + "caption": "Netwerk" + }, "node_management": { "header": "Apparaatbeheer", "help_node_dropdown": "Selecteer een apparaat om de opties per apparaat te bekijken.", @@ -1836,6 +1854,7 @@ "no_zones_created_yet": "Het lijkt erop dat je nog geen zones hebt aangemaakt." }, "zwave": { + "button": "Configureer", "caption": "Z-Wave", "common": { "index": "Index", @@ -1868,6 +1887,15 @@ "set_wakeup": "Activeringsinterval instellen", "true": "Waar" }, + "node_management": { + "add_to_group": "Toevoegen aan groep", + "entity_info": "Entiteitsinformatie", + "exclude_entity": "Sluit deze entiteit uit van Home Assistant", + "group": "Groep", + "protection": "Bescherming", + "remove_from_group": "Verwijderen uit groep", + "set_protection": "Bescherming instellen" + }, "ozw_log": { "header": "OZW-logboek", "introduction": "Bekijk het logboek. 0 is het minimum (laadt het gehele logboek) en 1000 is het maximum. Laad toont een statisch logboek en staart wordt automatisch bijgewerkt met het laatst opgegeven aantal regels van het logboek." @@ -1877,6 +1905,7 @@ "add_node_secure": "Secure Node toevoegen", "cancel_command": "Opdracht annuleren", "heal_network": "Herstel Netwerk", + "refresh_entity": "Entiteit vernieuwen", "remove_node": "Node verwijderen", "save_config": "Configuratie Opslaan", "soft_reset": "Soft Reset", @@ -2012,6 +2041,10 @@ "add_item": "Item toevoegen", "checked_items": "Geselecteerde items", "clear_items": "Geselecteerde items wissen" + }, + "starting": { + "description": "Home Assistant is aan het opstarten, even geduld...", + "header": "Home Assistant is aan het opstarten..." } }, "changed_toast": { @@ -2304,7 +2337,8 @@ "attribute_not_found": "Kenmerk {attribute} niet beschikbaar in: {entity}", "entity_non_numeric": "Entiteit is niet-numeriek: {entity}", "entity_not_found": "Entiteit niet beschikbaar: {entity}", - "entity_unavailable": "{entity} is momenteel niet beschikbaar" + "entity_unavailable": "{entity} is momenteel niet beschikbaar", + "starting": "Home Assistant is aan het opstarten, wellicht is nog niet alles beschikbaar" } }, "mailbox": { diff --git a/translations/frontend/pl.json b/translations/frontend/pl.json index 7bd461cc15..90295dd78f 100644 --- a/translations/frontend/pl.json +++ b/translations/frontend/pl.json @@ -195,7 +195,7 @@ "off": "wyłączony" }, "configurator": { - "configure": "Skonfiguruj", + "configure": "Konfiguruj", "configured": "skonfigurowany" }, "cover": { @@ -480,8 +480,10 @@ "delete": "Usuń", "error_required": "To pole jest wymagane", "loading": "Ładowanie", + "menu": "Menu", "next": "Dalej", "no": "Nie", + "overflow_menu": "Menu", "previous": "Poprzedni", "refresh": "Odśwież", "save": "Zapisz", @@ -911,6 +913,8 @@ "introduction": "Użyj automatyzacji, aby ożywić swój dom", "load_error_not_editable": "Tylko automatyzacje zdefiniowane w pliku automations.yaml są edytowalne.", "load_error_unknown": "Wystąpił błąd podczas ładowania automatyzacji ({err_no}).", + "move_down": "Przesuń w dół", + "move_up": "Przesuń w górę", "save": "Zapisz", "triggers": { "add": "Dodaj wyzwalacz", @@ -1322,8 +1326,8 @@ "introduction2": "Użyj rejestru encji, aby nadpisać jej nazwę, zmienić jej identyfikator lub usunąć ją z Home Assistant'a. Uwaga: usunięcie wpisu rejestru encji nie spowoduje usunięcia encji. Aby to zrobić, kliknij poniższy link i usuń integracje encji.", "remove_selected": { "button": "Usuń wybrane", - "confirm_partly_text": "Można usunąć tylko {removable} z wybranych {selected} encji. Encje można usunąć tylko wtedy, gdy integracja wspiera taka możliwość. Czasami trzeba ponownie uruchomić Home Assistanta, zanim będzie można usunąć encje usuniętej integracji. Czy na pewno chcesz usunąć usuwalne encje?", - "confirm_partly_title": "Tylko {number} wybrane encje można usunąć.", + "confirm_partly_text": "Można usunąć tylko {removable} z wybranych {selected} encji. Encje można usunąć tylko wtedy, gdy integracja wspiera taką możliwość. Czasami trzeba ponownie uruchomić Home Assistanta, zanim będzie można usunąć encje usuniętej integracji. Czy na pewno chcesz usunąć usuwalne encje?", + "confirm_partly_title": "Wybrane encje możliwe do usunięcia: {number}", "confirm_text": "Powinieneś uprzednio usunąć integrację z automatyzacji i konfiguracji Lovelace, jeśli encje w niej występują.", "confirm_title": "Czy chcesz usunąć encje: {number}?" }, @@ -1369,7 +1373,9 @@ }, "info": { "built_using": "Zbudowany przy użyciu", + "caption": "Informacje", "custom_uis": "Niestandardowe interfejsy użytkownika:", + "description": "Informacje o instalacji Home Assistanta", "developed_by": "Opracowany przez grono wspaniałych ludzi.", "documentation": "Dokumentacja", "frontend": "frontend-ui", @@ -1385,6 +1391,11 @@ "system_health_error": "Komponent kondycji systemu nie jest załadowany. Dodaj 'system_health:' do pliku configuration.yaml", "title": "Informacje" }, + "integration_panel_move": { + "link_integration_page": "stronie integracji", + "missing_zha": "Nie możesz znaleźć konfiguracji ZHA? Została ona przeniesiona do wpisu Z-Wave na {integrations_page}.", + "missing_zwave": "Nie możesz znaleźć konfiguracji Z-Wave? Została ona przeniesiona do wpisu Z-Wave na {integrations_page}." + }, "integrations": { "add_integration": "Dodaj integrację", "caption": "Integracje", @@ -1457,7 +1468,9 @@ }, "introduction": "Tutaj możesz skonfigurować Home Assistanta i jego komponenty. Nie wszystkie opcje można konfigurować z interfejsu użytkownika, ale pracujemy nad tym.", "logs": { + "caption": "Logi", "clear": "Wyczyść", + "description": "Wyświetlanie logów Home Assistanta", "details": "Szczegóły loga ({level})", "load_full_log": "Załaduj cały log Home Assistanta", "loading_log": "Ładowanie loga błędów…", @@ -1652,6 +1665,11 @@ "core": "Lokalizacja i dostosowywanie", "group": "Grupy", "heading": "Ponowne wczytanie konfiguracji", + "input_boolean": "Pomocnicy typu przełącznik", + "input_datetime": "Pomocnicy typu data i czas", + "input_number": "Pomocnicy typu numer", + "input_select": "Pomocnicy typu pole wyboru", + "input_text": "Pomocnicy typu tekst", "introduction": "Niektóre fragmenty konfiguracji można przeładować bez ponownego uruchamiania. Poniższe przyciski pozwalają na ponowne wczytanie konfiguracji.", "person": "Osoby", "scene": "Sceny", @@ -1715,8 +1733,11 @@ }, "zha": { "add_device_page": { + "discovered_text": "Urządzenia pojawią się tutaj, jak tylko zostaną wykryte.", "discovery_text": "Wykryte urządzenia pojawią się tutaj. Postępuj zgodnie z instrukcjami dla urządzeń, by wprowadzić je w tryb parowania.", "header": "Zigbee Home Automation - dodaj urządzenia", + "no_devices_found": "Nie znaleziono urządzeń, upewnij się, że są w trybie parowania i nie są w trybie uśpienia podczas wykrywania.", + "pairing_mode": "Upewnij się, że urządzenie jest w trybie parowania. Zapoznaj się z instrukcją obsługi urządzenia, by dowiedzieć się, jak to zrobić.", "search_again": "Szukaj ponownie", "spinner": "Wyszukiwanie urządzeń ZHA Zigbee..." }, @@ -1724,6 +1745,7 @@ "caption": "Dodaj urządzenia", "description": "Dodaj urządzenia do sieci Zigbee" }, + "button": "Konfiguruj", "caption": "ZHA", "cluster_attributes": { "attributes_of_cluster": "Atrybuty wybranego klastra", @@ -1802,6 +1824,9 @@ "header": "Zarządzanie siecią", "introduction": "Polecenia, które wpływają na całą sieć" }, + "network": { + "caption": "Sieć" + }, "node_management": { "header": "Zarządzanie urządzeniami", "help_node_dropdown": "Wybierz urządzenie, aby wyświetlić jego opcje.", @@ -1841,6 +1866,7 @@ "no_zones_created_yet": "Wygląda na to, że nie utworzyłeś jeszcze żadnych stref." }, "zwave": { + "button": "Konfiguruj", "caption": "Z-Wave", "common": { "index": "Indeks", diff --git a/translations/frontend/pt-BR.json b/translations/frontend/pt-BR.json index 6e934dbb50..a6a601900d 100644 --- a/translations/frontend/pt-BR.json +++ b/translations/frontend/pt-BR.json @@ -767,6 +767,7 @@ }, "description": "Visão geral de todas as áreas da sua casa.", "editor": { + "area_id": "ID da Área", "create": "Criar", "default_name": "Nova Zona", "delete": "Excluir", @@ -910,6 +911,8 @@ "introduction": "Use automações para trazer vida à sua casa", "load_error_not_editable": "Somente automações em automations.yaml são editáveis.", "load_error_unknown": "Erro ao carregar a automação ({err_no}).", + "move_down": "Mover para baixo", + "move_up": "Mover para cima", "save": "Salvar", "triggers": { "add": "Adicionar gatilho", @@ -1368,6 +1371,7 @@ }, "info": { "built_using": "Construído usando", + "caption": "Informações", "custom_uis": "UIs personalizadas:", "developed_by": "Desenvolvido por um monte de pessoas incríveis.", "documentation": "Documentação", @@ -1384,6 +1388,9 @@ "system_health_error": "O componente System Health não foi carregado. Adicione 'system_health:' ao configuration.yaml", "title": "Info" }, + "integration_panel_move": { + "link_integration_page": "Página de integrações" + }, "integrations": { "add_integration": "Adicionar integração", "caption": "Integrações", @@ -1456,6 +1463,7 @@ }, "introduction": "Aqui é possível configurar seus componentes e Home Assistant. Nem tudo é possível configurar via UI, mas estamos trabalhando nisso.", "logs": { + "caption": "Logs", "clear": "Limpar", "details": "Detalhes do log ({Level})", "load_full_log": "Carregar todos os logs do Home Assistant", @@ -1713,8 +1721,10 @@ }, "zha": { "add_device_page": { + "discovered_text": "Os dispositivos descobertos aparecerão aqui.", "discovery_text": "Dispositivos descobertos serão exibidos aqui. Siga as instruções para o(s) seu(s) dispositivo(s) e coloque o(s) dispositivo(s) no modo de emparelhamento.", "header": "Zigbee Home Automation - Adicionar dispositivos", + "pairing_mode": "Certifique-se de que seus dispositivos estão em modo de pareamento. Verifique as instruções do seu dispositivo para saber como fazer isso.", "search_again": "Pesquisar novamente", "spinner": "Procurando por dispositivos ZHA Zigbee…" }, @@ -1722,6 +1732,7 @@ "caption": "Adicionar Dispositivos", "description": "Adicionar dispositivos à rede Zigbee" }, + "button": "Configurar", "caption": "ZHA", "cluster_attributes": { "attributes_of_cluster": "Atributos do cluster selecionado", @@ -1800,6 +1811,9 @@ "header": "Gerenciamento de Rede", "introduction": "Comandos que afetam toda a rede" }, + "network": { + "caption": "Rede" + }, "node_management": { "header": "Gerenciamento de Dispositivos", "help_node_dropdown": "Selecione um dispositivo para visualizar as opções por dispositivo.", @@ -1839,6 +1853,7 @@ "no_zones_created_yet": "Parece que você ainda não criou nenhuma zona." }, "zwave": { + "button": "Configurar", "caption": "", "common": { "index": "Índice", @@ -1883,6 +1898,7 @@ "ozw_log": { "header": "OZW Log", "introduction": "Veja o log. 0 é o mínimo (carrega o log inteiro) e 1000 é o máximo. A carga mostrará um log estático e tail será atualizada automaticamente com o último número especificado de linhas do log.", + "last_log_lines": "Número da última linhas de log", "load": "Carregar" }, "services": { @@ -1890,9 +1906,12 @@ "add_node_secure": "Adicionar Nó Seguro", "cancel_command": "Cancelar Comando", "heal_network": "Reparar rede", + "heal_node": "Repara nó", "node_info": "Informações do Nó", + "print_node": "Imprimir nó", "refresh_entity": "Atualizar Entidade", "remove_node": "Remover Nó", + "replace_failed_node": "Substituir Nó com Falha", "save_config": "Salvar Configuração", "soft_reset": "Soft Reset", "start_network": "Iniciar Rede", diff --git a/translations/frontend/ru.json b/translations/frontend/ru.json index 5786d3205b..5ebe8997b0 100644 --- a/translations/frontend/ru.json +++ b/translations/frontend/ru.json @@ -694,10 +694,10 @@ }, "zha_device_info": { "buttons": { - "add": "Добавить устройства", + "add": "Добавить устройства через это устройство", "reconfigure": "Перенастроить устройство", "remove": "Удалить устройство", - "zigbee_information": "Информация о Zigbee" + "zigbee_information": "Подпись устройства Zigbee" }, "confirmations": { "remove": "Вы уверены, что хотите удалить это устройство?" @@ -1391,6 +1391,11 @@ "system_health_error": "Компонент System Health не загружен. Добавьте 'system_health:' в файл configuration.yaml.", "title": "О системе" }, + "integration_panel_move": { + "link_integration_page": "странице интеграций", + "missing_zha": "Отсутствует панель конфигурации ZHA? Настройки ZHA теперь находятся на {integrations_page} в карточке ZHA.", + "missing_zwave": "Отсутствует панель конфигурации Z-Wave? Настройки Z-Wave теперь находятся на {integrations_page} в карточке Z-Wave." + }, "integrations": { "add_integration": "Добавить интеграцию", "caption": "Интеграции", @@ -1728,8 +1733,11 @@ }, "zha": { "add_device_page": { + "discovered_text": "Устройства появятся здесь, когда будут обнаружены.", "discovery_text": "Здесь будут отображаться обнаруженные устройства. Следуйте инструкциям для Вашего устройства, чтобы включить режим сопряжения.", "header": "Zigbee Home Automation", + "no_devices_found": "Устройства не найдены, убедитесь, что они находятся в режиме сопряжения, и держите их активными во время обнаружения.", + "pairing_mode": "Убедитесь, что подключаемые устройства находятся в режиме сопряжения. Чтобы узнать, как активировать режим сопряжения, ознакомьтесь с инструкциями для Вашего устройства.", "search_again": "Повторный поиск", "spinner": "Поиск Zigbee устройств..." }, @@ -1737,6 +1745,7 @@ "caption": "Добавить устройства", "description": "Добавить устройства в сеть Zigbee" }, + "button": "Настроить", "caption": "Zigbee Home Automation", "cluster_attributes": { "attributes_of_cluster": "Атрибуты выбранного кластера", @@ -1815,6 +1824,9 @@ "header": "Управление сетью", "introduction": "Команды, которые влияют на всю сеть" }, + "network": { + "caption": "Сеть" + }, "node_management": { "header": "Управление устройством", "help_node_dropdown": "Выберите устройство для просмотра индивидуальных параметров.", @@ -1854,6 +1866,7 @@ "no_zones_created_yet": "У Вас еще нет добавленных зон." }, "zwave": { + "button": "Настроить", "caption": "Z-Wave", "common": { "index": "Индекс", diff --git a/translations/frontend/sl.json b/translations/frontend/sl.json index 41ffdf8afa..2a06adf054 100644 --- a/translations/frontend/sl.json +++ b/translations/frontend/sl.json @@ -480,8 +480,10 @@ "delete": "Izbriši", "error_required": "Zahtevano", "loading": "Nalaganje", + "menu": "Meni", "next": "Naslednji", "no": "Ne", + "overflow_menu": "Prelivni meni", "previous": "Prejšnji", "refresh": "Osveži", "save": "Shrani", @@ -692,10 +694,10 @@ }, "zha_device_info": { "buttons": { - "add": "Dodajte naprave", + "add": "Dodajte naprave prek te naprave", "reconfigure": "Ponovno konfigurirajte napravo", "remove": "Odstranite napravo", - "zigbee_information": "Zigbee Informacije" + "zigbee_information": "Podpis naprave Zigbee" }, "confirmations": { "remove": "Ali ste prepričani, da želite odstraniti napravo?" @@ -715,7 +717,7 @@ "unknown": "Neznano", "zha_device_card": { "area_picker_label": "Območje", - "device_name_placeholder": "Ime, ki ga je dodelil uporabnik", + "device_name_placeholder": "Spremenite ime naprave", "update_name_button": "Posodobi ime" } } @@ -911,6 +913,8 @@ "introduction": "Uporabite avtomatizacije za oživitev vašega doma.", "load_error_not_editable": "Urejati je mogoče le avtomatizacije v automations.yaml.", "load_error_unknown": "Napaka pri nalaganju avtomatizacije ({err_no}).", + "move_down": "Premakni navzdol", + "move_up": "Premakni navzgor", "save": "Shrani", "triggers": { "add": "Dodaj sprožilec", @@ -1369,7 +1373,9 @@ }, "info": { "built_using": "Zgrajen z uporabo", + "caption": "Info", "custom_uis": "Uporabniški vmesniki po meri:", + "description": "Informacije o vaši namestitvi programa Home Assistant", "developed_by": "Razvija ga kup osupljivih ljudi.", "documentation": "Dokumentacija", "frontend": "frontend-ui", @@ -1385,6 +1391,11 @@ "system_health_error": "Komponenta \"system health\" ni naložena. Dodajte \"system_health:\" v svoj configuration.yaml", "title": "Info" }, + "integration_panel_move": { + "link_integration_page": "Stran za integracije", + "missing_zha": "Ali manjka konfiguracijska plošča ZHA? Premaknjen je bil v vnos ZHA na {integrations_page} .", + "missing_zwave": "Ali manjka konfiguracijska plošča Z-Wave? Premaknili so ga v vnos Z-Wave na {integrations_page} ." + }, "integrations": { "add_integration": "Dodaj integracijo", "caption": "Integracije", @@ -1457,7 +1468,9 @@ }, "introduction": "Tukaj je mogoče konfigurirati vaše komponente in Home Assistanta. Vsega ni mogoče konfigurirati iz uporabniškega vmesnika (vendar delamo na tem).", "logs": { + "caption": "Dnevniki", "clear": "Počisti", + "description": "Oglejte si Home Assistant dnevnike", "details": "Podrobnosti dnevnika ({level})", "load_full_log": "Naloži celoten dnevnik Home Assistant-a", "loading_log": "Nalaganje dnevnika napak ...", @@ -1652,6 +1665,11 @@ "core": "Ponovno naloži lokacijo in prilagoditve", "group": "Ponovno naloži skupine", "heading": "Ponovno nalaganje konfiguracije YAML", + "input_boolean": "Ponovno naloži \"input booleans\"", + "input_datetime": "Ponovno naloži vhodne datumske čase", + "input_number": "Ponovno naloži vhodne številke", + "input_select": "Ponovno naloži izbirne vnose", + "input_text": "Ponovno naloži vhodna besedila", "introduction": "Nekateri deli programa Home Assistant-a se lahko naložijo brez ponovnega zagona. S ponovnim nalaganjem se trenutna konfiguracija YAML zamenja in naloži nova.", "person": "Ponovno naloži osebe", "scene": "Ponovno naloži scene", @@ -1715,8 +1733,11 @@ }, "zha": { "add_device_page": { + "discovered_text": "Naprave se bodo prikazale tukaj, ko jih odkrijemo.", "discovery_text": "Tukaj bodo prikazane odkrite naprave. Sledite navodilom za napravo in jo postavite v način seznanjanja.", "header": "Zigbee Home Automation - Dodaj naprave", + "no_devices_found": "Najdene ni bilo nobene naprave, preverite, ali so v načinu združevanje ter jih držite budne medtem, ko je v odkrivanje v teku.", + "pairing_mode": "Prepričajte se, da so vaše naprave v načinu združevanja. Preverite navodila svoje naprave, kako to storiti.", "search_again": "Ponovno iskanje", "spinner": "Iskanje ZHA Zigbee naprav..." }, @@ -1724,6 +1745,7 @@ "caption": "Dodajte naprave", "description": "Dodajte naprave v omrežje Zigbee" }, + "button": "Konfiguriraj", "caption": "ZHA", "cluster_attributes": { "attributes_of_cluster": "Atributi izbrane gruče", @@ -1802,6 +1824,9 @@ "header": "Upravljanje omrežja", "introduction": "Ukazi, ki vplivajo na celotno omrežje" }, + "network": { + "caption": "Omrežje" + }, "node_management": { "header": "Upravljanje naprav", "help_node_dropdown": "Izberite napravo za ogled njenih možnosti.", @@ -1841,6 +1866,7 @@ "no_zones_created_yet": "Izgleda, da še niste ustvarili nobenih con." }, "zwave": { + "button": "Konfiguriraj", "caption": "Z-Wave", "common": { "index": "Indeks", diff --git a/translations/frontend/sv.json b/translations/frontend/sv.json index 10d8332153..c4c592d00f 100644 --- a/translations/frontend/sv.json +++ b/translations/frontend/sv.json @@ -694,7 +694,7 @@ }, "zha_device_info": { "buttons": { - "add": "Lägg till enheter", + "add": "Lägg till enheter via den här enheten", "reconfigure": "Konfigurera om enheten", "remove": "Ta bort enhet", "zigbee_information": "Zigbee-information" @@ -717,7 +717,7 @@ "unknown": "Okänd", "zha_device_card": { "area_picker_label": "Område", - "device_name_placeholder": "Användarnamn", + "device_name_placeholder": "Ändra enhetsnamn", "update_name_button": "Uppdatera namn" } } @@ -744,7 +744,7 @@ "connection_lost": "Anslutning tappad. Ansluter igen...", "service_call_failed": "Misslyckades med att anropa tjänsten {service}.", "started": "Home Assistant har startat!", - "starting": "Home Assistant startar, allt är inte tillgängligt tills uppstarten är klar.", + "starting": "Home Assistant startar, allt är inte tillgängligt förrän uppstarten är klar.", "triggered": "Utlöst {name}" }, "panel": { @@ -1013,7 +1013,7 @@ "picker": { "add_automation": "Lägg till automatisering", "delete_automation": "Radera automation", - "delete_confirm": "Är du säker på att du vill radera denna automatiseringen?", + "delete_confirm": "Är du säker på att du vill radera denna automatisering?", "edit_automation": "Redigera automation", "header": "Automatiseringseditor", "headers": { @@ -1373,7 +1373,9 @@ }, "info": { "built_using": "Byggt med", + "caption": "Info", "custom_uis": "Anpassade användargränssnitt:", + "description": "Info om din Home Assistant installation", "developed_by": "Utvecklad av ett gäng grymma människor.", "documentation": "Dokumentation", "frontend": "frontend-UI", @@ -1461,7 +1463,9 @@ }, "introduction": "Här går det att konfigurera dina komponenter och Home Assistant. Det är inte möjligt att ställa in allt från användargränssnittet ännu, men vi jobbar på det.", "logs": { + "caption": "Loggar", "clear": "Rensa", + "description": "Visa Home Assistant loggarna", "details": "Logginformation ({level})", "load_full_log": "Ladda hela Home Assistant-loggen", "loading_log": "Läser in fellogg ...", @@ -1656,7 +1660,11 @@ "core": "Ladda om plats & anpassningar", "group": "Ladda om grupper", "heading": "YAML-konfiguration laddas om", + "input_boolean": "Ladda om inmatning av booleska värden", "input_datetime": "Ladda om inmatningsdatum/tid", + "input_number": "Ladda om inmatningsnummer", + "input_select": "Ladda om inmatningsväljare", + "input_text": "Ladda om inmatningstext", "introduction": "Vissa delar av Home Assistant kan laddas om utan att en omstart krävs. Att trycka på \"ladda om\" innebär att den nuvarande konfiguration inaktiveras och den nya laddas.", "person": "Ladda om personer", "scene": "Ladda om scenarier", @@ -1716,12 +1724,15 @@ "system": "System" } }, - "users_privileges_note": "Denna användaren är under konstruktion. Denna använder kommer inte kunna administrera instansen via användargränssnittet. Vi granskar fortfarande alla API-slutpunkter för att försäkra att de korrekt begränsar åtkomst till administratörer." + "users_privileges_note": "Användar gruppen är under konstruktion. Användaren kommer inte att kunna administrera instansen via användargränssnittet. Vi granskar fortfarande alla API-slutpunkter för att försäkra att de korrekt begränsar åtkomst till endast administratörer." }, "zha": { "add_device_page": { + "discovered_text": "Enheterna kommer att dyka upp här när de upptäckts.", "discovery_text": "Upptäckta enheter kommer dyka upp här. Följ instruktionerna för dina enheter och sätt dem i parningsläge.", "header": "Zigbee Home Automation - Lägg till enheter", + "no_devices_found": "Inga enheter hittade, se till att dom är i parningsläge och håll dom aktiva medans sökning sker.", + "pairing_mode": "Se till att dina enheter är i parningsläge. Kontrollera instruktionerna för din enhet om hur du gör det.", "search_again": "Sök Igen", "spinner": "Söker efter ZHA Zigbee-enheter ..." }, @@ -1729,6 +1740,7 @@ "caption": "Lägg till enheter", "description": "Lägg till enheter till Zigbee-nätverket" }, + "button": "Konfigurera", "caption": "ZHA", "cluster_attributes": { "attributes_of_cluster": "Attribut för det valda klustret", @@ -1807,6 +1819,9 @@ "header": "Nätverkshantering", "introduction": "Kommandon som påverkar hela nätverket" }, + "network": { + "caption": "Nätverk" + }, "node_management": { "header": "Enhetshantering", "help_node_dropdown": "Välj en enhet för att visa alternativ per enhet.", @@ -1846,6 +1861,7 @@ "no_zones_created_yet": "Det verkar som om du inte har skapat några zoner ännu." }, "zwave": { + "button": "Konfigurera", "caption": "Z-Wave", "common": { "index": "Index", @@ -1886,7 +1902,7 @@ "group": "Grupp", "header": "Z-Wave nodhantering", "introduction": "Kör Z-Wave-kommandon som påverkar en enda nod. Välj en nod för att se en lista över tillgängliga kommandon.", - "max_associations": "Max antal assosiationer:", + "max_associations": "Max antal associationer:", "node_group_associations": "Nodgruppsassociationer", "node_protection": "Nodskydd", "node_to_control": "Nod att styra", @@ -1911,7 +1927,7 @@ "add_node_secure": "Lägg till nod med säkerhet", "cancel_command": "Avbryt kommandot", "heal_network": "Reparera nätverk", - "heal_node": "Läka nod", + "heal_node": "Läke nod", "node_info": "Nodinformation", "print_node": "Skriv ut nod", "refresh_entity": "Uppdatera entitet", @@ -2351,7 +2367,7 @@ "entity_non_numeric": "Enheten är icke-numerisk: {entity}", "entity_not_found": "Enheten är ej tillgänglig: {entity}", "entity_unavailable": "{entity} är otillgänglig", - "starting": "Home Assistant startar, allt är kanske är tillgängligt ännu" + "starting": "Home Assistant startar, allt är kanske inte tillgängligt ännu" } }, "mailbox": { diff --git a/translations/frontend/vi.json b/translations/frontend/vi.json index ff935e05f7..8a8fa95106 100644 --- a/translations/frontend/vi.json +++ b/translations/frontend/vi.json @@ -199,6 +199,8 @@ "stopped": "Đã dừng" }, "default": { + "off": "Tắt", + "on": "Bật", "unavailable": "Không có sẵn", "unknown": "Chưa biết" }, @@ -344,8 +346,13 @@ "climate": { "aux_heat": "Nhiệt phụ trợ", "away_mode": "Chế độ đi vắng", + "cooling": "{name} đang làm mát", + "current_temperature": "{name} nhiệt độ hiện tại", "currently": "Hiện tại", "fan_mode": "Chế độ quạt", + "heating": "{name} đang sưởi ấm", + "high": "cao", + "low": "thấp", "on_off": "Bật / tắt", "operation": "Chế độ hoạt động", "preset_mode": "Đặt trước", @@ -353,6 +360,13 @@ "target_humidity": "Độ ẩm mục tiêu", "target_temperature": "Nhiệt độ mục tiêu" }, + "counter": { + "actions": { + "decrement": "giảm xuống", + "increment": "tăng lên", + "reset": "cài lại" + } + }, "cover": { "position": "Vị trí", "tilt_position": "Nghiêng vị trí" @@ -387,6 +401,9 @@ "script": { "execute": "Thi hành" }, + "service": { + "run": "Chạy" + }, "vacuum": { "actions": { "resume_cleaning": "Tiếp tục làm sạch", @@ -435,26 +452,67 @@ } }, "common": { + "and": "và", + "back": "Trở lại", "cancel": "Hủy bỏ", + "close": "Đóng", "delete": "Xóa", + "error_required": "Cần thiết", "loading": "Đang tải", + "menu": "Menu", + "next": "Kế tiếp", + "no": "Không", + "overflow_menu": "Menu tràn", + "previous": "Trước đó", + "refresh": "Làm mới", "save": "Lưu", "successfully_deleted": "Xóa thành công", - "undo": "Hoàn tác" + "undo": "Hoàn tác", + "yes": "Có" }, "components": { + "area-picker": { + "add_dialog": { + "add": "Thêm", + "failed_create_area": "Không thể tạo khu vực.", + "name": "Tên", + "text": "Nhập tên của khu vực mới.", + "title": "Thêm khu vực mới" + }, + "add_new": "Thêm khu vực mới...", + "area": "Khu vực", + "clear": "Xoá", + "show_areas": "Hiển thị các khu vực" + }, "device-picker": { - "show_devices": "Hiện các thiết bị" + "clear": "Xoá", + "device": "Thiết bị", + "no_area": "Không có khu vực", + "show_devices": "Hiện các thiết bị", + "toggle": "Chuyển đổi" }, "entity": { "entity-picker": { - "entity": "Thực thể" + "clear": "Xoá", + "entity": "Thực thể", + "show_entities": "Hiển thị các thực thể" } }, "history_charts": { "loading_history": "Đang tải lịch sử trạng thái ...", "no_history_found": "Không tìm thấy lịch sử trạng thái." }, + "related-items": { + "area": "Khu vực", + "automation": "Một phần của các tự động hóa sau", + "device": "Thiết bị", + "entity": "Các thực thể liên quan", + "group": "Một phần của các nhóm sau", + "integration": "Tích hợp", + "no_related_found": "Không tìm thấy mục nào liên quan.", + "scene": "Một phần của các ngữ cảnh sau", + "script": "Một phần của các kịch bản sau" + }, "relative_time": { "duration": { "day": "{count} {count, plural,\n one { ngày }\n other { ngày }\n}", @@ -472,27 +530,87 @@ } }, "dialogs": { + "config_entry_system_options": { + "update": "Cập nhật" + }, "entity_registry": { + "control": "Điều khiển", + "dismiss": "Bỏ qua", "editor": { + "confirm_delete": "Bạn có chắc bạn muốn xoá bỏ mục này không?", "delete": "Xóa", + "enabled_cause": "Vô hiệu hoá do {cause}.", + "enabled_description": "Các thực thể bị vô hiệu hóa sẽ không được thêm vào Home Assistant.", + "enabled_label": "Kích hoạt thực thể", + "entity_id": "Mã định danh Thực thể", + "icon_error": "Các biểu tượng phải ở định dạng 'tiền tố:tên biểu tượng', ví dụ như 'mdi:home'", + "name": "Ghi đè Tên", + "note": "Lưu ý: điều này có thể không hoạt động với tất cả các tích hợp.", + "unavailable": "Thực thể này hiện không có sẵn.", "update": "Cập nhật" - } + }, + "no_unique_id": "Thực thể này không có mã định danh duy nhất, do vậy không thể quản lý cài đặt của nó từ giao diện người dùng.", + "related": "Liên quan", + "settings": "Cài đặt" + }, + "generic": { + "cancel": "Hủy bỏ", + "close": "đóng", + "default_confirmation_title": "Bạn có chắc không?", + "ok": "Đồng ý" }, "helper_settings": { + "generic": { + "icon": "Biểu tượng", + "name": "Tên" + }, "input_datetime": { "date": "Ngày", "datetime": "Ngày và giờ", "mode": "Bạn muốn nhập gì", "time": "Thời gian" }, + "input_number": { + "box": "Trường nhập liệu", + "max": "Giá trị tối đa", + "min": "Giá trị tối thiểu", + "mode": "Chế độ hiển thị", + "slider": "Thanh trượt", + "step": "Cỡ bước", + "unit_of_measurement": "Đơn vị đo lường" + }, + "input_select": { + "add": "Thêm tuỳ chọn", + "add_option": "Thêm tùy chọn", + "no_options": "Chưa có lựa chọn nào.", + "options": "Tùy Chọn" + }, "input_text": { "max": "Độ dài tối đa", - "min": "Độ dài tối thiểu" - } + "min": "Độ dài tối thiểu", + "mode": "Chế độ hiển thị", + "password": "Mật khẩu", + "pattern": "Mẫu Regex để xác thực giá trị ở phía client", + "text": "Văn bản" + }, + "platform_not_loaded": "Tích hợp {platform} không được nạp. Hãy thêm nó vào cấu hình của bạn bằng cách thêm 'default_config:' hoặc ''{platform}:''.", + "required_error_msg": "Trường này là cần thiết" }, "more_info_control": { + "edit": "Chỉnh sửa thực thể", + "person": { + "create_zone": "Tạo vùng từ vị trí hiện tại" + }, + "restored": { + "confirm_remove_text": "Bạn có chắc bạn muốn loại bỏ thực thể này không?", + "confirm_remove_title": "Loại bỏ thực thể?", + "not_provided": "Thực thể này hiện không khả dụng và thuộc về một tích hợp hay thiết bị đã bị loại bỏ, thay đổi hoặc rối loạn chức năng.", + "remove_action": "Loại bỏ thực thể", + "remove_intro": "Nếu thực thể không còn được sử dụng, bạn có thể dọn dẹp bằng cách loại bỏ nó." + }, "script": { - "last_action": "Hành động cuối" + "last_action": "Hành động cuối", + "last_triggered": "Lần kích hoạt cuối" }, "sun": { "elevation": "Độ cao", @@ -501,17 +619,42 @@ }, "updater": { "title": "Hướng dẫn cập nhật" + }, + "vacuum": { + "clean_spot": "Làm sạch một vùng nhỏ", + "commands": "Các lệnh điều khiển máy hút bụi:", + "fan_speed": "Tốc độ quạt", + "locate": "Định vị", + "pause": "Tạm dừng", + "return_home": "Trở lại bệ sạc", + "start": "Bắt đầu", + "start_pause": "Bắt Đầu/Tạm Dừng", + "status": "Trạng thái", + "stop": "Dừng" } }, "mqtt_device_debug_info": { - "show_as_yaml": "Hiển thị dưới dạng YAML" + "deserialize": "Cố gắng phân tích các thông điệp MQTT dưới dạng JSON", + "entities": "Các thực thể", + "no_entities": "Không có thực thể", + "no_triggers": "Không có kích hoạt", + "payload_display": "Hiển thị nội dung", + "recent_messages": "{n} thông điệp nhận được gần đây nhất", + "show_as_yaml": "Hiển thị dưới dạng YAML", + "title": "{device} thông tin sửa lỗi", + "triggers": "Các kích hoạt" }, "voice_command": { "label": "Nhập câu hỏi và nhấn 'Enter'" }, "zha_device_info": { "buttons": { - "add": "Thêm thiết bị" + "add": "Thêm thiết bị", + "zigbee_information": "Chữ ký thiết bị ZigBee" + }, + "device_signature": "Chữ ký thiết bị ZigBee", + "services": { + "zigbee_information": "Xem thông tin Zigbee của thiết bị." } } }, @@ -534,10 +677,19 @@ }, "notification_toast": { "connection_lost": "Kết nối bị mất. Đang kết nối lại…", - "service_call_failed": "Không thể gọi dịch vụ {service} ." + "service_call_failed": "Không thể gọi dịch vụ {service} .", + "started": "Home Assistant đã khởi động xong!", + "starting": "Home Assistant đang khởi động, không phải tất cả mọi thứ đều đã sẵn sàng cho đến khi khởi động hoàn tất." }, "panel": { + "calendar": { + "my_calendars": "Các Lịch của tôi", + "today": "Hôm nay" + }, "config": { + "advanced_mode": { + "link_profile_page": "trang hồ sơ của bạn" + }, "areas": { "caption": "Đăng ký Khu vực", "data_table": { @@ -545,6 +697,7 @@ "devices": "Thiết bị" }, "delete": { + "confirmation_text": "Tất cả các thiết bị trong khu vực này sẽ trở thành chưa được phân khu vực.", "confirmation_title": "Bạn có chắc chắn muốn xóa khu vực này?" }, "description": "Tổng quan tất cả các khu vực trong nhà bạn.", @@ -552,6 +705,8 @@ "area_id": "ID Khu vực", "create": "TẠO", "delete": "XÓA", + "name": "Tên", + "name_required": "Tên là bắt buộc", "unknown_error": "Lỗi không xác định", "update": "CẬP NHẬT" }, @@ -576,6 +731,7 @@ "header": "Hành động", "introduction": "Hành động là những gì Home Assistant sẽ làm khi tự động hóa được kích hoạt. \n\n [Tìm hiểu thêm về các hành động.] (https://home-assistant.io/docs/automation/action/)", "learn_more": "Tìm hiểu thêm về Hành động", + "name": "Hành động", "type_select": "Loại hành động", "type": { "condition": { @@ -586,7 +742,10 @@ "label": "Chậm trễ" }, "device_id": { - "action": "Hành động" + "action": "Hành động", + "extra_fields": { + "code": "Mã" + } }, "event": { "event": "Sự kiện:", @@ -614,11 +773,15 @@ "header": "Điều kiện", "introduction": "Điều kiện là một phần tùy chọn của quy tắc tự động hóa và có thể được sử dụng để ngăn chặn một hành động xảy ra khi kích hoạt. Các điều kiện trông rất giống với kích hoạt nhưng rất khác nhau. Trình kích hoạt sẽ xem xét các sự kiện xảy ra trong hệ thống trong khi điều kiện chỉ nhìn vào hệ thống hiện tại. Một bộ kích hoạt có thể quan sát thấy rằng một công tắc đang được bật. Một điều kiện chỉ có thể xem nếu một công tắc hiện đang được bật hoặc tắt. \n\n [Tìm hiểu thêm về điều kiện] (https://home-assistant.io/docs/scripts/conditions/)", "learn_more": "Tìm hiểu thêm về Điều kiện", + "name": "Điều kiện", "type_select": "Loại điều kiện", "type": { "device": { "condition": "Điều kiện" }, + "not": { + "label": "Không" + }, "numeric_state": { "above": "Ở trên", "below": "Bên dưới", @@ -656,9 +819,12 @@ "unsupported_condition": "Điều kiện không được hỗ trợ: {condition}" }, "default_name": "Thêm Tự động hóa", + "enable_disable": "Bật/Tắt tự động hóa", "introduction": "Sử dụng tự động hóa để mang sự sống cho nhà bạn", "load_error_not_editable": "Chỉ tự động hóa trong automations.yaml là có thể chỉnh sửa.", "load_error_unknown": "Lỗi tải tự động hóa ({err_no}).", + "move_down": "Chuyển xuống", + "move_up": "Chuyển lên", "save": "Lưu", "triggers": { "add": "Thêm Bộ khởi động", @@ -668,6 +834,7 @@ "header": "Bộ khởi động", "introduction": "Bộ khởi động là bắt đầu quá trình xử lý quy tắc tự động hóa. Có thể chỉ định nhiều Bộ khởi động cho cùng một quy tắc. Khi kích hoạt một bộ khởi động, Home Assistant sẽ xác nhận các điều kiện, nếu có, và gọi hành động. \n\n [Tìm hiểu thêm về Bộ khởi động] (https://home-assistant.io/docs/automation/trigger/)", "learn_more": "Tìm hiểu thêm về Kích hoạt", + "name": "Kích hoạt", "type_select": "Loại Bộ khởi động", "type": { "device": { @@ -749,6 +916,9 @@ }, "picker": { "add_automation": "Thêm Tự động hóa", + "delete_automation": "Xóa tự động hóa", + "delete_confirm": "Bạn có chắc bạn muốn xoá tự động hoá này không?", + "edit_automation": "Chỉnh sửa tự động hóa", "header": "Trình biên tập tự động hóa", "headers": { "name": "Tên" @@ -756,10 +926,17 @@ "introduction": "Trình soạn thảo tự động hóa cho phép bạn tạo và chỉnh sửa tự động. Vui lòng đọc [hướng dẫn] (https://home-assistant.io/docs/automation/editor/) để đảm bảo rằng bạn đã cấu hình chính xác Home Assistant.", "learn_more": "Tìm hiểu thêm về Tự động hóa", "no_automations": "Chúng tôi không thể tìm thấy tự động hóa nào có thể chỉnh sửa", - "pick_automation": "Chọn tự động hóa để chỉnh sửa" + "only_editable": "Chỉ các tự động hóa trong automations.yaml là có thể chỉnh sửa.", + "pick_automation": "Chọn tự động hóa để chỉnh sửa", + "show_info_automation": "Hiển thị thông tin về tự động hóa" } }, "cloud": { + "account": { + "google": { + "sync_entities_404_message": "Thất bị khi đồng bộ các thực thể của bạn với Google, yêu cầu Google 'Hey Google, sync my devices' để thực hiện đồng bộ hoá." + } + }, "caption": "Home Assistant Cloud", "description_login": "Đã đăng nhập với tên {email}", "description_not_login": "Chưa đăng nhập" @@ -773,7 +950,9 @@ "edit_requires_storage": "Trình chỉnh sửa bị vô hiệu hóa do cấu hình được lưu trữ trong configuration.yaml.", "elevation": "Độ cao", "elevation_meters": "mét", + "external_url": "URL bên ngoài", "imperial_example": "Độ F, pound", + "internal_url": "URL nội bộ", "latitude": "Vĩ độ", "location_name": "Tên cài đặt Home Assistant của bạn", "longitude": "Kinh độ", @@ -790,21 +969,34 @@ } }, "customize": { + "attributes_not_set": "Các thuộc tính sau chưa được thiết lập. Thiết lập chúng nếu muốn.", + "attributes_outside": "Các thuộc tính sau được tùy chỉnh từ bên ngoài customize.yaml", + "attributes_override": "Bạn có thể ghi đè chúng nếu muốn.", + "attributes_set": "Các thuộc tính sau của thực thể được thiếp lập bởi chương trình.", "caption": "Tùy chỉnh", "description": "Tùy chỉnh các thực thể của bạn", + "different_include": "Có thể qua một miền, một đường dẫn hoặc một bao gồm khác.", + "pick_attribute": "Chọn một thuộc tính để ghi đè", "picker": { + "entity": "Thực thể", "header": "Tùy chỉnh", "introduction": "Tinh chỉnh thuộc tính mỗi thực thể. Các tùy chỉnh được thêm / chỉnh sửa sẽ có hiệu lực ngay lập tức. Các tùy chỉnh bị xóa sẽ có hiệu lực khi thực thể được cập nhật." } }, "devices": { "automation": { + "automations": "Tự động hóa", + "create": "Tạo tự động hóa với thiết bị", + "no_automations": "Không có tự động hoá", + "no_device_automations": "Không có tự động hoá nào khả dụng cho thiết bị này.", "triggers": { "caption": "Làm gì đó khi ..." } }, + "cant_edit": "Bạn chỉ có thể chỉnh sửa các mục được tạo trong UI.", "caption": "Thiết bị", "confirm_delete": "Bạn có chắc bạn muốn xóa bỏ thiết bị này không?", + "confirm_rename_entity_ids": "Bạn cũng muốn đổi mã định danh của các thực thể?", "data_table": { "area": "Khu vực", "battery": "Pin", @@ -816,12 +1008,30 @@ "no_devices": "Không có thiết bị nào" }, "delete": "Xóa", + "device_info": "Thông tin thiết bị", "device_not_found": "Không tìm thấy thiết bị.", "entities": { - "add_entities_lovelace": "Thêm vào Lovelace" + "add_entities_lovelace": "Thêm vào Lovelace", + "disabled_entities": "+{count} {count, plural,\n one {thực thể bị vô hiệu hoá}\n other {các thực thể bị vô hiệu hoá}\n}", + "entities": "Các thực thể", + "hide_disabled": "Ẩn các thiết bị bị vô hiệu hoá", + "none": "Thiết bị này không có thực thể nào" }, "name": "Tên", "no_devices": "Không có thiết bị nào", + "scene": { + "create": "Tạo ngữ cảnh với thiết bị", + "no_scenes": "Không có ngữ cảnh", + "scenes": "Các ngữ cảnh" + }, + "scenes": "Các ngữ cảnh", + "script": { + "create": "Tạo kịch bản với thiết bị", + "no_scripts": "Không có kịch bản", + "scripts": "Các kịch bản" + }, + "scripts": "Các kịch bản", + "unknown_error": "Lỗi không xác định", "unnamed_device": "Thiết bị không tên", "update": "Cập nhật" }, @@ -829,21 +1039,89 @@ "caption": "Đăng ký thực thể", "description": "Tổng quan tất cả các thực thể đã biết.", "picker": { + "disable_selected": { + "button": "Vô hiệu hoá các mục đã chọn" + }, + "enable_selected": { + "button": "Kích hoạt các mục đã chọn" + }, + "filter": { + "filter": "Lọc", + "show_disabled": "Hiển thị các thực thể bị vô hiệu", + "show_readonly": "Hiển thị các thực thể chỉ đọc", + "show_unavailable": "Hiện thực thể không khả dụng" + }, "header": "Đăng ký thực thể", + "headers": { + "status": "Trạng thái" + }, "introduction": "Home Assistant giữ một sổ đăng ký của mọi thực thể mà nó từng thấy có thể được xác định duy nhất. Mỗi thực thể này sẽ có một ID thực thể được gán sẽ chỉ dành riêng cho thực thể này.", - "introduction2": "Sử dụng sổ đăng ký thực thể để ghi đè tên, thay đổi ID thực thể hoặc xóa mục nhập khỏi Home Assistant. Lưu ý, xóa mục đăng ký thực thể sẽ không xóa thực thể. Để làm điều đó, hãy theo liên kết dưới đây và xóa nó khỏi trang tích hợp." + "introduction2": "Sử dụng sổ đăng ký thực thể để ghi đè tên, thay đổi ID thực thể hoặc xóa mục nhập khỏi Home Assistant. Lưu ý, xóa mục đăng ký thực thể sẽ không xóa thực thể. Để làm điều đó, hãy theo liên kết dưới đây và xóa nó khỏi trang tích hợp.", + "selected": "{number} đã chọn", + "status": { + "disabled": "Bị vô hiệu hoá", + "ok": "Đồng ý", + "readonly": "Chỉ đọc", + "unavailable": "Không khả dụng" + } } }, + "filtering": { + "clear": "Xoá", + "filtering_by": "Lọc bởi" + }, "header": "Cấu hình Home Assistant", + "helpers": { + "caption": "Người hỗ trợ", + "description": "Các yếu tố có thể giúp xây dựng tự động hóa.", + "dialog": { + "add_helper": "Thêm hỗ trợ", + "add_platform": "Thêm {platform}", + "create": "Tạo" + }, + "picker": { + "add_helper": "Thêm hỗ trợ", + "headers": { + "editable": "Có thể chỉnh sửa", + "entity_id": "Mã Thực thể", + "name": "Tên", + "type": "Loại" + } + }, + "types": { + "input_boolean": "Chuyển đổi", + "input_datetime": "Ngày và/hoặc giờ", + "input_number": "Số", + "input_select": "Thả xuống", + "input_text": "Văn bản" + } + }, "info": { + "caption": "Thông tin", + "custom_uis": "Các UI Tuỳ chỉnh:", + "description": "Thông tin về bản cài đặt Home Assistant của bạn", + "developed_by": "Được phát triển bởi một nhóm những con người tuyệt vời.", + "documentation": "Tài liệu", + "frontend_version": "Phiên bản Frontend: {version} - {type}", + "home_assistant_logo": "Logo của Home Assistant", + "integrations": "Các tích hợp", + "issues": "Các vấn đề", + "license": "Được xuất bản theo giấy phép Apache 2.0", + "path_configuration": "Đường dẫn đến configuration.yaml: {path}", + "server": "máy chủ", + "source": "Nguồn:", "title": "Thông tin" }, "integrations": { + "add_integration": "Thêm tích hợp", "caption": "Các bộ tích hợp", "config_entry": { "delete": "Xóa", + "delete_button": "Xoá {integration}", "delete_confirm": "Bạn chắc chắn muốn xóa bộ tích hợp này?", "device_unavailable": "Thiết bị không khả dụng", + "devices": "{count} {count, plural,\n one { thiết bị }\n other { các thiết bị }\n}", + "entities": "{count} {count, plural,\n one { thực thể }\n other { các thực thể }\n}", "entity_unavailable": "Thiết bị không khả dụng", "firmware": "Firmware: {version}", "manuf": "bởi {manufacturer}", @@ -853,38 +1131,131 @@ "options": "Tùy Chọn", "rename": "Đổi tên", "restart_confirm": "Khởi động lại Home Assistant để hoàn tất xóa bộ tích hợp này", - "system_options": "Tùy chọn hệ thống" + "system_options": "Tùy chọn hệ thống", + "unnamed_entry": "Thực thể chưa có tên" }, "config_flow": { + "aborted": "Đã hủy bỏ", + "close": "Đóng", "created_config": "Đã tạo cấu hình cho {name}.", + "dismiss": "Bỏ qua hộp thoại", + "error_saving_area": "Lỗi khi lưu khu vực: {error}", "external_step": { "description": "Bước này yêu cầu bạn truy cập một trang web bên ngoài để hoàn thành.", "open_site": "Mở trang web" - } + }, + "finish": "Hoàn thành", + "loading_first_time": "Vui lòng chờ trong khi tích hợp đang được cài đặt", + "not_all_required_fields": "Không phải tất cả các trường bắt buộc đều đã được điền.", + "submit": "Gửi đi" }, "configure": "Cấu hình", "configured": "Đã cấu hình", "description": "Quản lý thiết bị và dịch vụ đã kết nối", "discovered": "Đã quét", + "ignore": { + "confirm_delete_ignore_title": "Ngừng bỏ qua {name}?", + "hide_ignored": "Ẩn các tích hợp bị bỏ qua", + "ignored": "Đã bỏ qua", + "show_ignored": "Hiển thị các tích hợp bị bỏ qua", + "stop_ignore": "Ngừng bỏ qua" + }, "integration": "tích hợp", + "integration_not_found": "Không tìm thấy tích hợp.", "new": "Thiết lập bộ tích hợp mới", - "none": "Chưa có cấu hình nào" + "no_integrations": "Có vẻ như bạn chưa có bất kỳ tích hợp nào được cấu hình. Nhấp vào nút bên dưới để thêm tích hợp đầu tiên của bạn!", + "none": "Chưa có cấu hình nào", + "none_found": "Không tìm thấy tích hợp nào", + "none_found_detail": "Điều chỉnh tiêu chí tìm kiếm của bạn." }, "introduction": "Ở đây có thể định cấu hình các thành phần của bạn và Home Assistant. Không phải mọi thứ đều có thể được cấu hình từ giao diện người dùng, nhưng chúng tôi đang cải thiện việc đó.", + "logs": { + "caption": "Nhật ký hoạt động", + "clear": "Xoá", + "description": "Xem nhật ký hoạt động của Home Assistant", + "details": "Chi tiết Nhật ký ({level})", + "load_full_log": "Tải Đầy đủ Nhật ký của Home Assistant", + "loading_log": "Đang tải nhật ký lỗi...", + "multiple_messages": "thông điệp xuất hiện lần đầu vào lúc {time} và lặp lại {counter} lần", + "no_errors": "Không có lỗi nào được báo cáo.", + "no_issues": "Không có vấn đề mới nào!", + "refresh": "Làm mới" + }, "lovelace": { "caption": "Bảng điều khiển Lovelace", "dashboards": { "cant_edit_default": "Bảng điều khiển Lovelace tiêu chuẩn không thể chỉnh sửa được từ UI. Bạn có thể ẩn nó bằng cách đặt bảng điều khiển khác làm mặc định.", + "cant_edit_yaml": "Các bảng điều khiển được định nghĩa trong YAML không thể được sửa từ giao diện người dùng. Thay đổi chúng trong configuration.yaml.", + "caption": "Bảng điều khiển", + "conf_mode": { + "storage": "Điều khiển bằng UI", + "yaml": "Tập tin YAML" + }, + "confirm_delete": "Bạn có chắc chắn muốn xóa bảng điều khiển này?", "default_dashboard": "Đây là bảng điều khiển mặc định", "detail": { + "create": "Tạo", + "delete": "Xóa", + "dismiss": "Đóng", + "edit_dashboard": "Chỉnh sửa bảng điều khiển", "icon": "Biểu tượng", - "title": "Tiêu đề" + "new_dashboard": "Thêm bảng điều khiển mới", + "require_admin": "Chỉ Quản trị viên", + "set_default": "Đặt làm mặc định trên thiết bị này", + "show_sidebar": "Hiển thị trong thanh bên", + "title": "Tiêu đề", + "title_required": "Tiêu đề là bắt buộc.", + "update": "Cập nhật", + "url": "Url", + "url_error_msg": "URL phải chứa một ký tự - và không thể chứa dấu cách hoặc ký tự đặc biệt, ngoại trừ _ và -" }, "picker": { + "add_dashboard": "Thêm bảng điều khiển", + "headers": { + "conf_mode": "Phương thức cấu hình", + "default": "Mặc định", + "filename": "Tên tệp", + "require_admin": "Chỉ Quản trị viên", + "sidebar": "Hiển thị trong thanh bên", + "title": "Tiêu đề" + }, "open": "Mở" } }, - "description": "Cấu hình bảng điều khiển Lovelace" + "description": "Cấu hình bảng điều khiển Lovelace", + "resources": { + "cant_edit_yaml": "Bạn đang sử dụng Lovelace trong chế độ YAML, do đó bạn không thể quản lý tài nguyên của mình thông qua giao diện người dùng. Quản lý chúng trong configuration.yaml.", + "caption": "Tài nguyên", + "confirm_delete": "Bạn có chắc chắn muốn xóa tài nguyên này?", + "detail": { + "create": "Tạo", + "delete": "Xóa", + "dismiss": "Đóng", + "new_resource": "Thêm tài nguyên mới", + "type": "Loại tài nguyên", + "update": "Cập nhật", + "url": "Url", + "url_error_msg": "URL là trường bắt buộc", + "warning_header": "Thận trọng!", + "warning_text": "Thêm tài nguyên có thể nguy hiểm, đảm bảo bạn biết rõ nguồn của tài nguyên và tin tưởng họ. Tài nguyên xấu có thể gây hại nghiêm trọng cho hệ thống của bạn." + }, + "picker": { + "add_resource": "Thêm tài nguyên", + "headers": { + "type": "Loại", + "url": "Url" + }, + "no_resources": "Không có tài nguyên" + }, + "refresh_body": "Bạn phải làm mới trang để hoàn tất việc xóa, bạn có muốn làm mới bây giờ không?", + "refresh_header": "Bạn có muốn làm mới không?", + "types": { + "css": "Stylesheet", + "html": "HTML (không dùng nữa)", + "js": "Tệp JavaScript (không dùng nữa)", + "module": "Mô-đun JavaScript" + } + } }, "person": { "caption": "Người", @@ -897,26 +1268,65 @@ } }, "scene": { + "activated": "Đã kích hoạt ngữ cảnh {name}.", + "caption": "Các ngữ cảnh", + "description": "Tạo và chỉnh sửa ngữ cảnh", "editor": { + "default_name": "Ngữ cảnh mới", "devices": { "add": "Thêm thiết bị", "delete": "Xóa thiết bị", - "header": "Thiết bị" - } + "header": "Thiết bị", + "introduction": "Thêm các thiết bị mà bạn muốn bao gồm trong ngữ cảnh của bạn. Đặt tất cả các thiết bị vào trạng thái mong muốn cho ngữ cảnh này." + }, + "entities": { + "add": "Thêm một thực thể", + "delete": "Xóa thực thể", + "device_entities": "Nếu bạn thêm một thực thể thuộc về một thiết bị, thiết bị cũng sẽ được thêm vào.", + "header": "Các thực thể", + "introduction": "Các thực thể không thuộc về một thiết bị có thể được đặt ở đây.", + "without_device": "Các thực thể không thuộc một thiết bị" + }, + "introduction": "Sử dụng các ngữ cảnh để mang lại sự sống cho nhà bạn.", + "load_error_not_editable": "Chỉ những ngữ cảnh nằm trong scenes.yaml là có thể chỉnh sửa.", + "load_error_unknown": "Lỗi khi tải ngữ cảnh ({err_no}).", + "name": "Tên", + "save": "Lưu", + "unsaved_confirm": "Bạn có những thay đổi chưa được lưu. Bạn có chắc chắn muốn rời đi không?" }, "picker": { + "add_scene": "Thêm ngữ cảnh", + "delete_confirm": "Bạn có chắc bạn muốn xóa bỏ ngữ cảnh này không?", + "delete_scene": "Xóa ngữ cảnh", + "edit_scene": "Chỉnh sửa ngữ cảnh", + "header": "Trình soạn thảo Ngữ cảnh", "headers": { "name": "Tên" - } + }, + "introduction": "Trình soạn thảo ngữ cảnh cho phép bạn tạo và chỉnh sửa các ngữ cảnh. Vui lòng theo liên kết dưới đây để xem hướng dẫn nhằm đảm bảo rằng bạn đã cấu hình Home Assistant chính xác.", + "learn_more": "Tìm hiểu thêm về ngữ cảnh", + "no_scenes": "Chúng tôi không thể tìm thấy bất kỳ ngữ cảnh nào có thể chỉnh sửa", + "only_editable": "Chỉ những ngữ cảnh được định nghĩa trong scenes.yaml là có thể chỉnh sửa.", + "pick_scene": "Chọn ngữ cảnh để chỉnh sửa", + "show_info_scene": "Hiển thị thông tin về ngữ cảnh" } }, "script": { "caption": "Kịch bản", "description": "Tạo và chỉnh sửa các tập lệnh", + "editor": { + "delete_script": "Xóa kịch bản", + "link_available_actions": "Tìm hiểu thêm về các hành động khả dụng.", + "sequence": "Trình tự", + "sequence_sentence": "Trình tự các hành động trong kịch bản này." + }, "picker": { + "edit_script": "Chỉnh sửa kịch bản", "headers": { "name": "Tên" - } + }, + "show_info": "Hiển thị thông tin về kịch bản", + "trigger_script": "Kích hoạt kịch bản" } }, "server_control": { @@ -928,6 +1338,11 @@ "core": "Tải lại lõi", "group": "Tải lại nhóm", "heading": "Đang tải lại cấu hình YAML", + "input_boolean": "Tải lại input boolean", + "input_datetime": "Tải lại input date time", + "input_number": "Tải lại input number", + "input_select": "Tải lại input select", + "input_text": "Tải lại input texts", "introduction": "Một số phần của Home Assistant có thể tải lại mà không yêu cầu khởi động lại. Nhấn nút tải lại sẽ gỡ bỏ cấu hình hiện tại của nó và tải một cấu hình mới.", "person": "Tải lại người", "scene": "Tải lại ngữ cảnh", @@ -975,29 +1390,82 @@ "name": "Tên", "system": "Hệ thống" } - } + }, + "users_privileges_note": "Nhóm người dùng đang trong quá trình hoàn thiện. Người dùng sẽ không thể thực hiện các thao tác quản lý qua UI. Chúng tôi vẫn đang kiểm tra tất cả các điểm kết thúc của API để đảm bảo rằng chúng giới hạn chính xác các truy cập vào quyền quản trị." }, "zha": { "add_device_page": { + "discovered_text": "Thiết bị sẽ hiển thị ở đây một khi được tìm thấy.", + "no_devices_found": "Không có thiết bị nào được tìm thấy, hãy chắc chắn thiết bị đang trong chế độ ghép nối và giữ thiết bị kích hoạt khi tự động phát hiện đang chạy.", + "pairing_mode": "Đảm bảo các thiết bị của bạn đang ở chế độ ghép nối. Kiểm tra hướng dẫn đi kèm thiết bị về cách làm điều này.", "spinner": "Tìm kiếm các thiết bị ZHA Zigbee ..." }, "add": { "caption": "Thêm thiết bị" }, + "button": "Cấu hình", "caption": "ZHA", "common": { "add_devices": "Thêm thiết bị", - "devices": "Thiết bị" + "devices": "Thiết bị", + "value": "Giá trị" }, - "description": "Quản lý mạng Zigbee Home Automation" + "description": "Quản lý mạng Zigbee Home Automation", + "group_binding": { + "bind_button_help": "Liên kết nhóm đã chọn vào các cụm thiết bị đã chọn.", + "bind_button_label": "Liên kết Nhóm", + "cluster_selection_help": "Chọn các cụm để liên kết với nhóm đã chọn.", + "group_picker_help": "Chọn một nhóm để thi hành một lệnh liên kết.", + "unbind_button_help": "Hủy liên kết nhóm đã chọn khỏi cụm thiết bị đã chọn.", + "unbind_button_label": "Ngừng liên kết Nhóm" + }, + "groups": { + "add_members": "Thêm Thành viên", + "adding_members": "Thêm Thành viên", + "caption": "Các nhóm", + "create": "Tạo Nhóm", + "create_group": "Zigbee Home Automation - Tạo Nhóm", + "creating_group": "Đang tạo Nhóm", + "group_id": "Mã Nhóm", + "group_info": "Thông tin Nhóm", + "group_name_placeholder": "Tên Nhóm", + "group_not_found": "Không tìm thấy nhóm!", + "group-header": "ZigBee Home Automation - Chi tiết Nhóm", + "groups": "Nhóm", + "members": "Thành viên", + "remove_groups": "Xoá các Nhóm", + "remove_members": "Xóa Thành viên", + "removing_groups": "Đang xoá các Nhóm", + "removing_members": "Xoá các Thành Viên" + }, + "network_management": { + "header": "Quản lí Mạng" + }, + "network": { + "caption": "Mạng" + } }, "zone": { "caption": "Khu vực", "configured_in_yaml": "Các khu vực được định cấu hình qua file configuration.yaml không thể được chỉnh sửa thông qua giao diện.", + "create_zone": "Tạo một Vùng", "description": "Quản lý các khu vực bạn muốn theo dõi mọi người trong đó.", + "detail": { + "create": "Tạo", + "delete": "Xóa", + "latitude": "Vĩ độ", + "longitude": "Kinh độ", + "passive": "Thụ động", + "radius": "Bán kính", + "required_error_msg": "Trường này là cần thiết", + "update": "Cập nhật" + }, + "edit_home_zone": "Bán kính của vùng Nhà chưa thể chỉnh sửa được từ frontend. Kéo điểm đánh dấu trên bản đồ để di chuyển vùng Nhà.", + "go_to_core_config": "Đi đến cấu hình chung?", "no_zones_created_yet": "Có vẻ như bạn chưa tạo ra bất kỳ khu vực nào." }, "zwave": { + "button": "Cấu hình", "caption": "Z-Wave", "common": { "index": "Mục lục", @@ -1011,29 +1479,95 @@ "set_config_parameter": "Đặt tham số cấu hình", "true": "Đúng" }, + "node_management": { + "add_to_group": "Thêm vào Nhóm", + "group": "Nhóm" + }, + "ozw_log": { + "load": "Tải" + }, "services": { "cancel_command": "Hủy lệnh", + "heal_node": "Nút sửa lỗi", + "node_info": "Thông tin nút", + "print_node": "Nút in ấn", + "refresh_entity": "Làm mới Thực thể", "save_config": "Lưu cấu hình", - "soft_reset": "Khởi động lại" + "soft_reset": "Khởi động lại", + "test_node": "Nút kiểm tra" } } }, + "custom": { + "external_panel": { + "question_trust": "Bạn có tin tưởng bảng điều khiển bên ngoài {name} tại {link} không?" + } + }, "developer-tools": { "tabs": { "events": { - "title": "Sự kiện" + "alert_event_type": "Loại sự kiện là một trường bắt buộc", + "available_events": "Các sự kiện khả dụng", + "count_listeners": "({count} đang lắng nghe)", + "data": "Dữ liệu của Sự kiện (YAML, tùy chọn)", + "description": "Tạo một sự kiện trên kênh sự kiện.", + "documentation": "Tài liệu của các Sự kiện.", + "event_fired": "Sự kiện {type} đã được tạo", + "fire_event": "Tạo Sự kiện", + "listen_to_events": "Lắng nghe các sự kiện", + "listening_to": "Lắng nghe", + "notification_event_fired": "Sự kiện {type} được tạo thành công!", + "start_listening": "Bắt đầu lắng nghe", + "stop_listening": "Ngừng lắng nghe", + "subscribe_to": "Sự kiện để đăng ký", + "title": "Sự kiện", + "type": "Loại Sự Kiện" }, "mqtt": { - "title": "MQTT" + "description_listen": "Nghe một chủ đề", + "description_publish": "Công bố một gói tin", + "listening_to": "Lắng nghe", + "message_received": "Thông điệp {id} nhận được trên {topic} tại {time}:", + "payload": "Nội dung (cho phép dùng Mẫu sẵn)", + "publish": "Công bố", + "start_listening": "Bắt đầu nghe", + "stop_listening": "Dừng nghe", + "subscribe_to": "Đăng ký vào chủ đề", + "title": "MQTT", + "topic": "chủ đề" }, "services": { + "alert_parsing_yaml": "Lỗi phân tích YAML: {data}", + "call_service": "Gọi Dịch vụ", + "column_description": "Mô tả", + "column_example": "Ví dụ", + "column_parameter": "Tham số", + "data": "Dữ liệu dịch vụ (YAML, tùy chọn)", + "description": "Công cụ hỗ trợ phát triển dịch vụ cho phép bạn gọi các dịch vụ khả dụng trong Home Assistant.", + "fill_example_data": "Điền các Dữ liệu Mẫu", + "no_description": "Không có mô tả nào", + "no_parameters": "Dịch vụ này không có tham số.", + "select_service": "Chọn một dịch vụ để xem mô tả", "title": "Dịch vụ" }, "states": { + "attributes": "Các thuộc tính", + "current_entities": "Thực thể hiện tại", + "entity": "Thực thể", + "filter_attributes": "Lọc các thuộc tính", + "filter_entities": "Lọc các thực thể", + "filter_states": "Lọc các trạng thái", + "more_info": "Thêm Thông tin", + "no_entities": "Không có thực thể", + "set_state": "Thiết lập Trạng thái", + "state": "Trạng thái", + "state_attributes": "Các thuộc tính Trạng thái (YAML, tuỳ chọn)", "title": "Trạng thái" }, "templates": { - "title": "Mẫu sẵn" + "editor": "Trình soạn thảo bản mẫu", + "title": "Mẫu sẵn", + "unknown_error_template": "Lỗi không xác định khi kết xuất bản mẫu" } } }, @@ -1042,16 +1576,25 @@ "showing_entries": "Hiển thị mục cho" }, "logbook": { + "entries_not_found": "Không tìm thấy trong sổ nhật ký.", "period": "Giai đoạn", "showing_entries": "Hiển thị mục cho" }, "lovelace": { + "add_entities": { + "generated_unsupported": "Bạn chỉ có thể sử dụng chức năng này khi bạn lấy quyền kiểm soát giao diện Lovelace.", + "saving_failed": "Không thể lưu lại cấu hình Lovelace.", + "yaml_unsupported": "Bạn không thể sử dụng chức năng này khi sử dụng giao diện Lovelace trong chế độ YAML." + }, "cards": { "empty_state": { "go_to_integrations_page": "Chuyển đến trang tích hợp.", "no_devices": "Trang này cho phép bạn điều khiển các thiết bị của mình, tuy nhiên có vẻ như bạn chưa có thiết bị nào được thiết lập. Đi đến trang tích hợp để bắt đầu.", "title": "Chào mừng về nhà" }, + "entities": { + "never_triggered": "Chưa bao giờ kích hoạt" + }, "picture-elements": { "call_service": "Gọi dịch vụ {name}", "hold": "Giữ:", @@ -1064,6 +1607,10 @@ "add_item": "Thêm mục", "checked_items": "Mục đã chọn", "clear_items": "Xóa các mục đã chọn" + }, + "starting": { + "description": "Home Assistant đang khởi động, vui lòng chờ...", + "header": "Home Assistant đang khởi động" } }, "changed_toast": { @@ -1072,16 +1619,84 @@ }, "editor": { "card": { + "button": { + "name": "Nút" + }, "conditional": { - "card": "Thẻ" + "card": "Thẻ", + "condition_explanation": "Thẻ sẽ được hiển thị khi TẤT CẢ các điều kiện dưới đây được đáp ứng.", + "conditions": "Điều kiện", + "current_state": "hiện tại", + "description": "Thẻ Điều kiện hiển thị một thẻ khác dựa trên trạng thái của các thực thể.", + "state_equal": "Trạng thái bằng với", + "state_not_equal": "Trạng thái không bằng với" + }, + "entity-filter": { + "name": "Bộ lọc Thực thể" + }, + "entity": { + "description": "Thẻ Thực thể cung cấp cho bạn thông tin tổng quát về trạng thái của thực thể.", + "name": "Thực thể" }, "generic": { + "attribute": "Thuộc tính", + "double_tap_action": "Hành động khi Nhấn Đôi", + "manual": "Thủ công", + "manual_description": "Cần thêm một thẻ tuỳ chỉnh hay chỉ muốn viết cấu hình yaml thủ công?", + "no_theme": "Không có theme.", "state": "Trạng thái" }, + "history-graph": { + "description": "Thẻ Biểu đồ Lịch sử cho phép bạn hiển thị biểu đồ cho từng thực thể được liệt kê." + }, + "horizontal-stack": { + "description": "Thẻ Xếp Ngang cho phép bạn nhóm nhiều thẻ để các thẻ này luôn nằm cạnh nhau trong cùng một hàng.", + "name": "Xếp Ngang" + }, "iframe": { "name": "Trang web" + }, + "light": { + "description": "Thẻ Đèn cho phép bạn thay đổi độ sáng của đèn." + }, + "map": { + "description": "Thẻ Bản đồ cho phép bạn hiển thị các thực thể trên bản đồ.", + "hours_to_show": "Giờ hiển thị" + }, + "media-control": { + "name": "Điều khiển Thiết bị đa phương tiện" + }, + "picture": { + "name": "Hình ảnh" + }, + "plant-status": { + "description": "Thẻ Tình trạng Cây cối dành cho tất cả các nhà thực vật học đáng yêu ngoài kia." + }, + "sensor": { + "description": "Thẻ Cảm biến cung cấp cho bạn tổng quan nhanh về trạng thái cảm biến của bạn với một biểu đồ tùy chọn thể hiện sự thay đổi qua thời gian.", + "name": "Cảm biến" + }, + "shopping-list": { + "description": "Thẻ Danh sách mua sắm cho phép bạn thêm, chỉnh sửa, kiểm tra và xóa các mục khỏi danh sách mua sắm của bạn.", + "integration_not_loaded": "Thẻ này yêu cầu thiết lập tích hợp 'shopping_list'." + }, + "thermostat": { + "description": "Thẻ Điều chỉnh nhiệt cho phép kiểm soát thực thể khí hậu của bạn. Cho phép bạn thay đổi nhiệt độ và chế độ của thực thể.", + "name": "Thiết bị điều chỉnh nhiệt độ" + }, + "vertical-stack": { + "description": "Thẻ Xếp Dọc cho phép bạn nhóm nhiều thẻ để các thẻ này luôn nằm trong cùng một cột.", + "name": "Xếp Dọc" + }, + "weather-forecast": { + "name": "Dự báo Thời tiết", + "show_forecast": "Hiển thị Dự báo thời tiết" } }, + "cardpicker": { + "custom_card": "Tuỳ chỉnh", + "no_description": "Không có mô tả nào." + }, "edit_card": { "add": "Thêm Thẻ", "delete": "Xóa", @@ -1091,14 +1706,23 @@ "move": "Di chuyển", "options": "Tùy Chọn", "pick_card": "Chọn Thẻ bạn muốn thêm.", + "pick_card_view_title": "Loại thẻ nào bạn muốn thêm vào chế độ xem {name}?", "show_code_editor": "Sửa mã nguồn", "toggle_editor": "Đổi trình biên tập" }, + "edit_lovelace": { + "edit_title": "Chỉnh sửa tiêu đề" + }, "edit_view": { "add": "Thêm Tầm nhìn", "delete": "Xóa Tầm nhìn", "edit": "Chỉnh sửa Tầm nhìn", - "header": "Cấu hình Tầm nhìn" + "header": "Cấu hình Tầm nhìn", + "move_right": "Di chuyển tầm nhìn sang phải", + "tab_badges": "Huy hiệu", + "visibility": { + "select_users": "Chọn người dùng sẽ thấy chế độ xem này trong thanh điều hướng" + } }, "header": "Chỉnh sửa giao diện", "menu": { @@ -1112,32 +1736,63 @@ "para_no_id": "Phần tử này không có ID. Vui lòng thêm ID vào thành phần này trong 'ui-lovelace.yaml'." }, "raw_editor": { + "confirm_unsaved_changes": "Bạn có những thay đổi chưa được lưu, bạn có chắc muốn thoát không?", + "confirm_unsaved_comments": "Cấu hình của bạn chứa (các) ghi chú, những ghi chú này sẽ không được lưu. Bạn có muốn tiếp tục?", "error_invalid_config": "Cấu hình của bạn không hợp lệ: {error}", + "error_parse_yaml": "Không thể phân tích YAML: {error}", + "error_save_yaml": "Không thể lưu YAML: {error}", "header": "Chỉnh sửa cấu hình", + "resources_moved": "Các Tài nguyên giờ không nên được thêm vào qua cấu hình Lovelace nhưng có thể thêm vào qua bảng điều khiển cấu hình Lovelace.", "save": "Lưu", "saved": "Đã lưu", "unsaved_changes": "Thay đổi chưa lưu" }, "save_config": { "cancel": "Đừng bận tâm", + "close": "Đóng", "empty_config": "Bắt đầu với một bảng điều khiển trống", "header": "Kiểm soát giao diện Lovelace của bạn", "para": "Theo mặc định, Home Assistant sẽ duy trì giao diện của bạn, cập nhật nó khi các thực thể mới hoặc các thành phần Lovelace có sẵn. Nếu bạn kiểm soát, chúng tôi sẽ không còn thay đổi tự động cho bạn nữa.", "para_sure": "Bạn có chắc chắn muốn kiểm soát giao diện của mình không?", - "save": "Kiểm soát" + "save": "Kiểm soát", + "yaml_config": "Để giúp bạn bắt đầu, đây là cấu hình hiện tại của bảng điều khiển này:", + "yaml_control": "Để kiểm soát trong chế độ YAML, hãy tạo tệp YAML với tên bạn đã chỉ định trong cấu hình hoặc trong 'ui-lovelace.yaml' mặc định.", + "yaml_mode": "Bạn đang sử dụng chế độ YAML cho bảng điều khiển này, có nghĩa là bạn không thể thay đổi cấu hình Lovelace từ giao diện người dùng. Nếu bạn muốn quản lý bảng điều khiển này từ giao diện người dùng, loại bỏ 'mode:yaml' từ cấu hình Lovelace của bạn trong 'configuration.yaml'." }, "suggest_card": { "add": "Thêm vào Lovelace UI", - "create_own": "Chọn thẻ khác" + "create_own": "Chọn thẻ khác", + "header": "Chúng tôi đã tạo một đề xuất cho bạn" + }, + "view": { + "panel_mode": { + "description": "Chế độ này hiển thị thẻ đầu tiên với toàn bộ chiều rộng; các thẻ còn lại sẽ không được hiển thị.", + "title": "Chế độ Bảng điều khiển?", + "warning_multiple_cards": "Chế độ xem này chứa nhiều thẻ, nhưng chế độ xem dạng bảng điều khiển chỉ có thể hiển thị 1 thẻ." + } } }, "menu": { + "close": "Đóng", "configure_ui": "Cấu hình giao diện", "help": "Trợ giúp", "refresh": "Làm tươi", "reload_resources": "Tải lại các tài nguyên" }, "reload_lovelace": "Tải lại giao diện", + "reload_resources": { + "refresh_body": "Bạn phải làm mới trang để hoàn thành tải lại, bạn có muốn làm mới bây giờ không?", + "refresh_header": "Bạn có muốn làm mới không?" + }, + "unused_entities": { + "available_entities": "Đây là những thực thể mà bạn có, nhưng chưa thêm vào giao diện người dùng Lovelace.", + "domain": "Tên miền", + "entity": "Thực thể", + "entity_id": "Mã Thực thể", + "last_changed": "Thay đổi lần cuối", + "select_to_add": "Chọn thực thể bạn muốn thêm vào thẻ và sau đó nhấp vào nút Thêm thẻ.", + "title": "Thực thể chưa sử dụng" + }, "views": { "confirm_delete": "Xóa cửa sổ?" }, @@ -1145,7 +1800,8 @@ "attribute_not_found": "Thuộc tính {attribute} không có trong: {entity}", "entity_non_numeric": "Thực thể không phải là số: {entity}", "entity_not_found": "Thực thể không có sẵn: {entity}", - "entity_unavailable": "{entity} hiện không khả dụng" + "entity_unavailable": "{entity} hiện không khả dụng", + "starting": "Home Assistant đang khởi động, không phải tất cả mọi thứ đã sẵn sàng" } }, "mailbox": { @@ -1158,6 +1814,8 @@ "abort_intro": "Đã hủy đăng nhập", "authorizing_client": "Bạn sắp cấp quyền cho {clientId} truy cập vào Home Assistant của bạn.", "form": { + "error": "Lỗi: {error}", + "next": "Kế tiếp", "providers": { "command_line": { "abort": { @@ -1243,6 +1901,7 @@ } } }, + "start_over": "Bắt đầu lại", "unknown_error": "Đã xảy ra sự cố", "working": "Vui lòng đợi" }, @@ -1263,6 +1922,7 @@ "hallway": "Hành lang", "kitchen": "Phòng bếp", "patio": "Sân trong", + "temperature_study": "Nghiên cứu Nhiệt độ", "upstairs": "Tầng trên" }, "unit": { @@ -1305,6 +1965,7 @@ "profile": { "advanced_mode": { "description": "Mở các tính năng nâng cao.", + "link_promo": "Tìm hiểu thêm", "title": "Chế độ nâng cao" }, "change_password": { @@ -1332,6 +1993,8 @@ "link_promo": "Trợ giúp dịch" }, "logout": "Đăng xuất", + "logout_text": "Bạn có chắc bạn muốn đăng xuất không?", + "logout_title": "Đăng xuất?", "long_lived_access_tokens": { "confirm_delete": "Bạn có chắn chắn muốn xóa token truy cập {name}?", "create": "Tạo Token", diff --git a/translations/frontend/zh-Hans.json b/translations/frontend/zh-Hans.json index 9a14d4687f..0150446332 100644 --- a/translations/frontend/zh-Hans.json +++ b/translations/frontend/zh-Hans.json @@ -473,7 +473,7 @@ } }, "common": { - "and": "并且", + "and": "和", "back": "返回", "cancel": "取消", "close": "关闭", @@ -694,10 +694,10 @@ }, "zha_device_info": { "buttons": { - "add": "添加设备", + "add": "通过此设备添加设备", "reconfigure": "重新配置设备", "remove": "删除设备", - "zigbee_information": "Zigbee 信息" + "zigbee_information": "Zigbee 设备签名" }, "confirmations": { "remove": "您确定要删除此设备吗?" @@ -717,7 +717,7 @@ "unknown": "未知", "zha_device_card": { "area_picker_label": "区域", - "device_name_placeholder": "用户指定的名称", + "device_name_placeholder": "更改设备名称", "update_name_button": "更新名称" } } @@ -1391,6 +1391,11 @@ "system_health_error": "未加载系统健康组件。请将 'system_health:' 添加到 configuration.yaml", "title": "信息" }, + "integration_panel_move": { + "link_integration_page": "集成页面", + "missing_zha": "找不到 ZHA 配置面板了吗?它已移动到{integrations_page}中的 ZHA 条目。", + "missing_zwave": "找不到 Z-Wave 配置面板了吗?它已移动到{integrations_page}中的 Z-Wave 条目。" + }, "integrations": { "add_integration": "添加集成", "caption": "集成", @@ -1728,8 +1733,11 @@ }, "zha": { "add_device_page": { + "discovered_text": "发现的设备会立即显示在这里。", "discovery_text": "发现的设备将显示在此处。按照设备的说明进行操作,并将设备置于配对模式。", "header": "Zigbee 家庭自动化 - 添加设备", + "no_devices_found": "未发现设备。请确保设备处于配对模式,并且在搜索设备时保持唤醒。", + "pairing_mode": "请确保您的设备处于配对模式。有关如何进入配对模式,请查阅设备说明书。", "search_again": "再次搜索", "spinner": "正在寻找ZHA Zigbee设备......" }, @@ -1737,6 +1745,7 @@ "caption": "添加设备", "description": "将设备添加到Zigbee网络" }, + "button": "配置", "caption": "ZHA", "cluster_attributes": { "attributes_of_cluster": "所选集群的属性", @@ -1815,6 +1824,9 @@ "header": "网络管理", "introduction": "影响整个网络的命令" }, + "network": { + "caption": "网络" + }, "node_management": { "header": "设备管理", "help_node_dropdown": "选择一个设备以查看每个设备的选项。", @@ -1854,6 +1866,7 @@ "no_zones_created_yet": "您还没有建立地点。" }, "zwave": { + "button": "配置", "caption": "Z-Wave", "common": { "index": "指数", @@ -1953,8 +1966,8 @@ "available_events": "可用事件", "count_listeners": " ({count} 个监听器)", "data": "事件数据(格式为YAML,选填)", - "description": "将事件发送到事件总线", - "documentation": "事件文档。", + "description": "将事件发送到事件总线。", + "documentation": "事件文档", "event_fired": "事件 {name} 已触发", "fire_event": "触发事件", "listen_to_events": "监听事件", diff --git a/translations/frontend/zh-Hant.json b/translations/frontend/zh-Hant.json index 385567cb26..49c4530421 100644 --- a/translations/frontend/zh-Hant.json +++ b/translations/frontend/zh-Hant.json @@ -694,10 +694,10 @@ }, "zha_device_info": { "buttons": { - "add": "新增設備", + "add": "透過此設備新增設備", "reconfigure": "重新設定設備", "remove": "移除設備", - "zigbee_information": "Zigbee 資訊" + "zigbee_information": "Zigbee 設備簽章" }, "confirmations": { "remove": "確定要移除此設備?" @@ -717,7 +717,7 @@ "unknown": "未知", "zha_device_card": { "area_picker_label": "分區", - "device_name_placeholder": "設備命名", + "device_name_placeholder": "變更設備名稱", "update_name_button": "更新名稱" } } @@ -1391,6 +1391,11 @@ "system_health_error": "系統健康元件未載入。請於 configuration.yaml 內加入「system_health:」", "title": "資訊" }, + "integration_panel_move": { + "link_integration_page": "整合頁面", + "missing_zha": "找不到 ZHA 設定頁面嗎?目前已經移至 {integrations_page} 中的 ZHA 物件。", + "missing_zwave": "找不到 Z-Wave 設定頁面嗎?目前已經移至 {integrations_page} 中的 Z-Wave 物件。" + }, "integrations": { "add_integration": "新增整合", "caption": "整合", @@ -1728,8 +1733,11 @@ }, "zha": { "add_device_page": { + "discovered_text": "於探索到設備後將顯示於此處。", "discovery_text": "所發現的設備將會顯示於此。跟隨設備的指示並將其設定為配對模式。", "header": "Zigbee 家庭自動化 - 新增設備", + "no_devices_found": "找不到設備,請確定設備處於配對模式、並於探索時保成喚醒狀態。", + "pairing_mode": "請確定設備處於配對模式中,參閱設備的手冊以了解如何進行操作。", "search_again": "再次搜尋", "spinner": "正在搜尋 ZHA Zigbee 設備..." }, @@ -1737,6 +1745,7 @@ "caption": "新增設備", "description": "新增設備至 Zigbee 網路" }, + "button": "設定", "caption": "ZHA", "cluster_attributes": { "attributes_of_cluster": "獲取所選叢集屬性。", @@ -1815,6 +1824,9 @@ "header": "網路管理", "introduction": "命令影響整個網路" }, + "network": { + "caption": "網路" + }, "node_management": { "header": "設備管理", "help_node_dropdown": "選擇設備以檢視該設備選項。", @@ -1854,6 +1866,7 @@ "no_zones_created_yet": "看起來您還沒有新增任何區域。" }, "zwave": { + "button": "設定", "caption": "Z-Wave", "common": { "index": "指數", diff --git a/yarn.lock b/yarn.lock index 14318d7282..c7f51c7378 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2738,6 +2738,11 @@ dependencies: "@vaadin/vaadin-development-mode-detector" "^2.0.0" +"@vue/web-component-wrapper@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@vue/web-component-wrapper/-/web-component-wrapper-1.2.0.tgz#bb0e46f1585a7e289b4ee6067dcc5a6ae62f1dd1" + integrity sha512-Xn/+vdm9CjuC9p3Ae+lTClNutrVhsXpzxvoTXXtoys6kVRX9FkueSUAqSWAyZntmVLlR4DosBV4pH8y5Z/HbUw== + "@webassemblyjs/ast@1.8.5": version "1.8.5" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" @@ -11829,6 +11834,18 @@ vscode-uri@^1.0.6: resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-1.0.8.tgz#9769aaececae4026fb6e22359cb38946580ded59" integrity sha512-obtSWTlbJ+a+TFRYGaUumtVwb+InIUVI0Lu0VBUAPmj2cU5JutEXg3xUE0c2J5Tcy7h2DEKVJBFi+Y9ZSFzzPQ== +vue2-daterange-picker@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/vue2-daterange-picker/-/vue2-daterange-picker-0.5.1.tgz#f41f3cd20b242b7f34ce16eeea9534d9cbe9f4d7" + integrity sha512-p0y9RyI6wqqwffKM5EYgxvNM51un/fBu9hLZ/GxXVOBqTMxjDuV8mz9iUTj4p5R80lWSBwIY7GshW5RYgS8+rw== + dependencies: + vue "^2.6.10" + +vue@^2.6.10, vue@^2.6.11: + version "2.6.11" + resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.11.tgz#76594d877d4b12234406e84e35275c6d514125c5" + integrity sha512-VfPwgcGABbGAue9+sfrD4PuwFar7gPb1yl1UK1MwXoQPAw0BKSqWfoYCT/ThFrdEVWoI51dBuyCoiNU9bZDZxQ== + watchpack@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00"