From e2ed1a9fd9455acc33f3907044de90048214b60b Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 12 Mar 2019 19:41:02 -0700 Subject: [PATCH 1/6] Fix bugs (#2923) --- src/dialogs/more-info/controls/more-info-camera.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/dialogs/more-info/controls/more-info-camera.ts b/src/dialogs/more-info/controls/more-info-camera.ts index fc97b0b370..72ec2629cf 100644 --- a/src/dialogs/more-info/controls/more-info-camera.ts +++ b/src/dialogs/more-info/controls/more-info-camera.ts @@ -10,6 +10,7 @@ type HLSModule = typeof import("hls.js"); class MoreInfoCamera extends UpdatingElement { @property() public hass?: HomeAssistant; @property() public stateObj?: CameraEntity; + private _hlsPolyfillInstance?: Hls; public disconnectedCallback() { super.disconnectedCallback(); @@ -100,6 +101,7 @@ class MoreInfoCamera extends UpdatingElement { url: string ) { const hls = new Hls(); + this._hlsPolyfillInstance = hls; await new Promise((resolve) => { hls.on(Hls.Events.MEDIA_ATTACHED, resolve); hls.attachMedia(videoEl); @@ -123,9 +125,14 @@ class MoreInfoCamera extends UpdatingElement { } private _teardownPlayback(): any { + if (this._hlsPolyfillInstance) { + this._hlsPolyfillInstance.destroy(); + this._hlsPolyfillInstance = undefined; + } while (this.lastChild) { this.removeChild(this.lastChild); } + this.stateObj = undefined; } } From bbc32278d8c6ee6744c36e00934a3a6fd351f7a9 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 12 Mar 2019 19:43:04 -0700 Subject: [PATCH 2/6] Cache thumbnails (#2924) --- src/cards/ha-media_player-card.js | 12 +++-- .../util/time-cache-function-promise.ts | 47 +++++++++++++++++++ src/data/camera.ts | 6 +++ src/data/media-player.ts | 31 ++++++++++++ src/panels/lovelace/components/hui-image.ts | 10 ++-- 5 files changed, 97 insertions(+), 9 deletions(-) create mode 100644 src/common/util/time-cache-function-promise.ts diff --git a/src/cards/ha-media_player-card.js b/src/cards/ha-media_player-card.js index 6bbda8eab6..cb068c3afe 100644 --- a/src/cards/ha-media_player-card.js +++ b/src/cards/ha-media_player-card.js @@ -6,6 +6,7 @@ import { html } from "@polymer/polymer/lib/utils/html-tag"; import { PolymerElement } from "@polymer/polymer/polymer-element"; import HassMediaPlayerEntity from "../util/hass-media-player-model"; +import { fetchMediaPlayerThumbnailWithCache } from "../data/media-player"; import computeStateName from "../common/entity/compute_state_name"; import EventsMixin from "../mixins/events-mixin"; @@ -271,10 +272,13 @@ class HaMediaPlayerCard extends LocalizeMixin(EventsMixin(PolymerElement)) { // We have a new picture url try { - const { content_type: contentType, content } = await this.hass.callWS({ - type: "media_player_thumbnail", - entity_id: playerObj.stateObj.entity_id, - }); + const { + content_type: contentType, + content, + } = await fetchMediaPlayerThumbnailWithCache( + this.hass, + playerObj.stateObj.entity_id + ); this._coverShowing = true; this._coverLoadError = false; this.$.cover.style.backgroundImage = `url(data:${contentType};base64,${content})`; diff --git a/src/common/util/time-cache-function-promise.ts b/src/common/util/time-cache-function-promise.ts new file mode 100644 index 0000000000..8dc8abcd3f --- /dev/null +++ b/src/common/util/time-cache-function-promise.ts @@ -0,0 +1,47 @@ +import { HomeAssistant } from "../../types"; + +interface ResultCache { + [entityId: string]: Promise | undefined; +} + +export const timeCachePromiseFunc = async ( + cacheKey: string, + cacheTime: number, + func: ( + hass: HomeAssistant, + entityId: string, + ...args: Array + ) => Promise, + hass: HomeAssistant, + entityId: string, + ...args: Array +): Promise => { + let cache: ResultCache | undefined = (hass as any)[cacheKey]; + + if (!cache) { + cache = hass[cacheKey] = {}; + } + + const lastResult = cache[entityId]; + + if (lastResult) { + return lastResult; + } + + const result = func(hass, entityId, ...args); + cache[entityId] = result; + + result.then( + // When successful, set timer to clear cache + () => + setTimeout(() => { + cache![entityId] = undefined; + }, cacheTime), + // On failure, clear cache right away + () => { + cache![entityId] = undefined; + } + ); + + return result; +}; diff --git a/src/data/camera.ts b/src/data/camera.ts index 64eec22d15..62f94096e4 100644 --- a/src/data/camera.ts +++ b/src/data/camera.ts @@ -1,4 +1,5 @@ import { HomeAssistant, CameraEntity } from "../types"; +import { timeCachePromiseFunc } from "../common/util/time-cache-function-promise"; export interface CameraThumbnail { content_type: string; @@ -14,6 +15,11 @@ export const computeMJPEGStreamUrl = (entity: CameraEntity) => entity.attributes.access_token }`; +export const fetchThumbnailWithCache = ( + hass: HomeAssistant, + entityId: string +) => timeCachePromiseFunc("_cameraTmb", 9000, fetchThumbnail, hass, entityId); + export const fetchThumbnail = (hass: HomeAssistant, entityId: string) => hass.callWS({ type: "camera_thumbnail", diff --git a/src/data/media-player.ts b/src/data/media-player.ts index 7d89d4d544..3aaf16e093 100644 --- a/src/data/media-player.ts +++ b/src/data/media-player.ts @@ -1,4 +1,35 @@ +import { HomeAssistant } from "../types"; + +import { timeCachePromiseFunc } from "../common/util/time-cache-function-promise"; + export const SUPPORT_PAUSE = 1; export const SUPPORT_NEXT_TRACK = 32; export const SUPPORTS_PLAY = 16384; export const OFF_STATES = ["off", "idle"]; + +export interface MediaPlayerThumbnail { + content_type: string; + content: string; +} + +export const fetchMediaPlayerThumbnailWithCache = ( + hass: HomeAssistant, + entityId: string +) => + timeCachePromiseFunc( + "_media_playerTmb", + 9000, + fetchMediaPlayerThumbnail, + hass, + entityId + ); + +export const fetchMediaPlayerThumbnail = ( + hass: HomeAssistant, + entityId: string +) => { + return hass.callWS({ + type: "media_player_thumbnail", + entity_id: entityId, + }); +}; diff --git a/src/panels/lovelace/components/hui-image.ts b/src/panels/lovelace/components/hui-image.ts index 213220772d..7f9bd87e95 100644 --- a/src/panels/lovelace/components/hui-image.ts +++ b/src/panels/lovelace/components/hui-image.ts @@ -18,7 +18,7 @@ import { HomeAssistant } from "../../../types"; import { styleMap } from "lit-html/directives/style-map"; import { classMap } from "lit-html/directives/class-map"; import { b64toBlob } from "../../../common/file/b64-to-blob"; -import { fetchThumbnail } from "../../../data/camera"; +import { fetchThumbnailWithCache } from "../../../data/camera"; const UPDATE_INTERVAL = 10000; const DEFAULT_FILTER = "grayscale(100%)"; @@ -179,10 +179,10 @@ class HuiImage extends LitElement { return; } try { - const { content_type: contentType, content } = await fetchThumbnail( - this.hass, - this.cameraImage - ); + const { + content_type: contentType, + content, + } = await fetchThumbnailWithCache(this.hass, this.cameraImage); if (this._cameraImageSrc) { URL.revokeObjectURL(this._cameraImageSrc); } From a626961ae50c0363c14f33643ebb2ed9bd89e556 Mon Sep 17 00:00:00 2001 From: Jason Hu Date: Tue, 12 Mar 2019 19:44:26 -0700 Subject: [PATCH 3/6] Add Afrikaans and Basque languages support (#2922) * Add Basque language * Add Afrikaans language * Update translations --- src/translations/translationMetadata.json | 6 + translations/af.json | 237 ++++++++++++++++++++++ translations/eu.json | 11 + translations/he.json | 8 +- 4 files changed, 258 insertions(+), 4 deletions(-) create mode 100644 translations/af.json create mode 100644 translations/eu.json diff --git a/src/translations/translationMetadata.json b/src/translations/translationMetadata.json index 2a1c2db7b4..ad5be46a17 100644 --- a/src/translations/translationMetadata.json +++ b/src/translations/translationMetadata.json @@ -1,4 +1,7 @@ { + "af": { + "nativeName": "Afrikaans" + }, "ar": { "nativeName": "العربية", "isRTL": true @@ -39,6 +42,9 @@ "et": { "nativeName": "Eesti" }, + "eu": { + "nativeName": "Euskara" + }, "fa": { "nativeName": "فارسی" }, diff --git a/translations/af.json b/translations/af.json new file mode 100644 index 0000000000..1371d3b086 --- /dev/null +++ b/translations/af.json @@ -0,0 +1,237 @@ +{ + "panel": { + "config": "Konfigurasie", + "states": "Oorsig", + "map": "Kaart", + "logbook": "Logboek", + "history": "Geskiedenis", + "mailbox": "Posbus", + "shopping_list": "Inkopielys", + "dev-services": "Services", + "dev-states": "States", + "dev-events": "Events", + "dev-templates": "Templates", + "dev-mqtt": "MQTT", + "dev-info": "Info" + }, + "state": { + "default": { + "off": "Af", + "on": "Op", + "unknown": "Onbekende", + "unavailable": "Nie beskikbaar nie" + }, + "alarm_control_panel": { + "armed": "Gewapen", + "disarmed": "Ontwapen", + "armed_home": "Gewapende huis", + "armed_away": "Gewapen weg", + "armed_night": "Gewapende nag", + "pending": "Hangende", + "arming": "Bewapen", + "disarming": "Ontwapen", + "triggered": "Veroorsaak", + "armed_custom_bypass": "Gewapende pasgemaakte omseil" + }, + "automation": { + "off": "Af", + "on": "Op" + }, + "binary_sensor": { + "default": { + "off": "Af", + "on": "Op" + }, + "moisture": { + "off": "Droë", + "on": "Nat" + }, + "gas": { + "off": "Duidelike", + "on": "Opgespoor" + }, + "motion": { + "off": "Duidelike", + "on": "Opgespoor" + }, + "occupancy": { + "off": "Duidelike", + "on": "Opgespoor" + }, + "smoke": { + "off": "Duidelike", + "on": "Opgespoor" + }, + "sound": { + "off": "Duidelike", + "on": "Opgespoor" + }, + "vibration": { + "off": "Duidelike", + "on": "Opgespoor" + }, + "opening": { + "off": "Gesluit", + "on": "Oop" + }, + "safety": { + "off": "Veilige", + "on": "Onveilige" + }, + "presence": { + "off": "Weg", + "on": "Huis" + }, + "battery": { + "off": "Normale", + "on": "Lae" + } + }, + "calendar": { + "off": "Af", + "on": "Op" + }, + "camera": { + "recording": "Opname", + "streaming": "Stroming", + "idle": "Ledig" + }, + "climate": { + "off": "Af", + "on": "Op", + "heat": "Hitte", + "cool": "Afkoel", + "idle": "Ledig", + "auto": "Outo", + "dry": "Droë", + "fan_only": "Slegs fan", + "eco": "Eko", + "electric": "Elektriese", + "performance": "Prestasie", + "high_demand": "Hoë aanvraag", + "heat_pump": "Hitte pomp", + "gas": "Gas" + }, + "configurator": { + "configure": "Konfigureer", + "configured": "Gekonfigureer" + }, + "cover": { + "open": "Oop", + "opening": "Opening", + "closed": "Gesluit", + "closing": "Sluit", + "stopped": "Gestop" + }, + "device_tracker": { + "home": "Huis", + "not_home": "Weg" + }, + "fan": { + "off": "Af", + "on": "Op" + }, + "group": { + "off": "Af", + "on": "Op", + "home": "Huis", + "not_home": "Weg", + "open": "Oop", + "opening": "Opening", + "closed": "Gesluit", + "closing": "Sluit", + "stopped": "Gestop", + "locked": "Gesluit", + "unlocked": "Ontsluit" + }, + "input_boolean": { + "off": "Af", + "on": "Op" + }, + "light": { + "off": "Af", + "on": "Op" + }, + "lock": { + "locked": "Gesluit", + "unlocked": "Ontsluit" + }, + "media_player": { + "off": "Af", + "on": "Op", + "playing": "Speel", + "paused": "Onderbreek", + "idle": "Ledig", + "standby": "Gereedheid" + }, + "remote": { + "off": "Af", + "on": "Op" + }, + "scene": { + "scening": "Scening" + }, + "script": { + "off": "Af", + "on": "Op" + }, + "sensor": { + "off": "Af", + "on": "Op" + }, + "sun": { + "above_horizon": "Bo horison", + "below_horizon": "Onder horison" + }, + "switch": { + "off": "Af", + "on": "Op" + }, + "zwave": { + "default": { + "initializing": "Inisialiseer", + "dead": "Dood", + "sleeping": "Slaap", + "ready": "Gereed" + }, + "query_stage": { + "initializing": "Inisialiseer ({query_stage})", + "dead": "Dood ({query_stage})" + } + } + }, + "state_badge": { + "default": { + "unknown": "Unk", + "unavailable": "Unavai" + }, + "alarm_control_panel": { + "armed": "Armed", + "disarmed": "Disarm", + "armed_home": "Armed", + "armed_away": "Armed", + "armed_night": "Armed", + "pending": "Pend", + "arming": "Arming", + "disarming": "Disarm", + "triggered": "Trig", + "armed_custom_bypass": "Armed" + }, + "device_tracker": { + "home": "Huis", + "not_home": "Weg" + } + }, + "ui": { + "panel": { + "shopping-list": { + "clear_completed": "Duidelik voltooide", + "add_item": "Voeg item" + } + }, + "sidebar": { + "log_out": "Teken", + "developer_tools": "Ontwikkelaar gereedskap" + } + } +} \ No newline at end of file diff --git a/translations/eu.json b/translations/eu.json new file mode 100644 index 0000000000..132f442750 --- /dev/null +++ b/translations/eu.json @@ -0,0 +1,11 @@ +{ + "panel": { + "config": "Konfigurazioa", + "states": "Orokorra", + "map": "Mapa", + "logbook": "Logbook", + "history": "Historia", + "mailbox": "Postontzia", + "shopping_list": "Erosketa zerrenda" + } +} \ No newline at end of file diff --git a/translations/he.json b/translations/he.json index d21ceabf9f..a5f52daa90 100644 --- a/translations/he.json +++ b/translations/he.json @@ -370,7 +370,7 @@ "description": "צור וערוך אוטומציות", "picker": { "header": "עורך אוטומציה", - "introduction": "עורך אוטומציה מאפשר לך ליצור ולערוך אוטומציות. אנא קרא את [ההוראות](https:\/\/home-assistant.io\/docs\/automation\/editor\/) כדי לוודא שהגדרת את ה - Home Assistant כהלכה.", + "introduction": "עורך אוטומציה מאפשר לך ליצור ולערוך אוטומציות. אנא עקוב אחר הקישור למטה וקרא את ההוראות כדי לוודא שהגדרת את ה - Home Assistant כהלכה.", "pick_automation": "בחר אוטומציה לעריכה", "no_automations": "לא הצלחנו למצוא שום אוטומציה הניתנת לעריכה", "add_automation": "הוסף אוטומציה", @@ -384,7 +384,7 @@ "alias": "שם", "triggers": { "header": "טריגרים", - "introduction": "טריגרים הם מה שמתחיל כל אוטומציה. ניתן לציין מספר טריגרים עבור אותו כלל. לאחר הפעלת טריגר, Home Assistant יאמת את התנאים, אם ישנם, ויפעיל את הפעולה. \n\n[למד עוד על טריגרים](https:\/\/home-assistant.io\/docs\/automation\/trigger\/)", + "introduction": "טריגרים הם מה שמתחיל כל אוטומציה. ניתן לציין מספר טריגרים עבור אותו כלל. לאחר הפעלת טריגר, Home Assistant יאמת את התנאים, אם ישנם, ויפעיל את הפעולה.", "add": "הוספת טריגר", "duplicate": "שכפל", "delete": "מחק", @@ -466,7 +466,7 @@ }, "conditions": { "header": "תנאים", - "introduction": "התנאים הם חלק אופציונלי של כלל אוטומציה, וניתן להשתמש בהם כדי למנוע פעולה כלשהי בעת הפעלתה. התנאים נראים דומים מאוד לטריגרים אך הם שונים מאוד. הטריגר יסתכל על האירועים המתרחשים במערכת בעוד תנאי רק מסתכל על איך המערכת נראית עכשיו. הטריגר יכול לדעת כשמתג נדלק. תנאי יכול לראות רק אם מתג מופעל או כבוי. \n\n[למידע נוסף על תנאים](Https:\/\/home-assistant.io\/docs\/scripts\/conditions\/)", + "introduction": "התנאים הם חלק אופציונלי של כלל אוטומציה, וניתן להשתמש בהם כדי למנוע פעולה כלשהי בעת הפעלתה. התנאים נראים דומים מאוד לטריגרים אך הם שונים מאוד. הטריגר יסתכל על האירועים המתרחשים במערכת בעוד תנאי רק מסתכל על איך המערכת נראית עכשיו. הטריגר יכול לדעת כשמתג נדלק. תנאי יכול לראות רק אם מתג מופעל או כבוי.", "add": "הוסף תנאי", "duplicate": "שכפל", "delete": "מחק", @@ -512,7 +512,7 @@ }, "actions": { "header": "פעולות", - "introduction": "הפעולות הן מה שHome Assistant יעשה כאשר אוטומציה מופעלת. \n\n[למידע נוסף על פעולות](https:\/\/home-assistant.io\/docs\/automation\/action\/)", + "introduction": "הפעולות הן מה שHome Assistant יעשה כאשר אוטומציה מופעלת.", "add": "הוסף פעולה", "duplicate": "שכפל", "delete": "מחק", From cd466df42c7c18e99876fc70ce68ae430bc720ec Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 13 Mar 2019 12:42:42 -0700 Subject: [PATCH 4/6] Show message when cert not ready --- src/panels/config/cloud/cloud-remote-pref.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/panels/config/cloud/cloud-remote-pref.ts b/src/panels/config/cloud/cloud-remote-pref.ts index c364af1dd5..ee79d3f7db 100644 --- a/src/panels/config/cloud/cloud-remote-pref.ts +++ b/src/panels/config/cloud/cloud-remote-pref.ts @@ -47,6 +47,16 @@ export class CloudRemotePref extends LitElement { remote_certificate, } = this.cloudStatus; + if (!remote_certificate) { + return html` + +
+ Remote access is being prepared. We will notify you when it's ready. +
+
+ `; + } + return html` Date: Wed, 13 Mar 2019 12:46:27 -0700 Subject: [PATCH 5/6] Update translations --- translations/ca.json | 26 +++++++++++++++++-------- translations/de.json | 18 +++++++++++++---- translations/el.json | 2 +- translations/en.json | 18 +++++++++++++---- translations/es.json | 18 +++++++++++++---- translations/lb.json | 18 +++++++++++++---- translations/nb.json | 18 +++++++++++++---- translations/pl.json | 46 +++++++++++++++++++++++++++----------------- 8 files changed, 117 insertions(+), 47 deletions(-) diff --git a/translations/ca.json b/translations/ca.json index e037ae14b2..fae67dbb72 100644 --- a/translations/ca.json +++ b/translations/ca.json @@ -133,8 +133,8 @@ "climate": { "off": "Apagat", "on": "Encès", - "heat": "Calent", - "cool": "Fred", + "heat": "Escalfar", + "cool": "Refredar", "idle": "Inactiu", "auto": "Automàtic", "dry": "Assecar", @@ -606,7 +606,8 @@ "caption": "ZHA", "description": "Gestiona la xarxa domòtica ZIgbee", "services": { - "reconfigure": "Reconfigura el dispositiu ZHA (dispositiu curatiu). Utilitza-ho si tens problemes amb el dispositiu. Si el dispositiu en qüestió està alimentat per bateria, assegura't que estigui despert i accepti ordres quan utilitzis aquest servei." + "reconfigure": "Reconfigura el dispositiu ZHA (dispositiu curatiu). Utilitza-ho si tens problemes amb el dispositiu. Si el dispositiu en qüestió està alimentat per bateria, assegura't que estigui despert i accepti ordres quan utilitzis aquest servei.", + "updateDeviceName": "Estableix un nom personalitzat pel dispositiu al registre de dispositius." } }, "area_registry": { @@ -616,9 +617,11 @@ "header": "Registre d'àrees", "introduction": "Les àrees s'utilitzen per organitzar la situació dels dispositius. Aquesta informació serà utilitzada per Home Assistant per ajudar-te a organitzar millor la teva interfície, els permisos i les integracions amb d'altres sistemes.", "introduction2": "Per col·locar dispositius en una àrea, utilitza l'enllaç de sota per anar a la pàgina d'integracions i, a continuació, fes clic a una integració configurada per accedir a les targetes del dispositiu.", - "integrations_page": "Pàgina d'integracions" + "integrations_page": "Pàgina d'integracions", + "no_areas": "Sembla que encara no tens cap àrea!", + "create_area": "CREAR ÀREA" }, - "no_areas": "Sembla que encara no tens cap àrea, encara.", + "no_areas": "Sembla que encara no tens cap àrea!.", "create_area": "CREA ÀREA", "editor": { "default_name": "Àrea nova", @@ -830,11 +833,13 @@ "data": { "name": "Nom", "username": "Nom d'usuari", - "password": "Contrasenya" + "password": "Contrasenya", + "password_confirm": "Confirma la contrasenya" }, "create_account": "Crear un compte", "error": { - "required_fields": "Omple tots els camps obligatoris" + "required_fields": "Omple tots els camps obligatoris", + "password_not_match": "Les contrasenyes no coincideixen" } } }, @@ -1008,7 +1013,7 @@ "operation": "Funcionament", "fan_mode": "Mode ventilació", "swing_mode": "Mode oscil·lació", - "away_mode": "Mode fora", + "away_mode": "Mode absent", "aux_heat": "Calefactor auxiliar" }, "lock": { @@ -1156,5 +1161,10 @@ "auto": "Automàtic" } } + }, + "groups": { + "system-admin": "Administradors", + "system-users": "Usuaris", + "system-read-only": "Usuaris de només lectura" } } \ No newline at end of file diff --git a/translations/de.json b/translations/de.json index 146b2cadf6..c94ae68c52 100644 --- a/translations/de.json +++ b/translations/de.json @@ -606,7 +606,8 @@ "caption": "ZHA", "description": "Zigbee Home Automation Netzwerkmanagement", "services": { - "reconfigure": "Rekonfiguriere ZHA-Gerät (Gerät heilen). Benutze dies, wenn du Probleme mit dem Gerät hast. Wenn es sich bei dem betroffenden Gerät um ein batteriebetriebenes Gerät handelt, stelle sicher dass es wach ist und Kommandos akzeptiert wenn du diesen Dienst benutzt." + "reconfigure": "Rekonfiguriere ZHA-Gerät (Gerät heilen). Benutze dies, wenn du Probleme mit dem Gerät hast. Wenn es sich bei dem betroffenden Gerät um ein batteriebetriebenes Gerät handelt, stelle sicher dass es wach ist und Kommandos akzeptiert wenn du diesen Dienst benutzt.", + "updateDeviceName": "Lege einen benutzerdefinierten Namen für dieses Gerät in der Geräteregistrierung fest." } }, "area_registry": { @@ -616,7 +617,9 @@ "header": "Bereichsregister", "introduction": "In Bereichen wird festgelegt, wo sich Geräte befinden. Diese Informationen werden in Home Assistant verwendet, um dich bei der Organisation deiner Benutzeroberfläche, Berechtigungen und Integrationen mit anderen Systemen zu unterstützen.", "introduction2": "Um Geräte in einem Bereich zu platzieren, navigieren Sie mit dem Link unten zur Integrationsseite und klicken Sie dann auf eine konfigurierte Integration, um zu den Gerätekarten zu gelangen.", - "integrations_page": "Integrationsseite" + "integrations_page": "Integrationsseite", + "no_areas": "Sieht aus, als hättest du noch keine Bereiche!", + "create_area": "BEREICH ERSTELLEN" }, "no_areas": "Sieht aus, als hättest du noch keine Bereiche!", "create_area": "BEREICH ERSTELLEN", @@ -830,11 +833,13 @@ "data": { "name": "Name", "username": "Benutzername", - "password": "Passwort" + "password": "Passwort", + "password_confirm": "Passwort bestätigen" }, "create_account": "Benutzerkonto anlegen", "error": { - "required_fields": "Fülle alle Pflichtfelder aus." + "required_fields": "Fülle alle Pflichtfelder aus.", + "password_not_match": "Passwörter stimmen nicht überein" } } }, @@ -1156,5 +1161,10 @@ "auto": "Auto" } } + }, + "groups": { + "system-admin": "Administratoren", + "system-users": "Benutzer", + "system-read-only": "Nur-Lesen Benutzer" } } \ No newline at end of file diff --git a/translations/el.json b/translations/el.json index 17e1362de9..fb93fff710 100644 --- a/translations/el.json +++ b/translations/el.json @@ -780,7 +780,7 @@ }, "abort": { "no_api_password_set": "Δεν έχετε διαμορφώσει έναν κωδικό πρόσβασης API.", - "login_expired": "Έληξε η περίοδος σύνδεσης, παρακαλώ ξανα συνδεθείτε." + "login_expired": "Έληξε η περίοδος σύνδεσης, παρακαλώ ξανά συνδεθείτε." } }, "trusted_networks": { diff --git a/translations/en.json b/translations/en.json index d8718e77a6..bdbd816093 100644 --- a/translations/en.json +++ b/translations/en.json @@ -606,7 +606,8 @@ "caption": "ZHA", "description": "Zigbee Home Automation network management", "services": { - "reconfigure": "Reconfigure ZHA device (heal device). Use this if you are having issues with the device. If the device in question is a battery powered device please ensure it is awake and accepting commands when you use this service." + "reconfigure": "Reconfigure ZHA device (heal device). Use this if you are having issues with the device. If the device in question is a battery powered device please ensure it is awake and accepting commands when you use this service.", + "updateDeviceName": "Set a custom name for this device in the device registry." } }, "area_registry": { @@ -616,7 +617,9 @@ "header": "Area Registry", "introduction": "Areas are used to organize where devices are. This information will be used throughout Home Assistant to help you in organizing your interface, permissions and integrations with other systems.", "introduction2": "To place devices in an area, use the link below to navigate to the integrations page and then click on a configured integration to get to the device cards.", - "integrations_page": "Integrations page" + "integrations_page": "Integrations page", + "no_areas": "Looks like you have no areas yet!", + "create_area": "CREATE AREA" }, "no_areas": "Looks like you have no areas yet!", "create_area": "CREATE AREA", @@ -830,11 +833,13 @@ "data": { "name": "Name", "username": "Username", - "password": "Password" + "password": "Password", + "password_confirm": "Confirm Password" }, "create_account": "Create Account", "error": { - "required_fields": "Fill in all required fields" + "required_fields": "Fill in all required fields", + "password_not_match": "Passwords don't match" } } }, @@ -1156,5 +1161,10 @@ "auto": "Auto" } } + }, + "groups": { + "system-admin": "Administrators", + "system-users": "Users", + "system-read-only": "Read-Only Users" } } \ No newline at end of file diff --git a/translations/es.json b/translations/es.json index e640d04063..571b44da4f 100644 --- a/translations/es.json +++ b/translations/es.json @@ -606,7 +606,8 @@ "caption": "ZHA", "description": "Gestión de red de Zigbee Home Automation", "services": { - "reconfigure": "Reconfigura el dispositivo ZHA (curar dispositivo). Usa esto si tienes problemas con el dispositivo. Si el dispositivo en cuestión es un dispositivo alimentado por batería, asegurate de que está activo y aceptando comandos cuando uses este servicio." + "reconfigure": "Reconfigura el dispositivo ZHA (curar dispositivo). Usa esto si tienes problemas con el dispositivo. Si el dispositivo en cuestión es un dispositivo alimentado por batería, asegurate de que está activo y aceptando comandos cuando uses este servicio.", + "updateDeviceName": "Establezca un nombre personalizado para este dispositivo en el registro de dispositivos." } }, "area_registry": { @@ -616,7 +617,9 @@ "header": "Registro de Área", "introduction": "Las áreas se utilizan para organizar dónde están los dispositivos. Esta información se utilizará en Home Assistant para ayudarle a organizar su interfaz, permisos e integraciones con otros sistemas.", "introduction2": "Para colocar dispositivos en un área, utilice el siguiente enlace para navegar a la página de integraciones y luego haga clic en una integración configurada para llegar a las tarjetas de dispositivos.", - "integrations_page": "Integraciones" + "integrations_page": "Integraciones", + "no_areas": "¡Parece que aún no tienes áreas!", + "create_area": "CREAR ÁREA" }, "no_areas": "¡Parece que no tienes áreas!", "create_area": "CREAR ÁREA", @@ -830,11 +833,13 @@ "data": { "name": "Nombre", "username": "Nombre de usuario", - "password": "Contraseña" + "password": "Contraseña", + "password_confirm": "Confirmar Contraseña" }, "create_account": "Crear una cuenta", "error": { - "required_fields": "Complete todos los campos requeridos" + "required_fields": "Complete todos los campos requeridos", + "password_not_match": "Las contraseñas no coinciden" } } }, @@ -1156,5 +1161,10 @@ "auto": "Automático" } } + }, + "groups": { + "system-admin": "Administradores", + "system-users": "Usuarios", + "system-read-only": "Usuarios de solo lectura" } } \ No newline at end of file diff --git a/translations/lb.json b/translations/lb.json index cb7ed9d726..c6c584c730 100644 --- a/translations/lb.json +++ b/translations/lb.json @@ -606,7 +606,8 @@ "caption": "ZHA", "description": "Gestioun vum Zigbee Home Automation Reseau", "services": { - "reconfigure": "ZHA Apparat rekonfiguréieren (Apparat heelen). Benotzt dëst am Fall vu Problemer mam Apparat. Falls den Apparat duerch eng Batterie gespeist gëtt stellt sécher dass en un ass a Befeeler entgéint kann huelen" + "reconfigure": "ZHA Apparat rekonfiguréieren (Apparat heelen). Benotzt dëst am Fall vu Problemer mam Apparat. Falls den Apparat duerch eng Batterie gespeist gëtt stellt sécher dass en un ass a Befeeler entgéint kann huelen", + "updateDeviceName": "Personaliséiert den Numm fir dësen Apparat an der Iwwersiicht vun den Apparaten." } }, "area_registry": { @@ -616,7 +617,9 @@ "header": "Lëscht vun de Beräicher", "introduction": "Beräicher gi benotzt fir d'Organisatioun vum Standuert vun den Apparater. Dës Informatioun gëtt vum Home Assistant benotzt fir iech ze hëllefe fir den Interface, Berechtegungen an Integratioune mat aner Systemer ze geréieren.", "introduction2": "Fir Apparater an e Beräich ze setzen, benotzt de Link ënne fir op d'Integratiouns Säit ze kommen a klickt do op eng konfiguréiert Integratioun fir d'Kaart vum Apparat unzeweisen.", - "integrations_page": "Integratiouns Säit" + "integrations_page": "Integratiouns Säit", + "no_areas": "Et sinn nach keng Beräicher do!", + "create_area": "Beräich erstellen" }, "no_areas": "Et sinn nach keng Beräicher do!", "create_area": "Beräich erstellen", @@ -830,11 +833,13 @@ "data": { "name": "Numm", "username": "Benotzernumm", - "password": "Passwuert" + "password": "Passwuert", + "password_confirm": "Passwuert bestätegen" }, "create_account": "Kont erstellen", "error": { - "required_fields": "Fëllt all néideg Felder aus" + "required_fields": "Fëllt all néideg Felder aus", + "password_not_match": "Passwierder stëmmen net iwwereneen" } } }, @@ -1156,5 +1161,10 @@ "auto": "Autmatesch" } } + }, + "groups": { + "system-admin": "Administrateuren", + "system-users": "Benotzer", + "system-read-only": "Benotzer mat nëmmen Lies Rechter" } } \ No newline at end of file diff --git a/translations/nb.json b/translations/nb.json index ffc77aed40..6a31ca5d9d 100644 --- a/translations/nb.json +++ b/translations/nb.json @@ -606,7 +606,8 @@ "caption": "ZHA", "description": "ZigBee Home Automation nettverksadministrasjon", "services": { - "reconfigure": "Rekonfigurer ZHA-enhet (heal enhet). Bruk dette hvis du har problemer med enheten. Hvis den aktuelle enheten er en batteridrevet enhet, sørg for at den er våken og aksepterer kommandoer når du bruker denne tjenesten." + "reconfigure": "Rekonfigurer ZHA-enhet (heal enhet). Bruk dette hvis du har problemer med enheten. Hvis den aktuelle enheten er en batteridrevet enhet, sørg for at den er våken og aksepterer kommandoer når du bruker denne tjenesten.", + "updateDeviceName": "Angi et egendefinert navn for denne enheten i enhetsregisteret." } }, "area_registry": { @@ -616,7 +617,9 @@ "header": "Områderegister", "introduction": "Områder brukes til å organisere hvor enheter er. Denne informasjonen vil bli brukt gjennomgående i Home Assistant for å hjelpe deg med å organisere grensesnittet, tillatelser og integrasjoner med andre systemer.", "introduction2": "For å plassere enheter i et område, bruk linken under for å navigere til integrasjonssiden og klikk deretter på en konfigurert integrasjon for å komme til enhetskortene.", - "integrations_page": "Integrasjonsside" + "integrations_page": "Integrasjonsside", + "no_areas": "Det ser ikke ut som om du har noen områder enda!", + "create_area": "Opprett område" }, "no_areas": "Det ser ikke ut som om du har noen områder ennå!", "create_area": "OPPRETT OMRÅDE", @@ -830,11 +833,13 @@ "data": { "name": "Navn", "username": "Brukernavn", - "password": "Passord" + "password": "Passord", + "password_confirm": "Bekreft passord" }, "create_account": "Opprett konto", "error": { - "required_fields": "Fyll ut alle nødvendige felt" + "required_fields": "Fyll ut alle nødvendige felt", + "password_not_match": "Passordene er ikke like" } } }, @@ -1156,5 +1161,10 @@ "auto": "Auto" } } + }, + "groups": { + "system-admin": "Administratorer", + "system-users": "Brukere", + "system-read-only": "Lesetilgang brukere" } } \ No newline at end of file diff --git a/translations/pl.json b/translations/pl.json index 3e05223644..45478e9696 100644 --- a/translations/pl.json +++ b/translations/pl.json @@ -384,7 +384,7 @@ "alias": "Nazwa", "triggers": { "header": "Wyzwalacze", - "introduction": "Wyzwalacze uruchamiają przetwarzanie reguły automatyzacji. Możliwe jest określenie wielu wyzwalaczy dla tej samej reguły. Po uruchomieniu wyzwalacza Home Assistant potwierdzi ewentualne warunki i wywoła akcję. \n\n[Dowiedz się więcej o wyzwalaczach.](Https:\/\/home-assistant.io\/docs\/automation\/trigger\/)", + "introduction": "Wyzwalacze uruchamiają przetwarzanie reguły automatyzacji. Możliwe jest stworzenie wielu wyzwalaczy dla tej samej reguły. Po uruchomieniu wyzwalacza Home Assistant sprawdzi ewentualne warunki i wywoła akcje.", "add": "Dodaj wyzwalacz", "duplicate": "Duplikuj", "delete": "Usuń", @@ -399,8 +399,8 @@ }, "state": { "label": "Stan", - "from": "Od", - "to": "Do", + "from": "Z", + "to": "Na", "for": "Przez" }, "homeassistant": { @@ -466,7 +466,7 @@ }, "conditions": { "header": "Warunki", - "introduction": "Warunki są opcjonalną częścią reguły automatyzacji i można ich użyć, aby zapobiec działaniom po uruchomieniu. Warunki wyglądają bardzo podobnie do wyzwalaczy, ale są bardzo różne. Wyzwalacz będzie analizował zdarzenia zachodzące w systemie, a warunek będzie dotyczył tylko tego, jak wygląda teraz system. Wyzwalacz może zaobserwować, że przełącznik jest włączony. Warunek może tylko sprawdzić, czy przełącznik jest aktualnie włączony lub wyłączony. \n\n[Dowiedz się więcej o warunkach.](Https:\/\/home-assistant.io\/docs\/scripts\/conditions\/)", + "introduction": "Warunki są opcjonalną częścią reguły automatyzacji i można ich użyć, aby zapobiec działaniom po uruchomieniu. Warunki wyglądają bardzo podobnie do wyzwalaczy, ale są bardzo różne. Wyzwalacz będzie analizował zdarzenia zachodzące w systemie, a warunek będzie dotyczył tylko tego, jak wygląda teraz system. Wyzwalacz może zaobserwować, że przełącznik jest przełączany. Warunek może tylko sprawdzić, czy przełącznik jest aktualnie włączony lub wyłączony. ", "add": "Dodaj warunek", "duplicate": "Duplikuj", "delete": "Usuń", @@ -512,7 +512,7 @@ }, "actions": { "header": "Akcje", - "introduction": "Akcje są wykonywane przez Home Assistant'a po uruchomieniu automatyki. \n\n[Dowiedz się więcej o akcjach.](Https:\/\/home-assistant.io\/docs\/automation\/action\/)", + "introduction": "Akcje są wykonywane przez Home Assistant'a po uruchomieniu reguły automatyzacji.", "add": "Dodaj akcję", "duplicate": "Duplikuj", "delete": "Usuń", @@ -599,29 +599,32 @@ "firmware": "Oprogramowanie: {version}", "device_unavailable": "urządzenie niedostępne", "entity_unavailable": "encja niedostępna", - "no_area": "Brak lokalizacji" + "no_area": "Brak obszaru" } }, "zha": { "caption": "ZHA", "description": "Zarządzanie siecią automatyki domowej ZigBee", "services": { - "reconfigure": "Ponowna konfiguracja urządzenia ZHA (uzdrawianie urządzenia). Użyj tej usługi, jeśli masz problemy z urządzeniem. Jeśli urządzenie jest zasilane bateryjnie, upewnij się, że nie jest uśpione i przyjmie polecenie rekonfiguracji." + "reconfigure": "Ponowna konfiguracja urządzenia ZHA (uzdrawianie urządzenia). Użyj tej usługi, jeśli masz problemy z urządzeniem. Jeśli urządzenie jest zasilane bateryjnie, upewnij się, że nie jest uśpione i przyjmie polecenie rekonfiguracji.", + "updateDeviceName": "Ustaw niestandardową nazwę tego urządzenia w rejestrze urządzeń." } }, "area_registry": { - "caption": "Rejestr lokalizacji", - "description": "Przegląd wszystkich lokalizacji w twoim domu.", + "caption": "Rejestr obszarów", + "description": "Przegląd wszystkich obszarów w twoim domu.", "picker": { - "header": "Rejestr lokalizacji", + "header": "Rejestr obszarów", "introduction": "Obszary służą do organizacji urządzeń. Informacje te będą używane w Home Assistant, aby pomóc w organizacji interfejsu, uprawnień i integracji z innymi systemami.", - "introduction2": "Aby umieścić urządzenia w danym obszarze, użyj poniższego linku, aby przejść do strony integracji, a następnie kliknij na skonfigurowaną integrację, aby dostać się do kart urządzeń.", - "integrations_page": "Strona integracji" + "introduction2": "Aby umieścić urządzenia w danym obszarze, użyj poniższego linku, aby przejść do strony integracji, a następnie kliknij skonfigurowaną integrację, aby dostać się do kart urządzeń.", + "integrations_page": "Strona integracji", + "no_areas": "Wygląda na to, że nie masz jeszcze lokalizacji!", + "create_area": "UTWÓRZ OBSZAR" }, - "no_areas": "Wygląda na to, że jeszcze nie masz zdefiniowanych lokalizacji!", - "create_area": "STWÓRZ LOKALIZACJĘ", + "no_areas": "Wygląda na to, że jeszcze nie masz zdefiniowanych obszarów!", + "create_area": "STWÓRZ OBSZAR", "editor": { - "default_name": "Nowa lokalizacja", + "default_name": "Nowy obszar", "delete": "USUŃ", "update": "UAKTUALNIJ", "create": "STWÓRZ" @@ -639,7 +642,7 @@ }, "editor": { "unavailable": "Ta encja nie jest obecnie dostępna.", - "default_name": "Nowa lokalizacja", + "default_name": "Nowy obszar", "delete": "USUŃ", "update": "UAKTUALNIJ" } @@ -830,11 +833,13 @@ "data": { "name": "Imię", "username": "Nazwa użytkownika", - "password": "Hasło" + "password": "Hasło", + "password_confirm": "Potwierdź hasło" }, "create_account": "Utwórz konto", "error": { - "required_fields": "Wypełnij wszystkie wymagane pola" + "required_fields": "Wypełnij wszystkie wymagane pola", + "password_not_match": "Hasła nie są takie same" } } }, @@ -1156,5 +1161,10 @@ "auto": "Auto" } } + }, + "groups": { + "system-admin": "Administratorzy", + "system-users": "Użytkownicy", + "system-read-only": "Użytkownicy (tylko odczyt)" } } \ No newline at end of file From 1451a78dd36a20dac90722ee0512f60a6c503442 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 13 Mar 2019 12:46:32 -0700 Subject: [PATCH 6/6] Bumped version to 20190313.0 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 206985f0f5..92bfb26266 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name="home-assistant-frontend", - version="20190312.0", + version="20190313.0", description="The Home Assistant frontend", url="https://github.com/home-assistant/home-assistant-polymer", author="The Home Assistant Authors",