Dashboard Studio 2.2.0: guest invites, personal looks, more themes, Haven widgets and tiles

- Vacuum card: the robot drawn beside its dock by state, last clean, maintenance
- Formula One card: the official F1 look with a user-supplied logo
- Nine more themes; per-person theme, text size and language on Admin, People
- Guest invites: an expiring link and QR code for one dashboard, served on a
  LAN-only guest port, with the Home Assistant connection filtered both ways
- Haven 2.2: home screen widgets, three quick settings tiles, several homes,
  and self-updates from the Haven that Dashboard Studio serves

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-27 00:31:50 +01:00
parent f4c98e27af
commit a5823b4726
26 changed files with 1514 additions and 164 deletions
+52
View File
@@ -723,6 +723,56 @@
"Energy now": "Energie nu",
"No power is flowing right now.": "Er stroomt nu geen vermogen.",
"Battery {0}%, charging": "Batterij {0}%, laadt",
"This invite ends {0}.": "Deze uitnodiging eindigt {0}.",
"Guests": "Gasten",
"Ended {0}": "Afgelopen {0}",
"Until {0}": "Tot {0}",
"QR code": "QR-code",
"End": "Beëindigen",
"An invite opens one dashboard on a guest’s phone, without a Home Assistant login, until the time you choose. Guests can only see and control what is on that dashboard, and only on your home Wi-Fi.": "Een uitnodiging opent één dashboard op de telefoon van een gast, zonder Home Assistant-account, tot het moment dat je kiest. Gasten zien en bedienen alleen wat op dat dashboard staat, en alleen via je wifi thuis.",
"Turn on guest links first": "Zet eerst gastlinks aan",
"In Home Assistant, open Settings, Apps, Dashboard Studio, Configuration. Under Network, give “Guest invite links” a port, for example 8199, and save. Then come back here.": "Open in Home Assistant Instellingen, Apps, Dashboard Studio, Configuratie. Geef onder Netwerk “Guest invite links” een poort, bijvoorbeeld 8199, en sla op. Kom daarna hier terug.",
"New invite": "Nieuwe uitnodiging",
"For": "Voor",
"e.g. Babysitter, Grandma and Grandpa": "bijv. Oppas, Opa en oma",
"Works until": "Werkt tot",
"4 hours from now": "Over 4 uur",
"Tonight, 23:59": "Vanavond, 23:59",
"24 hours from now": "Over 24 uur",
"After the weekend (Monday 10:00)": "Na het weekend (maandag 10:00)",
"A week from now": "Over een week",
"Make invite": "Uitnodiging maken",
"Address for the link": "Adres voor de link",
"The address of Home Assistant on your home network, such as homeassistant.local or 192.168.1.20.": "Het adres van Home Assistant in je thuisnetwerk, zoals homeassistant.local of 192.168.1.20.",
"QR code for the invite": "QR-code voor de uitnodiging",
"No invites yet.": "Nog geen uitnodigingen.",
"Couldn’t make the invite: {0}": "Uitnodiging maken lukte niet: {0}",
"End this invite?": "Deze uitnodiging beëindigen?",
"The link stops working at once, also on phones that have it open.": "De link werkt direct niet meer, ook op telefoons waar hij open staat.",
"The dashboard’s theme": "Thema van het dashboard",
"Normal": "Normaal",
"Large": "Groot",
"Extra large": "Extra groot",
"English": "English",
"Nederlands": "Nederlands",
"Cleaned": "Schoongemaakt",
"Time": "Tijd",
"Last clean": "Laatste schoonmaak",
"days": "dagen",
"hrs": "uur",
"mins": "min",
"Round {0} · {1}": "Ronde {0} · {1}",
"Look": "Uiterlijk",
"Official": "Officieel",
"Logo image (put the official logo in Home Assistant's www folder)": "Logo-afbeelding (zet het officiële logo in de www-map van Home Assistant)",
"Midnight": "Middernacht",
"Espresso": "Espresso",
"Ember": "Gloed",
"Lagoon": "Lagune",
"Arctic": "Arctisch",
"Moss": "Mos",
"Sakura": "Sakura",
"Concrete": "Beton",
"Today": "Vandaag", "Tomorrow": "Morgen", "All day": "Hele dag", "Busy": "Bezet",
};
@@ -745,6 +795,8 @@
function detect() {
const pref = read("ds.lang");
if (pref && pref !== "auto") return pref;
const person = read("ds.personLang"); // chosen for this person by an admin
if (person) return person;
let ha = read("selectedLanguage"); // Home Assistant stores it as a JSON string
try { ha = ha && JSON.parse(ha); } catch { /* plain string */ }
return String(ha || navigator.language || "en").toLowerCase().startsWith("nl") ? "nl" : "en";