mirror of
https://github.com/Matysh/houseplan-card
synced 2026-07-31 08:28:31 +00:00
- kiosk: true — header hidden, editors hard-blocked, full-height stage; full View interactivity preserved (live states, glow, taps, locks) - swipe between spaces at 1:1 (swipeTarget pure helper, wrap + dots indicator), pan wins while zoomed, double tap resets zoom - cycle: N auto-carousel with 60 s pause after any touch (TV/burn-in) - per-SCREEN size multipliers (icons x0.5-3, room-card font) in localStorage via a 3 s long-press popover; clampScale helper - GUI editor fields, README wall-tablet recipe, +2 unit tests (111), smoke_kiosk.mjs (12 checks); TESTING/CHANGELOG same-commit
312 lines
14 KiB
JSON
312 lines
14 KiB
JSON
{
|
||
"card.title": "House plan",
|
||
"count.devices": "{n} dev.",
|
||
"empty.no_spaces": "No spaces yet.",
|
||
"empty.add_first": "Add the first space and upload a floor plan.",
|
||
"empty.install": "Install the House Plan integration and add it in \"Devices & services\".",
|
||
"btn.add_space": "Add space",
|
||
"btn.cancel": "Cancel",
|
||
"btn.save": "Save",
|
||
"btn.close": "Close",
|
||
"btn.delete": "Delete",
|
||
"btn.remove": "Remove",
|
||
"btn.edit": "Edit",
|
||
"btn.open_in_ha": "Open in HA",
|
||
"btn.reset": "Reset",
|
||
"btn.attach": "Attach…",
|
||
"btn.upload": "Upload…",
|
||
"btn.replace": "Replace…",
|
||
"btn.no_area": "No area",
|
||
"title.zoom_in": "Zoom in",
|
||
"title.zoom_out": "Zoom out",
|
||
"title.zoom_reset": "Reset zoom",
|
||
"title.add_device": "Add a device to the plan",
|
||
"title.show_all": "Show all area devices (no curation)",
|
||
"title.markup": "Room markup: grid, lines, outlines",
|
||
"title.configure_space": "Configure space",
|
||
"title.add_space": "Add space",
|
||
"title.markup_add": "Add a room: connect grid dots with lines until the outline closes",
|
||
"title.markup_merge": "Merge rooms: click one room, then the neighbour it shares a wall with",
|
||
"title.markup_split": "Split a room: click the room, then two points on its walls",
|
||
"title.markup_delroom": "Delete a room: click inside the room",
|
||
"title.no_area_room": "Decorative room without an HA area (e.g. a hallway)",
|
||
"title.choose_area": "Select a Home Assistant area",
|
||
"title.need_plan": "Upload a floor-plan image",
|
||
"markup.add": "Add",
|
||
"markup.merge": "Merge",
|
||
"markup.split": "Split",
|
||
"markup.opening": "Opening",
|
||
"title.markup_opening": "Doors & windows: click a wall to place, click an opening to edit",
|
||
"opening.new": "New opening",
|
||
"opening.edit": "Door / window",
|
||
"opening.door": "Door",
|
||
"opening.window": "Window",
|
||
"opening.type_label": "Type",
|
||
"opening.length_label": "Length, cm",
|
||
"opening.contact_label": "Open/close sensor",
|
||
"opening.lock_label": "Lock",
|
||
"opening.none": "— none —",
|
||
"opening.invert": "Invert open/closed",
|
||
"opening.flip_h": "Hinge on the other jamb",
|
||
"opening.flip_v": "Opens to the other side",
|
||
"opening.open": "Open",
|
||
"opening.closed": "Closed",
|
||
"opening.locked": "Locked",
|
||
"opening.unlocked": "Unlocked",
|
||
"opening.state_unknown": "unavailable",
|
||
"opening.no_entities": "No sensors bound — a static symbol on the plan.",
|
||
"toast.opening_no_wall": "Click next to a room wall — openings sit on walls",
|
||
"markup.delete": "Delete",
|
||
"markup.hint_points": "points: {n} · Esc/Ctrl+Z — undo a dot · close the outline by clicking the first one",
|
||
"markup.hint_start": "click a grid dot to start the outline",
|
||
"tip.room": "room — open the area",
|
||
"tip.lqi": "average zigbee signal:",
|
||
"info.device_header": "Device on the plan",
|
||
"info.model": "Model",
|
||
"info.state": "State",
|
||
"info.link": "Link",
|
||
"info.manuals": "Manuals",
|
||
"info.none": "No additional information",
|
||
"marker.new_device": "New device",
|
||
"marker.name_label": "Name (shown on the plan)",
|
||
"marker.name_ph": "Name",
|
||
"marker.binding_label": "Bind to an HA device",
|
||
"marker.virtual_option": "Virtual device (no binding)",
|
||
"marker.search_ph": "Search device / group…",
|
||
"marker.nothing_found": "nothing found",
|
||
"marker.room_label": "Room",
|
||
"marker.room_override": " (override placement)",
|
||
"marker.room_choose": "— select a room —",
|
||
"marker.room_auto": "— by device area (auto) —",
|
||
"marker.icon_label": "Icon",
|
||
"marker.icon_ph": "mdi:… (empty = auto)",
|
||
"marker.display_label": "Display",
|
||
"display.badge": "Icon badge",
|
||
"display.ripple": "Ripple only",
|
||
"display.icon_ripple": "Icon + ripple",
|
||
"marker.ripple_size": "Ripple size",
|
||
"marker.size_label": "Icon size / rotation",
|
||
"marker.angle_label": "Rotate",
|
||
"marker.model_label": "Model",
|
||
"marker.model_ph": "e.g. Aqara T&H",
|
||
"marker.link_label": "Link",
|
||
"marker.desc_label": "Description",
|
||
"marker.desc_ph": "Notes, specs…",
|
||
"marker.manuals_label": "Manuals (PDF etc.)",
|
||
"marker.sub_device": "device",
|
||
"marker.sub_z2m_group": " · Z2M group",
|
||
"marker.sub_group": "group",
|
||
"marker.sub_helper": "helper",
|
||
"space.new": "New space",
|
||
"space.header": "Space",
|
||
"space.title_label": "Title",
|
||
"space.title_ph": "e.g. Garage",
|
||
"space.plan_label": "Floor plan (background)",
|
||
"space.no_plan": "no plan image",
|
||
"space.plan_alt": "plan",
|
||
"room.new": "New room",
|
||
"room.name_label": "Display name",
|
||
"room.name_ph": "e.g. Terrace",
|
||
"room.area_label": "Home Assistant area (unassigned)",
|
||
"room.no_area_option": "— no area —",
|
||
"room.default_name": "Room",
|
||
"device.unnamed": "unnamed",
|
||
"device.light_group": "light group",
|
||
"device.fallback": "device",
|
||
"device.virtual": "virtual device",
|
||
"confirm.delete_room": "Delete room \"{name}\"?",
|
||
"confirm.remove_marker": "Remove \"{name}\" from the plan?",
|
||
"confirm.delete_space": "Delete space \"{title}\" with all its rooms and markup?",
|
||
"toast.pos_save_failed": "Failed to save position: {err}",
|
||
"toast.no_entity": "The device has no suitable entity",
|
||
"toast.markup_needs_server": "Markup is available after the config is moved to the server",
|
||
"toast.conflict": "Config was changed in another window — data refreshed, repeat your last action",
|
||
"toast.cfg_save_failed": "Failed to save config: {err}",
|
||
"toast.room_overlap": "The outline overlaps room “{name}” — rooms must not overlap",
|
||
"toast.merge_not_adjacent": "Only rooms that share a wall can be merged",
|
||
"toast.rooms_merged": "Rooms merged into “{name}”",
|
||
"toast.split_pick_wall": "Start the cut on the room’s wall",
|
||
"toast.split_bad_cut": "The cut must run wall to wall inside the room, without crossing walls or itself",
|
||
"merge.header": "Merge rooms",
|
||
"merge.hint": "The merged room keeps one name and one area. The other area is released — its devices leave the plan until another room claims it.",
|
||
"merge.keep": "Keep",
|
||
"merge.no_area": "no area",
|
||
"room.split_header": "New room from the split",
|
||
"toast.room_saved": "Room saved ({n}). Devices added: {added}. Outline the next one or exit markup.",
|
||
"toast.room_saved_no_area": "Room saved ({n}, no area). Outline the next one or exit markup.",
|
||
"toast.marker_needs_server": "Device editing is available after the config is moved to the server",
|
||
"toast.virtual_name_required": "Enter a name for the virtual device",
|
||
"toast.marker_saved": "Device saved",
|
||
"toast.marker_removed": "Device removed from the plan",
|
||
"toast.integration_missing": "The House Plan integration is not installed — management unavailable",
|
||
"toast.plan_formats": "Supported formats: SVG, PNG, JPG, WebP",
|
||
"toast.plan_required": "Upload a floor plan — it is required",
|
||
"toast.space_added_onboard": "Space added. Outline the rooms: click grid dots and close the contour.",
|
||
"toast.space_added": "Space added",
|
||
"toast.space_saved": "Space saved",
|
||
"toast.space_deleted": "Space deleted",
|
||
"toast.delete_failed": "Delete failed: {err}",
|
||
"toast.error": "Error: {err}",
|
||
"toast.file_failed": "File \"{name}\" was not uploaded: {err}",
|
||
"toast.files_attached": "Files attached: {n}",
|
||
"err.unknown": "unknown error",
|
||
"err.code": "code {code}",
|
||
"err.too_large": "file larger than {mb} MB",
|
||
"err.bad_ext": "unsupported type (PDF/image expected)",
|
||
"err.unauthorized": "administrator rights required",
|
||
"editor.title": "Title",
|
||
"editor.default_floor": "Default space",
|
||
"editor.icon_size": "Icon size, % of plan width",
|
||
"editor.show_temperature": "Show temperature",
|
||
"editor.live_states": "Live states (on/off, open…)",
|
||
"editor.show_signal": "Show zigbee signal (LQI)",
|
||
"editor.language": "Interface language",
|
||
"editor.lang_auto": "Auto (HA profile)",
|
||
"editor.lang_en": "English",
|
||
"editor.lang_ru": "Русский",
|
||
"title.icon_rules": "Icon rules: which MDI icon devices get by name",
|
||
"rules.title": "Icon rules",
|
||
"rules.hint": "Rules are checked top-down against “device name + model” (case-insensitive regex); the first match wins. When nothing matches, the entity device class decides, then the generic chip icon.",
|
||
"rules.pattern_ph": "regex, e.g. plug|socket",
|
||
"rules.icon_ph": "mdi:power-socket-de",
|
||
"rules.add": "Add rule",
|
||
"rules.reset": "Reset to defaults",
|
||
"rules.test_ph": "Try a device name…",
|
||
"rules.invalid": "invalid regex",
|
||
"rules.saved": "Icon rules saved",
|
||
"btn.up": "Up",
|
||
"btn.down": "Down",
|
||
"tap.info": "Device card",
|
||
"tap.more_info": "HA more-info dialog",
|
||
"tap.toggle": "Toggle (lights/switches)",
|
||
"marker.tap_label": "Tap action for this device",
|
||
"tap.toggle_note": "Toggle never applies to locks and alarms; hold the icon to open the info card.",
|
||
"import.title": "Create spaces from HA floors",
|
||
"import.hint": "Your Home Assistant already knows these floors. Pick the ones to turn into plan spaces — you will upload a floor-plan image for each one next. Rooms are then outlined by hand on the plan.",
|
||
"import.start": "Create {n} space(s)",
|
||
"import.manual": "Start from scratch",
|
||
"import.progress": "Floor {i} of {n}",
|
||
"import.done": "Spaces created. Outline the rooms: click grid dots and close the contour.",
|
||
"btn.skip": "Skip",
|
||
"space.scale_label": "Scale (grid cell size)",
|
||
"space.scale_unit": "cm per cell",
|
||
"space.display_section": "Display",
|
||
"space.show_borders": "Always show room borders",
|
||
"space.show_names": "Show room names (drag to move)",
|
||
"space.room_color": "Border & name color",
|
||
"space.opacity": "Opacity",
|
||
"space.fill_label": "Room fill",
|
||
"fill.none": "None",
|
||
"fill.lqi": "Zigbee signal",
|
||
"fill.light": "Lights",
|
||
"space.source_file": "I have a floor-plan image",
|
||
"space.source_draw": "No image — I'll outline rooms by hand",
|
||
"space.orientation": "Canvas",
|
||
"orient.landscape": "Landscape",
|
||
"orient.portrait": "Portrait",
|
||
"orient.square": "Square",
|
||
"fill.temp": "Temperature",
|
||
"space.temp_min": "Comfort from",
|
||
"space.temp_max": "to",
|
||
"tip.temp_avg": "average temperature:",
|
||
"space_card.button": "Open the space plan",
|
||
"space_card.not_found": "Space “{id}” not found",
|
||
"space_card.loading": "Loading…",
|
||
"editor.space": "Space",
|
||
"editor.show_button": "Show button",
|
||
"editor.button_label": "Button label",
|
||
"editor.button_target": "Target dashboard path",
|
||
"editor.aspect_ratio": "Aspect ratio (e.g. 16:9 or auto)",
|
||
"marker.sub_entity": "entity",
|
||
"title.general_settings": "General settings",
|
||
"gs.title": "General settings",
|
||
"gs.hint": "Fill colors apply to every space; each color has its own opacity. Which fill mode a space uses is set in that space's dialog.",
|
||
"gs.light_group": "Fill: lights",
|
||
"gs.light_on": "Lights on",
|
||
"gs.light_off": "All lights off",
|
||
"gs.temp_group": "Fill: temperature",
|
||
"gs.temp_cold": "Cold",
|
||
"gs.temp_ok": "Comfortable",
|
||
"gs.temp_hot": "Hot",
|
||
"gs.lqi_group": "Fill: zigbee signal",
|
||
"gs.lqi_low": "Weak signal",
|
||
"gs.lqi_high": "Strong signal",
|
||
"gs.reset": "Reset to defaults",
|
||
"gs.saved": "General settings saved",
|
||
"space.show_lqi": "Show zigbee signal (LQI) next to devices",
|
||
"gs.light_none": "No light sources",
|
||
"mode.plan": "Plan editor",
|
||
"mode.devices": "Device editor",
|
||
"display.value": "Value instead of an icon",
|
||
"marker.subarea": "no area, manual",
|
||
"device.new": "New device — open its editor to dismiss",
|
||
"opening.unlock_action": "Unlock",
|
||
"opening.lock_action": "Lock",
|
||
"opening.lock_pending": "Working…",
|
||
"title.close_editor": "Close editor (back to view)",
|
||
"devbar.add": "Add",
|
||
"devbar.show_all": "Show all",
|
||
"devbar.rules": "Icon rules",
|
||
"space.roomcard_section": "Room card shows:",
|
||
"space.label_temp": "Temperature",
|
||
"space.label_hum": "Humidity",
|
||
"space.label_lqi": "Average Zigbee signal",
|
||
"space.label_light": "Lights on/off",
|
||
"roomcard.light_on": "On",
|
||
"roomcard.light_off": "Off",
|
||
"roomcard.light_partial": "{on} of {total}",
|
||
"toast.split_pick_inside": "Intermediate cut points must be inside the room",
|
||
"mode.decor": "Background editor",
|
||
"decor.select": "Select",
|
||
"decor.line": "Line",
|
||
"decor.rect": "Rectangle",
|
||
"decor.ellipse": "Oval",
|
||
"decor.text": "Text",
|
||
"decor.erase": "Erase",
|
||
"decor.color": "Color",
|
||
"decor.width": "Line width",
|
||
"decor.w_thin": "Thin",
|
||
"decor.w_mid": "Medium",
|
||
"decor.w_thick": "Thick",
|
||
"decor.fill": "Fill",
|
||
"decor.text_title": "Text label",
|
||
"decor.text_label": "Text",
|
||
"decor.text_size": "Size",
|
||
"decor.size_s": "Small",
|
||
"decor.size_m": "Medium",
|
||
"decor.size_l": "Large",
|
||
"marker.icon_auto": "Auto: {icon} (by icon rules; pick one to override)",
|
||
"mode.plan_tip": "Plan editor — the geometry of the home: draw and split/merge rooms, bind them to HA areas, place doors and windows, move room cards, set the scale",
|
||
"mode.devices_tip": "Device editor — everything about icons: drag to position, click to edit binding/icon/display, add virtual devices, icon rules",
|
||
"mode.decor_tip": "Background editor — purely visual decor under the plan: lines, rectangles, ovals and text labels that never react to clicks",
|
||
"fill.glow": "Light sources (dark house, glowing lamps)",
|
||
"gs.glow_group": "Light-sources fill",
|
||
"gs.glow_base": "House darkness",
|
||
"gs.glow_light": "Default light color / intensity",
|
||
"gs.glow_radius": "Glow radius",
|
||
"gs.unit_m": "m",
|
||
"gs.unit_ft": "ft",
|
||
"marker.controls_label": "Controls light sources",
|
||
"marker.controls_hint": "With tap action “Toggle”, a click flips all bound lights at once (any on → all off). The icon mirrors their state.",
|
||
"marker.controls_filter": "Search lights and switches…",
|
||
"info.controls": "Controls",
|
||
"marker.glow_radius_label": "Glow radius (light-sources fill)",
|
||
"marker.glow_radius_hint": "empty = default from general settings",
|
||
"markup.openwall": "Open boundary",
|
||
"title.markup_openwall": "Open boundary — click a wall shared by two rooms to make it virtual: light flows through, the line turns dashed. Click again to close it.",
|
||
"toast.openwall_pick": "Click a wall shared by two rooms",
|
||
"toast.openwall_opened": "Boundary “{a}” ↔ “{b}” is now open",
|
||
"toast.openwall_closed": "Boundary “{a}” ↔ “{b}” is closed again",
|
||
"marker.from_ha_option": "Pick from the HA list",
|
||
"marker.show_entities": "Show entities",
|
||
"marker.show_entities_tip": "Adds not only devices to the list, but all their entities too",
|
||
"marker.pick_ph": "Choose a device…",
|
||
"room.open_area": "Open the HA area",
|
||
"kiosk.title": "This screen's sizes",
|
||
"kiosk.hint": "Stored on this device only — every wall tablet or TV can have its own comfortable sizes.",
|
||
"kiosk.icon_scale": "Device icon size",
|
||
"kiosk.font_scale": "Room card text size",
|
||
"editor.kiosk": "Wall device (kiosk) mode",
|
||
"editor.cycle": "Auto-switch spaces every N seconds (kiosk, 0 = off)"
|
||
}
|