mirror of
https://github.com/Matysh/houseplan-card
synced 2026-10-03 05:08:53 +00:00
1013 lines
61 KiB
JSON
1013 lines
61 KiB
JSON
{
|
||
"editor.context_actions": "Actions: {object}",
|
||
"editor.tool_options": "Tool options: {tool}",
|
||
"editor.palette": "Palette: {tool}",
|
||
"editor.open_group": "Tool group: {group}",
|
||
"editor.group_active": "{group} — active: {item}",
|
||
"editor.disabled_action": "{action} is unavailable: {reason}",
|
||
"color_picker.title": "Color picker",
|
||
"color_picker.hue": "Hue",
|
||
"color_picker.saturation": "Saturation",
|
||
"color_picker.value": "Brightness",
|
||
"color_picker.hex": "Hex color",
|
||
"color_picker.invalid_hex": "Enter a 3- or 6-digit hex color",
|
||
"btn.properties": "Properties",
|
||
"btn.keep_as_walls": "Keep as walls",
|
||
"btn.delete_room_keep_walls": "Delete room, keep walls",
|
||
"btn.delete_room_with_walls": "Delete room and walls",
|
||
"title.markup_select": "Select and edit walls, columns and saved outlines",
|
||
"title.markup_column": "Column: click a grid point to place a square column",
|
||
"markup.partition": "Partition",
|
||
"markup.column": "Column",
|
||
"markup.hint_column": "click a grid point to place a square column",
|
||
"history.draft_segment": "Add room-draft segment",
|
||
"history.draft_merge": "Join unfinished room outlines",
|
||
"history.draft_segment_delete": "Remove room-draft segment",
|
||
"history.partition_add": "Add partition",
|
||
"history.column_add": "Add column",
|
||
"history.physical_edit": "Change physical object",
|
||
"history.physical_delete": "Delete physical object",
|
||
"history.physical_move": "Move physical object",
|
||
"history.contour_to_partitions": "Convert contour to closed walls",
|
||
"history.wall_chain_finish": "Finish wall chain",
|
||
"history.wall_face_batch": "Create rooms from walls",
|
||
"toast.column_duplicate": "A column with the same centre and outer size already exists",
|
||
"confirm.delete_draft": "Delete the whole unfinished room contour?",
|
||
"confirm.delete_draft_segment": "Delete this draft segment? The remaining contour may split in two.",
|
||
"physical.partition_properties": "Partition properties",
|
||
"physical.column_properties": "Column properties",
|
||
"physical.draft_properties": "Draft segment properties",
|
||
"physical.shape": "Shape",
|
||
"physical.square": "Square",
|
||
"physical.circle": "Circle",
|
||
"physical.diameter": "Diameter",
|
||
"physical.side": "Side",
|
||
"physical.rotation": "Rotation angle",
|
||
"physical.length": "Length",
|
||
"physical.allowed_range": "Allowed: 1–{max} {unit}",
|
||
"physical.delete_segment": "Delete segment",
|
||
"physical.delete_draft": "Delete entire outline",
|
||
"physical.column_size_title": "Outer side of the square column placed by the click (1–150 cm).",
|
||
"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.edit": "Edit",
|
||
"btn.open_in_ha": "Open in HA",
|
||
"btn.reset": "Reset",
|
||
"btn.attach": "Attach…",
|
||
"btn.upload": "Upload…",
|
||
"btn.replace": "Replace…",
|
||
"title.zoom_in": "Zoom in",
|
||
"title.zoom_out": "Zoom out",
|
||
"title.zoom_fit": "Fit all",
|
||
"title.add_device": "Add a device to the plan",
|
||
"title.show_all": "Show hidden and disabled devices as service markers (this tab only)",
|
||
"title.markup": "Room markup: grid, lines, outlines",
|
||
"title.configure_space": "Configure space",
|
||
"title.add_space": "Add space",
|
||
"title.markup_add": "Walls: draw a continuous chain; Shift locks to 45°. Changing tool or leaving the editor finishes it as independent walls",
|
||
"title.markup_merge": "Merge: 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 room: click inside a room and confirm",
|
||
"title.markup_boundary": "Boundary: click two points on a solid shared wall to make that stretch virtual; click a dashed stretch to restore it",
|
||
"title.need_plan": "Upload a floor-plan image",
|
||
"markup.add": "Walls",
|
||
"markup.merge": "Merge",
|
||
"markup.split": "Split",
|
||
"markup.resize": "Resize",
|
||
"title.markup_resize": "Resize rooms: drag an available horizontal or vertical wall handle",
|
||
"markup.hint_resize": "drag an available wall handle · the wall stops at the first unsafe position · Esc cancels · Ctrl+Z — undo",
|
||
"resize.disabled.diagonal": "This wall is angled; Resize supports only horizontal and vertical walls",
|
||
"resize.disabled.side-angle": "This wall does not have two perpendicular side walls",
|
||
"resize.disabled.duplicate-physical-wall": "An independent wall, unfinished outline, or column overlaps this wall",
|
||
"resize.disabled.partial-shared": "Only part of a shared wall cannot be moved",
|
||
"resize.disabled.unequal-shared": "The neighbouring room has a different wall length or endpoints",
|
||
"resize.disabled.multiple-rooms": "Moving this wall would affect more than two rooms",
|
||
"resize.disabled.thickness-conflict": "The wall thickness cannot be preserved safely",
|
||
"resize.disabled.opening-conflict": "An opening on this wall cannot be moved safely",
|
||
"resize.disabled.invalid-geometry": "This wall cannot be resized without changing the plan structure",
|
||
"resize.commit_failed": "Resize was cancelled because the final plan did not pass the geometry check",
|
||
"markup.opening": "Opening",
|
||
"markup.boundary": "Boundary",
|
||
"markup.delete_room": "Delete room",
|
||
"history.undo": "Undo",
|
||
"history.redo": "Redo",
|
||
"history.undo_named": "Undo: {name} (Ctrl+Z)",
|
||
"history.redo_named": "Redo: {name} (Ctrl+Shift+Z / Ctrl+Y)",
|
||
"history.undo_empty": "Nothing to undo",
|
||
"history.redo_empty": "Nothing to redo",
|
||
"history.undone": "Undone: {name}",
|
||
"history.redone": "Redone: {name}",
|
||
"history.add_room": "Create room",
|
||
"history.split_room": "Split room",
|
||
"history.merge_rooms": "Merge rooms",
|
||
"history.resize_room": "Resize room",
|
||
"history.open_boundary": "Open boundary",
|
||
"history.close_boundary": "Restore wall",
|
||
"history.wall_thickness": "Change wall thickness",
|
||
"history.add_opening": "Add door or window opening",
|
||
"history.edit_opening": "Edit opening",
|
||
"history.move_opening": "Move opening",
|
||
"history.delete_opening": "Delete opening",
|
||
"history.delete_room": "Delete room",
|
||
"history.delete_room_keep_walls": "Delete room, keep walls",
|
||
"history.delete_room_with_walls": "Delete room and walls",
|
||
"history.decor_add": "Add decor object",
|
||
"history.decor_edit": "Edit decor object",
|
||
"history.decor_move": "Move decor object",
|
||
"history.decor_transform": "Transform decor object",
|
||
"history.decor_delete": "Delete decor object",
|
||
"history.backdrop_transform": "Transform plan backdrop",
|
||
"title.markup_opening": "Openings: click a wall to place, click an opening to edit",
|
||
"opening.new": "New opening",
|
||
"opening.edit": "Opening",
|
||
"opening.door": "Door",
|
||
"opening.window": "Window",
|
||
"opening.gate": "Gate",
|
||
"opening.passage": "Open passage",
|
||
"opening.passage_binding_warning": "Saving will remove the open/close sensor and lock.",
|
||
"opening.invalid_passage_fields": "The open passage on plan “{room}” has unsupported settings: {fields}.",
|
||
"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 or independent wall",
|
||
"opening.host_partition": "Independent wall",
|
||
"opening.partition_orphan": "The independent wall for this opening no longer exists",
|
||
"opening.partition_jamb_margin": "Leave at least {distance} between the opening and the end of the wall",
|
||
"opening.rebind_partition": "Attach to another independent wall",
|
||
"confirm.delete_partition_openings_title": "Delete wall and openings?",
|
||
"confirm.delete_partition_openings_body": "This wall contains {count} opening(s). They will be deleted together.",
|
||
"confirm.delete_partition_openings_item": "• {type}, {length}",
|
||
"markup.delete": "Delete",
|
||
"markup.hint_points": "points: {n} · Shift — 45° steps · Esc/Ctrl+Z — undo a dot · closing an area offers a room",
|
||
"markup.hint_start": "click a grid dot to start a wall chain",
|
||
"tip.lqi": "average zigbee signal:",
|
||
"tip.area": "area: {value}",
|
||
"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.binding_disabled": "disabled in Home Assistant",
|
||
"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 + state",
|
||
"display.icon_ripple": "Icon + state and activity",
|
||
"display.static_icon": "Always static icon",
|
||
"marker.display_hint": "Icon + state changes the plate for work, open, alarm and unavailable states. Icon + state and activity additionally shows a short pulse for events and a continuous pulse for ongoing work, movement or presence. Value + state replaces the icon with one unambiguous HA value. A static icon never reacts to device states.",
|
||
"marker.display_hint_badge": "The icon and dynamic plate show device state without the ordinary activity pulse. Red alarms remain visible.",
|
||
"marker.display_hint_icon": "The icon and dynamic plate show device state without the ordinary activity pulse. Red alarms remain visible.",
|
||
"marker.display_hint_icon_ripple": "The icon, dynamic plate and pulse show a short pulse for events and a continuous pulse for work, motion or presence. Red alarms have separate priority.",
|
||
"marker.display_hint_value": "One unambiguous Home Assistant value replaces the icon while the plate continues to show state. Red alarms remain visible.",
|
||
"marker.display_hint_static_icon": "The theme-aware shell and icon always stay the same. State, activity, unavailability and alarms do not change the face.",
|
||
"marker.static_alarm_warning": "This device can report alarms. Static display hides the marker's visual alarm indication.",
|
||
"marker.preview.title": "Display preview",
|
||
"marker.preview.actual": "Now",
|
||
"marker.preview.example": "Example",
|
||
"marker.preview.integration": "Provided by",
|
||
"marker.preview.source": "Display source",
|
||
"marker.preview.current_state": "Current state",
|
||
"marker.preview.result": "On the plan",
|
||
"marker.preview.details": "Source details",
|
||
"marker.preview.select_source": "Choose a Home Assistant device or entity to see its actual display.",
|
||
"marker.preview.unknown_provider": "Unknown integration",
|
||
"marker.preview.virtual_provider": "House Plan · virtual device",
|
||
"marker.preview.no_source": "No active source",
|
||
"marker.preview.no_state": "No current state",
|
||
"marker.preview.mixed_states": "Several different states",
|
||
"marker.preview.multiple_sources": "{n} sources",
|
||
"marker.preview.more_sources": "+{n} more",
|
||
"marker.preview.scaled": "The preview is scaled to {n}% to fit. The saved size is unchanged.",
|
||
"marker.preview.demo_activity": "Show activity example",
|
||
"marker.preview.demo_notice": "Temporary activity example; the actual device state is unchanged.",
|
||
"marker.preview.demo_short": "Show short activity",
|
||
"marker.preview.demo_continuous": "Show continuous activity",
|
||
"marker.preview.stop_continuous": "Stop continuous activity",
|
||
"marker.preview.demo_short_notice": "Short activity example; the actual device state is unchanged.",
|
||
"marker.preview.demo_continuous_notice": "Continuous activity example; the actual device state is unchanged.",
|
||
"marker.preview.demo_already_visible": "The current state already shows a real activity or alarm effect.",
|
||
"marker.preview.reduced_motion": "System reduced-motion is enabled, so ordinary activity is shown as a dot.",
|
||
"marker.preview.reason.neutral": "Neutral dark plate",
|
||
"marker.preview.reason.working": "Yellow plate: the device is working now",
|
||
"marker.preview.reason.working_activity": "Yellow plate and activity effect: the device is working now",
|
||
"marker.preview.reason.open": "Orange plate: physically open or unlocked",
|
||
"marker.preview.reason.cover_icon_state": "Neutral plate; the cover entity controls the displayed state and icon",
|
||
"marker.preview.reason.presence": "Activity effect while presence is detected",
|
||
"marker.preview.reason.event": "Short activity effect after a detected event",
|
||
"marker.preview.reason.transition": "Activity effect while the device is moving or changing state",
|
||
"marker.preview.reason.media_neutral": "Media devices stay on a neutral dark plate while available",
|
||
"marker.preview.reason.unavailable": "Subdued neutral plate: unavailable or off",
|
||
"marker.preview.reason.alarm": "Red alarm plate; alarm indication is always shown",
|
||
"marker.preview.reason.live_states_disabled": "Live-state styling is disabled for this card",
|
||
"marker.preview.reason.value_no_state": "No usable state value; the icon is shown instead",
|
||
"marker.preview.reason.value_ambiguous_sources": "Several possible value sources; the icon is shown instead",
|
||
"marker.preview.reason.value_non_scalar": "The source did not return a simple value; the icon is shown instead",
|
||
"marker.preview.reason.value_virtual": "A virtual device has no Home Assistant value; the icon is shown instead",
|
||
"marker.preview.reason.vacuum_live_plan_only": "Live vacuum position and trail are available only on the full plan",
|
||
"marker.preview.reason.hidden_design_preview": "The device is hidden on the plan; this design preview remains visible",
|
||
"marker.preview.reason.composite_power_source": "State comes from the device Power entity; auxiliary switches are ignored",
|
||
"marker.preview.reason.activity_display_disabled": "The selected display mode does not show ordinary activity effects",
|
||
"marker.preview.reason.ha_disabled": "The Home Assistant binding is disabled and will be hidden on the plan",
|
||
"marker.preview.reason.orphaned": "The saved Home Assistant binding can no longer be found",
|
||
"marker.preview.reason.static_icon": "Static mode: device state does not change the icon",
|
||
"marker.activity_color": "Activity pulse color",
|
||
"marker.ripple_size": "Activity pulse size",
|
||
"marker.activity_alarm_note": "Color and size affect ordinary activity only and do not change red alarms.",
|
||
"marker.pulse_a11y_alarm": "Alarm",
|
||
"marker.pulse_a11y_event": "Recent event",
|
||
"marker.pulse_a11y_presence": "Presence detected",
|
||
"marker.pulse_a11y_transition": "Changing state",
|
||
"marker.pulse_a11y_running": "Working",
|
||
"marker.state_a11y_neutral": "Default state",
|
||
"marker.state_a11y_working": "Working",
|
||
"marker.state_a11y_open": "Open",
|
||
"marker.state_a11y_locked": "Locked",
|
||
"marker.state_a11y_unlocked": "Unlocked",
|
||
"marker.state_a11y_alarm": "Alarm",
|
||
"marker.state_a11y_unavailable": "Unavailable",
|
||
"marker.lqi_a11y_low": "LQI {value}, low signal",
|
||
"marker.lqi_a11y_mid": "LQI {value}, medium signal",
|
||
"marker.lqi_a11y_high": "LQI {value}, high signal",
|
||
"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.delete_room_title": "Delete room \"{name}\"?",
|
||
"confirm.delete_room_body": "Choose whether the room's exclusive physical walls should remain. Walls shared with another room are always kept.",
|
||
"confirm.merge_rooms": "Merge rooms \"{a}\" and \"{b}\"?",
|
||
"confirm.remove_marker": "Delete \"{name}\" from the plan? The device will disappear completely and stop contributing to plan data. You can add it again later.",
|
||
"confirm.erase_decor": "Erase the {kind} object? You can undo this action from the editor history.",
|
||
"confirm.delete_space": "Delete space \"{title}\" with all its rooms and markup?",
|
||
"space.delete_blocked": "This space is still used by {n} device(s). Move them to another space or delete them first.",
|
||
"toast.pos_save_failed": "Failed to save position: {err}",
|
||
"toast.no_entity": "The device has no suitable entity",
|
||
"toast.ha_disabled_action": "A Home Assistant object that is disabled cannot be used on the plan.",
|
||
"toast.ha_disabled_show_device": "A device disabled in Home Assistant cannot be shown on the plan. Enable it in Home Assistant first.",
|
||
"toast.ha_disabled_show_entity": "An entity disabled in Home Assistant cannot be shown on the plan. Enable it in Home Assistant first.",
|
||
"toast.ha_disabled_add": "A disabled Home Assistant object cannot be added to the plan. Enable it in Home Assistant first.",
|
||
"toast.ha_binding_unverified": "The object status could not be verified through the Home Assistant registry. Display and actions are temporarily unavailable.",
|
||
"toast.markup_needs_server": "Markup is available after the config is moved to the server",
|
||
"toast.space_order_changed": "Order changed. If any card pins its floor by number, check those panels.",
|
||
"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.contour_min_edges": "Draw at least two edges before closing the outline",
|
||
"toast.contour_cannot_close": "The outline cannot close because it is degenerate or intersects itself",
|
||
"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 deleted 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.toggle_target_unavailable": "Target “{name}” is unavailable — no action was performed",
|
||
"toast.toggle_targets_unavailable": "Targets are unavailable: {names}. No action was performed",
|
||
"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": "Initial space",
|
||
"editor.default_floor_missing": "Initial space “{id}” no longer exists. Choose another space.",
|
||
"editor.floor": "Fixed space",
|
||
"editor.floor_none": "— not fixed —",
|
||
"editor.floor_index": "YAML index {index} (preserved)",
|
||
"fixed_floor.loading": "Loading the fixed space…",
|
||
"fixed_floor.invalid_title": "The fixed space is unavailable",
|
||
"fixed_floor.invalid_body": "Check floor in the card configuration. The configured value is: {value}",
|
||
"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 state",
|
||
"marker.tap_label": "Tap action for this device",
|
||
"tap.toggle_note": "The resolved state is shown below. Secure devices are never toggled from the plan.",
|
||
"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.scale_unit_imperial": "in 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",
|
||
"fill.custom": "Custom color",
|
||
"space.custom_fill": "Fill color",
|
||
"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:",
|
||
"tip.hum_avg": "average humidity:",
|
||
"space_card.button": "Open the space plan",
|
||
"space_card.not_found": "Space “{id}” not found",
|
||
"space_card.loading": "Loading…",
|
||
"continuity.restore_plan": "Restoring floor plan…",
|
||
"continuity.restore_connection": "Restoring device connection…",
|
||
"continuity.retry": "Try again",
|
||
"editor.space": "Space",
|
||
"editor.show_button": "Show button",
|
||
"editor.button_label": "Button label",
|
||
"editor.button_target": "Target dashboard path",
|
||
"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",
|
||
"space.hide_decor": "Hide the decorative layer",
|
||
"space.hide_decor_tip": "Lines, shapes, labels and furniture stay where they are — visible in the backdrop editor, not on the plan.",
|
||
"space.hide_openings": "Hide openings",
|
||
"space.hide_openings_tip": "Door, window and gate symbols are not drawn, but the openings keep working: light passes through, the sun comes in at a window, contact sensors still open them. The plan editor always shows them.",
|
||
"gs.light_none": "No light sources",
|
||
"mode.plan": "Plan editor",
|
||
"mode.devices": "Device editor",
|
||
"display.value": "Value + state",
|
||
"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": "Hidden and disabled",
|
||
"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.erase_confirm_title": "Erase object?",
|
||
"decor.color": "Color",
|
||
"decor.width": "Line width",
|
||
"decor.line_style": "Line style",
|
||
"decor.line_style_solid": "Solid",
|
||
"decor.line_style_dashed": "Dashed",
|
||
"decor.fill": "Fill",
|
||
"decor.fill_color": "Fill color",
|
||
"decor.length": "Length",
|
||
"decor.size": "Size",
|
||
"decor.angle": "Rotation angle, °",
|
||
"decor.text_size": "Text size",
|
||
"decor.backdrop_properties": "Plan backdrop properties",
|
||
"decor.text_title": "Text label",
|
||
"decor.object_title": "Edit {kind}",
|
||
"decor.text_label": "Text",
|
||
"decor.live_group": "Insert HA variable",
|
||
"decor.live_entity": "Entity",
|
||
"decor.live_entity_ph": "choose an entity",
|
||
"decor.live_attr": "Value",
|
||
"decor.live_attr_ph": "choose state or attribute",
|
||
"decor.live_state": "State",
|
||
"decor.backdrop": "Backdrop image",
|
||
"decor.backdrop_hint": "Drag to move; pull a corner to resize; use the top handle to rotate. Shift changes proportions or frees the angle.",
|
||
"decor.backdrop_reset": "Reset the picture",
|
||
"decor.backdrop_reset_done": "The picture is back at its original place and size",
|
||
"marker.icon_auto": "Auto: {icon} (by icon rules; pick one to override)",
|
||
"marker.icon_pin_auto": "Pin",
|
||
"mode.plan_tip": "Plan editor — the geometry of the home: draw and split/merge rooms, bind them to HA areas, place doors, windows and gates, 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",
|
||
"space.glow_enabled": "Light-source glow",
|
||
"gs.glow_group": "Light-source glow",
|
||
"gs.glow_base": "House darkness",
|
||
"gs.glow_light": "Default light color / intensity",
|
||
"gs.wall_group": "Walls",
|
||
"gs.wall_fill": "Wall fill",
|
||
"gs.glow_radius": "Glow radius",
|
||
"gs.unit_m": "m",
|
||
"gs.unit_ft": "ft",
|
||
"marker.controls_label": "Controls other light sources",
|
||
"marker.controls_hint": "With tap action “Toggle”, a click flips every source added here. The marker’s own bound entity is controlled directly and cannot be added; use the switch below to classify it as a light.",
|
||
"marker.controls_filter": "Search lights and switches…",
|
||
"info.controls": "Controls",
|
||
"marker.glow_radius_label": "Glow radius",
|
||
"marker.glow_radius.help": "Sets the glow radius in metres or feet; an empty value uses the radius from general settings.",
|
||
"marker.glow_radius.help.aria": "Help: glow radius",
|
||
"markup.wallthick": "Thickness",
|
||
"markup.select": "Select",
|
||
"title.markup_wallthick": "Thickness — click a wall to set how thick it is. Empty or zero removes the thickness.",
|
||
"markup.hint_wallthick": "click a wall · Esc closes without applying",
|
||
"wallthick.field": "Thickness",
|
||
"wallthick.unit_cm": "cm",
|
||
"wallthick.unit_in": "in",
|
||
"wallthick.apply_room": "Apply to all walls of this room",
|
||
"markup.draw_wall_title": "Thickness of each new wall segment (1–100 cm). Shared walls keep the existing value.",
|
||
"room.queue_progress": "Room {current} of {total}",
|
||
"toast.wall_rooms_saved": "Created rooms: {n}",
|
||
"toast.wall_chain_saved": "Wall chain saved",
|
||
"toast.wallthick_pick": "Click a wall (not an open boundary)",
|
||
"toast.wallthick_open": "Open boundaries have no thickness",
|
||
"toast.wallthick_set": "Wall thickness set",
|
||
"toast.wallthick_cleared": "Wall thickness removed",
|
||
"toast.physical_range": "Enter a value from 1 to {max} {unit}",
|
||
"toast.physical_angle": "Enter a rotation angle from 0° up to, but not including, 90°",
|
||
"toast.physical_limit": "The space has reached the limit for this type of geometry",
|
||
"toast.geometry_unsafe": "Change canceled: wall geometry could not be built safely.",
|
||
"markup.boundary_hint": "Select a shared room boundary or a dashed stretch",
|
||
"markup.boundary_hint_open": "Click the start of the open stretch",
|
||
"markup.boundary_hint_second": "Choose the end on the selected boundary · Esc to cancel",
|
||
"markup.boundary_hint_retry": "Choose the end on the selected boundary",
|
||
"markup.boundary_hint_restore": "Click to restore the wall",
|
||
"markup.boundary_hint_outer": "Only a boundary shared by two rooms can be opened",
|
||
"markup.boundary_hint_blocked": "a partition, column or unfinished contour is above this boundary",
|
||
"markup.boundary_hint_ambiguous": "Choose a stretch farther from the junction",
|
||
"markup.boundary_cancel": "Cancel the unfinished Boundary action",
|
||
"toast.openwall_pick": "This tool works with room boundaries",
|
||
"toast.openwall_shared_only": "Only a shared wall between two rooms can be opened",
|
||
"toast.openwall_short": "Stretch too short — pick a farther point",
|
||
"toast.boundary_opened": "Boundary stretch opened",
|
||
"toast.boundary_restored": "Wall restored on this stretch",
|
||
"toast.boundary_same_edge": "Choose the end point on the selected wall",
|
||
"toast.boundary_ambiguous": "Choose a stretch slightly farther from the junction",
|
||
"toast.boundary_blocked": "This boundary is covered by independent masonry. Move or delete it with Select first",
|
||
"toast.delete_room_pick": "Click inside the room you want to delete",
|
||
"toast.plan_snap_ambiguous": "Zoom in to choose the wall node",
|
||
"toast.wall_repair_ambiguous": "The room outline has more than one possible connection. Zoom in and connect it explicitly.",
|
||
"toast.wall_repair_too_large": "The gap is larger than 2 cm. Connect the walls before creating the room.",
|
||
"toast.wall_repair_changed": "The wall geometry changed. Try creating the room again.",
|
||
"toast.openwall_openings_removed": "Openings on the virtual stretch were removed",
|
||
"toast.openwall_opened": "Boundary “{a}” ↔ “{b}” is now open",
|
||
"toast.openwall_closed": "Boundary “{a}” ↔ “{b}” is closed again",
|
||
"toast.opening_on_virtual": "Openings cannot sit on a virtual wall",
|
||
"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",
|
||
"view.volumetric": "Volumetric view",
|
||
"view.flat": "Flat view",
|
||
"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)",
|
||
"room.settings_title": "Room settings",
|
||
"room.settings_section": "Room settings (override the space)",
|
||
"room.fill_label": "Fill in THIS room",
|
||
"fill.inherit": "As the space",
|
||
"room.custom_fill_space": "Space color",
|
||
"room.custom_fill_own": "Room color",
|
||
"room.temp_src_label": "Temperature source",
|
||
"room.hum_src_label": "Humidity source",
|
||
"room.src_average": "Average over the room's sensors (default)",
|
||
"room.src_pick": "A specific HA device or entity",
|
||
"room.src_ph": "Choose a source…",
|
||
"toast.room_updated": "Room updated",
|
||
"space.card_font": "Room-card font size (whole space)",
|
||
"room.sizes_section": "Font sizes",
|
||
"room.name_scale": "Room name size",
|
||
"room.label_scale": "Metrics size",
|
||
"preview.room_name": "Living room",
|
||
"toast.cfg_reload_failed": "Could not reload the plan from the server: {err}",
|
||
"room.settings_short": "Room settings",
|
||
"room.unnamed": "Unnamed room",
|
||
"marker.use_climate_temp": "Include the device temperature in the room",
|
||
"marker.use_climate_temp_tip": "Adds an air conditioner or thermostat current_temperature to the room average. Configure the external value badge separately below.",
|
||
"marker.value_badge_title": "Value badge",
|
||
"marker.value_badge.help": "Shows one selected value next to the icon. It does not affect room metrics, light, Glow or the tap action.",
|
||
"marker.value_badge.help.aria": "Help: device value badge",
|
||
"marker.value_badge_enabled": "Show a value badge",
|
||
"marker.value_badge_source": "Value",
|
||
"marker.value_badge_source.help": "Choose a specific state, supported attribute, or derived value of this device.",
|
||
"marker.value_badge_source.help.aria": "Help: value badge source",
|
||
"marker.value_badge_position": "Position",
|
||
"marker.value_badge_position.help": "The chosen side stays fixed and does not flip automatically at a plan edge.",
|
||
"marker.value_badge_position.help.aria": "Help: value badge position",
|
||
"marker.value_badge_right": "Right",
|
||
"marker.value_badge_bottom": "Below",
|
||
"marker.value_badge_left": "Left",
|
||
"marker.value_badge_top": "Above",
|
||
"marker.value_badge_empty": "This device has no available values",
|
||
"marker.value_badge_static": "A static icon does not show live values. The setting is preserved.",
|
||
"marker.value_badge_missing": "Source unavailable",
|
||
"marker.value_badge_missing_hint": "The saved source is currently unavailable. Keep it, disable the badge, or choose another value.",
|
||
"marker.value_badge_duplicate": "The same value is already shown inside the icon.",
|
||
"marker.value_badge_state": "State · {name}",
|
||
"marker.value_badge_marker_state": "Light-source state · {name}",
|
||
"marker.value_badge_lqi": "Average Zigbee signal quality",
|
||
"marker.value_badge_attr_current_temperature": "Current temperature · {name}",
|
||
"marker.value_badge_attr_temperature": "Target temperature · {name}",
|
||
"marker.value_badge_attr_current_humidity": "Current humidity · {name}",
|
||
"marker.value_badge_attr_humidity": "Humidity · {name}",
|
||
"marker.value_badge_attr_current_position": "Position · {name}",
|
||
"marker.value_badge_attr_percentage": "Speed · {name}",
|
||
"marker.value_badge_attr_brightness": "Brightness · {name}",
|
||
"marker.value_badge_attr_volume_level": "Volume · {name}",
|
||
"marker.value_badge_attr_battery_level": "Battery · {name}",
|
||
"marker.value_badge_attr_fan_speed": "Fan speed · {name}",
|
||
"marker.light_role_label": "Is this device a light source?",
|
||
"marker.light_role.help": "Controls whether this marker itself is a spatial light source. Linked lights above remain independent room-light controls.",
|
||
"marker.light_role.help.aria": "Help: whether this device is a light source",
|
||
"marker.light_role_auto_yes": "Auto (light source)",
|
||
"marker.light_role_auto_no": "Auto (not a light source)",
|
||
"marker.light_role_always": "Always a light source",
|
||
"marker.light_role_never": "Never a light source",
|
||
"marker.light_entity_label": "Leading light entity",
|
||
"marker.light_entity.help": "For a composite device, choose the entity whose state, colour and brightness represent this plan source. The automatic fallback remains compatible with older plans.",
|
||
"marker.light_entity.help.aria": "Help: leading light entity",
|
||
"marker.light_entity_auto": "Automatic ({entity})",
|
||
"marker.light_entity_none": "no controllable entity",
|
||
"marker.light_entity_missing": "The saved entity {entity} is unavailable. House Plan temporarily uses {fallback}; the saved choice will be restored if it returns.",
|
||
"marker.toggle_entity_label": "Entity to toggle",
|
||
"marker.toggle_entity.help": "For a composite device, choose the exact own light or switch operated by a tap. Automatic keeps the previous target rules and is independent from the leading light entity.",
|
||
"marker.toggle_entity.help.aria": "Help: entity to toggle",
|
||
"marker.toggle_entity_auto": "Automatic ({entity})",
|
||
"marker.toggle_entity_none": "no own controllable entity",
|
||
"marker.toggle_entity_missing": "The saved entity {entity} is no longer among this marker’s selectable channels. House Plan temporarily uses {fallback}; the saved choice will be restored if it returns.",
|
||
"marker.glow_color_label": "Glow colour and brightness",
|
||
"marker.glow_mode.help": "Use live source values, override only its colour, or fix both colour and brightness. The minimum is 1%; to disable the source, choose “Never”.",
|
||
"marker.glow_mode.help.aria": "Help: glow colour and brightness",
|
||
"marker.glow_mode_auto": "From source",
|
||
"marker.glow_mode_color": "Set colour",
|
||
"marker.glow_mode_fixed": "Set colour and brightness",
|
||
"marker.glow_color": "Glow colour",
|
||
"marker.glow_brightness": "Brightness",
|
||
"marker.glow_disabled_never": "Glow settings are unavailable because this marker is explicitly not a light source.",
|
||
"marker.glow_disabled_auto": "Auto mode found no spatial light source for this marker.",
|
||
"marker.glow_disabled_no_entity": "No active controllable Home Assistant entity is available for this spatial source.",
|
||
"marker.glow_passive_hint": "This source has no own Home Assistant data. Set its colour and brightness manually; its radius remains available.",
|
||
"marker.control_broken": "Saved source is missing or no longer marked as a light",
|
||
"marker.control_missing_label": "Missing plan light",
|
||
"marker.control_passive": "passive source",
|
||
"toast.marker_control_cycle": "This link would create a circular chain of light controls.",
|
||
"toast.marker_binding_required": "Choose a Home Assistant device before linking another light source.",
|
||
"confirm.unlock": "Unlock “{name}”?",
|
||
"toast.files_migrate_failed": "Attachments could not be moved to the new binding, links keep pointing at the old files: {err}",
|
||
"space.pick_saved": "Already uploaded",
|
||
"space.pick_saved_hint": "Plans stored on the server, including ones you detached earlier",
|
||
"space.no_saved": "No plans stored on the server yet.",
|
||
"space.loading": "Loading…",
|
||
"space.used_by": "in use: {list}",
|
||
"space.in_use": "A space still uses this plan — detach it first",
|
||
"btn.use": "Use",
|
||
"confirm.delete_plan": "Delete the plan file \"{name}\" from the server? This cannot be undone.",
|
||
"toast.plans_list_failed": "Could not list the stored plans: {err}",
|
||
"toast.plan_delete_failed": "Could not delete the plan: {err}",
|
||
"marker.hide": "Hide",
|
||
"marker.hide_tip": "The device will disappear from the plan after saving but will still count toward the room signal. Restore it through \"Hidden and disabled\" in the device editor.",
|
||
"marker.show": "Show",
|
||
"marker.show_tip": "The device will appear on the plan again after saving.",
|
||
"marker.hidden_ghost": "Device hidden by the user",
|
||
"marker.ha_disabled_device": "The device is disabled in Home Assistant and hidden from the plan.",
|
||
"marker.ha_disabled_entity": "The entity is disabled in Home Assistant and hidden from the plan.",
|
||
"marker.ha_disabled_all_entities": "The device has no active Home Assistant entities, so it is hidden from the plan.",
|
||
"marker.ha_registry_limited": "The full Home Assistant registry is unavailable to this user. The unverified object cannot be shown or used for now.",
|
||
"marker.delete_tip": "Completely delete the device from the plan and every aggregate. You can add it again later.",
|
||
"tap.run": "Run automation/script/scene",
|
||
"tap.cover": "Open/close (curtains/blinds)",
|
||
"marker.run_target_label": "What to run",
|
||
"marker.run_search_ph": "Search: automation, script or scene…",
|
||
"marker.run_target_gone": "Target {id} not found — pick again",
|
||
"marker.tap_confirm": "Ask for confirmation",
|
||
"marker.tap_confirm_tip": "Show a confirmation dialog before acting — a guard against accidental taps.",
|
||
"marker.toggle_hint_single": "Target: {name} ({id}).",
|
||
"marker.virtual_light_target": "Virtual light: {name}.",
|
||
"marker.virtual_light_current": "Manual state: {state} → {effect}.",
|
||
"marker.virtual_light_state_on": "on",
|
||
"marker.virtual_light_state_off": "off",
|
||
"marker.toggle_hint_group": "Will toggle {count} source(s): {names}.",
|
||
"marker.toggle_hint_current": "Now: {state} → {effect}.",
|
||
"marker.toggle_hint_group_current": "Currently on: {on} of {count} → {effect}.",
|
||
"marker.toggle_hint_skipped": "Will be skipped ({count}): {targets}.",
|
||
"marker.toggle_effect_turn_on": "will turn on",
|
||
"marker.toggle_effect_turn_off": "will turn off",
|
||
"marker.toggle_effect_open": "will open",
|
||
"marker.toggle_effect_close": "will close",
|
||
"marker.toggle_effect_stop": "will stop",
|
||
"marker.toggle_effect_toggle": "state will toggle",
|
||
"marker.toggle_skip_missing": "not found",
|
||
"marker.toggle_skip_ha_disabled": "disabled in HA",
|
||
"marker.toggle_skip_unavailable": "unavailable",
|
||
"marker.toggle_skip_unsupported": "toggle is unsupported",
|
||
"marker.toggle_skip_secure": "blocked for security",
|
||
"marker.toggle_none_no_binding": "This device has no binding, so there is no state to toggle. Tapping will do nothing.",
|
||
"marker.toggle_none_no_actionable_entity": "This device has no state that can be toggled. Tapping will do nothing.",
|
||
"marker.toggle_none_configured_targets_missing": "The configured targets are unavailable. The device's own entity will not be substituted for them.",
|
||
"marker.toggle_none_ha_disabled": "The target is disabled in Home Assistant and cannot be used on the plan.",
|
||
"marker.toggle_none_unavailable": "The target is currently unavailable. Tapping will do nothing.",
|
||
"marker.toggle_none_unsupported": "Home Assistant exposes no safe toggle operation for this entity. Tapping will do nothing.",
|
||
"marker.toggle_none_secure": "Toggling locks, alarms and secure gates from the plan is blocked for security.",
|
||
"run.automation": "automation",
|
||
"run.script": "script",
|
||
"run.scene": "scene",
|
||
"confirm.tap_run": "Run \"{name}\"?",
|
||
"confirm.tap_toggle": "Toggle \"{name}\"?",
|
||
"confirm.tap_cover": "Open/close \"{name}\"?",
|
||
"confirm.current_state": "Current state: {state}",
|
||
"confirm.expected_state": "After switching: {state}",
|
||
"confirm.group_current": "on {on} of {total}",
|
||
"confirm.group_all_on": "all are on",
|
||
"confirm.group_all_off": "all are off",
|
||
"confirm.unavailable_targets": "Unavailable: {count}",
|
||
"confirm.expected_by_ha": "Home Assistant will determine the state",
|
||
"confirm.state_on": "On",
|
||
"confirm.state_off": "Off",
|
||
"confirm.state_open": "Open",
|
||
"confirm.state_closed": "Closed",
|
||
"confirm.state_opening": "Opening",
|
||
"confirm.state_closing": "Closing",
|
||
"confirm.state_stopped": "Stopped",
|
||
"confirm.state_unknown": "Unknown",
|
||
"toast.run_started": "Started: {name}",
|
||
"toast.run_target_missing": "Run target not found — check the device settings",
|
||
"toast.run_target_required": "Pick an automation, script or scene",
|
||
"toast.tap_target_changed": "The action target changed. Try again.",
|
||
"toast.virtual_light_toggle_failed": "Could not toggle the virtual light: {err}",
|
||
"toast.value_badge_source_required": "Choose a value for the badge",
|
||
"btn.run": "Run",
|
||
"vac.section": "Robot vacuum: live position",
|
||
"vac.autocal": "Set up automatically",
|
||
"vac.live": "Live position on the plan",
|
||
"vac.trail": "Show the robot's path",
|
||
"vac.cal_maps": "Calibrated maps: {maps}",
|
||
"vac.autocal_no_rooms": "The integration reports no room list — open “Fit manually”",
|
||
"vac.autocal_no_match": "Room names did not match (need ≥3 in common) — open “Fit manually”",
|
||
"vac.autocal_done": "Done: bound via {rooms} rooms. Start a cleanup and check",
|
||
"vac.cal_need_pos": "The robot is not reporting coordinates — start a cleanup and pause it",
|
||
"vac.cal_done": "Calibration saved. Start a cleanup and check",
|
||
"vac.cal_cancelled": "Calibration cancelled",
|
||
"vac.fit": "Fit manually",
|
||
"vac.fit_hint": "Drag the robot map into place, stretch by the corners",
|
||
"vac.fit_rotate": "Rotate 90°",
|
||
"vac.fit_mirror": "Mirror",
|
||
"vac.trail_never": "Never",
|
||
"vac.trail_cleaning": "While cleaning",
|
||
"vac.trail_always": "Always",
|
||
"gs.bg_group": "Stage background",
|
||
"gs.bg_color": "Background around the plan",
|
||
"gs.bg_default": "Theme default",
|
||
"gs.bg_theme": "theme default",
|
||
"gs.bg_mode": "Plan background",
|
||
"gs.bg_static": "Static color",
|
||
"gs.bg_daynight": "Follows the Sun",
|
||
"gs.bg_daynight_hint": "The background moves through dawn, day, dusk and night using sun.sun, or your local clock when sun data is unavailable. No compass is needed for the background.",
|
||
"gs.sun_group": "Sun",
|
||
"gs.sun_missing": "The sun.sun entity was not found — the background follows your local clock; window rays are unavailable.",
|
||
"gs.north": "North on the plan",
|
||
"gs.north_ph": "not set",
|
||
"gs.north_hint": "Set north only for window rays (1° steps, 15° with Shift); the Sun background works without it.",
|
||
"gs.north_clear": "Clear",
|
||
"gs.north_letter": "N",
|
||
"gs.sun_rays": "Sunlight through windows",
|
||
"gs.about_group": "About",
|
||
"gs.about_version": "Houseplan Card v{v}",
|
||
"gs.about_github": "GitHub · docs & issues",
|
||
"gs.about_telegram": "Telegram chat",
|
||
"space.bg_color": "Background around the plan",
|
||
"space.bg_inherit": "Inherit general",
|
||
"space.bg_inherited": "inherits general settings",
|
||
"space.bg_mode": "Plan background",
|
||
"space.north": "North on the plan (override)",
|
||
"space.north_inherited": "inherited: {v}",
|
||
"space.sun_rays": "Sunlight through windows",
|
||
"space.sun_inherit": "Inherit general",
|
||
"space.sun_on": "On",
|
||
"space.sun_off": "Off",
|
||
"canvas.far_objects": "{n} object(s) far from the plan",
|
||
"canvas.show_far": "Show",
|
||
"canvas.home_tip": "The plan is over there — click to fit it",
|
||
"gs.grid_group": "Plan maintenance",
|
||
"gs.grid_hint": "Updates data models, aligns plan elements to the grid and merges redundant wall fragments. An exact report is shown before anything is stored.",
|
||
"gs.align_all": "Optimize plans",
|
||
"gs.align_title": "Optimize plans",
|
||
"gs.align_none": "All plans already use the current optimized data model.",
|
||
"gs.optimize_no_automatic_changes": "There are no automatic changes to apply. Review the items below.",
|
||
"gs.align_count": "{n} of {total} elements will move, by at most {cm} cm.",
|
||
"gs.align_where": "The largest shift is in “{s}”.",
|
||
"gs.align_turned": "Openings whose angle is corrected: {n}.",
|
||
"gs.align_removed_drafts": "Invalid outlines collapsed by the grid and removed: {n}.",
|
||
"gs.align_preflight_failed": "Could not safely verify the geometry of the following spaces: {spaces}{more}.",
|
||
"gs.align_preflight_hint": "Plans were not changed. Update House Plan and try again. If the error persists, attach a space export to the bug report.",
|
||
"gs.align_preflight_space": "Space {n}",
|
||
"gs.align_preflight_more": ", and {n} more",
|
||
"gs.optimize_changes": "Model migrations: {m}; spaces updated: {c}; noisy coordinate values removed: {p}; merged real-wall fragments: {w}; virtual fragments: {s}; independent walls: {i}.",
|
||
"gs.optimize_lattice_summary": "Noisy coordinate values canonicalized: {n}; maximum movement: {cm} cm.",
|
||
"gs.optimize_lattice_space": "{space}: coordinate values canonicalized: {n}; off-grid values left unchanged: {far}.",
|
||
"gs.optimize_coincident_partitions": "Coincident partitions converted to room walls: {n}.",
|
||
"gs.optimize_openings_rehosted": "Openings reattached to room walls: {n}.",
|
||
"gs.optimize_walls_straightened": "Walls straightened: {n}; maximum movement: {cm} cm.",
|
||
"gs.optimize_walls_straightened_where": "Largest wall correction: {s}.",
|
||
"gs.optimize_walls_straighten_skipped": "Near-axis walls left unchanged because they could not be repaired safely: {n}.",
|
||
"gs.optimize_glow_migration": "Legacy Glow: {spaces} spaces → no data fill + independent Glow; {rooms} rooms → inherited data fill + independent Glow.",
|
||
"gs.optimize_references": "References repaired: spaces — {spaces}; rooms — {rooms}; positions — {positions}; devices detached from missing spaces — {detached}.",
|
||
"gs.optimize_reference_more": ", and {n} more",
|
||
"gs.optimize_orphans_removed": "Forgotten records removed: {total} — room labels: {rooms}; devices: {devices}; group markers: {groups}. They belonged to spaces deleted earlier.",
|
||
"gs.optimize_live_positions": "Old positions in deleted spaces belong to existing objects: {n}{names}. They will be kept.",
|
||
"gs.optimize_live_positions_remove": "Old positions in deleted spaces belong to existing objects: {n}{names}. They are selected for removal.",
|
||
"gs.optimize_live_names": ": {names}{more}",
|
||
"gs.optimize_live_remove": "Remove old positions",
|
||
"gs.optimize_live_keep": "Keep old positions",
|
||
"gs.optimize_live_selected": "Old positions will be removed after Optimize is applied.",
|
||
"gs.optimize_unverified": "Could not safely verify positions: {n}. They were left unchanged.",
|
||
"gs.optimize_registry_limited": "Full administrator access to the Home Assistant registries is required for a safe check.",
|
||
"gs.optimize_vacuum_warning": "Vacuum room mappings that still need review: {n}.",
|
||
"gs.optimize_details": "Details",
|
||
"gs.optimize_details_more": "And {n} more records.",
|
||
"gs.optimize_detail_removed": "will be removed",
|
||
"gs.optimize_detail_live": "will be kept",
|
||
"gs.optimize_detail_unverified": "not verified",
|
||
"gs.optimize_detail_room_label": "room label",
|
||
"gs.optimize_detail_device": "device",
|
||
"gs.optimize_detail_group": "group marker",
|
||
"gs.optimize_detail_unknown": "unknown owner",
|
||
"gs.optimize_detail_item": "{status}: {kind} {id}; old space {space}",
|
||
"gs.align_warn": "Elements deliberately placed between grid nodes will move. One undo is available after the operation, only until the next plan edit.",
|
||
"gs.align_run": "Optimize",
|
||
"gs.align_done": "Plans optimized: {n} elements moved, {m} records maintained, {r} references repaired",
|
||
"gs.optimize_undo": "Undo last optimization",
|
||
"gs.optimize_undone": "The last optimization was undone",
|
||
"decor.furniture": "Furniture",
|
||
"furn.title": "Furniture library",
|
||
"furn.symbol": "Symbol",
|
||
"furn.group_furniture": "Furniture",
|
||
"furn.group_appliance": "Appliances",
|
||
"furn.group_sanitary": "Plumbing",
|
||
"furn.group_other": "Other",
|
||
"furn.width": "Width",
|
||
"furn.depth": "Depth",
|
||
"furn.pick_hint": "Pick a symbol, then click on the plan.",
|
||
"furn.place_hint": "Click on the plan — the piece lands against the nearest wall. Shift places it free.",
|
||
"furn.sym_sofa": "Sofa",
|
||
"furn.sym_armchair": "Armchair",
|
||
"furn.sym_coffee_table": "Coffee table",
|
||
"furn.sym_table_dining": "Dining table",
|
||
"furn.sym_table_round": "Round table",
|
||
"furn.sym_chair": "Chair",
|
||
"furn.sym_desk": "Desk",
|
||
"furn.sym_bed_double": "Double bed",
|
||
"furn.sym_bed_single": "Single bed",
|
||
"furn.sym_nightstand": "Nightstand",
|
||
"furn.sym_wardrobe": "Wardrobe",
|
||
"furn.sym_bookshelf": "Bookshelf",
|
||
"furn.sym_fridge": "Fridge",
|
||
"furn.sym_stove": "Cooker",
|
||
"furn.sym_dishwasher": "Dishwasher",
|
||
"furn.sym_washer": "Washing machine",
|
||
"furn.sym_dryer": "Tumble dryer",
|
||
"furn.sym_tv": "TV",
|
||
"furn.sym_ac": "Air conditioner",
|
||
"furn.sym_water_heater": "Water heater",
|
||
"furn.sym_toilet": "Toilet",
|
||
"furn.sym_bathtub": "Bathtub",
|
||
"furn.sym_shower": "Shower",
|
||
"furn.sym_sink": "Washbasin",
|
||
"furn.sym_kitchen_sink": "Kitchen sink",
|
||
"furn.sym_bidet": "Bidet",
|
||
"furn.sym_stairs": "Stairs",
|
||
"furn.sym_fireplace": "Fireplace",
|
||
"furn.sym_plant": "Plant",
|
||
"furn.sym_rug": "Rug",
|
||
"common.yes": "Yes",
|
||
"common.no": "No",
|
||
"vac.diag_source": "Source",
|
||
"vac.diag_platform": "Integration",
|
||
"vac.diag_status": "Status",
|
||
"vac.diag_position": "Position",
|
||
"vac.diag_rooms": "Rooms",
|
||
"vac.diag_rooms_value": "{total} · {matched} names match · {readiness}",
|
||
"vac.autocal_ready": "auto-calibration available",
|
||
"vac.autocal_not_ready": "need 3 matching names",
|
||
"vac.diag_path": "Integration path",
|
||
"vac.diag_map": "Map ID",
|
||
"vac.source_none": "not selected",
|
||
"vac.source_status_ok": "Ready",
|
||
"vac.source_status_missing": "Missing",
|
||
"vac.source_status_disabled": "Disabled in Home Assistant",
|
||
"vac.source_status_unavailable": "Unavailable",
|
||
"vac.source_status_unverified": "Cannot verify with current permissions",
|
||
"vac.source_status_unsupported": "No position data",
|
||
"vac.source_status_none": "No source",
|
||
"vac.source_banner_missing": "The saved source no longer exists. It was not replaced automatically; choose another source or restore it in Home Assistant.",
|
||
"vac.source_banner_disabled": "The saved source is disabled in Home Assistant. Enable it there or choose another source.",
|
||
"vac.source_banner_unverified": "Current Home Assistant permissions cannot verify this saved source. It remains pinned and will not be replaced automatically.",
|
||
"vac.choose_source": "Choose source",
|
||
"vac.source_auto": "Automatic",
|
||
"vac.source_auto_hint": "Use a compatible entity from this device",
|
||
"vac.all_cameras": "All cameras",
|
||
"vac.all_cameras_warn": "A camera may not provide robot data. Choose one only if it is your vacuum map.",
|
||
"vac.all_cameras_empty": "No other camera entities found.",
|
||
"vac.platform_unknown": "unknown integration",
|
||
"vac.cap_position": "position",
|
||
"vac.cap_rooms_short": "rooms",
|
||
"vac.cap_path": "path",
|
||
"vac.cap_map": "map ID",
|
||
"vac.cap_none": "no robot data detected",
|
||
"vac.xcme_hint": "Enable these Xiaomi Cloud Map Extractor attributes:",
|
||
"vac.documentation": "Documentation",
|
||
"vac.residual_title": "Check automatic calibration",
|
||
"vac.residual_message": "The matched rooms disagree by up to {error}. Apply this approximate calibration, refine it manually, or cancel without changing the saved setup.",
|
||
"vac.apply_proposal": "Apply",
|
||
"gs.backup_group": "Backup and transfer",
|
||
"gs.backup_hint": "Download a portable JSON backup or preview and import a backup made by House Plan.",
|
||
"backup.export_open": "Export",
|
||
"backup.import_open": "Import",
|
||
"backup.export_title": "Export House Plan",
|
||
"backup.import_title": "Import House Plan",
|
||
"backup.export_hint": "Choose whether the backup should contain the whole House Plan configuration or only the current space.",
|
||
"backup.full": "Full backup",
|
||
"backup.current_space": "Current space",
|
||
"backup.current_space_title": "Current space: {title}",
|
||
"backup.no_current_space": "No current space",
|
||
"backup.plan_only": "Plan only",
|
||
"backup.plan_only_hint": "Keep rooms, walls, openings, decor and room-label positions without devices or Home Assistant bindings.",
|
||
"backup.plan_only_preview": "This file contains the plan only",
|
||
"backup.privacy_warning": "The archive keeps names, Home Assistant identifiers and exact coordinates. Internal plans and attachments are referenced, not embedded; runtime states and vacuum trails are not included.",
|
||
"backup.download": "Download JSON",
|
||
"backup.export_done": "Backup downloaded",
|
||
"backup.reading": "Checking the backup…",
|
||
"backup.revalidated": "The plan changed after this preview. The summary was refreshed; review it and confirm again.",
|
||
"backup.error.unauthorized": "You do not have permission to export or import this plan.",
|
||
"backup.error.not_ready": "House Plan is not ready yet. Try again in a moment.",
|
||
"backup.error.too_large": "The backup exceeds the 8 MiB limit.",
|
||
"backup.error.invalid_json": "The selected file is not valid JSON.",
|
||
"backup.error.invalid_format": "The selected file is not a House Plan backup.",
|
||
"backup.error.unsupported_export_version": "This backup format is not supported by the installed version.",
|
||
"backup.error.future_model": "The backup was created by a newer House Plan data model.",
|
||
"backup.error.invalid_config": "The backup contains an invalid House Plan configuration.",
|
||
"backup.error.invalid_layout": "The backup contains invalid object positions.",
|
||
"backup.error.invalid_content": "The backup contains invalid or inconsistent content references.",
|
||
"backup.error.space_not_found": "The selected space no longer exists.",
|
||
"backup.error.capacity_exceeded": "Adding this backup would exceed the plan limits.",
|
||
"backup.error.preview_expired": "The preview expired. Select the backup file again.",
|
||
"backup.error.preview_owner_mismatch": "This preview belongs to another Home Assistant user.",
|
||
"backup.error.conflict": "The plan changed after the preview. Review the refreshed summary.",
|
||
"backup.error.content_confirmation_required": "Confirm that unavailable local content may be detached.",
|
||
"backup.error.commit_failed": "The backup could not be applied safely. The previous plan was restored or is pending recovery.",
|
||
"backup.error.missing_plan": "A referenced plan file disappeared after the preview. Review the backup again.",
|
||
"backup.error.missing_content": "A referenced local attachment disappeared after the preview. Review the backup again.",
|
||
"backup.error.marker_control_missing": "A linked plan light is missing from the backup.",
|
||
"backup.error.marker_control_not_light": "A linked plan target is no longer marked as a light source.",
|
||
"backup.error.marker_control_self": "A light source cannot control itself.",
|
||
"backup.error.marker_control_cycle": "The backup contains a circular chain of light controls.",
|
||
"backup.error.duplicate_marker_control": "The backup contains a duplicate plan-light link.",
|
||
"backup.error.no_backup": "There is no import or optimization snapshot to restore.",
|
||
"backup.same_source": "Created on this Home Assistant instance",
|
||
"backup.foreign_source": "Created on another Home Assistant instance",
|
||
"backup.created": "Created: {value}",
|
||
"backup.versions": "Card {card}; integration {integration}; data model {model}",
|
||
"backup.count_spaces": "Spaces: {n}",
|
||
"backup.count_rooms": "Rooms: {n}",
|
||
"backup.count_walls": "Walls: {n}",
|
||
"backup.count_openings": "Openings: {n}",
|
||
"backup.count_decor": "Decor objects: {n}",
|
||
"backup.count_markers": "Devices: {n}",
|
||
"backup.count_layout": "Positions: {n}",
|
||
"backup.bindings": "Bindings — devices: {device}, entities: {entity}, virtual: {virtual}; positions without a space: {legacy}",
|
||
"backup.binding_status": "Target status — active: {active}, disabled: {disabled}, missing: {missing}",
|
||
"backup.missing_areas": "Areas missing on the target: {areas}",
|
||
"backup.dropped_marker_links": "Plan-light links outside this transferred space were omitted: {n}.",
|
||
"backup.repaired_target_refs": "Existing references restored by this space import: {n}.",
|
||
"backup.replace_warning": "This replaces the current configuration and layout. Uploaded files are never deleted. One undo remains available until the next plan edit.",
|
||
"backup.foreign_bookkeeping": "Instance-specific known/new-device bookkeeping will not be imported.",
|
||
"backup.final_name": "New space name",
|
||
"backup.target_settings": "The target instance's global settings remain unchanged.",
|
||
"backup.duplicates": "Bindings already present: {n}",
|
||
"backup.skip": "Skip duplicate devices",
|
||
"backup.virtual_copy": "Add safe static virtual copies",
|
||
"backup.content": "Referenced content",
|
||
"backup.content_available": "available locally",
|
||
"backup.content_external": "external link",
|
||
"backup.content_detach_required": "will be detached",
|
||
"backup.confirm_detach": "I understand that unavailable internal plans and attachments will be detached from the imported configuration.",
|
||
"backup.replace": "Replace",
|
||
"backup.add": "Add space",
|
||
"backup.space_done": "Space imported: {rooms} rooms, {markers} devices, {refs} existing references restored",
|
||
"backup.full_done": "Backup restored: {spaces} spaces, {rooms} rooms, {markers} devices",
|
||
"backup.undo_import": "Undo last full import",
|
||
"backup.import_undone": "Full import undone"
|
||
}
|