Compare commits
3
Commits
2094c84c6a
...
3acb7eabba
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3acb7eabba | ||
|
|
2bc77c43ce | ||
|
|
9ea95c3a46 |
@@ -8,6 +8,12 @@
|
||||
!**/.??*.yaml
|
||||
!*.yml
|
||||
!**/.??*.yml
|
||||
!*.md
|
||||
!**/.??*.md
|
||||
!*.json
|
||||
!**/.??*.json
|
||||
!*.js
|
||||
!**/.??*.js
|
||||
|
||||
# Track specific .storage configuration files
|
||||
!.storage/lovelace
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"enable_auto_backup": true,
|
||||
"auto_backup_throttle_minutes": 0,
|
||||
"auto_backup_retain_per_entity": 100,
|
||||
"auto_backup_dir": "",
|
||||
"auto_backup_calendar_lookahead_days": 7,
|
||||
"enable_snapshot_delete": false,
|
||||
"snapshot_delete_min_age_days": 7
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"enable_tool_search": false,
|
||||
"tool_search_max_results": 10
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
# Stats Dashboard Session - 2026-07-27
|
||||
|
||||
## Dashboard: Stats (url_path: dashboard-temp)
|
||||
|
||||
## Changes Made
|
||||
|
||||
### 1. Added Memory Usage Gauge
|
||||
- Added `sensor.system_monitor_memory_usage` gauge card next to CPU gauge
|
||||
- Entity: `sensor.system_monitor_memory_usage`
|
||||
- Severity: green(0), yellow(50), red(80)
|
||||
- Both gauges set to `grid_options: {columns: 6}` for side-by-side layout
|
||||
|
||||
### 2. Combined CPU & Memory History Chart
|
||||
- Updated existing CPU history-graph card to include both sensors
|
||||
- Renamed to "System Resources"
|
||||
- Entities:
|
||||
- `sensor.home_assistant_cpu_usage` (CPU Usage)
|
||||
- `sensor.system_monitor_memory_usage` (Memory Usage)
|
||||
- Hours to show: 24
|
||||
|
||||
## Current System Status
|
||||
- Memory usage: 61.0% (yellow zone, normal for 8GB system)
|
||||
- Memory sensor reports percentage (%)
|
||||
|
||||
## File Locations
|
||||
- Dashboard config: storage (url_path: dashboard-temp)
|
||||
- Section index: views[0].sections[1] (System Health section)
|
||||
- Gauge cards: cards[0] (CPU), cards[1] (Memory)
|
||||
- History chart: cards[2] (System Resources)
|
||||
|
||||
## Notes
|
||||
- `sensor.system_monitor_memory_usage` is also listed in the System Health entities card (views[0].sections[1].cards[3])
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"name": "Dishwasher",
|
||||
"device_id": 150633095332665,
|
||||
"type": 225,
|
||||
"protocol": 3,
|
||||
"ip_address": "192.168.1.83",
|
||||
"port": 6444,
|
||||
"model": "7600004A",
|
||||
"subtype": 3,
|
||||
"token": "2a146cafc4951b1317096d6dfd3bde6bc32aad40cdb9d60d51dcc99f8abbab4ed75331e2bc4e3dfb3664b4cf68b0b5c60ee4453bbe1d48619cc60c3483229395",
|
||||
"key": "0725ef104dbe450e83d0abaa3701f112d7771d10a9cb4306bc086718be8e684d"
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"aliases": [
|
||||
"Google Nest Mini"
|
||||
],
|
||||
"calculation_enabled_condition": "{{ is_state('[[entity]]', 'playing') }}",
|
||||
"calculation_strategy": "linear",
|
||||
"created_at": "2022-10-05T10:14:54Z",
|
||||
"device_type": "smart_speaker",
|
||||
"linear_config": {
|
||||
"calibrate": [
|
||||
"0 -> 2.01",
|
||||
"10 -> 2.01",
|
||||
"20 -> 2.04",
|
||||
"30 -> 2.10",
|
||||
"40 -> 2.26",
|
||||
"50 -> 2.49",
|
||||
"60 -> 2.83",
|
||||
"70 -> 3.13",
|
||||
"80 -> 3.37",
|
||||
"90 -> 3.50",
|
||||
"100 -> 3.66"
|
||||
]
|
||||
},
|
||||
"measure_description": "Streamed 'Radiohead - National Anthem' using spotify, and took average measurements using the measure.py tool on different volume levels",
|
||||
"measure_device": "Shelly Plug S",
|
||||
"measure_method": "manual",
|
||||
"name": "Nest Mini",
|
||||
"standby_power": 1.65,
|
||||
"author_info": {
|
||||
"name": "Daniel O'Connor",
|
||||
"email": "daniel.oconnor@gmail.com",
|
||||
"github": "CloCkWeRX"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"aliases": [
|
||||
"TRADFRI bulb GU10 WS 345lm",
|
||||
"TRADFRIbulbGU10WS345lm"
|
||||
],
|
||||
"calculation_strategy": "lut",
|
||||
"created_at": "2022-01-28T15:48:57Z",
|
||||
"device_type": "light",
|
||||
"measure_description": "Measured with utils/measure script",
|
||||
"measure_device": "Shelly Plug S",
|
||||
"measure_method": "script",
|
||||
"measure_settings": {
|
||||
"SAMPLE_COUNT": 3,
|
||||
"SLEEP_TIME": 6,
|
||||
"VERSION": "master"
|
||||
},
|
||||
"name": "TRADFRI bulb GU10 345 lumen, dimmable, white spectrum",
|
||||
"standby_power": 0.2,
|
||||
"author_info": {
|
||||
"name": "giu889",
|
||||
"github": "giu889"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"aliases": [
|
||||
"TRADFRI bulb GU10 WW 345lm"
|
||||
],
|
||||
"calculation_strategy": "lut",
|
||||
"created_at": "2025-12-22T22:20:22Z",
|
||||
"device_type": "light",
|
||||
"measure_description": "Measured with utils/measure script. Used 40W incandescent bulb as dummy load.",
|
||||
"measure_device": "Shelly 1PM Mini",
|
||||
"measure_method": "script",
|
||||
"measure_settings": {
|
||||
"SAMPLE_COUNT": 2,
|
||||
"SLEEP_TIME": 3,
|
||||
"VERSION": "v1.19.5:docker"
|
||||
},
|
||||
"name": "TRADFRI bulb GU10 WW 345lm",
|
||||
"standby_power": 0.1,
|
||||
"author_info": {
|
||||
"name": "Peklaa",
|
||||
"github": "Peklaa"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"calculation_strategy": "lut",
|
||||
"created_at": "2024-04-12T08:07:57Z",
|
||||
"device_type": "light",
|
||||
"measure_description": "Measured with utils/measure script",
|
||||
"measure_device": "TP-Link Tapo P110",
|
||||
"measure_method": "script",
|
||||
"measure_settings": {
|
||||
"SAMPLE_COUNT": 4,
|
||||
"SLEEP_TIME": 5,
|
||||
"VERSION": "v1.10.0:docker"
|
||||
},
|
||||
"name": "TRADFRI bulb GU10 WS 345 lm, dimmable, white spectrum",
|
||||
"standby_power": 0.2,
|
||||
"author_info": {
|
||||
"name": "martinkura-svk",
|
||||
"github": "martinkura-svk"
|
||||
}
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"calculation_strategy": "lut",
|
||||
"created_at": "2025-10-28T04:32:28Z",
|
||||
"device_type": "light",
|
||||
"measure_description": "Measured with utils/measure script",
|
||||
"measure_device": "Shelly Plus Plug S",
|
||||
"measure_method": "script",
|
||||
"measure_settings": {
|
||||
"SAMPLE_COUNT": 4,
|
||||
"SLEEP_TIME": 3,
|
||||
"VERSION": "v1.17.24:docker"
|
||||
},
|
||||
"name": "Smart Bulb A80 E27 922-65 RGB (type SHRGB, model 8719514554634, 18.5 W, 220-240 V, 50/60 Hz, 2452 lm @ 4000K, CRI: 90, beam angle: 360°)",
|
||||
"standby_power": 0.31,
|
||||
"author_info": {
|
||||
"name": "schuppan",
|
||||
"github": "schuppan"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"aliases": [
|
||||
"SHRGB"
|
||||
],
|
||||
"calculation_strategy": "lut",
|
||||
"created_at": "2025-11-08T06:11:27Z",
|
||||
"device_type": "light",
|
||||
"measure_description": "Measured with utils/measure script",
|
||||
"measure_device": "Shelly 2.5",
|
||||
"measure_method": "script",
|
||||
"measure_settings": {
|
||||
"SAMPLE_COUNT": 2,
|
||||
"SLEEP_TIME": 3,
|
||||
"VERSION": "v1.17.24:docker"
|
||||
},
|
||||
"name": "3.5 inch recessed downlight 8W",
|
||||
"standby_power": 0.2,
|
||||
"author_info": {
|
||||
"name": "Mike Debney",
|
||||
"email": "mike.debney@outlook.com",
|
||||
"github": "mike-debney"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,347 @@
|
||||
{
|
||||
"version": 1,
|
||||
"minor_version": 1,
|
||||
"key": "thermostat_timeline.json",
|
||||
"data": {
|
||||
"instances": {
|
||||
"default": {
|
||||
"schedules": {
|
||||
"climate.vt_basement": {
|
||||
"defaultTemp": 20,
|
||||
"blocks": [],
|
||||
"profiles": {},
|
||||
"activeProfile": null,
|
||||
"holiday": {
|
||||
"blocks": []
|
||||
},
|
||||
"presence": {}
|
||||
},
|
||||
"climate.climate_scheduler_climate_schedule_living_room": {
|
||||
"defaultTemp": 20,
|
||||
"blocks": [
|
||||
{
|
||||
"id": "7ky0uyr",
|
||||
"startMin": 690,
|
||||
"endMin": 971,
|
||||
"temp": 21
|
||||
}
|
||||
],
|
||||
"profiles": {},
|
||||
"activeProfile": null,
|
||||
"holiday": {
|
||||
"blocks": []
|
||||
},
|
||||
"presence": {}
|
||||
},
|
||||
"climate.basement": {
|
||||
"defaultTemp": 20,
|
||||
"blocks": [],
|
||||
"profiles": {},
|
||||
"activeProfile": null,
|
||||
"holiday": {
|
||||
"blocks": []
|
||||
},
|
||||
"presence": {}
|
||||
},
|
||||
"climate.living_room_living_room": {
|
||||
"defaultTemp": 20,
|
||||
"blocks": [],
|
||||
"profiles": {},
|
||||
"activeProfile": null,
|
||||
"holiday": {
|
||||
"blocks": []
|
||||
},
|
||||
"presence": {}
|
||||
}
|
||||
},
|
||||
"weekdays": {},
|
||||
"profiles": {
|
||||
"climate.vt_basement": {
|
||||
"profiles": {},
|
||||
"activeProfile": null
|
||||
},
|
||||
"climate.climate_scheduler_climate_schedule_living_room": {
|
||||
"profiles": {},
|
||||
"activeProfile": null
|
||||
},
|
||||
"climate.basement": {
|
||||
"profiles": {},
|
||||
"activeProfile": null
|
||||
},
|
||||
"climate.living_room_living_room": {
|
||||
"profiles": {},
|
||||
"activeProfile": null
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"entities": [
|
||||
"climate.basement",
|
||||
"climate.living_room_living_room"
|
||||
],
|
||||
"room_use_input_number": [
|
||||
false,
|
||||
false
|
||||
],
|
||||
"room_use_temp_sensor": [
|
||||
false,
|
||||
false
|
||||
],
|
||||
"time_12h": true,
|
||||
"temp_unit": "C",
|
||||
"storage_temp_unit": "C",
|
||||
"time_source": "browser",
|
||||
"row_height": 64,
|
||||
"default_temp": 20,
|
||||
"min_temp": 5,
|
||||
"max_temp": 25,
|
||||
"weekdays_enabled": false,
|
||||
"seasonal_enabled": false,
|
||||
"seasonal_mode": "winter",
|
||||
"weekdays_mode": "weekday_weekend",
|
||||
"weekdays_view": "all_rooms_one_day",
|
||||
"weekdays_view_switch_in_timeline": false,
|
||||
"weekdays_selected_room": "",
|
||||
"per_room_defaults": false,
|
||||
"away": {
|
||||
"enabled": false,
|
||||
"persons": [],
|
||||
"target_c": 17,
|
||||
"advanced_enabled": false,
|
||||
"combos": {},
|
||||
"delay_enabled": false,
|
||||
"delay_value": 0,
|
||||
"delay_unit": "minutes"
|
||||
},
|
||||
"away_bypass": false,
|
||||
"merges": {},
|
||||
"labels": {},
|
||||
"temp_sensors": {},
|
||||
"turn_on": {},
|
||||
"presence_sensor_enabled": false,
|
||||
"presence_live_header": true,
|
||||
"presence_sensors": {},
|
||||
"presence_sensor_temps": {},
|
||||
"presence_sensor_delays": {},
|
||||
"presence_sensor_delay_units": {
|
||||
"climate.basement": "minutes",
|
||||
"climate.living_room_living_room": "minutes"
|
||||
},
|
||||
"show_pause_button": true,
|
||||
"pause_sensor_enabled": false,
|
||||
"pause_sensor_entity": "",
|
||||
"pause_indef": true,
|
||||
"pause_until_ms": 0,
|
||||
"boiler_switch": "",
|
||||
"boiler_switch_domain": "switch",
|
||||
"boiler_rooms": null,
|
||||
"boiler_on_offset": 0,
|
||||
"boiler_off_offset": 0,
|
||||
"boiler_temp_sensor": "",
|
||||
"boiler_min_temp": 20,
|
||||
"boiler_max_temp": 25,
|
||||
"boiler_multi_enabled": false,
|
||||
"boiler_room_settings": {},
|
||||
"show_room_temp": true,
|
||||
"auto_apply_enabled": true,
|
||||
"apply_on_edit": true,
|
||||
"apply_on_default_change": true,
|
||||
"backup_auto_enabled": false,
|
||||
"backup_interval_days": 1,
|
||||
"profiles_enabled": false,
|
||||
"global_profile": null,
|
||||
"sync_mode": "instant",
|
||||
"sync_delay_min": 5,
|
||||
"sync_delay_sec": 300,
|
||||
"color_ranges": {},
|
||||
"color_global": false,
|
||||
"boiler_enabled": false,
|
||||
"holidays_source": "calendar",
|
||||
"holidays_entity": "",
|
||||
"holidays_dates": [],
|
||||
"holidays_groups": [],
|
||||
"open_window": {
|
||||
"enabled": false,
|
||||
"open_delay_min": 2,
|
||||
"close_delay_min": 5,
|
||||
"sensors": {}
|
||||
}
|
||||
},
|
||||
"colors": {
|
||||
"color_ranges": {},
|
||||
"color_global": false
|
||||
}
|
||||
}
|
||||
},
|
||||
"active_instance_id": "default",
|
||||
"schedules": {
|
||||
"climate.vt_basement": {
|
||||
"defaultTemp": 20,
|
||||
"blocks": [],
|
||||
"profiles": {},
|
||||
"activeProfile": null,
|
||||
"holiday": {
|
||||
"blocks": []
|
||||
},
|
||||
"presence": {}
|
||||
},
|
||||
"climate.climate_scheduler_climate_schedule_living_room": {
|
||||
"defaultTemp": 20,
|
||||
"blocks": [
|
||||
{
|
||||
"id": "7ky0uyr",
|
||||
"startMin": 690,
|
||||
"endMin": 971,
|
||||
"temp": 21
|
||||
}
|
||||
],
|
||||
"profiles": {},
|
||||
"activeProfile": null,
|
||||
"holiday": {
|
||||
"blocks": []
|
||||
},
|
||||
"presence": {}
|
||||
},
|
||||
"climate.basement": {
|
||||
"defaultTemp": 20,
|
||||
"blocks": [],
|
||||
"profiles": {},
|
||||
"activeProfile": null,
|
||||
"holiday": {
|
||||
"blocks": []
|
||||
},
|
||||
"presence": {}
|
||||
},
|
||||
"climate.living_room_living_room": {
|
||||
"defaultTemp": 20,
|
||||
"blocks": [],
|
||||
"profiles": {},
|
||||
"activeProfile": null,
|
||||
"holiday": {
|
||||
"blocks": []
|
||||
},
|
||||
"presence": {}
|
||||
}
|
||||
},
|
||||
"weekdays": {},
|
||||
"profiles": {
|
||||
"climate.vt_basement": {
|
||||
"profiles": {},
|
||||
"activeProfile": null
|
||||
},
|
||||
"climate.climate_scheduler_climate_schedule_living_room": {
|
||||
"profiles": {},
|
||||
"activeProfile": null
|
||||
},
|
||||
"climate.basement": {
|
||||
"profiles": {},
|
||||
"activeProfile": null
|
||||
},
|
||||
"climate.living_room_living_room": {
|
||||
"profiles": {},
|
||||
"activeProfile": null
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"entities": [
|
||||
"climate.basement",
|
||||
"climate.living_room_living_room"
|
||||
],
|
||||
"room_use_input_number": [
|
||||
false,
|
||||
false
|
||||
],
|
||||
"room_use_temp_sensor": [
|
||||
false,
|
||||
false
|
||||
],
|
||||
"time_12h": true,
|
||||
"temp_unit": "C",
|
||||
"storage_temp_unit": "C",
|
||||
"time_source": "browser",
|
||||
"row_height": 64,
|
||||
"default_temp": 20,
|
||||
"min_temp": 5,
|
||||
"max_temp": 25,
|
||||
"weekdays_enabled": false,
|
||||
"seasonal_enabled": false,
|
||||
"seasonal_mode": "winter",
|
||||
"weekdays_mode": "weekday_weekend",
|
||||
"weekdays_view": "all_rooms_one_day",
|
||||
"weekdays_view_switch_in_timeline": false,
|
||||
"weekdays_selected_room": "",
|
||||
"per_room_defaults": false,
|
||||
"away": {
|
||||
"enabled": false,
|
||||
"persons": [],
|
||||
"target_c": 17,
|
||||
"advanced_enabled": false,
|
||||
"combos": {},
|
||||
"delay_enabled": false,
|
||||
"delay_value": 0,
|
||||
"delay_unit": "minutes"
|
||||
},
|
||||
"away_bypass": false,
|
||||
"merges": {},
|
||||
"labels": {},
|
||||
"temp_sensors": {},
|
||||
"turn_on": {},
|
||||
"presence_sensor_enabled": false,
|
||||
"presence_live_header": true,
|
||||
"presence_sensors": {},
|
||||
"presence_sensor_temps": {},
|
||||
"presence_sensor_delays": {},
|
||||
"presence_sensor_delay_units": {
|
||||
"climate.basement": "minutes",
|
||||
"climate.living_room_living_room": "minutes"
|
||||
},
|
||||
"show_pause_button": true,
|
||||
"pause_sensor_enabled": false,
|
||||
"pause_sensor_entity": "",
|
||||
"pause_indef": true,
|
||||
"pause_until_ms": 0,
|
||||
"boiler_switch": "",
|
||||
"boiler_switch_domain": "switch",
|
||||
"boiler_rooms": null,
|
||||
"boiler_on_offset": 0,
|
||||
"boiler_off_offset": 0,
|
||||
"boiler_temp_sensor": "",
|
||||
"boiler_min_temp": 20,
|
||||
"boiler_max_temp": 25,
|
||||
"boiler_multi_enabled": false,
|
||||
"boiler_room_settings": {},
|
||||
"show_room_temp": true,
|
||||
"auto_apply_enabled": true,
|
||||
"apply_on_edit": true,
|
||||
"apply_on_default_change": true,
|
||||
"backup_auto_enabled": false,
|
||||
"backup_interval_days": 1,
|
||||
"profiles_enabled": false,
|
||||
"global_profile": null,
|
||||
"sync_mode": "instant",
|
||||
"sync_delay_min": 5,
|
||||
"sync_delay_sec": 300,
|
||||
"color_ranges": {},
|
||||
"color_global": false,
|
||||
"boiler_enabled": false,
|
||||
"holidays_source": "calendar",
|
||||
"holidays_entity": "",
|
||||
"holidays_dates": [],
|
||||
"holidays_groups": [],
|
||||
"open_window": {
|
||||
"enabled": false,
|
||||
"open_delay_min": 2,
|
||||
"close_delay_min": 5,
|
||||
"sensors": {}
|
||||
}
|
||||
},
|
||||
"colors": {
|
||||
"color_ranges": {},
|
||||
"color_global": false
|
||||
},
|
||||
"version": 177,
|
||||
"settings_version": 169,
|
||||
"colors_version": 169,
|
||||
"weekday_version": 1,
|
||||
"profile_version": 5
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
# MCP Server Usage
|
||||
|
||||
## ha-direct
|
||||
This custom MCP server provides deep Home Assistant integration. Use it with surgical precision — only for targeted operations that need its specific tools (automation/scene/script CRUD, safe config writing, entity registry changes). Prefer simpler MCP tools (homeassistant_*) or hab for broader queries and routine operations. Follow the ha-direct best-practices skill (home-assistant-best-practices) when creating or editing automations, scripts, scenes, helpers, or dashboards. This server can be toggled on or off, so it may not be in the list of available MCP servers — do not try to use it if it is not present. If I specifically ask you to use it, you should.
|
||||
@@ -0,0 +1,842 @@
|
||||
# Home Assistant OpenCode Rules
|
||||
|
||||
You are working directly within a Home Assistant installation. Your working directory is `/homeassistant`, which is the live Home Assistant configuration directory.
|
||||
|
||||
## CRITICAL: User Consent and Scope Rules
|
||||
|
||||
You MUST follow these rules strictly:
|
||||
|
||||
1. **Never exceed the user's request** - Do exactly what the user asks, nothing more. Do not "improve" or "enhance" beyond the stated scope.
|
||||
|
||||
2. **Never make changes without explicit approval** - Before modifying ANY file:
|
||||
- Show the user exactly what you plan to change
|
||||
- Wait for their explicit confirmation ("yes", "go ahead", "do it", etc.)
|
||||
- If they haven't approved, DO NOT proceed
|
||||
|
||||
3. **Ask, don't assume** - If the user's request is ambiguous:
|
||||
- Ask clarifying questions first
|
||||
- Present options and let them choose
|
||||
- Never guess at their intent
|
||||
|
||||
4. **Read-only by default** - When investigating or troubleshooting:
|
||||
- Only read files and gather information
|
||||
- Present findings and recommendations
|
||||
- Wait for user instruction before making any changes
|
||||
|
||||
5. **One change at a time** - When making approved changes:
|
||||
- Make the minimum change needed
|
||||
- Show what was changed
|
||||
- Let the user verify before proceeding to any next step
|
||||
|
||||
6. **No unsolicited modifications** - Never:
|
||||
- "Clean up" code the user didn't ask about
|
||||
- Add features they didn't request
|
||||
- Refactor working configurations
|
||||
- Fix issues they haven't mentioned
|
||||
|
||||
7. **Respect "no"** - If a user declines a suggestion, do not:
|
||||
- Repeat the suggestion
|
||||
- Make the change anyway
|
||||
- Try to convince them otherwise
|
||||
|
||||
## Environment Context
|
||||
|
||||
- You are running inside the OpenCode app
|
||||
- The current directory (`/homeassistant`) contains the live Home Assistant configuration
|
||||
- Changes to YAML files here directly affect the Home Assistant instance
|
||||
- If add-on folder access is enabled, `/addons` and `/addon_configs` are available for Home Assistant add-on development. Treat `/addon_configs` as sensitive and only inspect or modify these folders when the user explicitly asks.
|
||||
- You may have access to MCP tools for interacting with Home Assistant (check with the user)
|
||||
|
||||
## Home Context
|
||||
|
||||
The add-on assembles context about *this specific installation* and loads it before the user's first message. You do not need to fetch any of it. Depending on the user's settings, some or all of these are present:
|
||||
|
||||
- **Install briefing** — a generated snapshot: Home Assistant version, areas, entity counts per domain, how the configuration is split up, which custom components are installed. It is orientation, **not live state** — re-check anything current with the MCP tools or `hab`. It may be absent or partial when Home Assistant was still starting.
|
||||
- **`AGENTS.local.md`** — the user's own standing instructions, if they created that file. Follow them. This file (`AGENTS.md`) takes precedence where the two conflict, and the consent and safety rules above are never overridden.
|
||||
- **Decision notes** — decisions the user has confirmed about their setup, injected as a short digest.
|
||||
|
||||
### Decision Notes
|
||||
|
||||
Decision notes record *why* an installation is the way it is. That reasoning cannot be recovered by re-reading the YAML, which is exactly why it is worth storing.
|
||||
|
||||
**When a request conflicts with a note**, say so before acting. Never silently reverse a recorded decision — tell the user which note applies and ask whether they want to change it.
|
||||
|
||||
**The digest is a summary, not the whole record.** It states how many active notes it is showing; when that is fewer than the total, the notes it left out are still in force. `recall_decisions` is the authority. Before changing something that looks deliberate, odd, or redundant — an inverted switch, a disabled integration, a duplicate-looking entity — check there first. An empty search result means *that query* found nothing, never that nothing was decided; search again in different words, or with no query at all, before concluding a thing is safe to "fix".
|
||||
|
||||
**To read more**, use `recall_decisions`. The injected digest carries only the decisions themselves; the rationale and the superseded history are retrieved on demand. Check it when a note looks relevant but you need the reasoning, or when the user asks what was decided before.
|
||||
|
||||
**To record**, offer first and then wait. Say what you would store, in the words you would store it, and call `remember_decision` with `user_approved: true` only after the user agrees. A general instruction to "remember this" for the current task is not approval to write a permanent note; asking costs one sentence.
|
||||
|
||||
Worth recording:
|
||||
- Deliberate removals and disables ("that integration was removed because it fought with X")
|
||||
- Intentional deviations from the obvious approach, and why
|
||||
- Things to leave alone
|
||||
- Constraints that will still be true in six months
|
||||
|
||||
Not worth recording — do not write these:
|
||||
- What you did this session, or how you troubleshot something. **This is not a session log.**
|
||||
- Anything already readable from the configuration files
|
||||
- Anything the user has not explicitly approved
|
||||
|
||||
**Pinning** (`pin: true`) keeps a note in the digest when older notes stop fitting. It is for the small number of constraints where being forgotten causes real damage — something deliberately removed, something that must be left alone. Ask for the pin as well as for the note, and use it rarely: pinning everything pins nothing.
|
||||
|
||||
**Never** put passwords, tokens, or any value from `secrets.yaml` into a note. The tool rejects them, and a note is sent to the model in every future session.
|
||||
|
||||
## Home Assistant Interaction Model
|
||||
|
||||
There are three primary, safe ways to interact with Home Assistant:
|
||||
|
||||
### 1. Configuration Files (YAML)
|
||||
The standard way to define and customize Home Assistant behavior:
|
||||
- Automations, scripts, scenes, and blueprints
|
||||
- Integration and sensor configurations
|
||||
- Templates, packages, and customizations
|
||||
- Dashboard (Lovelace) definitions
|
||||
|
||||
These files are designed for user editing and are the source of truth for your Home Assistant setup.
|
||||
|
||||
### 2. MCP Tools (Runtime API)
|
||||
Real-time interaction with the running Home Assistant instance:
|
||||
- Query current entity states and history
|
||||
- Control devices and call services
|
||||
- Validate configurations
|
||||
- Diagnose issues and detect anomalies
|
||||
- Report OpenCode/HA agent capability status with `get_agent_capabilities`
|
||||
|
||||
### Native Home Assistant LLM Platform
|
||||
Home Assistant is developing a native `llm` integration where Core integrations and custom integrations can expose curated tools through `<integration>/llm.py` and registered LLM APIs. New Home Assistant builds may also expose those APIs over native MCP endpoints such as `/api/mcp/<API ID>`; the built-in Assist API uses `/api/mcp/assist`. This is complementary to OpenCode MCP, not a replacement.
|
||||
|
||||
- If the optional `homeassistant_native` MCP server is available, prefer it for requests that fit the configured native Home Assistant LLM API because those tools are curated by Home Assistant.
|
||||
- Use OpenCode MCP for configuration editing, safe writes, validation, admin/dev workflows, screenshots, updates, ESPHome, `hab`, Zigbee tasks, add-on development, and Home Assistant documentation lookup.
|
||||
- Use `get_agent_capabilities` or `ha://agent/capabilities` to check whether the running HA instance reports the native `llm` component and native MCP endpoints.
|
||||
- Use `get_home_context` for compact area/domain/entity understanding before broad state dumps.
|
||||
- Use `get_ha_llm_development_guide` when helping develop or review a custom integration's native `<integration>/llm.py` provider.
|
||||
- Do not assume this add-on can register tools directly with HA's native `llm` platform; native tool registration is internal to HA integrations/custom integrations. The add-on can consume configured native LLM APIs through native MCP when Home Assistant exposes them.
|
||||
|
||||
### 3. hab CLI (Home Assistant Builder)
|
||||
A CLI tool designed for AI agents to manage Home Assistant. Run `hab` commands via the terminal:
|
||||
- **Entity management**: `hab entity list`, `hab entity get light.living_room`, `hab entity logbook sensor.power --start 2h`
|
||||
- **Service calls**: `hab action call light.turn_on --entity light.living_room --data '{"brightness": 200}'`
|
||||
- **Automation CRUD**: `hab automation list`, `hab automation create`, `hab automation delete`
|
||||
- **Dashboard management**: `hab dashboard list`, `hab dashboard view create`
|
||||
- **Area/floor/zone/label**: `hab area list`, `hab area create "Kitchen"`
|
||||
- **Helpers**: `hab helper list`, `hab helper create`
|
||||
- **Scripts**: `hab script list`, `hab script create`
|
||||
- **Scenes**: `hab scene list`, `hab scene create`, `hab scene activate "Movie Time"`
|
||||
- **Blueprints**: `hab blueprint list`
|
||||
- **Backups**: `hab backup list`, `hab backup create`
|
||||
- **System**: `hab system info`, `hab system health`, `hab overview`
|
||||
- **Devices**: `hab device list`
|
||||
- **People**: `hab person list`, `hab person create`, `hab person update`
|
||||
- **Categories**: `hab category list`, `hab category assign --entity light.kitchen`
|
||||
- **To-do lists**: `hab todo list`, `hab todo item list todo.shopping`, `hab todo item add todo.shopping "Milk"`
|
||||
- **Notifications**: `hab notification list`, `hab notification create --message "Hello" --title "Alert"`
|
||||
- **Integrations**: `hab integration list`, `hab integration reload hue`, `hab integration disable mqtt`
|
||||
- **Repairs**: `hab repairs list`, `hab repairs ignore <issue_id>`
|
||||
- **Events**: `hab event list`, `hab event fire my_custom_event --data '{"key": "value"}'`
|
||||
- **Templates**: `hab template render --expression "{{ states('sensor.temperature') }}"`
|
||||
- **Search**: `hab search related`
|
||||
|
||||
`hab` outputs human-readable text by default. Use `--json` for structured JSON output (ideal for parsing).
|
||||
`hab` is pre-authenticated via the Supervisor token - no login required.
|
||||
Run `hab --help` or `hab <command> --help` for full usage details.
|
||||
|
||||
<!-- HAB_LIVE_HELP_START -->
|
||||
```
|
||||
Home Assistant Builder (hab) is a CLI utility designed for LLMs
|
||||
to build and manage Home Assistant configurations.
|
||||
|
||||
Interactive sessions default to human-readable text. Non-interactive sessions default to JSON.
|
||||
|
||||
Start with 'hab guide' for workflow-level guidance optimized for LLM and agent usage.
|
||||
|
||||
Usage:
|
||||
hab [command]
|
||||
|
||||
Getting Started:
|
||||
auth Manage authentication
|
||||
capability Inspect runtime capabilities
|
||||
guide Display built-in usage guides
|
||||
overview Show an overview of the Home Assistant instance
|
||||
schema Show machine-readable command schema
|
||||
|
||||
Registry:
|
||||
area Manage areas
|
||||
device Manage devices
|
||||
entity Manage entities
|
||||
floor Manage floors
|
||||
label Manage labels
|
||||
person Manage persons
|
||||
search Search for items and relationships
|
||||
zone Manage zones
|
||||
|
||||
Automation:
|
||||
action Call actions (services)
|
||||
automation Manage automations
|
||||
blueprint Manage blueprints
|
||||
category Manage categories
|
||||
helper Manage groups, templates, and other helpers
|
||||
scene Manage scenes
|
||||
script Manage scripts
|
||||
|
||||
Dashboard:
|
||||
dashboard Manage dashboards
|
||||
|
||||
Other:
|
||||
backup Manage backups
|
||||
calendar Manage calendar events
|
||||
diagnostics Manage diagnostics handlers
|
||||
energy Manage energy dashboard settings
|
||||
esphome Manage ESPHome devices
|
||||
event Manage Home Assistant events
|
||||
integration Manage integrations
|
||||
network Manage network settings
|
||||
notification Manage persistent notifications
|
||||
repairs Manage Home Assistant repairs
|
||||
system Manage system
|
||||
template Work with Home Assistant templates
|
||||
thread Manage Thread credentials
|
||||
todo Manage to-do list items
|
||||
update Update hab to the latest version
|
||||
version Show version information
|
||||
|
||||
Additional Commands:
|
||||
help Help about any command
|
||||
|
||||
Flags:
|
||||
--config string Path to config directory (default: ~/.config/home-assistant-builder)
|
||||
-h, --help help for hab
|
||||
--json Use JSON output instead of human-readable text
|
||||
--skip-update-check Skip automatic update check on startup
|
||||
--text Use human-readable text output
|
||||
--verbose Show verbose output
|
||||
|
||||
Use "hab [command] --help" for more information about a command.
|
||||
```
|
||||
<!-- HAB_LIVE_HELP_END -->
|
||||
|
||||
**Use configuration files when:** defining behavior, creating automations, setting up integrations
|
||||
**Use MCP tools when:** checking current state, safe config writing, anomaly detection, entity diagnostics
|
||||
**Use hab CLI when:** managing dashboards, areas, helpers, backups, blueprints, and bulk admin operations
|
||||
|
||||
### 4. zigporter CLI (Zigbee Toolkit)
|
||||
A CLI for Zigbee device management in Home Assistant. Handles cascade renames (updating entity IDs across automations, scripts, scenes, and all Lovelace dashboards atomically), device inspection, stale device cleanup, and Zigbee mesh visualization.
|
||||
|
||||
**Cascade rename** — zigporter's unique value: when you rename an entity or device, it automatically patches every reference in automations, scripts, scenes, and Lovelace dashboards. `hab` can rename a single entity/device but does NOT cascade to references.
|
||||
|
||||
Key commands:
|
||||
- **Cascade rename**: `zigporter rename-entity light.old_id light.new_id --apply`, `zigporter rename-device "Old Name" "New Name" --apply`
|
||||
- **Device inventory**: `zigporter list-devices --json`, `zigporter list-z2m --json` (requires Z2M config)
|
||||
- **Device inspection**: `zigporter inspect "Device Name" --json`, `zigporter inspect sensor.entity_id --json`
|
||||
- **Stale device management**: `zigporter stale "Device" --action remove`, `zigporter stale "Device" --action ignore`
|
||||
- **Post-migration cleanup**: `zigporter fix-device "Device" --apply`
|
||||
- **Connectivity check**: `zigporter check`
|
||||
- **ZHA export**: `zigporter export --output devices.json`
|
||||
- **Mesh visualization**: `zigporter network-map --format table` (terminal), `zigporter network-map --output mesh.svg` (SVG file)
|
||||
|
||||
**Output format**: Use `--json` on listing/inspect commands for structured output (ideal for AI parsing). Rename commands output diffs and confirmation text.
|
||||
|
||||
zigporter is pre-authenticated via the Supervisor token. Z2M commands (`list-z2m`, `network-map --backend z2m`) require Z2M URL configuration in the add-on settings.
|
||||
|
||||
**Important limitations**:
|
||||
- `rename-entity` / `rename-device` do NOT patch Jinja2 template expressions (e.g. `{{ states('old.id') }}`). A warning is printed listing affected files — inform the user these need manual review after renaming.
|
||||
- The `migrate` command is inherently interactive (requires physical device actions) and must NOT be used by AI agents.
|
||||
- Dry-run is the default for renames — always preview before using `--apply`.
|
||||
|
||||
<!-- ZIGPORTER_LIVE_HELP_START -->
|
||||
```
|
||||
|
||||
Usage: zigporter [OPTIONS] COMMAND [ARGS]...
|
||||
|
||||
Migrate Zigbee devices between ZHA and Zigbee2MQTT. Supports both ZHA → Z2M
|
||||
(default) and Z2M → ZHA (--direction z2m-to-zha).
|
||||
|
||||
╭─ Options ────────────────────────────────────────────────────────────────────╮
|
||||
│ --version -v Show version and exit. │
|
||||
│ --install-completion Install completion for the current shell. │
|
||||
│ --show-completion Show completion for the current shell, to │
|
||||
│ copy it or customize the installation. │
|
||||
│ --help -h Show this message and exit. │
|
||||
╰──────────────────────────────────────────────────────────────────────────────╯
|
||||
╭─ Commands ───────────────────────────────────────────────────────────────────╮
|
||||
│ setup Create or update the configuration file in the zigporter │
|
||||
│ config directory. │
|
||||
│ check Verify that all requirements are in place before migrating. │
|
||||
│ export Export current ZHA devices, entities, areas, and automation │
|
||||
│ references to JSON. │
|
||||
│ export-z2m Export current Z2M devices, entities, areas, and automation │
|
||||
│ references to JSON. │
|
||||
│ list-z2m List all devices currently paired with Zigbee2MQTT. │
|
||||
│ list-devices List all Home Assistant devices across all integrations. │
|
||||
│ migrate Interactive wizard to migrate devices between ZHA and │
|
||||
│ Zigbee2MQTT. │
|
||||
│ inspect Show all automations, scripts, scenes, and dashboard cards │
|
||||
│ that depend on a device. │
|
||||
│ rename-entity Rename an entity ID and update all references in automations, │
|
||||
│ scripts, scenes, and dashboards. │
|
||||
│ rename-device Rename a device and cascade the change to all its entities, │
|
||||
│ automations, scripts, scenes, and dashboards. │
|
||||
│ stale Identify and manage offline/stale devices across all │
|
||||
│ integrations. │
|
||||
│ fix-device Remove stale ZHA device entries left behind after migration │
|
||||
│ to Zigbee2MQTT. │
|
||||
│ network-map Show Zigbee mesh topology with signal strength (LQI) for each │
|
||||
│ device. │
|
||||
╰──────────────────────────────────────────────────────────────────────────────╯
|
||||
```
|
||||
<!-- ZIGPORTER_LIVE_HELP_END -->
|
||||
|
||||
**Use zigporter CLI when:** renaming entities/devices with cascade updates, inspecting Zigbee devices across integrations, cleaning up stale or post-migration devices, visualizing the Zigbee mesh
|
||||
|
||||
### 5. Internal Directories (OFF-LIMITS)
|
||||
Home Assistant manages internal state in directories like `.storage/`. These are:
|
||||
- Not designed for direct access
|
||||
- Subject to change without notice
|
||||
- Potentially dangerous to modify
|
||||
|
||||
**Never access internal directories directly - use configuration files or MCP tools instead.**
|
||||
|
||||
## RESTRICTED: Internal Home Assistant Directories
|
||||
|
||||
**NEVER read, modify, or directly interact with these internal directories:**
|
||||
|
||||
| Directory | Contains | Use Instead |
|
||||
|-----------|----------|-------------|
|
||||
| `.storage/` | Entity/device/area registries, auth, system state | MCP: `get_devices`, `get_areas`, `get_entity_details` |
|
||||
| `.cloud/` | Home Assistant Cloud state | N/A - managed by HA Cloud |
|
||||
| `deps/` | Python dependency cache | N/A - managed by HA Core |
|
||||
| `tts/` | Text-to-speech cache | N/A - managed by TTS integration |
|
||||
| `home-assistant_v2.db` | History SQLite database | MCP: `get_history`, `get_logbook` |
|
||||
| `home-assistant.log` | Raw system logs | MCP: `get_error_log` |
|
||||
|
||||
These contain internal Home Assistant state that:
|
||||
1. Is managed exclusively by Home Assistant core
|
||||
2. Can corrupt your installation if modified incorrectly
|
||||
3. May be overwritten by Home Assistant at any time
|
||||
4. Has no stable schema or format guarantees
|
||||
|
||||
**For information that seems to require internal access, there is always a proper alternative:**
|
||||
- Need entity details? -> Read configuration files OR use `get_entity_details`
|
||||
- Need device info? -> Use `get_devices` MCP tool
|
||||
- Need to check history? -> Use `get_history` MCP tool
|
||||
- Need to see errors? -> Use `get_error_log` MCP tool
|
||||
|
||||
## File Structure Knowledge
|
||||
|
||||
### Configuration Files (Primary Interface - Read/Write with User Approval)
|
||||
These are the user-facing configuration files - the primary way to define Home Assistant behavior:
|
||||
|
||||
- `configuration.yaml` - Main configuration file
|
||||
- `automations.yaml` - Automation definitions (if using UI or split config)
|
||||
- `scripts.yaml` - Script definitions
|
||||
- `scenes.yaml` - Scene definitions
|
||||
- `secrets.yaml` - Sensitive values (NEVER commit or expose)
|
||||
- `customize.yaml` - Entity customizations
|
||||
- `groups.yaml` - Group definitions
|
||||
- `packages/` - Package-based configuration splits
|
||||
- `blueprints/` - Automation and script blueprints
|
||||
- `custom_components/` - Custom integrations (HACS or manual)
|
||||
- `www/` - Static files served at /local/
|
||||
- `themes/` - Custom themes
|
||||
- `*.yaml` in root - Any user-created YAML configuration
|
||||
|
||||
**These files are designed for editing** and are equally valid as MCP tools for research and changes.
|
||||
|
||||
### Internal Directories (OFF-LIMITS - Never Access Directly)
|
||||
- `.storage/` - Internal registries and state (use MCP tools)
|
||||
- `.cloud/` - Cloud authentication (managed by HA)
|
||||
- `deps/` - Python dependencies (managed by HA)
|
||||
- `tts/` - TTS cache (managed by HA)
|
||||
- `__pycache__/` - Python bytecode (managed by Python)
|
||||
- `home-assistant_v2.db` - History database (use MCP `get_history`)
|
||||
- `home-assistant.log` - Logs (use MCP `get_error_log`)
|
||||
|
||||
## Working with YAML on the Command Line (`yq`)
|
||||
|
||||
To read, query, or convert YAML from the shell, use **`yq`** (the mikefarah/Go tool, pre-installed on `PATH`). It is the correct tool because it tolerates Home Assistant's custom tags — `!include`, `!secret`, `!env_var`, `!input`, and the `!include_dir_*` family.
|
||||
|
||||
**Do NOT reach for `python3 -c "import yaml"` (PyYAML) or Ruby's YAML for HA config** — both crash with a constructor error on the very first `!include`/`!secret`, because those tags are Home Assistant extensions, not standard YAML. `yq` parses them with no setup.
|
||||
|
||||
### Read / query (always safe — never errors on HA tags)
|
||||
|
||||
```
|
||||
yq '.homeassistant.latitude' configuration.yaml # Print a nested value
|
||||
yq '.automation | tag' configuration.yaml # Inspect the tag itself -> !include
|
||||
yq 'keys' configuration.yaml # List top-level keys
|
||||
yq -o=json '.' configuration.yaml | jq '.sensor' # Convert to JSON to pipe into jq
|
||||
```
|
||||
|
||||
Note: output and JSON conversion strip the tag — `!secret home_latitude` prints as `home_latitude`. Use `| tag` when you need to see the tag. Never round-trip a file *through* JSON and back; that permanently loses every `!include`/`!secret`.
|
||||
|
||||
### Writing / editing
|
||||
|
||||
Prefer the sanctioned write path: **`write_config_safe`** (MCP — validates, backs up, and blocks accidental content loss) or read the full file and use the editor. Reserve `yq -i` for quick, low-risk edits, and only with these two caveats in mind:
|
||||
|
||||
1. **A custom tag sticks to the value you overwrite.** `yq -i '.homeassistant.latitude = 52.37'` on a `!secret`-tagged node produces the corrupt `latitude: !secret 52.37`. When replacing a tagged value, reset the tag in the *same* expression:
|
||||
```
|
||||
yq -i '(.homeassistant.latitude tag = "") | .homeassistant.latitude = 52.37' configuration.yaml
|
||||
```
|
||||
To *add* a secret reference, set the tag explicitly: `yq -i '.http.api_key = "my_api_key" | .http.api_key tag = "!secret"' configuration.yaml`
|
||||
2. **`yq -i` strips blank separator lines** (and collapses inline-comment spacing) across the whole file. No data is lost, but diffs are noisier. When a clean, minimal diff matters, use the editor instead.
|
||||
|
||||
### Validation is not a syntax check
|
||||
|
||||
`yq` only confirms YAML *parses*. To validate a Home Assistant *configuration* (resolving `!include`/`!secret` and checking integration schemas), use `check_config_syntax` / `write_config_safe` (MCP), not `yq`.
|
||||
|
||||
## YAML Style Guide (MANDATORY)
|
||||
|
||||
All YAML written or modified MUST follow the official Home Assistant YAML Style Guide.
|
||||
Reference: https://developers.home-assistant.io/docs/documenting/yaml-style-guide/
|
||||
|
||||
A Prettier formatter is configured for this environment and will auto-format files on save.
|
||||
However, Prettier only enforces a subset of the rules below. You are responsible for following
|
||||
ALL rules, especially those Prettier cannot enforce (marked with *).
|
||||
|
||||
### Indentation
|
||||
|
||||
2 spaces. Tabs are forbidden.
|
||||
|
||||
```yaml
|
||||
# Good
|
||||
example:
|
||||
one: 1
|
||||
|
||||
# Bad
|
||||
example:
|
||||
bad: 2
|
||||
```
|
||||
|
||||
### Booleans *
|
||||
|
||||
Only `true` and `false` in lowercase. Never use `Yes`, `No`, `On`, `Off`, `TRUE`, etc.
|
||||
|
||||
```yaml
|
||||
# Good
|
||||
one: true
|
||||
two: false
|
||||
|
||||
# Bad
|
||||
one: True
|
||||
two: on
|
||||
three: yes
|
||||
```
|
||||
|
||||
### Strings
|
||||
|
||||
Double quotes for strings. Single quotes are not allowed.
|
||||
|
||||
```yaml
|
||||
# Good
|
||||
example: "Hi there!"
|
||||
|
||||
# Bad
|
||||
example: 'Hi there!'
|
||||
```
|
||||
|
||||
**Exceptions** (no quotes needed): entity IDs, area IDs, device IDs, platform types,
|
||||
trigger types, condition types, action names, device classes, event names, attribute names,
|
||||
and values from a fixed set of options (e.g., `mode`).
|
||||
|
||||
```yaml
|
||||
# Good
|
||||
actions:
|
||||
- action: light.turn_on
|
||||
target:
|
||||
entity_id: light.living_room
|
||||
area_id: living_room
|
||||
data:
|
||||
message: "Hello!"
|
||||
transition: 10
|
||||
|
||||
# Bad - don't quote entity IDs and action names
|
||||
actions:
|
||||
- action: "light.turn_on"
|
||||
target:
|
||||
entity_id: "light.living_room"
|
||||
```
|
||||
|
||||
### Sequences (Lists) *
|
||||
|
||||
Use block style. Flow style `[1, 2, 3]` must not be used.
|
||||
Block sequences must be indented under their key.
|
||||
|
||||
```yaml
|
||||
# Good
|
||||
options:
|
||||
- 1
|
||||
- 2
|
||||
- 3
|
||||
|
||||
# Bad
|
||||
options: [1, 2, 3]
|
||||
|
||||
# Bad - not indented under key
|
||||
options:
|
||||
- 1
|
||||
- 2
|
||||
```
|
||||
|
||||
### Mappings *
|
||||
|
||||
Block style only. Flow style `{ key: val }` must not be used.
|
||||
|
||||
```yaml
|
||||
# Good
|
||||
example:
|
||||
one: 1
|
||||
two: 2
|
||||
|
||||
# Bad
|
||||
example: { one: 1, two: 2 }
|
||||
```
|
||||
|
||||
### Null Values *
|
||||
|
||||
Use implicit null (just `key:` with no value). Never use `null` or `~`.
|
||||
|
||||
```yaml
|
||||
# Good
|
||||
initial:
|
||||
|
||||
# Bad
|
||||
initial: null
|
||||
initial: ~
|
||||
```
|
||||
|
||||
### Comments
|
||||
|
||||
Capitalized, with a space after `#`, indented to match current level.
|
||||
|
||||
```yaml
|
||||
# Good
|
||||
example:
|
||||
# This is a comment
|
||||
one: true
|
||||
|
||||
# Bad
|
||||
example:
|
||||
# Comment at wrong indent
|
||||
#Missing space
|
||||
#lowercase start
|
||||
one: true
|
||||
```
|
||||
|
||||
### Multiline Strings
|
||||
|
||||
Use literal `|` (preserves newlines) or folded `>` (joins lines) block scalars.
|
||||
Avoid `\n` in strings. Prefer no-chomp (`|`, `>`) unless you need strip (`|-`, `>-`).
|
||||
|
||||
```yaml
|
||||
# Good
|
||||
message: |
|
||||
Hello!
|
||||
This is a multiline
|
||||
notification message.
|
||||
|
||||
# Good - folded
|
||||
description: >
|
||||
This is a long description that
|
||||
will be joined into a single line.
|
||||
|
||||
# Bad
|
||||
message: "Hello!\nThis is a multiline\nnotification message.\n"
|
||||
```
|
||||
|
||||
### Templates
|
||||
|
||||
Double quotes outside, single quotes inside. Use `states()` and `state_attr()`
|
||||
helpers, not direct state object access. Split long templates across multiple lines.
|
||||
|
||||
```yaml
|
||||
# Good
|
||||
value_template: "{{ states('sensor.temperature') }}"
|
||||
attribute_template: "{{ state_attr('climate.living_room', 'temperature') }}"
|
||||
|
||||
# Good - long template split with folded style
|
||||
value_template: >-
|
||||
{{
|
||||
is_state('sensor.bedroom_co_status', 'Ok')
|
||||
and is_state('sensor.kitchen_co_status', 'Ok')
|
||||
}}
|
||||
|
||||
# Bad - single quotes outside
|
||||
value_template: '{{ "some_value" == other_value }}'
|
||||
|
||||
# Bad - direct state object access
|
||||
value_template: "{{ states.sensor.temperature.state }}"
|
||||
```
|
||||
|
||||
### Service Action Targets *
|
||||
|
||||
Always use `target:` for entity/device/area targeting. Do not put `entity_id` at
|
||||
the action level or inside `data:`.
|
||||
|
||||
```yaml
|
||||
# Good
|
||||
actions:
|
||||
- action: light.turn_on
|
||||
target:
|
||||
entity_id: light.living_room
|
||||
|
||||
# Bad
|
||||
actions:
|
||||
- action: light.turn_on
|
||||
entity_id: light.living_room
|
||||
|
||||
# Bad
|
||||
actions:
|
||||
- action: light.turn_on
|
||||
data:
|
||||
entity_id: light.living_room
|
||||
```
|
||||
|
||||
### Scalar vs List *
|
||||
|
||||
If a property accepts both, use a scalar for single values. Do not wrap a single
|
||||
value in a list. Do not use comma-separated strings.
|
||||
|
||||
```yaml
|
||||
# Good
|
||||
entity_id: light.living_room
|
||||
entity_id:
|
||||
- light.living_room
|
||||
- light.office
|
||||
|
||||
# Bad - single value in a list
|
||||
entity_id:
|
||||
- light.living_room
|
||||
|
||||
# Bad - comma separated
|
||||
entity_id: "light.living_room, light.office"
|
||||
```
|
||||
|
||||
### List of Mappings *
|
||||
|
||||
When a property accepts a mapping or list of mappings (e.g., `actions`, `conditions`),
|
||||
always use a list even for a single item.
|
||||
|
||||
```yaml
|
||||
# Good
|
||||
actions:
|
||||
- action: light.turn_on
|
||||
target:
|
||||
entity_id: light.living_room
|
||||
|
||||
# Bad
|
||||
actions:
|
||||
action: light.turn_on
|
||||
target:
|
||||
entity_id: light.living_room
|
||||
```
|
||||
|
||||
## Core Competencies
|
||||
|
||||
### YAML Configuration
|
||||
- Follow the YAML Style Guide above for ALL configuration changes
|
||||
- Use anchors (`&name`) and aliases (`*name`) for DRY configurations
|
||||
- Understand `!include`, `!include_dir_named`, `!include_dir_list`, `!include_dir_merge_named`, `!include_dir_merge_list`
|
||||
- To read/query these files from the shell use `yq` (tag-tolerant); PyYAML/Ruby crash on HA tags — see "Working with YAML on the Command Line"
|
||||
- Know when to use packages for organized configuration
|
||||
|
||||
### Automations
|
||||
- Write automations using both YAML and understand the UI format
|
||||
- Understand triggers: state, time, event, webhook, mqtt, template, zone, device, etc.
|
||||
- Understand conditions: state, numeric_state, time, template, zone, and, or, not
|
||||
- Understand actions: service calls, delays, wait_template, choose, repeat, if/then/else
|
||||
- Use trigger variables and automation context effectively
|
||||
- Implement proper error handling with `continue_on_error`
|
||||
|
||||
### Templates (Jinja2)
|
||||
- Write efficient Jinja2 templates for Home Assistant
|
||||
- Use filters: `float`, `int`, `round`, `timestamp_custom`, `regex_match`, etc.
|
||||
- Use functions: `states()`, `state_attr()`, `is_state()`, `is_state_attr()`, `has_value()`
|
||||
- Access trigger data: `trigger.to_state`, `trigger.from_state`, `trigger.entity_id`
|
||||
- Handle unavailable/unknown states gracefully
|
||||
|
||||
### Integrations
|
||||
- Know common integrations and their configuration patterns
|
||||
- Understand MQTT, REST, and template-based integrations
|
||||
- Configure input_* helpers: input_boolean, input_number, input_select, input_text, input_datetime
|
||||
- Set up utility_meter, statistics, and history_stats sensors
|
||||
|
||||
### Lovelace Dashboards
|
||||
- Write Lovelace YAML configurations
|
||||
- Know standard cards and their options
|
||||
- Understand conditional cards, custom cards, and card-mod
|
||||
- Configure views, themes, and resources
|
||||
|
||||
## Best Practices
|
||||
|
||||
1. **Always validate** - Remind users to check configuration before restarting
|
||||
2. **Use secrets** - Never hardcode sensitive data; use `!secret` references
|
||||
3. **Backup first** - Suggest backups before major changes
|
||||
4. **Incremental changes** - Make small, testable changes
|
||||
5. **Comments** - Add YAML comments explaining complex logic
|
||||
6. **Naming conventions** - Use consistent entity_id naming (e.g., `sensor.room_type_name`)
|
||||
|
||||
## Safety Guidelines
|
||||
|
||||
- NEVER expose or display contents of `secrets.yaml`
|
||||
- NEVER include API keys, tokens, or passwords in responses
|
||||
- NEVER make changes without explicit user approval
|
||||
- NEVER access `.storage/`, `.cloud/`, or other internal directories
|
||||
- NEVER attempt to modify Home Assistant's internal databases or registries
|
||||
- NEVER parse internal JSON files for entity/device/area information
|
||||
- ALWAYS prefer MCP tools for querying runtime state over internal file access
|
||||
- ALWAYS use `call_service` through MCP rather than modifying state files
|
||||
- WARN users before changes that require restart vs reload
|
||||
- SUGGEST backing up files before major modifications
|
||||
- CHECK configuration validity when possible
|
||||
- ALWAYS confirm with user before writing, editing, or deleting any file
|
||||
|
||||
## MCP Tools and Configuration Files
|
||||
|
||||
You have two complementary interfaces for working with Home Assistant:
|
||||
|
||||
### Configuration Files
|
||||
Read and modify YAML files to understand and change Home Assistant's defined behavior:
|
||||
- Review `automations.yaml` to understand existing automations
|
||||
- Edit `configuration.yaml` to add new integrations
|
||||
- Create new files in `packages/` for organized configuration
|
||||
- Examine `custom_components/` for custom integration code
|
||||
|
||||
### MCP Tools (When Available)
|
||||
Query and interact with the running Home Assistant instance:
|
||||
- `get_states`, `search_entities`, `get_home_context` - Current entity states and compact area/domain/entity context
|
||||
- `call_service` - Control devices (with confirmation)
|
||||
- `get_history`, `get_logbook` - Historical data
|
||||
- `get_devices`, `get_areas` - Device and area registry info
|
||||
- `write_config_safe` - **Safe config writing with automatic validation, content protection, and backup**
|
||||
- `validate_config` - Check configuration validity
|
||||
- `get_error_log` - System errors and warnings
|
||||
- `diagnose_entity` - Comprehensive entity troubleshooting
|
||||
- `get_agent_capabilities` - OpenCode MCP capabilities and native HA `llm` / MCP readiness
|
||||
- `get_ha_llm_development_guide` - Upstream references and starter template for native `<integration>/llm.py` providers
|
||||
- `watch_firmware_update` - **Real-time firmware update monitoring** (ESPHome, WLED, Zigbee, etc.)
|
||||
- `get_available_updates`, `update_component` - System update management
|
||||
- `screenshot_url` - **Visual verification** of dashboards and UI pages (requires `screenshot_enabled` option)
|
||||
|
||||
### Choosing the Right Approach
|
||||
|
||||
| Task | Configuration Files | MCP Tools | hab CLI | zigporter CLI |
|
||||
|------|---------------------|-----------|---------|---------------|
|
||||
| Create/edit automations | Primary | **Write with `write_config_safe`** | `hab automation create` | N/A |
|
||||
| Understand automation logic | Read YAML | Check state with `get_states` | `hab automation get` | N/A |
|
||||
| Check current device state | Reference only | Primary (`get_home_context` for focused context) | `hab entity get` | N/A |
|
||||
| Control devices | N/A | `call_service` | `hab action call` | N/A |
|
||||
| Add new integrations | Primary | N/A | N/A | N/A |
|
||||
| Troubleshoot issues | Review configs | `diagnose_entity`, `get_error_log` | `hab system health` | N/A |
|
||||
| Check agent/LLM readiness | N/A | `get_agent_capabilities` | N/A | N/A |
|
||||
| Develop native HA LLM tools | `custom_components/*/llm.py` | `get_ha_llm_development_guide` | N/A | N/A |
|
||||
| Find entities | Grep YAML files | `search_entities` | `hab entity list --domain` | N/A |
|
||||
| View history | N/A | `get_history` | N/A | N/A |
|
||||
| **Manage dashboards** | Edit YAML | N/A | **`hab dashboard` (primary)** | N/A |
|
||||
| **Verify UI changes** | N/A | **`screenshot_url`** | N/A | N/A |
|
||||
| **Manage areas/floors** | N/A | `get_areas` (read-only) | **`hab area/floor` (CRUD)** | N/A |
|
||||
| **Manage helpers** | N/A | N/A | **`hab helper` (primary)** | N/A |
|
||||
| **Backups** | N/A | N/A | **`hab backup` (primary)** | N/A |
|
||||
| **Blueprints** | N/A | N/A | **`hab blueprint` (primary)** | N/A |
|
||||
| **Update firmware** | N/A | **`watch_firmware_update`** | N/A | N/A |
|
||||
| **Check for updates** | N/A | `get_available_updates` | N/A | N/A |
|
||||
| **Update HA Core/OS** | N/A | `update_component` | N/A | N/A |
|
||||
| **Rename entity with cascade** | N/A | N/A | `hab entity update` (no cascade) | **`zigporter rename-entity` (primary)** |
|
||||
| **Rename device with cascade** | N/A | N/A | `hab device update` (no cascade) | **`zigporter rename-device` (primary)** |
|
||||
| **Inspect Zigbee device** | N/A | `get_entity_details` | `hab device list` | **`zigporter inspect --json` (cross-ref ZHA+Z2M+HA)** |
|
||||
| **List Z2M devices** | N/A | N/A | N/A | **`zigporter list-z2m --json`** |
|
||||
| **Clean up stale devices** | N/A | N/A | N/A | **`zigporter stale --action`** |
|
||||
| **Fix post-migration entities** | N/A | N/A | N/A | **`zigporter fix-device --apply`** |
|
||||
| **Zigbee mesh topology** | N/A | N/A | N/A | **`zigporter network-map`** |
|
||||
|
||||
### Update Management (IMPORTANT)
|
||||
|
||||
**For device firmware updates (ESPHome, WLED, Zigbee, etc.):**
|
||||
Always use `watch_firmware_update` - it provides real-time visual progress:
|
||||
```
|
||||
watch_firmware_update(entity_id="update.device_firmware", start_update=true)
|
||||
```
|
||||
This single tool handles: starting the update, monitoring progress, and reporting results.
|
||||
|
||||
**For system updates (Core, OS, Supervisor, Apps):**
|
||||
```
|
||||
1. get_available_updates() -> Check what needs updating
|
||||
2. update_component(component="core") -> Start update (returns job_id)
|
||||
3. get_update_progress(job_id="...") -> Monitor progress
|
||||
```
|
||||
|
||||
**Both approaches are valid and complementary.** Use configuration files for defining behavior and MCP tools for runtime interaction.
|
||||
|
||||
## Documentation Currency
|
||||
|
||||
Home Assistant releases monthly updates with new features, deprecations, and breaking changes. Your training data may be outdated. **Always verify configuration syntax against current documentation.**
|
||||
|
||||
### Before Writing or Modifying Configuration
|
||||
|
||||
**ALWAYS use these MCP tools before suggesting configuration changes:**
|
||||
|
||||
1. **Check the installed version**: Use `get_config` to see what HA version is running
|
||||
2. **Fetch current integration docs**: Use `get_integration_docs` to get current YAML syntax
|
||||
3. **Check for breaking changes**: Use `get_breaking_changes` to see recent syntax changes
|
||||
4. **Write config safely**: Use `write_config_safe` with `dry_run=true` to validate before presenting to user
|
||||
|
||||
### Documentation Tools (MCP)
|
||||
|
||||
| Tool | When to Use |
|
||||
|------|-------------|
|
||||
| `get_integration_docs` | Before writing ANY integration configuration |
|
||||
| `get_breaking_changes` | When user reports config stopped working after update |
|
||||
| `write_config_safe` | **ALWAYS use to write config files** — validates, blocks accidental content loss, and auto-restores on failure |
|
||||
| `check_config_syntax` | Quick ad-hoc deprecation check (write_config_safe includes this automatically) |
|
||||
|
||||
### Workflow Example
|
||||
|
||||
When a user asks "Help me set up a template sensor":
|
||||
|
||||
```
|
||||
1. get_config() -> Check HA version (e.g., 2024.12.1)
|
||||
2. get_integration_docs("template") -> Get current syntax and examples
|
||||
3. read_file(path) -> Read the EXISTING file content first
|
||||
4. Draft configuration: include ALL existing content + new changes
|
||||
5. write_config_safe(path, yaml, dry_run=true) -> Pre-validate everything
|
||||
6. If errors: fix and repeat step 5
|
||||
7. Present validated config to user and get approval
|
||||
8. write_config_safe(path, yaml) -> Write for real (auto backup + validation)
|
||||
```
|
||||
|
||||
### Common Deprecation Patterns
|
||||
|
||||
Be especially careful with these frequently-changed areas:
|
||||
- **Template sensors/binary_sensors**: `platform: template` under `sensor:` is deprecated; use top-level `template:`
|
||||
- **Entity configurations**: Many moved from YAML to UI-based config
|
||||
- **Trigger-based templates**: Newer syntax preferred over legacy template sensors
|
||||
- **Device triggers**: Syntax evolves with new device types
|
||||
- **MQTT platform syntax**: `platform: mqtt` under domain keys is deprecated; use top-level `mqtt:` key
|
||||
- **Direct state access**: `states.sensor.x.state` is fragile; use `states('sensor.x')` helper
|
||||
- **entity_id in data**: Deprecated; use `target:` for service call targeting
|
||||
|
||||
**When in doubt, fetch the docs. Never rely solely on training data for configuration syntax.**
|
||||
|
||||
## Common Tasks
|
||||
|
||||
### Creating an Automation
|
||||
1. **Read the existing `automations.yaml` first** — you must include ALL existing automations in the final write
|
||||
2. Understand the goal and identify trigger conditions
|
||||
3. Determine required entities (search if MCP available)
|
||||
4. Draft the automation YAML with clear comments
|
||||
5. **Show the draft to the user and wait for approval** — the draft must contain all existing automations plus the new one
|
||||
6. Only write the file after explicit user confirmation
|
||||
7. Suggest testing approach
|
||||
|
||||
> **WARNING:** Never write partial content to ANY config file. Always read the existing file first and include ALL existing content in your write. `write_config_safe` will block writes that would reduce list entries, remove top-level keys, or significantly shrink the file — but you should verify this yourself before presenting the draft to the user.
|
||||
|
||||
### Troubleshooting
|
||||
1. Check entity states and history (via MCP if available)
|
||||
2. Review relevant configuration files
|
||||
3. Check Home Assistant logs for errors
|
||||
4. Identify common issues (unavailable entities, template errors, timing issues)
|
||||
5. **Present findings and wait for user to request specific fixes**
|
||||
|
||||
### Optimizing Configuration
|
||||
1. Identify redundant or inefficient patterns
|
||||
2. **Present recommendations to user**
|
||||
3. Wait for user to approve specific changes
|
||||
4. Implement only the changes the user explicitly approves
|
||||
@@ -0,0 +1,28 @@
|
||||
# Downstairs Bathroom Light - Debug Session (2026-07-24)
|
||||
|
||||
## Issue
|
||||
Motion sensor triggers but bathroom light has a 20-30 second delay turning on.
|
||||
|
||||
## Key Entities
|
||||
- `automation.downstairs_bathroom_light_contro` — automation (mode: restart, working correctly)
|
||||
- `binary_sensor.downstairs_bathroom_occupancy` — Third Reality Zigbee motion sensor (Z2M)
|
||||
- `switch.downstairs_bathroom_switch` — TP-Link HS200 (exposed via Homebridge)
|
||||
- `light.bathroom_light` — TP-Link HS220 dimmer (separate device, NOT controlled by automation)
|
||||
|
||||
## Findings
|
||||
1. Automation logic is correct — triggers on occupancy on/off, 30-min timeout, mode restart
|
||||
2. Automation IS firing and switch IS turning on (confirmed via history)
|
||||
3. The delay is between automation trigger and switch responding — suggests Homebridge communication delay
|
||||
4. No other HA automations reference this switch
|
||||
5. User confirmed no HomeKit/TP-Link app automations interfering
|
||||
6. User tried restarting Homebridge — delay persisted
|
||||
7. User was about to restart entire HA server to test
|
||||
|
||||
## Resolution (2026-07-23)
|
||||
Full HA server restart resolved the issue. Post-reboot trigger-to-action times are all under 0.5s.
|
||||
The delay was caused by a stale Homebridge WebSocket connection to the TP-Link HS200.
|
||||
|
||||
## Next Steps If Issue Recurs
|
||||
- Check Homebridge logs for TP-Link communication errors
|
||||
- Consider switching automation to control `light.bathroom_light` (HS220) directly if TP-Link integration is available
|
||||
- Check if Homebridge add-on needs update
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
alias: 'Tablet: Dim Screen at Night'
|
||||
description: Drops tablet brightness to zero at night
|
||||
triggers:
|
||||
- at: 01:00:00
|
||||
- at: 00:00:00
|
||||
trigger: time
|
||||
actions:
|
||||
- action: notify.mobile_app_sm_t387w
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"domain": "cafe",
|
||||
"name": "C.A.F.E.",
|
||||
"version": "0.7.0",
|
||||
"codeowners": [],
|
||||
"config_flow": true,
|
||||
"dependencies": ["frontend", "http"],
|
||||
"documentation": "https://github.com/FezVrasta/cafe-hass",
|
||||
"documentation_url": "https://github.com/FezVrasta/cafe-hass",
|
||||
"integration_type": "service",
|
||||
"iot_class": "local_push",
|
||||
"issue_tracker": "https://github.com/FezVrasta/cafe-hass/issues",
|
||||
"requirements": []
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"config": {
|
||||
"title": "C.A.F.E.",
|
||||
"step": {
|
||||
"user": {
|
||||
"title": "Set up C.A.F.E.",
|
||||
"description": "C.A.F.E. is a visual automation editor for Home Assistant. It allows you to create and manage your automations using a visual flow editor.\n\nClick Submit to add C.A.F.E. to your Home Assistant."
|
||||
}
|
||||
},
|
||||
"abort": {
|
||||
"already_configured": "C.A.F.E. is already configured"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"config": {
|
||||
"title": "C.A.F.E.",
|
||||
"step": {
|
||||
"user": {
|
||||
"title": "Set up C.A.F.E.",
|
||||
"description": "C.A.F.E. is a visual automation editor for Home Assistant. It allows you to create and manage your automations using a visual flow editor.\n\nClick Submit to add C.A.F.E. to your Home Assistant."
|
||||
}
|
||||
},
|
||||
"abort": {
|
||||
"already_configured": "C.A.F.E. is already configured"
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,2 @@
|
||||
var d=Object.defineProperty;var o=(t,s,e)=>s in t?d(t,s,{enumerable:!0,configurable:!0,writable:!0,value:e}):t[s]=e;var h=(t,s,e)=>o(t,typeof s!="symbol"?s+"":s,e);class m extends HTMLElement{constructor(){super(...arguments);h(this,"_messageHandler");h(this,"iframe",null);h(this,"_hass")}set hass(e){var a;this._hass=e,window.hass=e;const i=(a=this.iframe)==null?void 0:a.contentWindow;i!=null&&i.setHass&&i.setHass(e)}get hass(){return this._hass}connectedCallback(){var a,n;this.style.display="block",this.style.width="100%",this.style.height="100%",this.style.position="relative";const i=((n=(a=this._hass)==null?void 0:a.themes)==null?void 0:n.darkMode)??!1?"hsl(222.2, 84%, 4.9%)":"hsl(0, 0%, 100%)";this.iframe=document.createElement("iframe"),this.iframe.src="/cafe-hass/index.html",this.iframe.style.width="100%",this.iframe.style.height="100%",this.iframe.style.border="none",this.iframe.style.display="block",this.iframe.style.background=i,this.iframe.setAttribute("allow","clipboard-read *; clipboard-write *"),this.appendChild(this.iframe),this._messageHandler=r=>{var l;r.source===((l=this.iframe)==null?void 0:l.contentWindow)&&r.data&&r.data.type==="CAFE_TOGGLE_SIDEBAR"&&this.dispatchEvent(new Event("hass-toggle-menu",{bubbles:!0,composed:!0}))},window.addEventListener("message",this._messageHandler)}disconnectedCallback(){this.iframe&&(this.removeChild(this.iframe),this.iframe=null),window.hass=void 0,this._messageHandler&&(window.removeEventListener("message",this._messageHandler),this._messageHandler=void 0)}}customElements.get("cafe-panel")||customElements.define("cafe-panel",m);
|
||||
//# sourceMappingURL=panel-wrapper.js.map
|
||||
@@ -0,0 +1,811 @@
|
||||
{
|
||||
"maintenance": "Karbantartás",
|
||||
"objects": "Objektumok",
|
||||
"tasks": "Feladatok",
|
||||
"overdue": "Lejárt",
|
||||
"due_soon": "Hamarosan esedékes",
|
||||
"triggered": "Aktiválva",
|
||||
"trigger_replaced": "Kiváltó lecserélve",
|
||||
"ok": "OK",
|
||||
"all": "Összes",
|
||||
"new_object": "+ Új objektum",
|
||||
"templates_from": "Sablonból",
|
||||
"templates_title": "Kezdés sablonból",
|
||||
"templates_task_count": "{n} feladat",
|
||||
"template_created": "Létrehozva sablonból",
|
||||
"onboard_hint": "Adja hozzá az első objektumot a karbantartások nyomon követéséhez.",
|
||||
"edit": "Szerkesztés",
|
||||
"duplicate": "Duplikálás",
|
||||
"task_duplicated": "Feladat duplikálva",
|
||||
"object_duplicated": "Objektum duplikálva",
|
||||
"delete": "Törlés",
|
||||
"add_task": "+ Új feladat",
|
||||
"complete": "Elvégzés",
|
||||
"completed": "Elvégezve",
|
||||
"skip": "Kihagyás",
|
||||
"skipped": "Kihagyva",
|
||||
"missed": "Elmulasztva",
|
||||
"reset": "Visszaállítás",
|
||||
"snooze": "Szundi",
|
||||
"snoozed": "Szundiztatva",
|
||||
"cancel": "Mégse",
|
||||
"bulk_select": "Kijelölés",
|
||||
"bulk_select_all": "Összes kijelölése",
|
||||
"bulk_n_selected": "{n} kijelölve",
|
||||
"bulk_completed": "{n} feladat elvégezve",
|
||||
"bulk_archived": "{n} feladat archiválva",
|
||||
"completing": "Elvégzés…",
|
||||
"interval": "Intervallum",
|
||||
"warning": "Figyelmeztetés",
|
||||
"last_performed": "Utoljára elvégezve",
|
||||
"next_due": "Következő esedékesség",
|
||||
"days_until_due": "Napok az esedékességig",
|
||||
"avg_duration": "Átl. időtartam",
|
||||
"trigger": "Kiváltó",
|
||||
"trigger_type": "Kiváltó típusa",
|
||||
"threshold_above": "Felső határ",
|
||||
"threshold_below": "Alsó határ",
|
||||
"threshold": "Küszöbérték",
|
||||
"counter": "Számláló",
|
||||
"state_change": "Állapotváltozás",
|
||||
"runtime": "Üzemidő",
|
||||
"runtime_hours": "Cél üzemidő (óra)",
|
||||
"target_value": "Célérték",
|
||||
"baseline": "Kiindulási érték",
|
||||
"target_changes": "Cél változásszám",
|
||||
"for_minutes": "Ennyi ideig (perc)",
|
||||
"time_based": "Időalapú",
|
||||
"sensor_based": "Érzékelőalapú",
|
||||
"manual": "Kézi",
|
||||
"one_time": "Egyszeri",
|
||||
"weekdays": "Hét napjai",
|
||||
"nth_weekday": "A hónap n. hétnapja",
|
||||
"day_of_month": "A hónap napja",
|
||||
"recurrence_on_days": "Ismétlés ezeken a napokon",
|
||||
"recurrence_occurrence": "Előfordulás",
|
||||
"recurrence_weekday": "Hét napja",
|
||||
"recurrence_day": "A hónap napja (1–31)",
|
||||
"recurrence_last_day": "A hónap utolsó napja",
|
||||
"recurrence_business_day": "Csak munkanapokon (hétvégéről visszalépve)",
|
||||
"recurrence_offset": "Eltolás (nap, ±)",
|
||||
"recurrence_offset_help": "A dátum eltolása ±N nappal, pl. -2 = két nappal korábban.",
|
||||
"last_day_month": "A hónap utolsó napja",
|
||||
"last_business_day_month": "Utolsó munkanap",
|
||||
"ord_1": "1.",
|
||||
"ord_2": "2.",
|
||||
"ord_3": "3.",
|
||||
"ord_4": "4.",
|
||||
"ord_5": "5.",
|
||||
"ord_last": "Utolsó",
|
||||
"day_word": "Nap",
|
||||
"interval_value": "Intervallum",
|
||||
"interval_unit": "Egység",
|
||||
"unit_days": "Nap",
|
||||
"unit_weeks": "Hét",
|
||||
"unit_months": "Hónap",
|
||||
"unit_years": "Év",
|
||||
"due_date": "Határidő",
|
||||
"cleaning": "Tisztítás",
|
||||
"inspection": "Ellenőrzés",
|
||||
"replacement": "Csere",
|
||||
"calibration": "Kalibrálás",
|
||||
"service": "Szerviz",
|
||||
"reading": "Leolvasás",
|
||||
"custom": "Egyéni",
|
||||
"history": "Előzmények",
|
||||
"cost": "Költség",
|
||||
"report_button": "Jelentés",
|
||||
"report_title": "Karbantartási jelentés",
|
||||
"report_generated": "Létrehozva",
|
||||
"report_times_done": "Elvégezve",
|
||||
"report_total_cost": "Összköltség",
|
||||
"report_every": "minden {n}. {unit}",
|
||||
"report_notes": "Megjegyzések",
|
||||
"report_col_type": "Típus",
|
||||
"report_col_status": "Állapot",
|
||||
"report_col_schedule": "Ütemezés",
|
||||
"duration": "Időtartam",
|
||||
"both": "Mindkettő",
|
||||
"trigger_val": "Kiváltó érték",
|
||||
"complete_title": "Elvégzés: ",
|
||||
"checklist": "Ellenőrzőlista",
|
||||
"checklist_steps_optional": "Ellenőrzőlista lépései (opcionális)",
|
||||
"checklist_placeholder": "Szűrő tisztítása\nTömítés cseréje\nNyomáspróba",
|
||||
"checklist_help": "Soronként egy lépés. Legfeljebb 100 elem.",
|
||||
"err_too_long": "{field}: túl hosszú (max. {n} karakter)",
|
||||
"err_too_short": "{field}: túl rövid (min. {n} karakter)",
|
||||
"err_value_too_high": "{field}: túl nagy (max. {n})",
|
||||
"err_value_too_low": "{field}: túl kicsi (min. {n})",
|
||||
"err_required": "{field}: kötelező",
|
||||
"err_wrong_type": "{field}: hibás típus (várt: {type})",
|
||||
"err_invalid_choice": "{field}: nem megengedett érték",
|
||||
"err_invalid_value": "{field}: érvénytelen érték",
|
||||
"feat_schedule_time": "Napszakhoz kötött ütemezés",
|
||||
"feat_schedule_time_desc": "A feladatok nem éjfélkor, hanem egy megadott napszakban válnak lejárttá.",
|
||||
"schedule_time_optional": "Esedékesség időpontja (opcionális, ÓÓ:PP)",
|
||||
"schedule_time_help": "Üres = éjfél (alapértelmezés). HA időzóna.",
|
||||
"at_time": "ekkor:",
|
||||
"notes_optional": "Megjegyzések (opcionális)",
|
||||
"cost_optional": "Költség (opcionális)",
|
||||
"duration_minutes": "Időtartam percben (opcionális)",
|
||||
"days": "nap",
|
||||
"day": "nap",
|
||||
"today": "Ma",
|
||||
"d_overdue": "napja lejárt",
|
||||
"no_tasks": "Még nincsenek karbantartási feladatok. Első lépésként hozzon létre egy objektumot.",
|
||||
"no_tasks_short": "Nincs feladat",
|
||||
"no_history": "Még nincsenek előzmények.",
|
||||
"show_all": "Összes megjelenítése",
|
||||
"cost_duration_chart": "Költség és időtartam",
|
||||
"installed": "Telepítve",
|
||||
"confirm_delete_object": "Törli az objektumot az összes feladatával együtt?",
|
||||
"confirm_delete_task": "Törli ezt a feladatot?",
|
||||
"min": "Min",
|
||||
"max": "Max",
|
||||
"save": "Mentés",
|
||||
"saving": "Mentés…",
|
||||
"edit_task": "Feladat szerkesztése",
|
||||
"new_task": "Új karbantartási feladat",
|
||||
"task_name": "Feladat neve",
|
||||
"maintenance_type": "Karbantartás típusa",
|
||||
"priority": "Prioritás",
|
||||
"labels": "Címkék",
|
||||
"labels_placeholder": "pl. biztonság, szezonális, bérlőnek látható",
|
||||
"labels_help": "Vesszővel elválasztott címkék szűréshez és jelentésekhez.",
|
||||
"priority_low": "Alacsony",
|
||||
"priority_normal": "Normál",
|
||||
"priority_high": "Magas",
|
||||
"schedule_type": "Ütemezés típusa",
|
||||
"interval_days": "Intervallum (nap)",
|
||||
"warning_days": "Figyelmeztetési napok",
|
||||
"earliest_completion_days": "Legkorábbi elvégzés (nappal az esedékesség előtt)",
|
||||
"earliest_completion_days_help": "Hagyja üresen, ha bármikor elvégezhető. 0 = csak az esedékesség napján vagy utána.",
|
||||
"last_performed_optional": "Utoljára elvégezve (opcionális)",
|
||||
"interval_anchor": "Intervallum horgonya",
|
||||
"anchor_completion": "Az elvégzés dátumától",
|
||||
"anchor_planned": "A tervezett dátumtól (nincs csúszás)",
|
||||
"edit_object": "Objektum szerkesztése",
|
||||
"name": "Név",
|
||||
"manufacturer_optional": "Gyártó (opcionális)",
|
||||
"model_optional": "Modell (opcionális)",
|
||||
"serial_number_optional": "Sorozatszám (opcionális)",
|
||||
"serial_number_label": "Sorozatszám",
|
||||
"documentation_url_label": "Kézikönyv",
|
||||
"object_notes_label": "Megjegyzések",
|
||||
"sort_due_date": "Határidő",
|
||||
"sort_object": "Objektum neve",
|
||||
"sort_type": "Típus",
|
||||
"sort_task_name": "Feladat neve",
|
||||
"all_objects": "Minden objektum",
|
||||
"tasks_lower": "feladat",
|
||||
"no_tasks_yet": "Még nincs feladat",
|
||||
"add_first_task": "Első feladat hozzáadása",
|
||||
"trigger_configuration": "Kiváltó beállítása",
|
||||
"entity_id": "Entitásazonosító",
|
||||
"comma_separated": "vesszővel elválasztva",
|
||||
"entity_logic": "Entitáslogika",
|
||||
"entity_logic_any": "Bármely entitás kivált",
|
||||
"entity_logic_all": "Minden entitásnak ki kell váltania",
|
||||
"entities": "entitás",
|
||||
"attribute_optional": "Attribútum (opcionális, üres = állapot)",
|
||||
"use_entity_state": "Entitás állapotának használata (attribútum nélkül)",
|
||||
"trigger_above": "Kiváltás e fölött",
|
||||
"trigger_below": "Kiváltás ez alatt",
|
||||
"for_at_least_minutes": "Legalább ennyi ideig (perc)",
|
||||
"safety_interval_days": "Biztonsági intervallum (nap, opcionális)",
|
||||
"safety_interval": "Biztonsági intervallum (opcionális)",
|
||||
"delta_mode": "Delta mód",
|
||||
"from_state_optional": "Kezdő állapot (opcionális)",
|
||||
"to_state_optional": "Célállapot (opcionális)",
|
||||
"documentation_url_optional": "Dokumentáció URL (opcionális)",
|
||||
"object_notes_optional": "Megjegyzések (opcionális)",
|
||||
"nfc_tag_id_optional": "NFC címke azonosító (opcionális)",
|
||||
"nfc_tags_empty_help": "Még nincs NFC címke regisztrálva a Home Assistantban.",
|
||||
"nfc_tags_open_settings": "Címkebeállítások megnyitása",
|
||||
"nfc_tags_refresh": "Frissítés",
|
||||
"environmental_entity_optional": "Környezeti érzékelő (opcionális)",
|
||||
"environmental_entity_helper": "pl. sensor.outdoor_temperature — a környezeti feltételek alapján igazítja az intervallumot",
|
||||
"environmental_attribute_optional": "Környezeti attribútum (opcionális)",
|
||||
"nfc_tag_id": "NFC címke azonosító",
|
||||
"nfc_linked": "NFC címke hozzárendelve",
|
||||
"nfc_link_hint": "Kattintson az NFC címke hozzárendeléséhez",
|
||||
"responsible_user": "Felelős felhasználó",
|
||||
"shared_with": "Megosztva (rotáció)",
|
||||
"shared_with_help": "Válasszon több személyt a feladat megosztásához; a felelős minden elvégzés után váltakozik.",
|
||||
"rotation_strategy": "Rotáció",
|
||||
"rotation_none": "Nincs rotáció",
|
||||
"rotation_round_robin": "Körforgás",
|
||||
"rotation_least_completed": "Legkevesebbet végezte",
|
||||
"rotation_random": "Véletlenszerű",
|
||||
"no_user_assigned": "(Nincs felhasználó hozzárendelve)",
|
||||
"all_users": "Minden felhasználó",
|
||||
"my_tasks": "Saját feladataim",
|
||||
"tab_calendar": "Naptár",
|
||||
"cal_no_events": "Nincs karbantartás",
|
||||
"cal_window_7": "7 nap",
|
||||
"cal_window_14": "14 nap",
|
||||
"cal_window_30": "30 nap",
|
||||
"cal_window_365": "1 év",
|
||||
"cal_every_n_days": "{n} naponta",
|
||||
"cal_source_time": "Időalapú",
|
||||
"cal_source_time_adaptive": "Időalapú (adaptív)",
|
||||
"cal_source_sensor": "Érzékelőalapú",
|
||||
"cal_predicted": "előrejelzett",
|
||||
"cal_confidence_high": "nagy megbízhatóság",
|
||||
"cal_confidence_medium": "közepes megbízhatóság",
|
||||
"cal_confidence_low": "alacsony megbízhatóság",
|
||||
"budget_monthly": "Havi költségkeret",
|
||||
"budget_yearly": "Éves költségkeret",
|
||||
"groups": "Csoportok",
|
||||
"new_group": "Új csoport",
|
||||
"edit_group": "Csoport szerkesztése",
|
||||
"no_groups": "Még nincsenek csoportok",
|
||||
"delete_group": "Csoport törlése",
|
||||
"delete_group_confirm": "Törli a(z) „{name}” csoportot?",
|
||||
"group_select_tasks": "Feladatok kiválasztása",
|
||||
"group_name_required": "A név megadása kötelező",
|
||||
"description_optional": "Leírás (opcionális)",
|
||||
"selected": "Kiválasztva",
|
||||
"loading_chart": "Diagramadatok betöltése…",
|
||||
"hide_outliers": "Kiugró értékek elrejtése (érzékelőhibák)",
|
||||
"was_maintenance_needed": "Szükség volt erre a karbantartásra?",
|
||||
"feedback_needed": "Szükséges volt",
|
||||
"feedback_not_needed": "Nem volt szükséges",
|
||||
"feedback_not_sure": "Nem biztos",
|
||||
"suggested_interval": "Javasolt intervallum",
|
||||
"apply_suggestion": "Alkalmaz",
|
||||
"reanalyze": "Újraelemzés",
|
||||
"reanalyze_result": "Új elemzés",
|
||||
"reanalyze_insufficient_data": "Nincs elég adat ajánlás készítéséhez",
|
||||
"data_points": "adatpont",
|
||||
"dismiss_suggestion": "Elvetés",
|
||||
"confidence_low": "Alacsony",
|
||||
"confidence_medium": "Közepes",
|
||||
"confidence_high": "Magas",
|
||||
"recommended": "ajánlott",
|
||||
"seasonal_awareness": "Szezonális igazodás",
|
||||
"edit_seasonal_overrides": "Szezonális tényezők szerkesztése",
|
||||
"seasonal_overrides_title": "Szezonális tényezők (felülbírálat)",
|
||||
"seasonal_overrides_hint": "Tényező havonta (0,1–5,0). Üres = automatikusan tanult.",
|
||||
"seasonal_override_invalid": "Érvénytelen érték",
|
||||
"seasonal_override_range": "A tényezőnek 0,1 és 5,0 között kell lennie",
|
||||
"clear_all": "Összes törlése",
|
||||
"seasonal_chart_title": "Szezonális tényezők",
|
||||
"seasonal_learned": "Tanult",
|
||||
"seasonal_manual": "Kézi",
|
||||
"month_jan": "Jan",
|
||||
"month_feb": "Febr",
|
||||
"month_mar": "Márc",
|
||||
"month_apr": "Ápr",
|
||||
"month_may": "Máj",
|
||||
"month_jun": "Jún",
|
||||
"month_jul": "Júl",
|
||||
"month_aug": "Aug",
|
||||
"month_sep": "Szept",
|
||||
"month_oct": "Okt",
|
||||
"month_nov": "Nov",
|
||||
"month_dec": "Dec",
|
||||
"sensor_prediction": "Érzékelő-előrejelzés",
|
||||
"degradation_trend": "Trend",
|
||||
"trend_rising": "Emelkedő",
|
||||
"trend_falling": "Csökkenő",
|
||||
"trend_stable": "Stabil",
|
||||
"trend_insufficient_data": "Nincs elég adat",
|
||||
"days_until_threshold": "Napok a küszöbértékig",
|
||||
"threshold_exceeded": "Küszöbérték túllépve",
|
||||
"environmental_adjustment": "Környezeti tényező",
|
||||
"sensor_prediction_urgency": "Az érzékelő ~{days} napon belül jelzi a küszöbérték elérését",
|
||||
"day_short": "nap",
|
||||
"weibull_reliability_curve": "Megbízhatósági görbe",
|
||||
"weibull_failure_probability": "Meghibásodási valószínűség",
|
||||
"weibull_r_squared": "Illeszkedés R²",
|
||||
"beta_early_failures": "Korai meghibásodások",
|
||||
"beta_random_failures": "Véletlen meghibásodások",
|
||||
"beta_wear_out": "Elhasználódás",
|
||||
"beta_highly_predictable": "Jól előrejelezhető",
|
||||
"confidence_interval": "Konfidenciaintervallum",
|
||||
"confidence_conservative": "Konzervatív",
|
||||
"confidence_aggressive": "Optimista",
|
||||
"current_interval_marker": "Jelenlegi intervallum",
|
||||
"recommended_marker": "Ajánlott",
|
||||
"characteristic_life": "Karakterisztikus élettartam",
|
||||
"chart_mini_sparkline": "Trendvonal",
|
||||
"chart_history": "Költség- és időtartam-előzmények",
|
||||
"chart_seasonal": "Szezonális tényezők, 12 hónap",
|
||||
"chart_weibull": "Weibull megbízhatósági görbe",
|
||||
"chart_sparkline": "Érzékelő kiváltóérték-diagram",
|
||||
"days_progress": "Napok előrehaladása",
|
||||
"qr_code": "QR-kód",
|
||||
"qr_generating": "QR-kód generálása…",
|
||||
"qr_error": "A QR-kód generálása nem sikerült.",
|
||||
"qr_error_no_url": "Nincs HA URL beállítva. Adjon meg külső vagy belső URL-t a Beállítások → Rendszer → Hálózat alatt.",
|
||||
"save_error": "A mentés nem sikerült. Próbálja újra.",
|
||||
"qr_print": "Nyomtatás",
|
||||
"qr_download": "SVG letöltése",
|
||||
"qr_action": "Művelet beolvasáskor",
|
||||
"qr_action_view": "Karbantartási adatok megtekintése",
|
||||
"qr_action_complete": "Karbantartás elvégzettként jelölése",
|
||||
"qr_url_mode": "Hivatkozás típusa",
|
||||
"qr_mode_companion": "Companion alkalmazás",
|
||||
"qr_mode_local": "Helyi (mDNS)",
|
||||
"qr_mode_server": "Szerver URL",
|
||||
"overview": "Áttekintés",
|
||||
"analysis": "Elemzés",
|
||||
"recent_activities": "Legutóbbi tevékenységek",
|
||||
"search_notes": "Keresés a megjegyzésekben",
|
||||
"avg_cost": "Átl. költség",
|
||||
"no_advanced_features": "Nincsenek engedélyezett speciális funkciók",
|
||||
"no_advanced_features_hint": "Az elemzési adatok megjelenítéséhez engedélyezze az „Adaptív ütemezés” vagy a „Szezonális minták” funkciót az integráció beállításaiban.",
|
||||
"analysis_not_enough_data": "Még nincs elég adat az elemzéshez.",
|
||||
"analysis_not_enough_data_hint": "A Weibull-elemzéshez legalább 5 elvégzett karbantartás szükséges; a szezonális minták havi 6+ adatpont után válnak láthatóvá.",
|
||||
"analysis_manual_task_hint": "Az intervallum nélküli kézi feladatok nem termelnek elemzési adatot.",
|
||||
"completions": "elvégzés",
|
||||
"current": "Jelenlegi",
|
||||
"shorter": "Rövidebb",
|
||||
"longer": "Hosszabb",
|
||||
"normal": "Normál",
|
||||
"disabled": "Letiltva",
|
||||
"compound_logic": "Összetett logika",
|
||||
"compound": "Összetett (több feltétel)",
|
||||
"compound_logic_and": "ÉS — minden feltételnek teljesülnie kell",
|
||||
"compound_logic_or": "VAGY — bármely feltétel kivált",
|
||||
"compound_help": "Több érzékelőfeltétel egyetlen kiváltóvá kombinálása.",
|
||||
"compound_no_conditions": "Még nincs feltétel — adjon hozzá legalább egyet.",
|
||||
"compound_add_condition": "Feltétel hozzáadása",
|
||||
"compound_condition": "Feltétel",
|
||||
"compound_remove_condition": "Feltétel eltávolítása",
|
||||
"card_title": "Cím",
|
||||
"card_show_header": "Fejléc megjelenítése statisztikákkal",
|
||||
"card_show_actions": "Műveletgombok megjelenítése",
|
||||
"card_compact": "Kompakt mód",
|
||||
"card_max_items": "Max. elemszám (0 = mind)",
|
||||
"card_filter_status": "Szűrés állapot szerint",
|
||||
"card_filter_status_help": "Üres = minden állapot megjelenik.",
|
||||
"card_filter_objects": "Szűrés objektumok szerint",
|
||||
"card_filter_objects_help": "Üres = minden objektum megjelenik.",
|
||||
"card_filter_entities": "Szűrés entitások szerint (entity_id-k)",
|
||||
"card_filter_entities_help": "Válasszon sensor / binary_sensor entitásokat ebből az integrációból. Üres = mind.",
|
||||
"card_loading_objects": "Objektumok betöltése…",
|
||||
"card_load_error": "Az objektumok betöltése nem sikerült — ellenőrizze a WebSocket-kapcsolatot.",
|
||||
"card_no_tasks_title": "Még nincsenek karbantartási feladatok",
|
||||
"card_no_tasks_cta": "→ Hozzon létre egyet a Karbantartás panelen",
|
||||
"no_objects": "Még nincsenek objektumok.",
|
||||
"action_error": "A művelet nem sikerült. Próbálja újra.",
|
||||
"area_id_optional": "Terület (opcionális)",
|
||||
"installation_date_optional": "Telepítés dátuma (opcionális)",
|
||||
"warranty_expiry_optional": "Garancia lejárta (opcionális)",
|
||||
"warranty": "Garancia",
|
||||
"warranty_valid_until": "érvényes eddig: {date}",
|
||||
"warranty_expires_in": "{days} nap múlva lejár",
|
||||
"warranty_expired": "lejárt",
|
||||
"cal_past_windows": "Korábbi időszakok",
|
||||
"cal_forward_windows": "Jövőbeli időszakok",
|
||||
"history_edit_title": "Előzménybejegyzés szerkesztése",
|
||||
"history_edit_timestamp": "Időbélyeg",
|
||||
"manufacturer": "Gyártó",
|
||||
"model": "Modell",
|
||||
"area": "Terület",
|
||||
"actions": "Műveletek",
|
||||
"view_mode_label": "Nézet",
|
||||
"view_cards": "Kártyanézet",
|
||||
"view_table": "Táblázatnézet",
|
||||
"objects_table_columns_label": "Objektumtáblázat oszlopai",
|
||||
"objects_table_columns_hint": "Válassza ki, mely oszlopok jelenjenek meg az objektumok táblázatnézetében.",
|
||||
"custom_icon_optional": "Ikon (opcionális, pl. mdi:wrench)",
|
||||
"task_enabled": "Feladat engedélyezve",
|
||||
"skip_reason_prompt": "Kihagyja ezt a feladatot?",
|
||||
"reason_optional": "Indoklás (opcionális)",
|
||||
"reset_date_prompt": "Elvégzettként jelöli a feladatot?",
|
||||
"reset_date_optional": "Utolsó elvégzés dátuma (opcionális, alapértelmezés: ma)",
|
||||
"notes_label": "Megjegyzések",
|
||||
"documentation_label": "Dokumentáció",
|
||||
"no_nfc_tag": "— Nincs címke —",
|
||||
"dashboard": "Irányítópult",
|
||||
"tab_today": "Ma",
|
||||
"palette_placeholder": "Objektumok és feladatok keresése…",
|
||||
"palette_no_results": "Nincs találat",
|
||||
"palette_hint": "↑↓ navigálás · Enter megnyitás · Esc bezárás",
|
||||
"today_all_caught_up": "Minden rendben! Ezen a héten nincs esedékes feladat.",
|
||||
"today_overdue": "Lejárt",
|
||||
"today_due_today": "Ma esedékes",
|
||||
"today_this_week": "Ezen a héten",
|
||||
"settings": "Beállítások",
|
||||
"settings_features": "Speciális funkciók",
|
||||
"settings_features_desc": "Speciális funkciók be- és kikapcsolása. A kikapcsolás elrejti őket a felületről, de nem töröl adatot.",
|
||||
"feat_adaptive": "Adaptív ütemezés",
|
||||
"feat_adaptive_desc": "Optimális intervallumok tanulása a karbantartási előzményekből",
|
||||
"feat_predictions": "Érzékelő-előrejelzések",
|
||||
"feat_predictions_desc": "Kiváltási dátumok előrejelzése az érzékelőértékek romlásából",
|
||||
"feat_seasonal": "Szezonális igazítások",
|
||||
"feat_seasonal_desc": "Intervallumok igazítása szezonális minták alapján",
|
||||
"feat_environmental": "Környezeti korreláció",
|
||||
"feat_environmental_desc": "Intervallumok korrelálása hőmérséklettel/páratartalommal",
|
||||
"feat_budget": "Költségkeret követése",
|
||||
"feat_budget_desc": "Havi és éves karbantartási kiadások követése",
|
||||
"feat_groups": "Feladatcsoportok",
|
||||
"feat_groups_desc": "Feladatok logikai csoportokba rendezése",
|
||||
"feat_checklists": "Ellenőrzőlisták",
|
||||
"feat_checklists_desc": "Többlépéses eljárások a feladatok elvégzéséhez",
|
||||
"settings_general": "Általános",
|
||||
"settings_default_warning": "Alapértelmezett figyelmeztetési napok",
|
||||
"settings_panel_enabled": "Oldalsáv-panel",
|
||||
"settings_panel_title": "Oldalsáv-panel címe",
|
||||
"settings_notifications": "Értesítések",
|
||||
"settings_notify_service": "Értesítési szolgáltatás",
|
||||
"test_notification": "Tesztértesítés",
|
||||
"send_test": "Teszt küldése",
|
||||
"testing": "Küldés…",
|
||||
"test_notification_success": "Tesztértesítés elküldve",
|
||||
"test_notification_failed": "A tesztértesítés nem sikerült",
|
||||
"settings_notify_due_soon": "Értesítés, ha hamarosan esedékes",
|
||||
"settings_notify_overdue": "Értesítés lejáratkor",
|
||||
"settings_notify_triggered": "Értesítés kiváltáskor",
|
||||
"settings_interval_hours": "Ismétlési intervallum (óra, 0 = egyszer)",
|
||||
"settings_quiet_hours": "Csendes órák",
|
||||
"settings_quiet_start": "Kezdete",
|
||||
"settings_quiet_end": "Vége",
|
||||
"settings_max_per_day": "Max. értesítés naponta (0 = korlátlan)",
|
||||
"settings_bundling": "Értesítések összevonása",
|
||||
"settings_bundle_threshold": "Összevonási küszöb",
|
||||
"settings_reminder_leads": "Extra emlékeztetők (nappal az esedékesség előtt)",
|
||||
"settings_reminder_leads_hint": "Vesszővel elválasztott napok, pl. 14, 3, 0 — minden egyező napon egy extra emlékeztető megy ki. Üres = kikapcsolva.",
|
||||
"settings_actions": "Mobil műveletgombok",
|
||||
"settings_action_complete": "„Elvégzés” gomb megjelenítése",
|
||||
"settings_action_skip": "„Kihagyás” gomb megjelenítése",
|
||||
"settings_action_snooze": "„Szundi” gomb megjelenítése",
|
||||
"settings_weekly_digest": "Heti összefoglaló",
|
||||
"settings_weekly_digest_hint": "Egyetlen összefoglaló értesítés hétfő reggel, ha vannak esedékes feladatok.",
|
||||
"settings_warranty_reminder": "Garancialejárati emlékeztető",
|
||||
"settings_warranty_reminder_days": "Nappal a lejárat előtt",
|
||||
"settings_warranty_reminder_hint": "Egyszeri értesítés, amikor egy objektum garanciája ennyi napra van a lejárattól.",
|
||||
"settings_snooze_hours": "Szundi időtartama (óra)",
|
||||
"settings_budget": "Költségkeret",
|
||||
"settings_currency": "Pénznem",
|
||||
"settings_budget_monthly": "Havi költségkeret",
|
||||
"settings_budget_yearly": "Éves költségkeret",
|
||||
"settings_budget_alerts": "Költségkeret-riasztások",
|
||||
"settings_budget_threshold": "Riasztási küszöb (%)",
|
||||
"settings_import_export": "Importálás / Exportálás",
|
||||
"settings_export_json": "JSON exportálása",
|
||||
"settings_export_yaml": "YAML exportálása",
|
||||
"settings_export_csv": "CSV exportálása",
|
||||
"settings_import_csv": "CSV importálása",
|
||||
"settings_import_placeholder": "Illessze be ide a JSON vagy CSV tartalmat…",
|
||||
"settings_import_btn": "Importálás",
|
||||
"settings_import_success": "{count} objektum sikeresen importálva.",
|
||||
"settings_export_success": "Export letöltve.",
|
||||
"settings_saved": "Beállítás mentve.",
|
||||
"settings_include_history": "Előzményekkel együtt",
|
||||
"settings_export_selection": "Csak a kiválasztott objektumok (opcionális)",
|
||||
"settings_docs_archive": "Dokumentumarchívum (fájlokkal)",
|
||||
"settings_docs_archive_hint": "A JSON/YAML/CSV export csak a beállításokat tartalmazza. Ez a ZIP a feltöltött fájlok tartalmát is magában foglalja, így a visszaállítás teljes.",
|
||||
"settings_docs_export_btn": "Dokumentum-ZIP letöltése",
|
||||
"settings_docs_import_btn": "Dokumentum-ZIP visszaállítása",
|
||||
"settings_docs_import_success": "Visszaállítva: {blobs} fájl, {docs} dokumentum",
|
||||
"sort_alphabetical": "Ábécésorrend",
|
||||
"sort_due_soonest": "Leghamarabb esedékes",
|
||||
"sort_task_count": "Feladatok száma",
|
||||
"sort_area": "Terület",
|
||||
"sort_assigned_user": "Hozzárendelt felhasználó",
|
||||
"sort_group": "Csoport",
|
||||
"groupby_none": "Nincs csoportosítás",
|
||||
"groupby_area": "Terület szerint",
|
||||
"groupby_group": "Csoport szerint",
|
||||
"groupby_user": "Felhasználó szerint",
|
||||
"filter_label": "Szűrő",
|
||||
"user_label": "Felhasználó",
|
||||
"sort_label": "Rendezés",
|
||||
"group_by_label": "Csoportosítás",
|
||||
"state_value_help": "A HA állapotértékét használja (általában kisbetűs, pl. „on”/„off”). A kis- és nagybetűk mentéskor normalizálódnak.",
|
||||
"target_changes_help": "Az egyező átmenetek száma a kiváltás előtt (alapértelmezés: 1).",
|
||||
"qr_print_title": "QR-kódok nyomtatása",
|
||||
"qr_print_desc": "Nyomtatható oldal QR-kódokkal — vágja ki és ragassza fel a berendezésekre.",
|
||||
"qr_print_load": "Objektumok betöltése",
|
||||
"qr_print_filter": "Szűrő",
|
||||
"qr_print_objects": "Objektumok",
|
||||
"qr_print_actions": "Műveletek",
|
||||
"qr_print_url_mode": "Hivatkozás típusa",
|
||||
"qr_print_estimate": "Becsült QR-kódok száma",
|
||||
"qr_print_over_limit": "a korlát 200, szűkítse a szűrőt",
|
||||
"qr_print_generate": "QR-kódok generálása",
|
||||
"qr_print_generating": "Generálás…",
|
||||
"qr_print_ready": "QR-kódok készen",
|
||||
"qr_print_print_button": "Nyomtatás",
|
||||
"qr_print_empty": "Nincs mit generálni",
|
||||
"qr_action_skip": "Kihagyás",
|
||||
"vacation_title": "Nyaralási mód",
|
||||
"vacation_active": "aktív",
|
||||
"vacation_ended": "véget ért",
|
||||
"vacation_desc": "Tervezzen nyaralást: az értesítések szünetelnek az időszak alatt, plusz egy puffernyi napig. Egyes feladatokat kivételként visszakapcsolhat.",
|
||||
"vacation_enable": "Nyaralási mód bekapcsolása",
|
||||
"vacation_start": "Kezdete",
|
||||
"vacation_end": "Vége",
|
||||
"vacation_buffer": "Puffer (nap)",
|
||||
"vacation_exempt_title": "Értesítés a nyaralás alatt is",
|
||||
"vacation_exempt_desc": "Válassza ki azokat a feladatokat, amelyek a nyaralás alatt is értesítsenek (pl. kritikus medencekémia).",
|
||||
"vacation_load_tasks": "Feladatok betöltése",
|
||||
"vacation_preview_btn": "Előnézet megjelenítése",
|
||||
"vacation_preview_affected": "érintett feladat",
|
||||
"vacation_event_due_soon": "hamarosan esedékessé válik",
|
||||
"vacation_event_overdue": "lejárttá válik",
|
||||
"vacation_event_triggered_est": "érzékelős kiváltás lehetséges",
|
||||
"vacation_sensor_based": "(érzékelőalapú)",
|
||||
"vacation_action_notify": "Értesítsen mégis",
|
||||
"vacation_action_unsilence": "Némítás újra",
|
||||
"vacation_marked_complete": "Elvégzettként jelölve",
|
||||
"vacation_marked_skip": "Kihagyva",
|
||||
"vacation_end_now": "Nyaralás befejezése most",
|
||||
"add": "Hozzáadás",
|
||||
"show_stats": "Statisztikák és grafikonok",
|
||||
"hide_stats": "Statisztikák elrejtése",
|
||||
"adaptive_no_data": "Még nincs elég elvégzési előzmény az adaptív elemzéshez. Végezze el a feladatot még néhányszor az intervallumjavaslatok és a megbízhatósági diagramok feloldásához.",
|
||||
"suggestion_applied": "Javasolt intervallum alkalmazva",
|
||||
"vacation_mode": "Nyaralási mód",
|
||||
"vacation_status_active": "Most aktív",
|
||||
"vacation_status_scheduled": "Ütemezve",
|
||||
"vacation_status_inactive": "Inaktív",
|
||||
"vacation_end_now_confirm": "Azonnal befejezi a nyaralást?",
|
||||
"vacation_exempt_count": "kivétel",
|
||||
"vacation_advanced": "Speciális…",
|
||||
"vacation_open_panel": "Megnyitás a panelen",
|
||||
"enable": "Engedélyezés",
|
||||
"saved": "Mentve",
|
||||
"budget_monthly_set": "Havi keret beállítása",
|
||||
"budget_yearly_set": "Éves keret beállítása",
|
||||
"budget_advanced": "Pénznem, riasztások…",
|
||||
"budget_open_panel": "Megnyitás a panelen",
|
||||
"groups_empty": "Még nincsenek csoportok.",
|
||||
"group_new_placeholder": "Csoport hozzáadása…",
|
||||
"group_delete_confirm": "Törli a(z) „{name}” csoportot?",
|
||||
"groups_manage_tasks": "Feladat-hozzárendelések kezelése…",
|
||||
"groups_open_panel": "Megnyitás a panelen",
|
||||
"unassigned": "Nincs hozzárendelve",
|
||||
"no_area": "Nincs terület",
|
||||
"has_overdue": "Van lejárt feladata",
|
||||
"object": "Objektum",
|
||||
"settings_panel_access": "Panel-hozzáférés",
|
||||
"settings_panel_access_desc": "Az adminok mindig teljes hozzáféréssel rendelkeznek. Ha a létrehozást, szerkesztést és törlést adott nem admin felhasználókra bízná, kapcsolja be ezt, és válassza ki őket lent — mindenki más csak az Elvégzés és a Kihagyás gombot látja.",
|
||||
"settings_operator_write": "A kiválasztott felhasználók létrehozhatnak, szerkeszthetnek és törölhetnek",
|
||||
"settings_operator_write_desc": "Ki: csak adminok módosíthatnak tartalmat. Be: a lent kiválasztott felhasználók is teljes hozzáférést kapnak.",
|
||||
"no_non_admin_users": "Nem található nem admin felhasználó. Vegyen fel néhányat a Beállítások → Személyek alatt.",
|
||||
"owner_label": "Tulajdonos",
|
||||
"feat_completion_actions": "Elvégzési műveletek",
|
||||
"feat_completion_actions_desc": "Feladatonkénti HA művelet elvégzéskor + gyorselvégző QR előre beállított értékekkel.",
|
||||
"on_complete_action_title": "Elvégzéskor: HA művelet indítása (opcionális)",
|
||||
"on_complete_action_desc": "HA szolgáltatást hív meg a feladat elvégzésekor — pl. számláló nullázása az eszközön.",
|
||||
"on_complete_action_service": "Szolgáltatás",
|
||||
"on_complete_action_target": "Cél entitás",
|
||||
"on_complete_action_target_hint": "Megjegyzés: az entitás doménjének egyeznie kell a szolgáltatással — pl. a „button.press” csak button.* entitáson működik, a „counter.increment” csak counter.* entitáson, az „input_button.press” csak input_button.* entitáson stb. Eltérés esetén a művelet csendben meghiúsul (a HA naplóban: „Referenced entities ... missing or not currently available”).",
|
||||
"on_complete_action_data": "Adatok (JSON, opcionális)",
|
||||
"on_complete_action_test": "Konfiguráció ellenőrzése",
|
||||
"on_complete_action_test_success": "✓ A konfiguráció érvényes (a művelet csak a feladat elvégzésekor fut le)",
|
||||
"on_complete_action_test_failed": "Sikertelen",
|
||||
"quick_complete_defaults_title": "Gyorselvégzés alapértékei (QR-beolvasáshoz, opcionális)",
|
||||
"quick_complete_defaults_desc": "Előre beállított értékek a gyorselvégző QR-beolvasásokhoz. Ezek nélkül a QR az elvégzési párbeszédablakot nyitja meg.",
|
||||
"quick_complete_defaults_notes": "Megjegyzések",
|
||||
"quick_complete_defaults_cost": "Költség",
|
||||
"quick_complete_defaults_duration": "Időtartam (perc)",
|
||||
"quick_complete_defaults_feedback_none": "Nincs visszajelzés",
|
||||
"quick_complete_defaults_feedback_needed": "Szükséges volt",
|
||||
"quick_complete_defaults_feedback_not_needed": "Nem volt szükséges",
|
||||
"quick_complete_success": "Gyorsan elvégzettként jelölve",
|
||||
"show_all_objects": "Minden objektum megjelenítése",
|
||||
"show_all_tasks": "Szűrő törlése — minden feladat megjelenítése",
|
||||
"filter_to_overdue": "Szűrés csak a lejárt feladatokra",
|
||||
"filter_to_due_soon": "Szűrés csak a hamarosan esedékes feladatokra",
|
||||
"filter_to_triggered": "Szűrés csak az aktivált feladatokra",
|
||||
"open_task": "Feladat megnyitása",
|
||||
"show_details": "Előzmények és statisztikák",
|
||||
"hide_details": "Részletek elrejtése",
|
||||
"history_empty": "Még nincsenek előzmények.",
|
||||
"history_edit_button": "Bejegyzés szerkesztése",
|
||||
"total_cost": "Összköltség",
|
||||
"times_performed": "Elvégezve",
|
||||
"older_entries": "régebbi",
|
||||
"open_in_panel": "Megnyitás a Karbantartás panelen",
|
||||
"skip_reason": "Kihagyás oka (opcionális)",
|
||||
"reset_to_date": "Utolsó elvégzés visszaállítása erre:",
|
||||
"delete_task_confirm": "Törli a feladatot az előzményeivel együtt?",
|
||||
"delete_object_confirm": "Törli az objektumot az összes feladatával együtt?",
|
||||
"loading": "Betöltés…",
|
||||
"archive": "Archiválás",
|
||||
"undo": "Visszavonás",
|
||||
"task_archived": "Feladat archiválva",
|
||||
"object_archived": "Objektum archiválva",
|
||||
"unarchive": "Archiválás visszavonása",
|
||||
"archived": "Archiválva",
|
||||
"show_archived": "Archiváltak megjelenítése",
|
||||
"hide_archived": "Archiváltak elrejtése",
|
||||
"confirm_archive_object": "Archiválja az objektumot és a feladatait? Megtartják előzményeiket, és később visszaállíthatók.",
|
||||
"settings_archive": "Archiválás és megőrzés",
|
||||
"settings_archive_desc": "Elvégzett egyszeri feladatok kivezetése törlés nélkül. Az archivált elemek rejtettek és inaktívak, de megtartják előzményeiket és költségeiket.",
|
||||
"settings_archive_oneoff_days": "Elvégzett egyszeri feladatok automatikus archiválása ennyi nap után (0 = ki)",
|
||||
"settings_delete_archived_oneoff_days": "Archivált egyszeri feladatok automatikus törlése ennyi nap után (0 = soha)",
|
||||
"archive_object": "Objektum archiválása",
|
||||
"unarchive_object": "Objektum visszaállítása",
|
||||
"documents": "Dokumentumok",
|
||||
"documents_empty": "Még nincsenek dokumentumok.",
|
||||
"doc_upload": "Fájl feltöltése",
|
||||
"doc_uploading": "Feltöltés…",
|
||||
"doc_add_link": "Hivatkozás hozzáadása",
|
||||
"doc_link_url": "URL (https://…)",
|
||||
"doc_link_title": "Cím (opcionális)",
|
||||
"doc_open": "Megnyitás",
|
||||
"doc_delete_confirm": "Törli a(z) „{name}” elemet?",
|
||||
"doc_too_large": "A fájl túl nagy (max. 25 MB).",
|
||||
"doc_upload_failed": "A feltöltés nem sikerült.",
|
||||
"completion_photo_optional": "Fotó az elvégzésről (opcionális)",
|
||||
"add_photo": "Fotó hozzáadása",
|
||||
"uploading": "Feltöltés…",
|
||||
"remove": "Eltávolítás",
|
||||
"doc_deduped": "Már máshol is tárolva — megosztott, nem foglal extra helyet.",
|
||||
"doc_dup_in_object": "Ez a fájl már csatolva van ehhez az objektumhoz.",
|
||||
"doc_link_invalid": "Csak http/https hivatkozás engedélyezett.",
|
||||
"doc_cat_manual": "Kézikönyv",
|
||||
"doc_cat_warranty": "Garancia",
|
||||
"doc_cat_invoice": "Számla",
|
||||
"doc_cat_spare_parts": "Pótalkatrészek",
|
||||
"doc_cat_photo": "Fotó",
|
||||
"doc_cat_other": "Egyéb",
|
||||
"doc_link_badge": "Hivatkozás",
|
||||
"doc_storage_title": "Dokumentumtárhely",
|
||||
"doc_storage_saved": "Deduplikációval megtakarítva",
|
||||
"doc_storage_refresh": "Frissítés",
|
||||
"doc_download": "Letöltés",
|
||||
"doc_close": "Bezárás",
|
||||
"doc_camera": "Fotó készítése",
|
||||
"doc_drop_hint": "Húzza ide a fájlokat",
|
||||
"doc_task_none": "Ehhez a feladathoz nincs dokumentum csatolva.",
|
||||
"doc_link_existing": "Dokumentum hozzárendelése…",
|
||||
"doc_attach": "Hozzárendelés",
|
||||
"doc_unlink": "Leválasztás",
|
||||
"doc_page": "Oldal",
|
||||
"chart_range_7d": "7 nap",
|
||||
"chart_range_30d": "30 nap",
|
||||
"chart_range_90d": "90 nap",
|
||||
"chart_range_1y": "1 év",
|
||||
"chart_since_service": "az utolsó szerviz óta",
|
||||
"chart_no_stats": "Nincs hosszú távú statisztika ehhez az entitáshoz — csak a karbantartási események értékei láthatók",
|
||||
"auto_complete_on_recovery": "Automatikus elvégzés, ha az érzékelő helyreáll",
|
||||
"auto_complete_on_recovery_help": "Elvégzést rögzít (beállítja az utolsó elvégzést), amikor a kiváltás magától megszűnik — pl. só utántöltve, szűrő kicserélve.",
|
||||
"doc_search": "Dokumentumok keresése…",
|
||||
"doc_search_none": "Nincs egyező dokumentum",
|
||||
"link_device_optional": "Meglévő eszközhöz kapcsolás (opcionális)",
|
||||
"parent_object_optional": "Szülőobjektum (opcionális)",
|
||||
"parent_none": "(Nincs szülő)",
|
||||
"paused": "Szüneteltetve",
|
||||
"pause_object": "Szüneteltetés",
|
||||
"resume_object": "Folytatás",
|
||||
"pause_until_prompt": "Az objektum ütemezéseinek befagyasztása — semmi nem válik esedékessé, és nincs értesítés a folytatásig. Megadhat automatikus folytatási dátumot is.",
|
||||
"pause_until_label": "Folytatás ekkor (opcionális)",
|
||||
"object_paused": "Objektum szüneteltetve",
|
||||
"object_resumed": "Objektum folytatva — az ütemezések újraindultak",
|
||||
"object_paused_badge": "Szüneteltetve",
|
||||
"paused_until_label": "eddig:",
|
||||
"replace_object": "Csere…",
|
||||
"replace_object_prompt": "Az objektum kivezetése és utód létrehozása. Az előzmények és a költségek archiválva a régin maradnak; a feladatok és a dokumentumok átkerülnek az újra, a számlálók nulláról indulnak.",
|
||||
"replace_name_label": "Utód neve",
|
||||
"object_replaced": "Objektum lecserélve — utód létrehozva",
|
||||
"reading_unit_label": "Leolvasás mértékegysége (pl. kWh, m³)",
|
||||
"reading_unit_help": "A rögzített érték mellett jelenik meg a feladat elvégzésekor.",
|
||||
"reading_value_label": "Leolvasott érték",
|
||||
"reading_label": "Leolvasás",
|
||||
"settings_templates_label": "Sablongaléria",
|
||||
"settings_templates_hint": "Vegye ki a pipát a sosem használt sablonoknál — így eltűnnek a „Sablonból” választókból (panel és konfigurációs folyamat). Semmi más nem változik; bármikor újra engedélyezheti őket.",
|
||||
"worksheet": "Munkalap",
|
||||
"worksheet_scan_view": "Olvassa be a feladat megnyitásához",
|
||||
"worksheet_scan_complete": "Olvassa be az elvégzéshez",
|
||||
"worksheet_manual_excerpt": "Kézikönyv-részlet",
|
||||
"worksheet_pages": "oldal",
|
||||
"worksheet_printed": "Nyomtatva",
|
||||
"worksheet_never": "Soha",
|
||||
"card_all_caught_up": "Minden rendben — semmi nem igényel figyelmet",
|
||||
"postpone": "Halasztás",
|
||||
"postpone_date_prompt": "Melyik dátumra halasztja ezt az alkalmat?",
|
||||
"postpone_date_label": "Új határidő",
|
||||
"postponed": "Elhalasztva",
|
||||
"postponed_to": "Elhalasztva erre:",
|
||||
"season_window_label": "Szezonális időablak (hónapok)",
|
||||
"season_window_hint": "Csak a kiválasztott hónapokban esedékes; a szezonon kívüli dátumok a következő aktív hónapra tolódnak. Nincs = egész évben.",
|
||||
"series_end_label": "Befejeződik",
|
||||
"series_end_never": "Soha (végtelen ismétlés)",
|
||||
"series_end_after_count": "Adott számú alkalom után",
|
||||
"series_end_until": "Egy adott dátumon",
|
||||
"series_end_count_label": "Alkalmak száma",
|
||||
"series_end_until_label": "Befejezés dátuma",
|
||||
"parts_section": "Alkatrészek és fogyóeszközök",
|
||||
"part_add": "Alkatrész hozzáadása",
|
||||
"part_name": "Név",
|
||||
"part_vendor": "Gyártó",
|
||||
"part_storage_location": "Tárolási hely",
|
||||
"part_product_url": "Termék URL",
|
||||
"part_unit": "Egység",
|
||||
"part_cost": "Egységár",
|
||||
"part_stock": "Készlet",
|
||||
"part_reorder_threshold": "Újrarendelés ennél",
|
||||
"part_restock_quantity": "Feltöltési mennyiség",
|
||||
"part_auto_buy": "Vásárlási feladat automatikus létrehozása, ha kevés van",
|
||||
"part_restock": "Készlet módosítása",
|
||||
"restock_quantity_label": "Vásárolt mennyiség",
|
||||
"consumes_parts_label": "Felhasznált alkatrészek",
|
||||
"parts_load_failed": "Az objektum alkatrészei nem tölthetők be — a felhasznált alkatrészek beállításai most nem érhetők el.",
|
||||
"adopt_problem_button": "Problémaérzékelők átvétele",
|
||||
"adopt_problem_title": "Problémaérzékelők átvétele",
|
||||
"adopt_problem_hint": "Alakítsa a HA problémaérzékelőit (nyomtatóhibák, szűrőfigyelmeztetések, gyenge elem) karbantartási feladatokká, amelyek a probléma fennállása alatt aktívak, és maguktól lezáródnak, amikor a probléma megoldódik.",
|
||||
"adopt_problem_none": "Nem található még nem követett problémaérzékelő.",
|
||||
"adopt_problem_active": "aktív",
|
||||
"adopt_problem_ok": "ok",
|
||||
"adopt_problem_new_object": "(új)",
|
||||
"adopt_problem_adopt": "Kijelöltek átvétele",
|
||||
"adopt_problem_done": "{tasks} problémaérzékelő átvéve",
|
||||
"views_label": "Nézetek",
|
||||
"views_none": "— Nincs nézet —",
|
||||
"views_manage": "Nézetek mentése / kezelése",
|
||||
"views_dialog_title": "Mentett nézetek",
|
||||
"views_dialog_hint": "Mentse el az aktuális szűrőket névvel ellátott nézetként, amelyet mindenki használhat.",
|
||||
"views_name_placeholder": "Nézet neve",
|
||||
"views_save_current": "Aktuális szűrők mentése",
|
||||
"views_none_yet": "Még nincsenek mentett nézetek.",
|
||||
"close": "Bezárás",
|
||||
"trigger_hint_now": "Az érzékelő jelenlegi értéke: {value}.",
|
||||
"trigger_hint_above": "A feladat akkor aktiválódik, amikor az érték {target} fölé emelkedik.",
|
||||
"trigger_hint_below": "Akkor aktiválódik, amikor az érték {target} alá csökken.",
|
||||
"trigger_hint_counter_delta": "A jelenlegi értéktől ({value}) számol: esedékes {due} értéknél (+{target}), és a számlálás minden elvégzés után újraindul.",
|
||||
"trigger_hint_counter_delta_edit": "A legutóbbi elvégzés óta számolja a használatot: esedékes +{target} után; a számlálás minden elvégzés után újraindul.",
|
||||
"trigger_hint_counter_abs": "A feladat akkor válik esedékessé, amikor az érzékelő eléri a(z) {target} értéket.",
|
||||
"trigger_hint_runtime": "A feladat {hours} óra összesített üzemidő után válik esedékessé; a számláló minden elvégzés után újraindul.",
|
||||
"trigger_hint_state_change": "A feladat {count} állapotváltozás után válik esedékessé.",
|
||||
"trigger_hint_state_change_to": "A feladat {count} alkalommal „{state}” állapotra váltás után válik esedékessé.",
|
||||
"trigger_hint_state_now": "Jelenlegi állapot: {value}.",
|
||||
"adopt_problem_part": "Alkatrészt használ: {name}",
|
||||
"label_filter": "Címke",
|
||||
"all_labels": "Minden címke",
|
||||
"settings_notify_scope": "Értesítés csak erre a nézetre",
|
||||
"settings_notify_scope_all": "Minden feladat",
|
||||
"settings_notify_scope_hint": "Csak a kiválasztott mentett nézet címke-/felhasználószűrőinek megfelelő feladatok küldenek emlékeztetőt. A nézet állapot-, rendezési és csoportosítási beállításait itt figyelmen kívül hagyjuk.",
|
||||
"card_saved_view": "Mentett nézet",
|
||||
"card_saved_view_none": "Nincs",
|
||||
"card_saved_view_help": "A nézet állapot-, felhasználó- és címkeszűrőit a fenti szűrőkön felül alkalmazza. A nézet rendezése és csoportosítása a panel megjelenítési beállítása, a kártyán nem érvényesül.",
|
||||
"doc_part_none": "Ehhez az alkatrészhez nincs dokumentum csatolva.",
|
||||
"settings_templates_toggle_group": "A csoport összes sablonjának be- vagy kikapcsolása",
|
||||
"setups_button": "Javasolt beállítások",
|
||||
"setups_title": "Javasolt beállítások (béta)",
|
||||
"setups_hint": "Támogatott integrációk eszközei, amelyek fogyóeszköz-érzékelői karbantartási feladatokat vezérelhetnek. Az átvétel létrehozza az objektumot, és minden feladatot az érzékelőjéhez köt — a feladat akkor aktiválódik, amikor a fogyóeszköz fogytán van, és a csere után magától lezáródik.",
|
||||
"setups_none": "Nem található támogatott eszköz bekötetlen fogyóeszköz-érzékelővel.",
|
||||
"setups_adopt": "Kijelöltek beállítása",
|
||||
"setups_done": "{tasks} érzékelőhöz kötött feladat létrehozva.",
|
||||
"complete_parts_used": "Most felhasznált alkatrészek",
|
||||
"part_delete_confirm": "Törli a(z) „{name}” alkatrészt? A készletkövetése, a feladatkapcsolatai és minden nyitott vásárlási emlékeztetője is törlődik.",
|
||||
"baseline_start_value": "Kezdő leolvasás (opcionális)",
|
||||
"baseline_start_help": "A számlálás ettől az értéktől indul. Hagyja üresen, ha a jelenlegi értéktől számolna; adja meg az utolsó szerviz értékét, hogy az azóta felhalmozott használat is beleszámítson.",
|
||||
"setups_baseline_hint": "érték az utolsó szerviznél (opcionális)",
|
||||
"baseline_start_help_edit": "Üresen hagyva a meglévő számlálás marad. Érték megadása újrahorgonyozza a számlálást (pl. az utolsó szerviz leolvasott értéke).",
|
||||
"baseline_current_effective": "Jelenleg érvényes kezdőérték: {value}",
|
||||
"runtime_on_states": "Aktív állapotok (vesszővel elválasztva)",
|
||||
"runtime_on_states_help": "Működésként számító állapotok — alapértelmezés: on. Pl. mowing, cleaning, printing. Attribútum kiválasztásakor annak értékei számítanak.",
|
||||
"setups_target_new": "Új létrehozása: {name}",
|
||||
"schedule_preview_title": "Következő dátumok",
|
||||
"schedule_preview_ontime": "Időben történő elvégzést feltételezve.",
|
||||
"schedule_preview_ends": "(a sorozat véget ér)",
|
||||
"adopt_problem_responsible": "Felelős felhasználó az összes átvett feladathoz (opcionális)",
|
||||
"adopt_problem_configure": "Beállítás",
|
||||
"history_auto": "Automatikus",
|
||||
"battery_fleet_title": "Elemflotta",
|
||||
"battery_fleet_none_low": "Minden elem rendben — nincs mit cserélni.",
|
||||
"battery_fleet_buy_now": "Vásárlás most",
|
||||
"battery_fleet_soon": "Hamarosan szükséges",
|
||||
"battery_fleet_soon_hint": "Az utolsó cseredátumból előrejelezve — rendeljen előre.",
|
||||
"battery_fleet_mark_all": "Mind cseréltként jelölése",
|
||||
"battery_fleet_mark_one": "Elem cseréltként jelölése",
|
||||
"battery_fleet_offline": "offline",
|
||||
"battery_fleet_trigger_lost": "A feladat érzékelős kiváltója elveszett — nem fog aktiválódni és automatikusan lezáródni sem.",
|
||||
"battery_fleet_repair": "Javítás",
|
||||
"battery_fleet_exclude": "Kizárás a flottából",
|
||||
"battery_fleet_excluded": "Kizárva",
|
||||
"battery_fleet_include": "Követés újra",
|
||||
"battery_fleet_total": "{n} elem követve",
|
||||
"battery_fleet_setup_button": "Elemflotta",
|
||||
"battery_fleet_setup_done": "Elemflotta beállítva — egyetlen feladat követi az összes elemet.",
|
||||
"update_banner": "A Maintenance Supporter újabb verziója érhető el a szerveren — töltse újra az oldalt a panel frissítéséhez.",
|
||||
"update_reload": "Újratöltés"
|
||||
}
|
||||
@@ -0,0 +1,811 @@
|
||||
{
|
||||
"maintenance": "유지보수",
|
||||
"objects": "객체",
|
||||
"tasks": "작업",
|
||||
"overdue": "기한 초과",
|
||||
"due_soon": "기한 임박",
|
||||
"triggered": "트리거됨",
|
||||
"trigger_replaced": "트리거 교체됨",
|
||||
"ok": "정상",
|
||||
"all": "전체",
|
||||
"new_object": "+ 새 객체",
|
||||
"templates_from": "템플릿에서",
|
||||
"templates_title": "템플릿으로 시작하기",
|
||||
"templates_task_count": "작업 {n}개",
|
||||
"template_created": "템플릿에서 생성됨",
|
||||
"onboard_hint": "첫 객체를 추가하여 유지보수 추적을 시작하세요.",
|
||||
"edit": "편집",
|
||||
"duplicate": "복제",
|
||||
"task_duplicated": "작업이 복제되었습니다",
|
||||
"object_duplicated": "객체가 복제되었습니다",
|
||||
"delete": "삭제",
|
||||
"add_task": "+ 작업 추가",
|
||||
"complete": "완료",
|
||||
"completed": "완료됨",
|
||||
"skip": "건너뛰기",
|
||||
"skipped": "건너뜀",
|
||||
"missed": "놓침",
|
||||
"reset": "초기화",
|
||||
"snooze": "다시 알림",
|
||||
"snoozed": "다시 알림 설정됨",
|
||||
"cancel": "취소",
|
||||
"bulk_select": "선택",
|
||||
"bulk_select_all": "모두 선택",
|
||||
"bulk_n_selected": "{n}개 선택됨",
|
||||
"bulk_completed": "작업 {n}개 완료됨",
|
||||
"bulk_archived": "작업 {n}개 보관됨",
|
||||
"completing": "완료 처리 중…",
|
||||
"interval": "주기",
|
||||
"warning": "경고",
|
||||
"last_performed": "마지막 수행일",
|
||||
"next_due": "다음 예정일",
|
||||
"days_until_due": "남은 일수",
|
||||
"avg_duration": "평균 소요 시간",
|
||||
"trigger": "트리거",
|
||||
"trigger_type": "트리거 유형",
|
||||
"threshold_above": "상한",
|
||||
"threshold_below": "하한",
|
||||
"threshold": "임계값",
|
||||
"counter": "카운터",
|
||||
"state_change": "상태 변경",
|
||||
"runtime": "가동 시간",
|
||||
"runtime_hours": "목표 가동 시간 (시간)",
|
||||
"target_value": "목표값",
|
||||
"baseline": "기준값",
|
||||
"target_changes": "목표 변경 횟수",
|
||||
"for_minutes": "지속 시간 (분)",
|
||||
"time_based": "시간 기반",
|
||||
"sensor_based": "센서 기반",
|
||||
"manual": "수동",
|
||||
"one_time": "일회성",
|
||||
"weekdays": "요일",
|
||||
"nth_weekday": "매월 N번째 요일",
|
||||
"day_of_month": "매월 특정 일",
|
||||
"recurrence_on_days": "반복 요일",
|
||||
"recurrence_occurrence": "회차",
|
||||
"recurrence_weekday": "요일",
|
||||
"recurrence_day": "일 (1–31)",
|
||||
"recurrence_last_day": "매월 마지막 날",
|
||||
"recurrence_business_day": "평일만 (주말이면 앞당김)",
|
||||
"recurrence_offset": "오프셋 (일, ±)",
|
||||
"recurrence_offset_help": "날짜를 ±N일 이동합니다. 예: -2 = 이틀 전.",
|
||||
"last_day_month": "매월 마지막 날",
|
||||
"last_business_day_month": "마지막 평일",
|
||||
"ord_1": "첫째",
|
||||
"ord_2": "둘째",
|
||||
"ord_3": "셋째",
|
||||
"ord_4": "넷째",
|
||||
"ord_5": "다섯째",
|
||||
"ord_last": "마지막",
|
||||
"day_word": "일",
|
||||
"interval_value": "주기",
|
||||
"interval_unit": "단위",
|
||||
"unit_days": "일",
|
||||
"unit_weeks": "주",
|
||||
"unit_months": "개월",
|
||||
"unit_years": "년",
|
||||
"due_date": "예정일",
|
||||
"cleaning": "청소",
|
||||
"inspection": "점검",
|
||||
"replacement": "교체",
|
||||
"calibration": "보정",
|
||||
"service": "정비",
|
||||
"reading": "검침",
|
||||
"custom": "사용자 지정",
|
||||
"history": "기록",
|
||||
"cost": "비용",
|
||||
"report_button": "보고서",
|
||||
"report_title": "유지보수 보고서",
|
||||
"report_generated": "생성일",
|
||||
"report_times_done": "수행 횟수",
|
||||
"report_total_cost": "총 비용",
|
||||
"report_every": "{n} {unit}마다",
|
||||
"report_notes": "메모",
|
||||
"report_col_type": "유형",
|
||||
"report_col_status": "상태",
|
||||
"report_col_schedule": "일정",
|
||||
"duration": "소요 시간",
|
||||
"both": "둘 다",
|
||||
"trigger_val": "트리거 값",
|
||||
"complete_title": "완료: ",
|
||||
"checklist": "체크리스트",
|
||||
"checklist_steps_optional": "체크리스트 단계 (선택)",
|
||||
"checklist_placeholder": "필터 청소\n씰 교체\n압력 테스트",
|
||||
"checklist_help": "한 줄에 한 단계씩 입력하세요. 최대 100개.",
|
||||
"err_too_long": "{field}: 너무 깁니다 (최대 {n}자)",
|
||||
"err_too_short": "{field}: 너무 짧습니다 (최소 {n}자)",
|
||||
"err_value_too_high": "{field}: 너무 큽니다 (최대 {n})",
|
||||
"err_value_too_low": "{field}: 너무 작습니다 (최소 {n})",
|
||||
"err_required": "{field}: 필수 항목입니다",
|
||||
"err_wrong_type": "{field}: 잘못된 형식입니다 (예상: {type})",
|
||||
"err_invalid_choice": "{field}: 허용되지 않는 값입니다",
|
||||
"err_invalid_value": "{field}: 유효하지 않은 값입니다",
|
||||
"feat_schedule_time": "시각 지정 일정",
|
||||
"feat_schedule_time_desc": "작업이 자정이 아닌 지정한 시각에 기한 초과로 전환됩니다.",
|
||||
"schedule_time_optional": "기한 시각 (선택, HH:MM)",
|
||||
"schedule_time_help": "비워두면 자정(기본값)입니다. HA 시간대 기준.",
|
||||
"at_time": "시각",
|
||||
"notes_optional": "메모 (선택)",
|
||||
"cost_optional": "비용 (선택)",
|
||||
"duration_minutes": "소요 시간(분, 선택)",
|
||||
"days": "일",
|
||||
"day": "일",
|
||||
"today": "오늘",
|
||||
"d_overdue": "일 초과",
|
||||
"no_tasks": "아직 유지보수 작업이 없습니다. 객체를 만들어 시작하세요.",
|
||||
"no_tasks_short": "작업 없음",
|
||||
"no_history": "아직 기록이 없습니다.",
|
||||
"show_all": "모두 보기",
|
||||
"cost_duration_chart": "비용 및 소요 시간",
|
||||
"installed": "설치일",
|
||||
"confirm_delete_object": "이 객체와 모든 작업을 삭제할까요?",
|
||||
"confirm_delete_task": "이 작업을 삭제할까요?",
|
||||
"min": "최소",
|
||||
"max": "최대",
|
||||
"save": "저장",
|
||||
"saving": "저장 중…",
|
||||
"edit_task": "작업 편집",
|
||||
"new_task": "새 유지보수 작업",
|
||||
"task_name": "작업 이름",
|
||||
"maintenance_type": "유지보수 유형",
|
||||
"priority": "우선순위",
|
||||
"labels": "라벨",
|
||||
"labels_placeholder": "예: 안전, 계절, 세입자용",
|
||||
"labels_help": "필터링과 보고서에 쓰이는 쉼표로 구분된 태그입니다.",
|
||||
"priority_low": "낮음",
|
||||
"priority_normal": "보통",
|
||||
"priority_high": "높음",
|
||||
"schedule_type": "일정 유형",
|
||||
"interval_days": "주기 (일)",
|
||||
"warning_days": "경고 일수",
|
||||
"earliest_completion_days": "조기 완료 허용 (기한 전 일수)",
|
||||
"earliest_completion_days_help": "비워두면 언제든 완료할 수 있습니다. 0 = 기한 당일 이후에만.",
|
||||
"last_performed_optional": "마지막 수행일 (선택)",
|
||||
"interval_anchor": "주기 기준",
|
||||
"anchor_completion": "완료일 기준",
|
||||
"anchor_planned": "예정일 기준 (밀림 없음)",
|
||||
"edit_object": "객체 편집",
|
||||
"name": "이름",
|
||||
"manufacturer_optional": "제조사 (선택)",
|
||||
"model_optional": "모델 (선택)",
|
||||
"serial_number_optional": "일련번호 (선택)",
|
||||
"serial_number_label": "일련번호",
|
||||
"documentation_url_label": "설명서",
|
||||
"object_notes_label": "메모",
|
||||
"sort_due_date": "예정일",
|
||||
"sort_object": "객체 이름",
|
||||
"sort_type": "유형",
|
||||
"sort_task_name": "작업 이름",
|
||||
"all_objects": "모든 객체",
|
||||
"tasks_lower": "작업",
|
||||
"no_tasks_yet": "아직 작업 없음",
|
||||
"add_first_task": "첫 작업 추가",
|
||||
"trigger_configuration": "트리거 설정",
|
||||
"entity_id": "엔티티 ID",
|
||||
"comma_separated": "쉼표로 구분",
|
||||
"entity_logic": "엔티티 논리",
|
||||
"entity_logic_any": "하나라도 트리거되면",
|
||||
"entity_logic_all": "모든 엔티티가 트리거되어야 함",
|
||||
"entities": "엔티티",
|
||||
"attribute_optional": "속성 (선택, 비우면 상태 사용)",
|
||||
"use_entity_state": "엔티티 상태 사용 (속성 없음)",
|
||||
"trigger_above": "초과 시 트리거",
|
||||
"trigger_below": "미만 시 트리거",
|
||||
"for_at_least_minutes": "최소 지속 시간 (분)",
|
||||
"safety_interval_days": "안전 주기 (일, 선택)",
|
||||
"safety_interval": "안전 주기 (선택)",
|
||||
"delta_mode": "델타 모드",
|
||||
"from_state_optional": "변경 전 상태 (선택)",
|
||||
"to_state_optional": "변경 후 상태 (선택)",
|
||||
"documentation_url_optional": "설명서 URL (선택)",
|
||||
"object_notes_optional": "메모 (선택)",
|
||||
"nfc_tag_id_optional": "NFC 태그 ID (선택)",
|
||||
"nfc_tags_empty_help": "Home Assistant에 등록된 NFC 태그가 아직 없습니다.",
|
||||
"nfc_tags_open_settings": "태그 설정 열기",
|
||||
"nfc_tags_refresh": "새로 고침",
|
||||
"environmental_entity_optional": "환경 센서 (선택)",
|
||||
"environmental_entity_helper": "예: sensor.outdoor_temperature — 환경 조건에 따라 주기를 조정합니다",
|
||||
"environmental_attribute_optional": "환경 속성 (선택)",
|
||||
"nfc_tag_id": "NFC 태그 ID",
|
||||
"nfc_linked": "NFC 태그 연결됨",
|
||||
"nfc_link_hint": "클릭하여 NFC 태그 연결",
|
||||
"responsible_user": "담당자",
|
||||
"shared_with": "공유 대상 (순환 담당)",
|
||||
"shared_with_help": "여러 명을 선택해 작업을 공유하세요. 완료할 때마다 담당자가 교대됩니다.",
|
||||
"rotation_strategy": "교대 방식",
|
||||
"rotation_none": "교대 없음",
|
||||
"rotation_round_robin": "순서대로",
|
||||
"rotation_least_completed": "완료 횟수가 적은 사람",
|
||||
"rotation_random": "무작위",
|
||||
"no_user_assigned": "(담당자 없음)",
|
||||
"all_users": "모든 사용자",
|
||||
"my_tasks": "내 작업",
|
||||
"tab_calendar": "캘린더",
|
||||
"cal_no_events": "유지보수 없음",
|
||||
"cal_window_7": "7일",
|
||||
"cal_window_14": "14일",
|
||||
"cal_window_30": "30일",
|
||||
"cal_window_365": "1년",
|
||||
"cal_every_n_days": "{n}일마다",
|
||||
"cal_source_time": "시간 기반",
|
||||
"cal_source_time_adaptive": "시간 기반 (적응형)",
|
||||
"cal_source_sensor": "센서 기반",
|
||||
"cal_predicted": "예측됨",
|
||||
"cal_confidence_high": "높은 신뢰도",
|
||||
"cal_confidence_medium": "중간 신뢰도",
|
||||
"cal_confidence_low": "낮은 신뢰도",
|
||||
"budget_monthly": "월 예산",
|
||||
"budget_yearly": "연 예산",
|
||||
"groups": "그룹",
|
||||
"new_group": "새 그룹",
|
||||
"edit_group": "그룹 편집",
|
||||
"no_groups": "아직 그룹 없음",
|
||||
"delete_group": "그룹 삭제",
|
||||
"delete_group_confirm": "'{name}' 그룹을 삭제할까요?",
|
||||
"group_select_tasks": "작업 선택",
|
||||
"group_name_required": "이름은 필수입니다",
|
||||
"description_optional": "설명 (선택)",
|
||||
"selected": "선택됨",
|
||||
"loading_chart": "차트 데이터 불러오는 중...",
|
||||
"hide_outliers": "이상값 숨기기 (센서 오류)",
|
||||
"was_maintenance_needed": "이 유지보수가 필요했나요?",
|
||||
"feedback_needed": "필요했음",
|
||||
"feedback_not_needed": "불필요했음",
|
||||
"feedback_not_sure": "잘 모름",
|
||||
"suggested_interval": "제안 주기",
|
||||
"apply_suggestion": "적용",
|
||||
"reanalyze": "재분석",
|
||||
"reanalyze_result": "새 분석 결과",
|
||||
"reanalyze_insufficient_data": "권장값을 산출하기에 데이터가 부족합니다",
|
||||
"data_points": "데이터 포인트",
|
||||
"dismiss_suggestion": "무시",
|
||||
"confidence_low": "낮음",
|
||||
"confidence_medium": "중간",
|
||||
"confidence_high": "높음",
|
||||
"recommended": "권장",
|
||||
"seasonal_awareness": "계절 인식",
|
||||
"edit_seasonal_overrides": "계절 계수 편집",
|
||||
"seasonal_overrides_title": "계절 계수 (수동 설정)",
|
||||
"seasonal_overrides_hint": "월별 계수 (0.1–5.0). 비워두면 자동으로 학습됩니다.",
|
||||
"seasonal_override_invalid": "유효하지 않은 값",
|
||||
"seasonal_override_range": "계수는 0.1에서 5.0 사이여야 합니다",
|
||||
"clear_all": "모두 지우기",
|
||||
"seasonal_chart_title": "계절 계수",
|
||||
"seasonal_learned": "학습됨",
|
||||
"seasonal_manual": "수동",
|
||||
"month_jan": "1월",
|
||||
"month_feb": "2월",
|
||||
"month_mar": "3월",
|
||||
"month_apr": "4월",
|
||||
"month_may": "5월",
|
||||
"month_jun": "6월",
|
||||
"month_jul": "7월",
|
||||
"month_aug": "8월",
|
||||
"month_sep": "9월",
|
||||
"month_oct": "10월",
|
||||
"month_nov": "11월",
|
||||
"month_dec": "12월",
|
||||
"sensor_prediction": "센서 예측",
|
||||
"degradation_trend": "추세",
|
||||
"trend_rising": "상승",
|
||||
"trend_falling": "하강",
|
||||
"trend_stable": "안정",
|
||||
"trend_insufficient_data": "데이터 부족",
|
||||
"days_until_threshold": "임계값까지 남은 일수",
|
||||
"threshold_exceeded": "임계값 초과",
|
||||
"environmental_adjustment": "환경 계수",
|
||||
"sensor_prediction_urgency": "센서 예측: 약 {days}일 후 임계값 도달",
|
||||
"day_short": "일",
|
||||
"weibull_reliability_curve": "신뢰도 곡선",
|
||||
"weibull_failure_probability": "고장 확률",
|
||||
"weibull_r_squared": "적합도 R²",
|
||||
"beta_early_failures": "초기 고장",
|
||||
"beta_random_failures": "무작위 고장",
|
||||
"beta_wear_out": "마모 고장",
|
||||
"beta_highly_predictable": "매우 예측 가능",
|
||||
"confidence_interval": "신뢰 구간",
|
||||
"confidence_conservative": "보수적",
|
||||
"confidence_aggressive": "낙관적",
|
||||
"current_interval_marker": "현재 주기",
|
||||
"recommended_marker": "권장",
|
||||
"characteristic_life": "특성 수명",
|
||||
"chart_mini_sparkline": "추세 스파크라인",
|
||||
"chart_history": "비용 및 소요 시간 기록",
|
||||
"chart_seasonal": "계절 계수, 12개월",
|
||||
"chart_weibull": "Weibull 신뢰도 곡선",
|
||||
"chart_sparkline": "센서 트리거 값 차트",
|
||||
"days_progress": "일수 진행률",
|
||||
"qr_code": "QR 코드",
|
||||
"qr_generating": "QR 코드 생성 중…",
|
||||
"qr_error": "QR 코드 생성에 실패했습니다.",
|
||||
"qr_error_no_url": "설정된 HA URL이 없습니다. 설정 → 시스템 → 네트워크에서 외부 또는 내부 URL을 설정해 주세요.",
|
||||
"save_error": "저장에 실패했습니다. 다시 시도해 주세요.",
|
||||
"qr_print": "인쇄",
|
||||
"qr_download": "SVG 다운로드",
|
||||
"qr_action": "스캔 시 동작",
|
||||
"qr_action_view": "유지보수 정보 보기",
|
||||
"qr_action_complete": "유지보수 완료로 표시",
|
||||
"qr_url_mode": "링크 유형",
|
||||
"qr_mode_companion": "Companion 앱",
|
||||
"qr_mode_local": "로컬 (mDNS)",
|
||||
"qr_mode_server": "서버 URL",
|
||||
"overview": "개요",
|
||||
"analysis": "분석",
|
||||
"recent_activities": "최근 활동",
|
||||
"search_notes": "메모 검색",
|
||||
"avg_cost": "평균 비용",
|
||||
"no_advanced_features": "활성화된 고급 기능 없음",
|
||||
"no_advanced_features_hint": "통합구성요소 설정에서 “적응형 일정” 또는 “계절 패턴”을 활성화하면 여기에서 분석 데이터를 볼 수 있습니다.",
|
||||
"analysis_not_enough_data": "아직 분석할 데이터가 충분하지 않습니다.",
|
||||
"analysis_not_enough_data_hint": "Weibull 분석에는 최소 5회의 완료 기록이 필요하며, 계절 패턴은 월별 6개 이상의 데이터 포인트가 쌓이면 표시됩니다.",
|
||||
"analysis_manual_task_hint": "주기가 없는 수동 작업은 분석 데이터를 생성하지 않습니다.",
|
||||
"completions": "회 완료",
|
||||
"current": "현재",
|
||||
"shorter": "더 짧게",
|
||||
"longer": "더 길게",
|
||||
"normal": "보통",
|
||||
"disabled": "비활성화됨",
|
||||
"compound_logic": "복합 논리",
|
||||
"compound": "복합 (여러 조건)",
|
||||
"compound_logic_and": "AND — 모든 조건이 트리거되어야 함",
|
||||
"compound_logic_or": "OR — 하나의 조건만 트리거되면 됨",
|
||||
"compound_help": "여러 센서 조건을 하나의 트리거로 결합합니다.",
|
||||
"compound_no_conditions": "아직 조건이 없습니다 — 최소 하나를 추가하세요.",
|
||||
"compound_add_condition": "조건 추가",
|
||||
"compound_condition": "조건",
|
||||
"compound_remove_condition": "조건 제거",
|
||||
"card_title": "제목",
|
||||
"card_show_header": "통계 헤더 표시",
|
||||
"card_show_actions": "동작 버튼 표시",
|
||||
"card_compact": "컴팩트 모드",
|
||||
"card_max_items": "최대 항목 수 (0 = 전체)",
|
||||
"card_filter_status": "상태로 필터",
|
||||
"card_filter_status_help": "비워두면 모든 상태를 표시합니다.",
|
||||
"card_filter_objects": "객체로 필터",
|
||||
"card_filter_objects_help": "비워두면 모든 객체를 표시합니다.",
|
||||
"card_filter_entities": "엔티티로 필터 (entity_ids)",
|
||||
"card_filter_entities_help": "이 통합구성요소의 sensor / binary_sensor 엔티티를 선택하세요. 비워두면 전체.",
|
||||
"card_loading_objects": "객체 불러오는 중…",
|
||||
"card_load_error": "객체를 불러올 수 없습니다 — WebSocket 연결을 확인하세요.",
|
||||
"card_no_tasks_title": "아직 유지보수 작업이 없습니다",
|
||||
"card_no_tasks_cta": "→ 유지보수 패널에서 만들어 보세요",
|
||||
"no_objects": "아직 객체가 없습니다.",
|
||||
"action_error": "동작에 실패했습니다. 다시 시도해 주세요.",
|
||||
"area_id_optional": "구역 (선택)",
|
||||
"installation_date_optional": "설치일 (선택)",
|
||||
"warranty_expiry_optional": "보증 만료일 (선택)",
|
||||
"warranty": "보증",
|
||||
"warranty_valid_until": "{date}까지 유효",
|
||||
"warranty_expires_in": "{days}일 후 만료",
|
||||
"warranty_expired": "만료됨",
|
||||
"cal_past_windows": "이전 기간",
|
||||
"cal_forward_windows": "이후 기간",
|
||||
"history_edit_title": "기록 항목 편집",
|
||||
"history_edit_timestamp": "타임스탬프",
|
||||
"manufacturer": "제조사",
|
||||
"model": "모델",
|
||||
"area": "구역",
|
||||
"actions": "동작",
|
||||
"view_mode_label": "보기",
|
||||
"view_cards": "카드 보기",
|
||||
"view_table": "표 보기",
|
||||
"objects_table_columns_label": "객체 표 열",
|
||||
"objects_table_columns_hint": "객체 표 보기에 표시할 열을 선택하세요.",
|
||||
"custom_icon_optional": "아이콘 (선택, 예: mdi:wrench)",
|
||||
"task_enabled": "작업 활성화",
|
||||
"skip_reason_prompt": "이 작업을 건너뛸까요?",
|
||||
"reason_optional": "사유 (선택)",
|
||||
"reset_date_prompt": "작업을 수행한 것으로 표시할까요?",
|
||||
"reset_date_optional": "마지막 수행일 (선택, 기본값은 오늘)",
|
||||
"notes_label": "메모",
|
||||
"documentation_label": "문서",
|
||||
"no_nfc_tag": "— 태그 없음 —",
|
||||
"dashboard": "대시보드",
|
||||
"tab_today": "오늘",
|
||||
"palette_placeholder": "객체와 작업 검색…",
|
||||
"palette_no_results": "일치 항목 없음",
|
||||
"palette_hint": "↑↓ 이동 · Enter 열기 · Esc 닫기",
|
||||
"today_all_caught_up": "모두 처리했습니다! 이번 주에 예정된 작업이 없습니다.",
|
||||
"today_overdue": "기한 초과",
|
||||
"today_due_today": "오늘 예정",
|
||||
"today_this_week": "이번 주",
|
||||
"settings": "설정",
|
||||
"settings_features": "고급 기능",
|
||||
"settings_features_desc": "고급 기능을 켜거나 끕니다. 끄면 UI에서 숨겨질 뿐 데이터는 삭제되지 않습니다.",
|
||||
"feat_adaptive": "적응형 일정",
|
||||
"feat_adaptive_desc": "유지보수 기록에서 최적 주기를 학습합니다",
|
||||
"feat_predictions": "센서 예측",
|
||||
"feat_predictions_desc": "센서 열화로부터 트리거 시점을 예측합니다",
|
||||
"feat_seasonal": "계절 조정",
|
||||
"feat_seasonal_desc": "계절 패턴에 따라 주기를 조정합니다",
|
||||
"feat_environmental": "환경 상관관계",
|
||||
"feat_environmental_desc": "온도/습도와 주기의 상관관계를 분석합니다",
|
||||
"feat_budget": "예산 추적",
|
||||
"feat_budget_desc": "월별·연별 유지보수 지출을 추적합니다",
|
||||
"feat_groups": "작업 그룹",
|
||||
"feat_groups_desc": "작업을 논리적 그룹으로 정리합니다",
|
||||
"feat_checklists": "체크리스트",
|
||||
"feat_checklists_desc": "작업 완료를 위한 다단계 절차",
|
||||
"settings_general": "일반",
|
||||
"settings_default_warning": "기본 경고 일수",
|
||||
"settings_panel_enabled": "사이드바 패널",
|
||||
"settings_panel_title": "사이드바 패널 제목",
|
||||
"settings_notifications": "알림",
|
||||
"settings_notify_service": "알림 서비스",
|
||||
"test_notification": "테스트 알림",
|
||||
"send_test": "테스트 보내기",
|
||||
"testing": "보내는 중…",
|
||||
"test_notification_success": "테스트 알림을 보냈습니다",
|
||||
"test_notification_failed": "테스트 알림 전송 실패",
|
||||
"settings_notify_due_soon": "기한 임박 시 알림",
|
||||
"settings_notify_overdue": "기한 초과 시 알림",
|
||||
"settings_notify_triggered": "트리거 시 알림",
|
||||
"settings_interval_hours": "반복 주기 (시간, 0 = 한 번만)",
|
||||
"settings_quiet_hours": "방해 금지 시간",
|
||||
"settings_quiet_start": "시작",
|
||||
"settings_quiet_end": "종료",
|
||||
"settings_max_per_day": "하루 최대 알림 수 (0 = 무제한)",
|
||||
"settings_bundling": "알림 묶기",
|
||||
"settings_bundle_threshold": "묶음 기준 개수",
|
||||
"settings_reminder_leads": "추가 알림 (기한 전 일수)",
|
||||
"settings_reminder_leads_hint": "쉼표로 구분한 사전 알림 시점입니다. 예: 14, 3, 0 — 해당하는 날마다 추가 알림이 한 번 발송됩니다. 비워두면 꺼짐.",
|
||||
"settings_actions": "모바일 동작 버튼",
|
||||
"settings_action_complete": "'완료' 버튼 표시",
|
||||
"settings_action_skip": "'건너뛰기' 버튼 표시",
|
||||
"settings_action_snooze": "'다시 알림' 버튼 표시",
|
||||
"settings_weekly_digest": "주간 요약",
|
||||
"settings_weekly_digest_hint": "예정된 작업이 있으면 월요일 아침에 요약 알림을 한 번 보냅니다.",
|
||||
"settings_warranty_reminder": "보증 만료 알림",
|
||||
"settings_warranty_reminder_days": "만료 전 일수",
|
||||
"settings_warranty_reminder_hint": "객체의 보증 만료가 설정한 일수만큼 남았을 때 한 번 알립니다.",
|
||||
"settings_snooze_hours": "다시 알림 대기 시간 (시간)",
|
||||
"settings_budget": "예산",
|
||||
"settings_currency": "통화",
|
||||
"settings_budget_monthly": "월 예산",
|
||||
"settings_budget_yearly": "연 예산",
|
||||
"settings_budget_alerts": "예산 경고",
|
||||
"settings_budget_threshold": "경고 기준 (%)",
|
||||
"settings_import_export": "가져오기 / 내보내기",
|
||||
"settings_export_json": "JSON 내보내기",
|
||||
"settings_export_yaml": "YAML 내보내기",
|
||||
"settings_export_csv": "CSV 내보내기",
|
||||
"settings_import_csv": "CSV 가져오기",
|
||||
"settings_import_placeholder": "JSON 또는 CSV 내용을 여기에 붙여넣으세요…",
|
||||
"settings_import_btn": "가져오기",
|
||||
"settings_import_success": "객체 {count}개를 성공적으로 가져왔습니다.",
|
||||
"settings_export_success": "내보내기 파일이 다운로드되었습니다.",
|
||||
"settings_saved": "설정이 저장되었습니다.",
|
||||
"settings_include_history": "기록 포함",
|
||||
"settings_export_selection": "선택한 객체로 제한 (선택)",
|
||||
"settings_docs_archive": "문서 아카이브 (파일 포함)",
|
||||
"settings_docs_archive_hint": "JSON/YAML/CSV 내보내기에는 설정만 포함됩니다. 이 ZIP에는 업로드한 파일 내용까지 포함되어 완전한 복원이 가능합니다.",
|
||||
"settings_docs_export_btn": "문서 ZIP 다운로드",
|
||||
"settings_docs_import_btn": "문서 ZIP 복원",
|
||||
"settings_docs_import_success": "복원됨: 파일 {blobs}개, 문서 {docs}개",
|
||||
"sort_alphabetical": "가나다순",
|
||||
"sort_due_soonest": "예정일 빠른 순",
|
||||
"sort_task_count": "작업 수",
|
||||
"sort_area": "구역",
|
||||
"sort_assigned_user": "담당자",
|
||||
"sort_group": "그룹",
|
||||
"groupby_none": "그룹화 없음",
|
||||
"groupby_area": "구역별",
|
||||
"groupby_group": "그룹별",
|
||||
"groupby_user": "사용자별",
|
||||
"filter_label": "필터",
|
||||
"user_label": "사용자",
|
||||
"sort_label": "정렬",
|
||||
"group_by_label": "그룹화",
|
||||
"state_value_help": "HA 상태 값을 사용하세요(보통 소문자, 예: \"on\"/\"off\"). 대소문자는 저장 시 정규화됩니다.",
|
||||
"target_changes_help": "트리거가 발동하기까지 필요한 일치 전환 횟수입니다 (기본값: 1).",
|
||||
"qr_print_title": "QR 코드 인쇄",
|
||||
"qr_print_desc": "잘라서 장비에 붙일 수 있는 QR 코드 인쇄 페이지를 생성합니다.",
|
||||
"qr_print_load": "객체 불러오기",
|
||||
"qr_print_filter": "필터",
|
||||
"qr_print_objects": "객체",
|
||||
"qr_print_actions": "동작",
|
||||
"qr_print_url_mode": "링크 유형",
|
||||
"qr_print_estimate": "예상 QR 코드 수",
|
||||
"qr_print_over_limit": "최대 200개입니다. 필터를 좁혀 주세요",
|
||||
"qr_print_generate": "QR 코드 생성",
|
||||
"qr_print_generating": "생성 중…",
|
||||
"qr_print_ready": "QR 코드 준비 완료",
|
||||
"qr_print_print_button": "인쇄",
|
||||
"qr_print_empty": "생성할 항목 없음",
|
||||
"qr_action_skip": "건너뛰기",
|
||||
"vacation_title": "휴가 모드",
|
||||
"vacation_active": "활성",
|
||||
"vacation_ended": "종료됨",
|
||||
"vacation_desc": "휴가를 계획하세요. 휴가 기간과 버퍼 일수 동안 알림이 일시 중지됩니다. 특정 작업은 예외로 되돌릴 수 있습니다.",
|
||||
"vacation_enable": "휴가 모드 활성화",
|
||||
"vacation_start": "시작",
|
||||
"vacation_end": "종료",
|
||||
"vacation_buffer": "버퍼 (일)",
|
||||
"vacation_exempt_title": "휴가 중에도 알림 받기",
|
||||
"vacation_exempt_desc": "휴가 중에도 알림을 받을 작업을 선택하세요 (예: 중요한 수영장 수질 관리).",
|
||||
"vacation_load_tasks": "작업 불러오기",
|
||||
"vacation_preview_btn": "미리보기 표시",
|
||||
"vacation_preview_affected": "개 작업 영향받음",
|
||||
"vacation_event_due_soon": "기한 임박 예정",
|
||||
"vacation_event_overdue": "기한 초과 예정",
|
||||
"vacation_event_triggered_est": "센서 트리거 가능",
|
||||
"vacation_sensor_based": "(센서 기반)",
|
||||
"vacation_action_notify": "그래도 알림",
|
||||
"vacation_action_unsilence": "다시 음소거",
|
||||
"vacation_marked_complete": "완료로 표시됨",
|
||||
"vacation_marked_skip": "건너뜀",
|
||||
"vacation_end_now": "지금 휴가 종료",
|
||||
"add": "추가",
|
||||
"show_stats": "통계 + 그래프 보기",
|
||||
"hide_stats": "통계 숨기기",
|
||||
"adaptive_no_data": "적응형 분석에 필요한 완료 기록이 아직 부족합니다. 이 작업을 몇 번 더 완료하면 주기 추천과 신뢰도 차트가 열립니다.",
|
||||
"suggestion_applied": "제안 주기가 적용되었습니다",
|
||||
"vacation_mode": "휴가 모드",
|
||||
"vacation_status_active": "현재 활성",
|
||||
"vacation_status_scheduled": "예약됨",
|
||||
"vacation_status_inactive": "비활성",
|
||||
"vacation_end_now_confirm": "휴가를 지금 바로 종료할까요?",
|
||||
"vacation_exempt_count": "예외",
|
||||
"vacation_advanced": "고급…",
|
||||
"vacation_open_panel": "패널에서 열기",
|
||||
"enable": "활성화",
|
||||
"saved": "저장됨",
|
||||
"budget_monthly_set": "월 예산 설정",
|
||||
"budget_yearly_set": "연 예산 설정",
|
||||
"budget_advanced": "통화, 경고…",
|
||||
"budget_open_panel": "패널에서 열기",
|
||||
"groups_empty": "아직 그룹이 없습니다.",
|
||||
"group_new_placeholder": "그룹 추가…",
|
||||
"group_delete_confirm": "\"{name}\" 그룹을 삭제할까요?",
|
||||
"groups_manage_tasks": "작업 배정 관리…",
|
||||
"groups_open_panel": "패널에서 열기",
|
||||
"unassigned": "미배정",
|
||||
"no_area": "구역 없음",
|
||||
"has_overdue": "기한 초과 작업 있음",
|
||||
"object": "객체",
|
||||
"settings_panel_access": "패널 접근 권한",
|
||||
"settings_panel_access_desc": "관리자는 항상 전체 권한을 가집니다. 특정 비관리자에게 생성·편집·삭제를 위임하려면 이 옵션을 켜고 아래에서 선택하세요. 나머지 사용자에게는 완료와 건너뛰기만 표시됩니다.",
|
||||
"settings_operator_write": "선택한 사용자에게 생성·편집·삭제 허용",
|
||||
"settings_operator_write_desc": "끔: 관리자만 내용을 변경할 수 있습니다. 켬: 아래에서 선택한 사용자도 전체 권한을 갖습니다.",
|
||||
"no_non_admin_users": "비관리자 사용자가 없습니다. 설정 → 사람에서 추가하세요.",
|
||||
"owner_label": "소유자",
|
||||
"feat_completion_actions": "완료 동작",
|
||||
"feat_completion_actions_desc": "완료 시 작업별 HA 동작 실행 + 사전 설정값이 있는 빠른 완료 QR.",
|
||||
"on_complete_action_title": "완료 시: HA 동작 실행 (선택)",
|
||||
"on_complete_action_desc": "작업이 완료되면 HA 서비스를 호출합니다 — 예: 기기의 카운터 초기화.",
|
||||
"on_complete_action_service": "서비스",
|
||||
"on_complete_action_target": "대상 엔티티",
|
||||
"on_complete_action_target_hint": "참고: 엔티티 도메인이 서비스와 일치해야 합니다 — 예: 'button.press'는 button.*에서만, 'counter.increment'는 counter.*에서만, 'input_button.press'는 input_button.*에서만 동작합니다. 불일치 시 동작이 조용히 실패합니다 (HA 로그에 'Referenced entities ... missing or not currently available' 기록).",
|
||||
"on_complete_action_data": "데이터 (JSON, 선택)",
|
||||
"on_complete_action_test": "설정 검증",
|
||||
"on_complete_action_test_success": "✓ 설정이 유효합니다 (동작은 작업 완료 시에만 실행됩니다)",
|
||||
"on_complete_action_test_failed": "실패",
|
||||
"quick_complete_defaults_title": "빠른 완료 기본값 (QR 스캔용, 선택)",
|
||||
"quick_complete_defaults_desc": "빠른 완료 QR 스캔에 쓰이는 사전 설정값입니다. 없으면 QR이 완료 대화상자를 엽니다.",
|
||||
"quick_complete_defaults_notes": "메모",
|
||||
"quick_complete_defaults_cost": "비용",
|
||||
"quick_complete_defaults_duration": "소요 시간 (분)",
|
||||
"quick_complete_defaults_feedback_none": "피드백 없음",
|
||||
"quick_complete_defaults_feedback_needed": "필요했음",
|
||||
"quick_complete_defaults_feedback_not_needed": "불필요했음",
|
||||
"quick_complete_success": "빠르게 완료로 표시됨",
|
||||
"show_all_objects": "모든 객체 보기",
|
||||
"show_all_tasks": "필터 해제 — 모든 작업 보기",
|
||||
"filter_to_overdue": "기한 초과 작업만 보기",
|
||||
"filter_to_due_soon": "기한 임박 작업만 보기",
|
||||
"filter_to_triggered": "트리거된 작업만 보기",
|
||||
"open_task": "작업 열기",
|
||||
"show_details": "기록 + 통계 보기",
|
||||
"hide_details": "상세 숨기기",
|
||||
"history_empty": "아직 기록이 없습니다.",
|
||||
"history_edit_button": "항목 편집",
|
||||
"total_cost": "총 비용",
|
||||
"times_performed": "수행 횟수",
|
||||
"older_entries": "이전 항목",
|
||||
"open_in_panel": "유지보수 패널에서 열기",
|
||||
"skip_reason": "건너뛰기 사유 (선택)",
|
||||
"reset_to_date": "마지막 수행일 재설정",
|
||||
"delete_task_confirm": "이 작업과 기록을 삭제할까요?",
|
||||
"delete_object_confirm": "이 객체와 모든 작업을 삭제할까요?",
|
||||
"loading": "불러오는 중…",
|
||||
"archive": "보관",
|
||||
"undo": "실행 취소",
|
||||
"task_archived": "작업이 보관되었습니다",
|
||||
"object_archived": "객체가 보관되었습니다",
|
||||
"unarchive": "보관 해제",
|
||||
"archived": "보관됨",
|
||||
"show_archived": "보관된 항목 보기",
|
||||
"hide_archived": "보관된 항목 숨기기",
|
||||
"confirm_archive_object": "이 객체와 작업을 보관할까요? 기록은 유지되며 나중에 보관 해제할 수 있습니다.",
|
||||
"settings_archive": "보관 및 보존",
|
||||
"settings_archive_desc": "완료된 일회성 작업을 삭제하지 않고 정리합니다. 보관된 항목은 숨겨지고 동작하지 않지만 기록과 비용은 유지됩니다.",
|
||||
"settings_archive_oneoff_days": "완료된 일회성 작업 자동 보관 (일, 0 = 끔)",
|
||||
"settings_delete_archived_oneoff_days": "보관된 일회성 작업 자동 삭제 (일, 0 = 안 함)",
|
||||
"archive_object": "객체 보관",
|
||||
"unarchive_object": "객체 보관 해제",
|
||||
"documents": "문서",
|
||||
"documents_empty": "아직 문서가 없습니다.",
|
||||
"doc_upload": "파일 업로드",
|
||||
"doc_uploading": "업로드 중…",
|
||||
"doc_add_link": "링크 추가",
|
||||
"doc_link_url": "링크 URL (https://…)",
|
||||
"doc_link_title": "제목 (선택)",
|
||||
"doc_open": "열기",
|
||||
"doc_delete_confirm": "\"{name}\"을(를) 삭제할까요?",
|
||||
"doc_too_large": "파일이 너무 큽니다 (최대 25 MB).",
|
||||
"doc_upload_failed": "업로드에 실패했습니다.",
|
||||
"completion_photo_optional": "완료 사진 (선택)",
|
||||
"add_photo": "사진 추가",
|
||||
"uploading": "업로드 중…",
|
||||
"remove": "제거",
|
||||
"doc_deduped": "이미 다른 곳에 저장됨 — 공유되어 추가 공간을 쓰지 않습니다.",
|
||||
"doc_dup_in_object": "이 파일은 이미 이 객체에 첨부되어 있습니다.",
|
||||
"doc_link_invalid": "http/https 링크만 허용됩니다.",
|
||||
"doc_cat_manual": "설명서",
|
||||
"doc_cat_warranty": "보증서",
|
||||
"doc_cat_invoice": "영수증",
|
||||
"doc_cat_spare_parts": "예비 부품",
|
||||
"doc_cat_photo": "사진",
|
||||
"doc_cat_other": "기타",
|
||||
"doc_link_badge": "링크",
|
||||
"doc_storage_title": "문서 저장소",
|
||||
"doc_storage_saved": "중복 제거로 절약됨",
|
||||
"doc_storage_refresh": "새로 고침",
|
||||
"doc_download": "다운로드",
|
||||
"doc_close": "닫기",
|
||||
"doc_camera": "사진 촬영",
|
||||
"doc_drop_hint": "파일을 여기에 놓으세요",
|
||||
"doc_task_none": "이 작업에 연결된 문서가 없습니다.",
|
||||
"doc_link_existing": "문서 연결…",
|
||||
"doc_attach": "연결",
|
||||
"doc_unlink": "연결 해제",
|
||||
"doc_page": "페이지",
|
||||
"chart_range_7d": "7일",
|
||||
"chart_range_30d": "30일",
|
||||
"chart_range_90d": "90일",
|
||||
"chart_range_1y": "1년",
|
||||
"chart_since_service": "마지막 정비 이후",
|
||||
"chart_no_stats": "이 엔티티의 장기 통계가 없습니다 — 유지보수 이벤트 값만 표시합니다",
|
||||
"auto_complete_on_recovery": "센서가 정상으로 돌아오면 자동 완료",
|
||||
"auto_complete_on_recovery_help": "트리거가 스스로 해제되면 완료를 기록합니다 (마지막 수행일 갱신) — 예: 소금 보충, 필터 교체.",
|
||||
"doc_search": "문서 검색…",
|
||||
"doc_search_none": "일치하는 문서 없음",
|
||||
"link_device_optional": "기존 기기와 연결 (선택)",
|
||||
"parent_object_optional": "상위 객체 (선택)",
|
||||
"parent_none": "(상위 없음)",
|
||||
"paused": "일시 중지됨",
|
||||
"pause_object": "일시 중지",
|
||||
"resume_object": "재개",
|
||||
"pause_until_prompt": "이 객체의 일정을 동결합니다 — 재개할 때까지 어떤 작업도 기한이 되지 않고 알림도 오지 않습니다. 자동 재개 날짜를 선택적으로 설정할 수 있습니다.",
|
||||
"pause_until_label": "재개일 (선택)",
|
||||
"object_paused": "객체가 일시 중지되었습니다",
|
||||
"object_resumed": "객체가 재개되었습니다 — 일정이 다시 시작됩니다",
|
||||
"object_paused_badge": "일시 중지됨",
|
||||
"paused_until_label": "재개일",
|
||||
"replace_object": "교체…",
|
||||
"replace_object_prompt": "이 객체를 퇴역시키고 후속 객체를 만듭니다. 기록과 비용은 기존 객체에 보관된 채 남고, 작업과 문서는 새 객체로 이어지며 카운터는 새로 시작됩니다.",
|
||||
"replace_name_label": "후속 객체 이름",
|
||||
"object_replaced": "객체가 교체되었습니다 — 후속 객체 생성됨",
|
||||
"reading_unit_label": "검침 단위 (예: kWh, m³)",
|
||||
"reading_unit_help": "이 작업을 완료할 때 기록 값 옆에 표시됩니다.",
|
||||
"reading_value_label": "검침 값",
|
||||
"reading_label": "검침",
|
||||
"settings_templates_label": "템플릿 갤러리",
|
||||
"settings_templates_hint": "필요 없는 템플릿의 체크를 해제하세요 — \"템플릿에서\" 선택 목록(패널 및 설정 흐름)에서 사라집니다. 다른 변화는 없으며 언제든 다시 활성화할 수 있습니다.",
|
||||
"worksheet": "작업 시트",
|
||||
"worksheet_scan_view": "스캔하여 작업 열기",
|
||||
"worksheet_scan_complete": "스캔하여 완료",
|
||||
"worksheet_manual_excerpt": "설명서 발췌",
|
||||
"worksheet_pages": "페이지",
|
||||
"worksheet_printed": "인쇄됨",
|
||||
"worksheet_never": "없음",
|
||||
"card_all_caught_up": "모두 처리했습니다 — 주의가 필요한 항목이 없습니다",
|
||||
"postpone": "연기",
|
||||
"postpone_date_prompt": "이번 회차를 언제로 연기할까요?",
|
||||
"postpone_date_label": "새 예정일",
|
||||
"postponed": "연기됨",
|
||||
"postponed_to": "연기됨:",
|
||||
"season_window_label": "계절 기간 (월)",
|
||||
"season_window_hint": "선택한 달에만 기한이 됩니다. 비수기 날짜는 다음 활성 달로 넘어갑니다. 선택 없음 = 연중.",
|
||||
"series_end_label": "종료",
|
||||
"series_end_never": "없음 (무기한 반복)",
|
||||
"series_end_after_count": "지정 횟수 후",
|
||||
"series_end_until": "특정 날짜에",
|
||||
"series_end_count_label": "횟수",
|
||||
"series_end_until_label": "종료일",
|
||||
"parts_section": "부품 및 소모품",
|
||||
"part_add": "부품 추가",
|
||||
"part_name": "이름",
|
||||
"part_vendor": "제조사",
|
||||
"part_storage_location": "보관 위치",
|
||||
"part_product_url": "제품 URL",
|
||||
"part_unit": "단위",
|
||||
"part_cost": "단가",
|
||||
"part_stock": "재고",
|
||||
"part_reorder_threshold": "재주문 기준",
|
||||
"part_restock_quantity": "보충 수량",
|
||||
"part_auto_buy": "재고 부족 시 구매 작업 자동 생성",
|
||||
"part_restock": "재고 조정",
|
||||
"restock_quantity_label": "구매 수량",
|
||||
"consumes_parts_label": "사용하는 부품",
|
||||
"parts_load_failed": "이 객체의 부품을 불러올 수 없습니다 — 부품 사용 옵션을 지금은 쓸 수 없습니다.",
|
||||
"adopt_problem_button": "문제 센서 가져오기",
|
||||
"adopt_problem_title": "문제 센서 가져오기",
|
||||
"adopt_problem_hint": "HA 문제 센서(프린터 오류, 필터 경고, 배터리 부족)를 유지보수 작업으로 전환합니다. 문제가 활성인 동안 트리거되고 해결되면 자동으로 해제됩니다.",
|
||||
"adopt_problem_none": "아직 추적되지 않은 문제 센서를 찾지 못했습니다.",
|
||||
"adopt_problem_active": "활성",
|
||||
"adopt_problem_ok": "정상",
|
||||
"adopt_problem_new_object": "(신규)",
|
||||
"adopt_problem_adopt": "선택 항목 가져오기",
|
||||
"adopt_problem_done": "문제 센서 {tasks}개를 가져왔습니다",
|
||||
"views_label": "보기",
|
||||
"views_none": "— 보기 없음 —",
|
||||
"views_manage": "보기 저장 / 관리",
|
||||
"views_dialog_title": "저장된 보기",
|
||||
"views_dialog_hint": "현재 필터를 이름 있는 보기로 저장하면 모두가 다시 사용할 수 있습니다.",
|
||||
"views_name_placeholder": "보기 이름",
|
||||
"views_save_current": "현재 필터 저장",
|
||||
"views_none_yet": "저장된 보기가 아직 없습니다.",
|
||||
"close": "닫기",
|
||||
"trigger_hint_now": "센서의 현재 값은 {value}입니다.",
|
||||
"trigger_hint_above": "{target}을(를) 초과하면 작업이 트리거됩니다.",
|
||||
"trigger_hint_below": "{target} 미만으로 떨어지면 트리거됩니다.",
|
||||
"trigger_hint_counter_delta": "현재 값({value})부터 계수합니다: {due} 도달 시 기한 (+{target}), 완료할 때마다 계수가 다시 시작됩니다.",
|
||||
"trigger_hint_counter_delta_edit": "마지막 완료 이후 사용량을 계수합니다: +{target} 후 기한이 되며, 완료할 때마다 계수가 다시 시작됩니다.",
|
||||
"trigger_hint_counter_abs": "센서가 {target}에 도달하면 작업 기한이 됩니다.",
|
||||
"trigger_hint_runtime": "누적 가동 {hours}시간 후 작업 기한이 됩니다. 카운터는 완료할 때마다 다시 시작됩니다.",
|
||||
"trigger_hint_state_change": "상태가 {count}회 변경되면 작업 기한이 됩니다.",
|
||||
"trigger_hint_state_change_to": "“{state}”(으)로 {count}회 변경되면 작업 기한이 됩니다.",
|
||||
"trigger_hint_state_now": "현재 상태: {value}.",
|
||||
"adopt_problem_part": "사용 부품: {name}",
|
||||
"label_filter": "라벨",
|
||||
"all_labels": "모든 라벨",
|
||||
"settings_notify_scope": "특정 보기만 알림",
|
||||
"settings_notify_scope_all": "모든 작업",
|
||||
"settings_notify_scope_hint": "선택한 저장된 보기의 라벨/사용자 필터와 일치하는 작업만 알림을 보냅니다. 보기의 상태·정렬·그룹화는 여기서 무시됩니다.",
|
||||
"card_saved_view": "저장된 보기",
|
||||
"card_saved_view_none": "없음",
|
||||
"card_saved_view_help": "위 필터에 더해 보기의 상태·사용자·라벨 필터를 적용합니다. 보기의 정렬과 그룹화는 패널 표시 설정이며 카드에는 적용되지 않습니다.",
|
||||
"doc_part_none": "이 부품에 연결된 문서가 없습니다.",
|
||||
"settings_templates_toggle_group": "이 그룹의 모든 템플릿을 켜거나 끄기",
|
||||
"setups_button": "추천 설정",
|
||||
"setups_title": "추천 설정 (베타)",
|
||||
"setups_hint": "소모품 센서로 유지보수 작업을 구동할 수 있는 지원 통합구성요소의 기기입니다. 가져오면 객체가 생성되고 각 작업이 센서에 연결됩니다 — 소모품이 부족해지면 트리거되고 교체 후 자동으로 해제됩니다.",
|
||||
"setups_none": "연결되지 않은 소모품 센서를 가진 지원 기기를 찾지 못했습니다.",
|
||||
"setups_adopt": "선택 항목 설정",
|
||||
"setups_done": "센서 연결 작업 {tasks}개가 생성되었습니다.",
|
||||
"complete_parts_used": "이번에 사용한 부품",
|
||||
"part_delete_confirm": "'{name}' 부품을 삭제할까요? 재고 추적, 작업 연결, 진행 중인 구매 알림이 모두 제거됩니다.",
|
||||
"baseline_start_value": "시작 값 (선택)",
|
||||
"baseline_start_help": "이 값부터 계수를 시작합니다. 비워두면 현재 값부터 계수합니다. 마지막 정비 시점의 값을 입력하면 그 이후의 사용량이 바로 반영됩니다.",
|
||||
"setups_baseline_hint": "마지막 정비 시점의 값 (선택)",
|
||||
"baseline_start_help_edit": "비워두면 기존 계수를 유지합니다. 값을 입력하면 계수 기준이 다시 설정됩니다 (예: 마지막 정비 시점의 값).",
|
||||
"baseline_current_effective": "현재 적용 중인 시작 값: {value}",
|
||||
"runtime_on_states": "활성 상태 (쉼표로 구분)",
|
||||
"runtime_on_states_help": "가동 중으로 계산할 상태입니다 — 기본값: on. 예: mowing, cleaning, printing. 속성을 선택한 경우 해당 속성 값과 비교합니다.",
|
||||
"setups_target_new": "새로 만들기: {name}",
|
||||
"schedule_preview_title": "다음 예정일",
|
||||
"schedule_preview_ontime": "제때 완료한다고 가정한 일정입니다.",
|
||||
"schedule_preview_ends": "(시리즈 종료)",
|
||||
"adopt_problem_responsible": "가져온 모든 작업의 담당자 (선택)",
|
||||
"adopt_problem_configure": "구성",
|
||||
"history_auto": "자동",
|
||||
"battery_fleet_title": "배터리 플릿",
|
||||
"battery_fleet_none_low": "모든 배터리 정상 — 교체할 것이 없습니다.",
|
||||
"battery_fleet_buy_now": "지금 구매",
|
||||
"battery_fleet_soon": "곧 필요",
|
||||
"battery_fleet_soon_hint": "마지막 교체일로부터 예측한 값입니다 — 미리 주문해 두세요.",
|
||||
"battery_fleet_mark_all": "모두 교체됨으로 표시",
|
||||
"battery_fleet_mark_one": "이 배터리를 교체됨으로 표시",
|
||||
"battery_fleet_offline": "오프라인",
|
||||
"battery_fleet_trigger_lost": "이 작업의 센서 트리거가 사라졌습니다 — 트리거도 자동 완료도 되지 않습니다.",
|
||||
"battery_fleet_repair": "복구",
|
||||
"battery_fleet_exclude": "플릿에서 제외",
|
||||
"battery_fleet_excluded": "제외됨",
|
||||
"battery_fleet_include": "다시 추적",
|
||||
"battery_fleet_total": "배터리 {n}개 추적 중",
|
||||
"battery_fleet_setup_button": "배터리 플릿",
|
||||
"battery_fleet_setup_done": "배터리 플릿이 설정되었습니다 — 하나의 작업이 모든 배터리를 추적합니다.",
|
||||
"update_banner": "서버에 Maintenance Supporter의 새 버전이 있습니다 — 패널을 업데이트하려면 새로 고침하세요.",
|
||||
"update_reload": "새로 고침"
|
||||
}
|
||||
@@ -0,0 +1,811 @@
|
||||
{
|
||||
"maintenance": "Manutenção",
|
||||
"objects": "Objetos",
|
||||
"tasks": "Tarefas",
|
||||
"overdue": "Atrasada",
|
||||
"due_soon": "Vence em breve",
|
||||
"triggered": "Acionada",
|
||||
"trigger_replaced": "Gatilho substituído",
|
||||
"ok": "OK",
|
||||
"all": "Todas",
|
||||
"new_object": "+ Novo objeto",
|
||||
"templates_from": "A partir de modelo",
|
||||
"templates_title": "Comece com um modelo",
|
||||
"templates_task_count": "{n} tarefas",
|
||||
"template_created": "Criado a partir do modelo",
|
||||
"onboard_hint": "Adicione seu primeiro objeto para começar a acompanhar a manutenção.",
|
||||
"edit": "Editar",
|
||||
"duplicate": "Duplicar",
|
||||
"task_duplicated": "Tarefa duplicada",
|
||||
"object_duplicated": "Objeto duplicado",
|
||||
"delete": "Excluir",
|
||||
"add_task": "+ Adicionar tarefa",
|
||||
"complete": "Concluir",
|
||||
"completed": "Concluída",
|
||||
"skip": "Pular",
|
||||
"skipped": "Pulada",
|
||||
"missed": "Perdida",
|
||||
"reset": "Redefinir",
|
||||
"snooze": "Soneca",
|
||||
"snoozed": "Em soneca",
|
||||
"cancel": "Cancelar",
|
||||
"bulk_select": "Selecionar",
|
||||
"bulk_select_all": "Selecionar tudo",
|
||||
"bulk_n_selected": "{n} selecionadas",
|
||||
"bulk_completed": "{n} tarefas concluídas",
|
||||
"bulk_archived": "{n} tarefas arquivadas",
|
||||
"completing": "Concluindo…",
|
||||
"interval": "Intervalo",
|
||||
"warning": "Aviso",
|
||||
"last_performed": "Última execução",
|
||||
"next_due": "Próximo vencimento",
|
||||
"days_until_due": "Dias até o vencimento",
|
||||
"avg_duration": "Duração média",
|
||||
"trigger": "Gatilho",
|
||||
"trigger_type": "Tipo de gatilho",
|
||||
"threshold_above": "Limite superior",
|
||||
"threshold_below": "Limite inferior",
|
||||
"threshold": "Limite",
|
||||
"counter": "Contador",
|
||||
"state_change": "Mudança de estado",
|
||||
"runtime": "Tempo de operação",
|
||||
"runtime_hours": "Tempo de operação alvo (horas)",
|
||||
"target_value": "Valor alvo",
|
||||
"baseline": "Linha de base",
|
||||
"target_changes": "Mudanças alvo",
|
||||
"for_minutes": "Durante (minutos)",
|
||||
"time_based": "Baseado em tempo",
|
||||
"sensor_based": "Baseado em sensor",
|
||||
"manual": "Manual",
|
||||
"one_time": "Única vez",
|
||||
"weekdays": "Dias da semana",
|
||||
"nth_weekday": "Enésimo dia da semana do mês",
|
||||
"day_of_month": "Dia do mês",
|
||||
"recurrence_on_days": "Repetir em",
|
||||
"recurrence_occurrence": "Ocorrência",
|
||||
"recurrence_weekday": "Dia da semana",
|
||||
"recurrence_day": "Dia do mês (1–31)",
|
||||
"recurrence_last_day": "Último dia do mês",
|
||||
"recurrence_business_day": "Somente dias úteis (antecipar do fim de semana)",
|
||||
"recurrence_offset": "Deslocamento (dias, ±)",
|
||||
"recurrence_offset_help": "Desloque a data em ±N dias, ex.: -2 = dois dias antes.",
|
||||
"last_day_month": "Último dia do mês",
|
||||
"last_business_day_month": "Último dia útil",
|
||||
"ord_1": "1º",
|
||||
"ord_2": "2º",
|
||||
"ord_3": "3º",
|
||||
"ord_4": "4º",
|
||||
"ord_5": "5º",
|
||||
"ord_last": "Último",
|
||||
"day_word": "Dia",
|
||||
"interval_value": "Intervalo",
|
||||
"interval_unit": "Unidade",
|
||||
"unit_days": "Dias",
|
||||
"unit_weeks": "Semanas",
|
||||
"unit_months": "Meses",
|
||||
"unit_years": "Anos",
|
||||
"due_date": "Data de vencimento",
|
||||
"cleaning": "Limpeza",
|
||||
"inspection": "Inspeção",
|
||||
"replacement": "Substituição",
|
||||
"calibration": "Calibração",
|
||||
"service": "Revisão",
|
||||
"reading": "Leitura",
|
||||
"custom": "Personalizado",
|
||||
"history": "Histórico",
|
||||
"cost": "Custo",
|
||||
"report_button": "Relatório",
|
||||
"report_title": "Relatório de manutenção",
|
||||
"report_generated": "Gerado em",
|
||||
"report_times_done": "Concluídas",
|
||||
"report_total_cost": "Custo total",
|
||||
"report_every": "a cada {n} {unit}",
|
||||
"report_notes": "Observações",
|
||||
"report_col_type": "Tipo",
|
||||
"report_col_status": "Status",
|
||||
"report_col_schedule": "Agendamento",
|
||||
"duration": "Duração",
|
||||
"both": "Ambos",
|
||||
"trigger_val": "Valor do gatilho",
|
||||
"complete_title": "Concluir: ",
|
||||
"checklist": "Checklist",
|
||||
"checklist_steps_optional": "Etapas do checklist (opcional)",
|
||||
"checklist_placeholder": "Limpar o filtro\nTrocar a vedação\nTestar a pressão",
|
||||
"checklist_help": "Uma etapa por linha. Máx. 100 itens.",
|
||||
"err_too_long": "{field}: muito longo (máx. {n} caracteres)",
|
||||
"err_too_short": "{field}: muito curto (mín. {n} caracteres)",
|
||||
"err_value_too_high": "{field}: muito grande (máx. {n})",
|
||||
"err_value_too_low": "{field}: muito pequeno (mín. {n})",
|
||||
"err_required": "{field}: obrigatório",
|
||||
"err_wrong_type": "{field}: tipo incorreto (esperado: {type})",
|
||||
"err_invalid_choice": "{field}: valor não permitido",
|
||||
"err_invalid_value": "{field}: valor inválido",
|
||||
"feat_schedule_time": "Agendamento por horário",
|
||||
"feat_schedule_time_desc": "As tarefas ficam atrasadas em um horário específico do dia, em vez de à meia-noite.",
|
||||
"schedule_time_optional": "Vence às (opcional, HH:MM)",
|
||||
"schedule_time_help": "Vazio = meia-noite (padrão). Fuso horário do HA.",
|
||||
"at_time": "às",
|
||||
"notes_optional": "Observações (opcional)",
|
||||
"cost_optional": "Custo (opcional)",
|
||||
"duration_minutes": "Duração em minutos (opcional)",
|
||||
"days": "dias",
|
||||
"day": "dia",
|
||||
"today": "Hoje",
|
||||
"d_overdue": "d de atraso",
|
||||
"no_tasks": "Ainda não há tarefas de manutenção. Crie um objeto para começar.",
|
||||
"no_tasks_short": "Sem tarefas",
|
||||
"no_history": "Ainda não há entradas no histórico.",
|
||||
"show_all": "Mostrar tudo",
|
||||
"cost_duration_chart": "Custo e duração",
|
||||
"installed": "Instalado",
|
||||
"confirm_delete_object": "Excluir este objeto e todas as suas tarefas?",
|
||||
"confirm_delete_task": "Excluir esta tarefa?",
|
||||
"min": "Mín",
|
||||
"max": "Máx",
|
||||
"save": "Salvar",
|
||||
"saving": "Salvando…",
|
||||
"edit_task": "Editar tarefa",
|
||||
"new_task": "Nova tarefa de manutenção",
|
||||
"task_name": "Nome da tarefa",
|
||||
"maintenance_type": "Tipo de manutenção",
|
||||
"priority": "Prioridade",
|
||||
"labels": "Etiquetas",
|
||||
"labels_placeholder": "ex.: segurança, sazonal, visível ao inquilino",
|
||||
"labels_help": "Tags separadas por vírgula para filtragem e relatórios.",
|
||||
"priority_low": "Baixa",
|
||||
"priority_normal": "Normal",
|
||||
"priority_high": "Alta",
|
||||
"schedule_type": "Tipo de agendamento",
|
||||
"interval_days": "Intervalo (dias)",
|
||||
"warning_days": "Dias de aviso",
|
||||
"earliest_completion_days": "Conclusão antecipada (dias antes do vencimento)",
|
||||
"earliest_completion_days_help": "Deixe vazio para permitir concluir a qualquer momento. 0 = somente no dia do vencimento ou depois.",
|
||||
"last_performed_optional": "Última execução (opcional)",
|
||||
"interval_anchor": "Âncora do intervalo",
|
||||
"anchor_completion": "A partir da data de conclusão",
|
||||
"anchor_planned": "A partir da data planejada (sem deriva)",
|
||||
"edit_object": "Editar objeto",
|
||||
"name": "Nome",
|
||||
"manufacturer_optional": "Fabricante (opcional)",
|
||||
"model_optional": "Modelo (opcional)",
|
||||
"serial_number_optional": "Número de série (opcional)",
|
||||
"serial_number_label": "N/S",
|
||||
"documentation_url_label": "Manual",
|
||||
"object_notes_label": "Observações",
|
||||
"sort_due_date": "Data de vencimento",
|
||||
"sort_object": "Nome do objeto",
|
||||
"sort_type": "Tipo",
|
||||
"sort_task_name": "Nome da tarefa",
|
||||
"all_objects": "Todos os objetos",
|
||||
"tasks_lower": "tarefas",
|
||||
"no_tasks_yet": "Ainda sem tarefas",
|
||||
"add_first_task": "Adicionar a primeira tarefa",
|
||||
"trigger_configuration": "Configuração do gatilho",
|
||||
"entity_id": "ID da entidade",
|
||||
"comma_separated": "separado por vírgulas",
|
||||
"entity_logic": "Lógica das entidades",
|
||||
"entity_logic_any": "Qualquer entidade aciona",
|
||||
"entity_logic_all": "Todas as entidades devem acionar",
|
||||
"entities": "entidades",
|
||||
"attribute_optional": "Atributo (opcional, vazio = estado)",
|
||||
"use_entity_state": "Usar o estado da entidade (sem atributo)",
|
||||
"trigger_above": "Acionar acima de",
|
||||
"trigger_below": "Acionar abaixo de",
|
||||
"for_at_least_minutes": "Por pelo menos (minutos)",
|
||||
"safety_interval_days": "Intervalo de segurança (dias, opcional)",
|
||||
"safety_interval": "Intervalo de segurança (opcional)",
|
||||
"delta_mode": "Modo delta",
|
||||
"from_state_optional": "Do estado (opcional)",
|
||||
"to_state_optional": "Para o estado (opcional)",
|
||||
"documentation_url_optional": "URL da documentação (opcional)",
|
||||
"object_notes_optional": "Observações (opcional)",
|
||||
"nfc_tag_id_optional": "ID da tag NFC (opcional)",
|
||||
"nfc_tags_empty_help": "Ainda não há tags NFC registradas no Home Assistant.",
|
||||
"nfc_tags_open_settings": "Abrir configurações de tags",
|
||||
"nfc_tags_refresh": "Atualizar",
|
||||
"environmental_entity_optional": "Sensor ambiental (opcional)",
|
||||
"environmental_entity_helper": "ex.: sensor.outdoor_temperature — ajusta o intervalo com base nas condições ambientais",
|
||||
"environmental_attribute_optional": "Atributo ambiental (opcional)",
|
||||
"nfc_tag_id": "ID da tag NFC",
|
||||
"nfc_linked": "Tag NFC vinculada",
|
||||
"nfc_link_hint": "Clique para vincular uma tag NFC",
|
||||
"responsible_user": "Usuário responsável",
|
||||
"shared_with": "Compartilhada com (rodízio)",
|
||||
"shared_with_help": "Escolha várias pessoas para compartilhar esta tarefa; o responsável muda em rodízio a cada conclusão.",
|
||||
"rotation_strategy": "Rodízio",
|
||||
"rotation_none": "Sem rodízio",
|
||||
"rotation_round_robin": "Revezamento",
|
||||
"rotation_least_completed": "Quem concluiu menos",
|
||||
"rotation_random": "Aleatório",
|
||||
"no_user_assigned": "(Nenhum usuário atribuído)",
|
||||
"all_users": "Todos os usuários",
|
||||
"my_tasks": "Minhas tarefas",
|
||||
"tab_calendar": "Calendário",
|
||||
"cal_no_events": "Sem manutenção",
|
||||
"cal_window_7": "7 dias",
|
||||
"cal_window_14": "14 dias",
|
||||
"cal_window_30": "30 dias",
|
||||
"cal_window_365": "1 ano",
|
||||
"cal_every_n_days": "a cada {n} dias",
|
||||
"cal_source_time": "Baseado em tempo",
|
||||
"cal_source_time_adaptive": "Baseado em tempo (adaptativo)",
|
||||
"cal_source_sensor": "Baseado em sensor",
|
||||
"cal_predicted": "previsto",
|
||||
"cal_confidence_high": "confiança alta",
|
||||
"cal_confidence_medium": "confiança média",
|
||||
"cal_confidence_low": "confiança baixa",
|
||||
"budget_monthly": "Orçamento mensal",
|
||||
"budget_yearly": "Orçamento anual",
|
||||
"groups": "Grupos",
|
||||
"new_group": "Novo grupo",
|
||||
"edit_group": "Editar grupo",
|
||||
"no_groups": "Ainda sem grupos",
|
||||
"delete_group": "Excluir grupo",
|
||||
"delete_group_confirm": "Excluir o grupo '{name}'?",
|
||||
"group_select_tasks": "Selecionar tarefas",
|
||||
"group_name_required": "O nome é obrigatório",
|
||||
"description_optional": "Descrição (opcional)",
|
||||
"selected": "Selecionadas",
|
||||
"loading_chart": "Carregando dados do gráfico...",
|
||||
"hide_outliers": "Ocultar valores atípicos (falhas do sensor)",
|
||||
"was_maintenance_needed": "Esta manutenção era necessária?",
|
||||
"feedback_needed": "Necessária",
|
||||
"feedback_not_needed": "Desnecessária",
|
||||
"feedback_not_sure": "Não sei",
|
||||
"suggested_interval": "Intervalo sugerido",
|
||||
"apply_suggestion": "Aplicar",
|
||||
"reanalyze": "Reanalisar",
|
||||
"reanalyze_result": "Nova análise",
|
||||
"reanalyze_insufficient_data": "Dados insuficientes para gerar uma recomendação",
|
||||
"data_points": "pontos de dados",
|
||||
"dismiss_suggestion": "Dispensar",
|
||||
"confidence_low": "Baixa",
|
||||
"confidence_medium": "Média",
|
||||
"confidence_high": "Alta",
|
||||
"recommended": "recomendado",
|
||||
"seasonal_awareness": "Sazonalidade",
|
||||
"edit_seasonal_overrides": "Editar fatores sazonais",
|
||||
"seasonal_overrides_title": "Fatores sazonais (manual)",
|
||||
"seasonal_overrides_hint": "Fator por mês (0,1–5,0). Vazio = aprendido automaticamente.",
|
||||
"seasonal_override_invalid": "Valor inválido",
|
||||
"seasonal_override_range": "O fator deve estar entre 0,1 e 5,0",
|
||||
"clear_all": "Limpar tudo",
|
||||
"seasonal_chart_title": "Fatores sazonais",
|
||||
"seasonal_learned": "Aprendido",
|
||||
"seasonal_manual": "Manual",
|
||||
"month_jan": "Jan",
|
||||
"month_feb": "Fev",
|
||||
"month_mar": "Mar",
|
||||
"month_apr": "Abr",
|
||||
"month_may": "Mai",
|
||||
"month_jun": "Jun",
|
||||
"month_jul": "Jul",
|
||||
"month_aug": "Ago",
|
||||
"month_sep": "Set",
|
||||
"month_oct": "Out",
|
||||
"month_nov": "Nov",
|
||||
"month_dec": "Dez",
|
||||
"sensor_prediction": "Previsão do sensor",
|
||||
"degradation_trend": "Tendência",
|
||||
"trend_rising": "Subindo",
|
||||
"trend_falling": "Caindo",
|
||||
"trend_stable": "Estável",
|
||||
"trend_insufficient_data": "Dados insuficientes",
|
||||
"days_until_threshold": "Dias até o limite",
|
||||
"threshold_exceeded": "Limite excedido",
|
||||
"environmental_adjustment": "Fator ambiental",
|
||||
"sensor_prediction_urgency": "O sensor prevê atingir o limite em ~{days} dias",
|
||||
"day_short": "dia",
|
||||
"weibull_reliability_curve": "Curva de confiabilidade",
|
||||
"weibull_failure_probability": "Probabilidade de falha",
|
||||
"weibull_r_squared": "R² do ajuste",
|
||||
"beta_early_failures": "Falhas precoces",
|
||||
"beta_random_failures": "Falhas aleatórias",
|
||||
"beta_wear_out": "Desgaste",
|
||||
"beta_highly_predictable": "Altamente previsível",
|
||||
"confidence_interval": "Intervalo de confiança",
|
||||
"confidence_conservative": "Conservador",
|
||||
"confidence_aggressive": "Otimista",
|
||||
"current_interval_marker": "Intervalo atual",
|
||||
"recommended_marker": "Recomendado",
|
||||
"characteristic_life": "Vida característica",
|
||||
"chart_mini_sparkline": "Minigráfico de tendência",
|
||||
"chart_history": "Histórico de custo e duração",
|
||||
"chart_seasonal": "Fatores sazonais, 12 meses",
|
||||
"chart_weibull": "Curva de confiabilidade Weibull",
|
||||
"chart_sparkline": "Gráfico do valor do gatilho do sensor",
|
||||
"days_progress": "Progresso em dias",
|
||||
"qr_code": "Código QR",
|
||||
"qr_generating": "Gerando código QR…",
|
||||
"qr_error": "Falha ao gerar o código QR.",
|
||||
"qr_error_no_url": "Nenhuma URL do HA configurada. Defina uma URL externa ou interna em Configurações → Sistema → Rede.",
|
||||
"save_error": "Falha ao salvar. Tente novamente.",
|
||||
"qr_print": "Imprimir",
|
||||
"qr_download": "Baixar SVG",
|
||||
"qr_action": "Ação ao escanear",
|
||||
"qr_action_view": "Ver informações de manutenção",
|
||||
"qr_action_complete": "Marcar a manutenção como concluída",
|
||||
"qr_url_mode": "Tipo de link",
|
||||
"qr_mode_companion": "Companion App",
|
||||
"qr_mode_local": "Local (mDNS)",
|
||||
"qr_mode_server": "URL do servidor",
|
||||
"overview": "Visão geral",
|
||||
"analysis": "Análise",
|
||||
"recent_activities": "Atividades recentes",
|
||||
"search_notes": "Pesquisar observações",
|
||||
"avg_cost": "Custo médio",
|
||||
"no_advanced_features": "Nenhum recurso avançado ativado",
|
||||
"no_advanced_features_hint": "Ative “Intervalos adaptativos” ou “Padrões sazonais” nas configurações da integração para ver dados de análise aqui.",
|
||||
"analysis_not_enough_data": "Ainda não há dados suficientes para análise.",
|
||||
"analysis_not_enough_data_hint": "A análise de Weibull exige pelo menos 5 manutenções concluídas; padrões sazonais aparecem após 6+ pontos de dados por mês.",
|
||||
"analysis_manual_task_hint": "Tarefas manuais sem intervalo não geram dados de análise.",
|
||||
"completions": "conclusões",
|
||||
"current": "Atual",
|
||||
"shorter": "Mais curto",
|
||||
"longer": "Mais longo",
|
||||
"normal": "Normal",
|
||||
"disabled": "Desativado",
|
||||
"compound_logic": "Lógica composta",
|
||||
"compound": "Composto (várias condições)",
|
||||
"compound_logic_and": "E — todas as condições devem acionar",
|
||||
"compound_logic_or": "OU — qualquer condição aciona",
|
||||
"compound_help": "Combine várias condições de sensor em um único gatilho.",
|
||||
"compound_no_conditions": "Ainda sem condições — adicione pelo menos uma.",
|
||||
"compound_add_condition": "Adicionar condição",
|
||||
"compound_condition": "Condição",
|
||||
"compound_remove_condition": "Remover condição",
|
||||
"card_title": "Título",
|
||||
"card_show_header": "Mostrar cabeçalho com estatísticas",
|
||||
"card_show_actions": "Mostrar botões de ação",
|
||||
"card_compact": "Modo compacto",
|
||||
"card_max_items": "Máx. de itens (0 = todos)",
|
||||
"card_filter_status": "Filtrar por status",
|
||||
"card_filter_status_help": "Vazio = mostrar todos os status.",
|
||||
"card_filter_objects": "Filtrar por objetos",
|
||||
"card_filter_objects_help": "Vazio = mostrar todos os objetos.",
|
||||
"card_filter_entities": "Filtrar por entidades (entity_ids)",
|
||||
"card_filter_entities_help": "Escolha entidades sensor / binary_sensor desta integração. Vazio = todas.",
|
||||
"card_loading_objects": "Carregando objetos…",
|
||||
"card_load_error": "Não foi possível carregar os objetos — verifique a conexão WebSocket.",
|
||||
"card_no_tasks_title": "Ainda não há tarefas de manutenção",
|
||||
"card_no_tasks_cta": "→ Crie uma no painel de Manutenção",
|
||||
"no_objects": "Ainda não há objetos.",
|
||||
"action_error": "A ação falhou. Tente novamente.",
|
||||
"area_id_optional": "Área (opcional)",
|
||||
"installation_date_optional": "Data de instalação (opcional)",
|
||||
"warranty_expiry_optional": "Fim da garantia (opcional)",
|
||||
"warranty": "Garantia",
|
||||
"warranty_valid_until": "válida até {date}",
|
||||
"warranty_expires_in": "expira em {days} dias",
|
||||
"warranty_expired": "expirada",
|
||||
"cal_past_windows": "Janelas passadas",
|
||||
"cal_forward_windows": "Janelas futuras",
|
||||
"history_edit_title": "Editar entrada do histórico",
|
||||
"history_edit_timestamp": "Data e hora",
|
||||
"manufacturer": "Fabricante",
|
||||
"model": "Modelo",
|
||||
"area": "Área",
|
||||
"actions": "Ações",
|
||||
"view_mode_label": "Visualização",
|
||||
"view_cards": "Cartões",
|
||||
"view_table": "Tabela",
|
||||
"objects_table_columns_label": "Colunas da tabela de objetos",
|
||||
"objects_table_columns_hint": "Escolha quais colunas aparecem na visualização em tabela dos objetos.",
|
||||
"custom_icon_optional": "Ícone (opcional, ex.: mdi:wrench)",
|
||||
"task_enabled": "Tarefa ativada",
|
||||
"skip_reason_prompt": "Pular esta tarefa?",
|
||||
"reason_optional": "Motivo (opcional)",
|
||||
"reset_date_prompt": "Marcar a tarefa como realizada?",
|
||||
"reset_date_optional": "Data da última execução (opcional, padrão: hoje)",
|
||||
"notes_label": "Observações",
|
||||
"documentation_label": "Documentação",
|
||||
"no_nfc_tag": "— Sem tag —",
|
||||
"dashboard": "Painel",
|
||||
"tab_today": "Hoje",
|
||||
"palette_placeholder": "Pesquisar objetos e tarefas…",
|
||||
"palette_no_results": "Nenhum resultado",
|
||||
"palette_hint": "↑↓ para navegar · Enter para abrir · Esc para fechar",
|
||||
"today_all_caught_up": "Tudo em dia! Nada vence esta semana.",
|
||||
"today_overdue": "Atrasadas",
|
||||
"today_due_today": "Vencem hoje",
|
||||
"today_this_week": "Esta semana",
|
||||
"settings": "Configurações",
|
||||
"settings_features": "Recursos avançados",
|
||||
"settings_features_desc": "Ative ou desative recursos avançados. Desativar apenas os oculta da interface, sem excluir dados.",
|
||||
"feat_adaptive": "Agendamento adaptativo",
|
||||
"feat_adaptive_desc": "Aprende intervalos ideais a partir do histórico de manutenção",
|
||||
"feat_predictions": "Previsões de sensor",
|
||||
"feat_predictions_desc": "Prevê datas de acionamento a partir da degradação do sensor",
|
||||
"feat_seasonal": "Ajustes sazonais",
|
||||
"feat_seasonal_desc": "Ajusta intervalos com base em padrões sazonais",
|
||||
"feat_environmental": "Correlação ambiental",
|
||||
"feat_environmental_desc": "Correlaciona intervalos com temperatura/umidade",
|
||||
"feat_budget": "Controle de orçamento",
|
||||
"feat_budget_desc": "Acompanha gastos mensais e anuais de manutenção",
|
||||
"feat_groups": "Grupos de tarefas",
|
||||
"feat_groups_desc": "Organiza tarefas em grupos lógicos",
|
||||
"feat_checklists": "Checklists",
|
||||
"feat_checklists_desc": "Procedimentos em várias etapas para concluir tarefas",
|
||||
"settings_general": "Geral",
|
||||
"settings_default_warning": "Dias de aviso padrão",
|
||||
"settings_panel_enabled": "Painel na barra lateral",
|
||||
"settings_panel_title": "Título do painel na barra lateral",
|
||||
"settings_notifications": "Notificações",
|
||||
"settings_notify_service": "Serviço de notificação",
|
||||
"test_notification": "Notificação de teste",
|
||||
"send_test": "Enviar teste",
|
||||
"testing": "Enviando…",
|
||||
"test_notification_success": "Notificação de teste enviada",
|
||||
"test_notification_failed": "Falha na notificação de teste",
|
||||
"settings_notify_due_soon": "Notificar quando vencer em breve",
|
||||
"settings_notify_overdue": "Notificar quando atrasada",
|
||||
"settings_notify_triggered": "Notificar quando acionada",
|
||||
"settings_interval_hours": "Intervalo de repetição (horas, 0 = uma vez)",
|
||||
"settings_quiet_hours": "Horário de silêncio",
|
||||
"settings_quiet_start": "Início",
|
||||
"settings_quiet_end": "Fim",
|
||||
"settings_max_per_day": "Máx. de notificações por dia (0 = ilimitado)",
|
||||
"settings_bundling": "Agrupar notificações",
|
||||
"settings_bundle_threshold": "Limite para agrupar",
|
||||
"settings_reminder_leads": "Lembretes extras (dias antes do vencimento)",
|
||||
"settings_reminder_leads_hint": "Antecedências separadas por vírgula, ex.: 14, 3, 0 — um lembrete extra é enviado em cada dia correspondente. Vazio = desativado.",
|
||||
"settings_actions": "Botões de ação no celular",
|
||||
"settings_action_complete": "Mostrar botão 'Concluir'",
|
||||
"settings_action_skip": "Mostrar botão 'Pular'",
|
||||
"settings_action_snooze": "Mostrar botão 'Soneca'",
|
||||
"settings_weekly_digest": "Resumo semanal",
|
||||
"settings_weekly_digest_hint": "Uma única notificação de resumo na segunda-feira de manhã quando houver tarefas vencendo.",
|
||||
"settings_warranty_reminder": "Lembrete de fim de garantia",
|
||||
"settings_warranty_reminder_days": "Dias antes do vencimento",
|
||||
"settings_warranty_reminder_hint": "Notifica uma vez quando faltar este número de dias para a garantia de um objeto expirar.",
|
||||
"settings_snooze_hours": "Duração da soneca (horas)",
|
||||
"settings_budget": "Orçamento",
|
||||
"settings_currency": "Moeda",
|
||||
"settings_budget_monthly": "Orçamento mensal",
|
||||
"settings_budget_yearly": "Orçamento anual",
|
||||
"settings_budget_alerts": "Alertas de orçamento",
|
||||
"settings_budget_threshold": "Limite de alerta (%)",
|
||||
"settings_import_export": "Importar / Exportar",
|
||||
"settings_export_json": "Exportar JSON",
|
||||
"settings_export_yaml": "Exportar YAML",
|
||||
"settings_export_csv": "Exportar CSV",
|
||||
"settings_import_csv": "Importar CSV",
|
||||
"settings_import_placeholder": "Cole o conteúdo JSON ou CSV aqui…",
|
||||
"settings_import_btn": "Importar",
|
||||
"settings_import_success": "{count} objetos importados com sucesso.",
|
||||
"settings_export_success": "Exportação baixada.",
|
||||
"settings_saved": "Configuração salva.",
|
||||
"settings_include_history": "Incluir histórico",
|
||||
"settings_export_selection": "Limitar aos objetos selecionados (opcional)",
|
||||
"settings_docs_archive": "Arquivo de documentos (com arquivos)",
|
||||
"settings_docs_archive_hint": "As exportações JSON/YAML/CSV levam apenas as configurações. Este ZIP inclui o conteúdo dos arquivos enviados para que a restauração seja completa.",
|
||||
"settings_docs_export_btn": "Baixar ZIP de documentos",
|
||||
"settings_docs_import_btn": "Restaurar ZIP de documentos",
|
||||
"settings_docs_import_success": "Restaurados: {blobs} arquivos, {docs} documentos",
|
||||
"sort_alphabetical": "Alfabética",
|
||||
"sort_due_soonest": "Vencimento mais próximo",
|
||||
"sort_task_count": "Número de tarefas",
|
||||
"sort_area": "Área",
|
||||
"sort_assigned_user": "Usuário atribuído",
|
||||
"sort_group": "Grupo",
|
||||
"groupby_none": "Sem agrupamento",
|
||||
"groupby_area": "Por área",
|
||||
"groupby_group": "Por grupo",
|
||||
"groupby_user": "Por usuário",
|
||||
"filter_label": "Filtro",
|
||||
"user_label": "Usuário",
|
||||
"sort_label": "Ordenar",
|
||||
"group_by_label": "Agrupar por",
|
||||
"state_value_help": "Use o valor de estado do HA (geralmente minúsculo, ex.: \"on\"/\"off\"). Maiúsculas e minúsculas são normalizadas ao salvar.",
|
||||
"target_changes_help": "Número de transições correspondentes antes de o gatilho disparar (padrão: 1).",
|
||||
"qr_print_title": "Imprimir códigos QR",
|
||||
"qr_print_desc": "Gere uma página imprimível de códigos QR para recortar e colar nos seus equipamentos.",
|
||||
"qr_print_load": "Carregar objetos",
|
||||
"qr_print_filter": "Filtro",
|
||||
"qr_print_objects": "Objetos",
|
||||
"qr_print_actions": "Ações",
|
||||
"qr_print_url_mode": "Tipo de link",
|
||||
"qr_print_estimate": "Códigos QR estimados",
|
||||
"qr_print_over_limit": "o limite é 200, restrinja o filtro",
|
||||
"qr_print_generate": "Gerar códigos QR",
|
||||
"qr_print_generating": "Gerando…",
|
||||
"qr_print_ready": "Códigos QR prontos",
|
||||
"qr_print_print_button": "Imprimir",
|
||||
"qr_print_empty": "Nada para gerar",
|
||||
"qr_action_skip": "Pular",
|
||||
"vacation_title": "Modo férias",
|
||||
"vacation_active": "ativo",
|
||||
"vacation_ended": "encerrado",
|
||||
"vacation_desc": "Planeje as férias: as notificações ficam pausadas durante o período mais uma margem de dias. Você pode reativar tarefas específicas.",
|
||||
"vacation_enable": "Ativar modo férias",
|
||||
"vacation_start": "Início",
|
||||
"vacation_end": "Fim",
|
||||
"vacation_buffer": "Margem (dias)",
|
||||
"vacation_exempt_title": "Notificar mesmo assim durante as férias",
|
||||
"vacation_exempt_desc": "Escolha tarefas que ainda devem notificar durante as férias (ex.: química crítica da piscina).",
|
||||
"vacation_load_tasks": "Carregar tarefas",
|
||||
"vacation_preview_btn": "Mostrar prévia",
|
||||
"vacation_preview_affected": "tarefas afetadas",
|
||||
"vacation_event_due_soon": "passa a vencer em breve",
|
||||
"vacation_event_overdue": "fica atrasada",
|
||||
"vacation_event_triggered_est": "possível acionamento por sensor",
|
||||
"vacation_sensor_based": "(baseado em sensor)",
|
||||
"vacation_action_notify": "Notificar mesmo assim",
|
||||
"vacation_action_unsilence": "Silenciar novamente",
|
||||
"vacation_marked_complete": "Marcada como concluída",
|
||||
"vacation_marked_skip": "Pulada",
|
||||
"vacation_end_now": "Encerrar as férias agora",
|
||||
"add": "Adicionar",
|
||||
"show_stats": "Mostrar estatísticas + gráficos",
|
||||
"hide_stats": "Ocultar estatísticas",
|
||||
"adaptive_no_data": "Ainda não há histórico de conclusões suficiente para a análise adaptativa. Conclua esta tarefa mais algumas vezes para desbloquear recomendações de intervalo e gráficos de confiabilidade.",
|
||||
"suggestion_applied": "Intervalo sugerido aplicado",
|
||||
"vacation_mode": "Modo férias",
|
||||
"vacation_status_active": "Ativo agora",
|
||||
"vacation_status_scheduled": "Agendado",
|
||||
"vacation_status_inactive": "Inativo",
|
||||
"vacation_end_now_confirm": "Encerrar as férias imediatamente?",
|
||||
"vacation_exempt_count": "isentas",
|
||||
"vacation_advanced": "Avançado…",
|
||||
"vacation_open_panel": "Abrir no painel",
|
||||
"enable": "Ativar",
|
||||
"saved": "Salvo",
|
||||
"budget_monthly_set": "Definir mensal",
|
||||
"budget_yearly_set": "Definir anual",
|
||||
"budget_advanced": "Moeda, alertas…",
|
||||
"budget_open_panel": "Abrir no painel",
|
||||
"groups_empty": "Ainda sem grupos.",
|
||||
"group_new_placeholder": "Adicionar grupo…",
|
||||
"group_delete_confirm": "Excluir o grupo \"{name}\"?",
|
||||
"groups_manage_tasks": "Gerenciar atribuições de tarefas…",
|
||||
"groups_open_panel": "Abrir no painel",
|
||||
"unassigned": "Sem atribuição",
|
||||
"no_area": "Sem área",
|
||||
"has_overdue": "Tem tarefas atrasadas",
|
||||
"object": "Objeto",
|
||||
"settings_panel_access": "Acesso ao painel",
|
||||
"settings_panel_access_desc": "Administradores sempre têm acesso total. Para delegar criação, edição e exclusão a não administradores específicos, ative esta opção e selecione-os abaixo — os demais veem apenas Concluir e Pular.",
|
||||
"settings_operator_write": "Permitir que os usuários selecionados criem, editem e excluam",
|
||||
"settings_operator_write_desc": "Desligado: apenas administradores podem alterar o conteúdo. Ligado: os usuários selecionados abaixo também recebem acesso total.",
|
||||
"no_non_admin_users": "Nenhum usuário não administrador encontrado. Adicione em Configurações → Pessoas.",
|
||||
"owner_label": "Proprietário",
|
||||
"feat_completion_actions": "Ações de conclusão",
|
||||
"feat_completion_actions_desc": "Ação do HA por tarefa ao concluir + QR de conclusão rápida com valores predefinidos.",
|
||||
"on_complete_action_title": "Ao concluir: acionar ação do HA (opcional)",
|
||||
"on_complete_action_desc": "Chama um serviço do HA quando a tarefa é concluída — ex.: zerar um contador no dispositivo.",
|
||||
"on_complete_action_service": "Serviço",
|
||||
"on_complete_action_target": "Entidade alvo",
|
||||
"on_complete_action_target_hint": "Atenção: o domínio da entidade deve corresponder ao serviço — ex.: 'button.press' só funciona em button.*, 'counter.increment' só em counter.*, 'input_button.press' só em input_button.* etc. Em caso de divergência, a ação falhará silenciosamente (o HA registra 'Referenced entities ... missing or not currently available').",
|
||||
"on_complete_action_data": "Dados (JSON, opcional)",
|
||||
"on_complete_action_test": "Validar configuração",
|
||||
"on_complete_action_test_success": "✓ Configuração válida (a ação só disparará na conclusão da tarefa)",
|
||||
"on_complete_action_test_failed": "Falhou",
|
||||
"quick_complete_defaults_title": "Padrões de conclusão rápida (para leituras de QR, opcional)",
|
||||
"quick_complete_defaults_desc": "Valores predefinidos para conclusões rápidas via QR. Sem eles, o QR abre o diálogo de conclusão.",
|
||||
"quick_complete_defaults_notes": "Observações",
|
||||
"quick_complete_defaults_cost": "Custo",
|
||||
"quick_complete_defaults_duration": "Duração (minutos)",
|
||||
"quick_complete_defaults_feedback_none": "Sem feedback",
|
||||
"quick_complete_defaults_feedback_needed": "Era necessária",
|
||||
"quick_complete_defaults_feedback_not_needed": "Não era necessária",
|
||||
"quick_complete_success": "Concluída rapidamente",
|
||||
"show_all_objects": "Mostrar todos os objetos",
|
||||
"show_all_tasks": "Limpar filtro — mostrar todas as tarefas",
|
||||
"filter_to_overdue": "Filtrar a lista de tarefas para apenas atrasadas",
|
||||
"filter_to_due_soon": "Filtrar a lista de tarefas para apenas vencendo em breve",
|
||||
"filter_to_triggered": "Filtrar a lista de tarefas para apenas acionadas",
|
||||
"open_task": "Abrir tarefa",
|
||||
"show_details": "Mostrar histórico + estatísticas",
|
||||
"hide_details": "Ocultar detalhes",
|
||||
"history_empty": "Ainda sem histórico.",
|
||||
"history_edit_button": "Editar entrada",
|
||||
"total_cost": "Custo total",
|
||||
"times_performed": "Realizada",
|
||||
"older_entries": "mais antigas",
|
||||
"open_in_panel": "Abrir no painel de Manutenção",
|
||||
"skip_reason": "Motivo para pular (opcional)",
|
||||
"reset_to_date": "Redefinir última execução para",
|
||||
"delete_task_confirm": "Excluir esta tarefa e seu histórico?",
|
||||
"delete_object_confirm": "Excluir este objeto e todas as suas tarefas?",
|
||||
"loading": "Carregando…",
|
||||
"archive": "Arquivar",
|
||||
"undo": "Desfazer",
|
||||
"task_archived": "Tarefa arquivada",
|
||||
"object_archived": "Objeto arquivado",
|
||||
"unarchive": "Desarquivar",
|
||||
"archived": "Arquivada",
|
||||
"show_archived": "Mostrar arquivados",
|
||||
"hide_archived": "Ocultar arquivados",
|
||||
"confirm_archive_object": "Arquivar este objeto e suas tarefas? Eles mantêm o histórico e podem ser desarquivados depois.",
|
||||
"settings_archive": "Arquivamento e retenção",
|
||||
"settings_archive_desc": "Aposente tarefas únicas concluídas sem excluí-las. Itens arquivados ficam ocultos e inativos, mas mantêm o histórico e o custo.",
|
||||
"settings_archive_oneoff_days": "Arquivar automaticamente tarefas únicas concluídas após (dias, 0 = desativado)",
|
||||
"settings_delete_archived_oneoff_days": "Excluir automaticamente tarefas únicas arquivadas após (dias, 0 = nunca)",
|
||||
"archive_object": "Arquivar objeto",
|
||||
"unarchive_object": "Desarquivar objeto",
|
||||
"documents": "Documentos",
|
||||
"documents_empty": "Ainda não há documentos.",
|
||||
"doc_upload": "Enviar arquivo",
|
||||
"doc_uploading": "Enviando…",
|
||||
"doc_add_link": "Adicionar link",
|
||||
"doc_link_url": "URL (https://…)",
|
||||
"doc_link_title": "Título (opcional)",
|
||||
"doc_open": "Abrir",
|
||||
"doc_delete_confirm": "Excluir \"{name}\"?",
|
||||
"doc_too_large": "O arquivo é muito grande (máx. 25 MB).",
|
||||
"doc_upload_failed": "Falha no envio.",
|
||||
"completion_photo_optional": "Foto da conclusão (opcional)",
|
||||
"add_photo": "Adicionar foto",
|
||||
"uploading": "Enviando…",
|
||||
"remove": "Remover",
|
||||
"doc_deduped": "Já armazenado em outro lugar — compartilhado, sem uso de espaço extra.",
|
||||
"doc_dup_in_object": "Este arquivo já está anexado a este objeto.",
|
||||
"doc_link_invalid": "Apenas links http/https são permitidos.",
|
||||
"doc_cat_manual": "Manual",
|
||||
"doc_cat_warranty": "Garantia",
|
||||
"doc_cat_invoice": "Nota fiscal",
|
||||
"doc_cat_spare_parts": "Peças de reposição",
|
||||
"doc_cat_photo": "Foto",
|
||||
"doc_cat_other": "Outros",
|
||||
"doc_link_badge": "Link",
|
||||
"doc_storage_title": "Armazenamento de documentos",
|
||||
"doc_storage_saved": "Economizado por deduplicação",
|
||||
"doc_storage_refresh": "Atualizar",
|
||||
"doc_download": "Baixar",
|
||||
"doc_close": "Fechar",
|
||||
"doc_camera": "Tirar foto",
|
||||
"doc_drop_hint": "Solte os arquivos aqui",
|
||||
"doc_task_none": "Nenhum documento vinculado a esta tarefa.",
|
||||
"doc_link_existing": "Vincular um documento…",
|
||||
"doc_attach": "Vincular",
|
||||
"doc_unlink": "Desvincular",
|
||||
"doc_page": "Página",
|
||||
"chart_range_7d": "7d",
|
||||
"chart_range_30d": "30d",
|
||||
"chart_range_90d": "90d",
|
||||
"chart_range_1y": "1a",
|
||||
"chart_since_service": "desde a última manutenção",
|
||||
"chart_no_stats": "Sem estatísticas de longo prazo para esta entidade — mostrando apenas valores de eventos de manutenção",
|
||||
"auto_complete_on_recovery": "Concluir automaticamente quando o sensor se recuperar",
|
||||
"auto_complete_on_recovery_help": "Registra uma conclusão (define a última execução) quando o gatilho se resolve sozinho — ex.: sal reposto, filtro trocado.",
|
||||
"doc_search": "Pesquisar documentos…",
|
||||
"doc_search_none": "Nenhum documento correspondente",
|
||||
"link_device_optional": "Vincular a um dispositivo existente (opcional)",
|
||||
"parent_object_optional": "Objeto pai (opcional)",
|
||||
"parent_none": "(Sem pai)",
|
||||
"paused": "Pausado",
|
||||
"pause_object": "Pausar",
|
||||
"resume_object": "Retomar",
|
||||
"pause_until_prompt": "Congele os agendamentos deste objeto — nada vence e nada notifica até que ele seja retomado. Opcionalmente, defina uma data de retomada automática.",
|
||||
"pause_until_label": "Retomar em (opcional)",
|
||||
"object_paused": "Objeto pausado",
|
||||
"object_resumed": "Objeto retomado — agendamentos reiniciados",
|
||||
"object_paused_badge": "Pausado",
|
||||
"paused_until_label": "até",
|
||||
"replace_object": "Substituir…",
|
||||
"replace_object_prompt": "Aposente este objeto e crie um sucessor. O histórico e os custos ficam arquivados no antigo; as tarefas e os documentos passam para o novo, e os contadores recomeçam do zero.",
|
||||
"replace_name_label": "Nome do sucessor",
|
||||
"object_replaced": "Objeto substituído — sucessor criado",
|
||||
"reading_unit_label": "Unidade da leitura (ex.: kWh, m³)",
|
||||
"reading_unit_help": "Exibida ao lado do valor registrado ao concluir esta tarefa.",
|
||||
"reading_value_label": "Valor da leitura",
|
||||
"reading_label": "Leitura",
|
||||
"settings_templates_label": "Galeria de modelos",
|
||||
"settings_templates_hint": "Desmarque os modelos de que você nunca precisará — eles somem dos seletores \"A partir de modelo\" (painel e fluxo de configuração). Nada mais muda; você pode reativá-los a qualquer momento.",
|
||||
"worksheet": "Folha de trabalho",
|
||||
"worksheet_scan_view": "Escaneie para abrir a tarefa",
|
||||
"worksheet_scan_complete": "Escaneie para concluir",
|
||||
"worksheet_manual_excerpt": "Trecho do manual",
|
||||
"worksheet_pages": "páginas",
|
||||
"worksheet_printed": "Impressa em",
|
||||
"worksheet_never": "Nunca",
|
||||
"card_all_caught_up": "Tudo em dia — nada precisa de atenção",
|
||||
"postpone": "Adiar",
|
||||
"postpone_date_prompt": "Adiar esta ocorrência para qual data?",
|
||||
"postpone_date_label": "Nova data de vencimento",
|
||||
"postponed": "Adiada",
|
||||
"postponed_to": "Adiada para",
|
||||
"season_window_label": "Janela sazonal (meses)",
|
||||
"season_window_hint": "Vence apenas nos meses selecionados; datas fora de temporada passam para o próximo mês ativo. Nenhum = o ano todo.",
|
||||
"series_end_label": "Termina",
|
||||
"series_end_never": "Nunca (repete indefinidamente)",
|
||||
"series_end_after_count": "Após um número de vezes",
|
||||
"series_end_until": "Em uma data",
|
||||
"series_end_count_label": "Número de vezes",
|
||||
"series_end_until_label": "Data final",
|
||||
"parts_section": "Peças e consumíveis",
|
||||
"part_add": "Adicionar peça",
|
||||
"part_name": "Nome",
|
||||
"part_vendor": "Fabricante",
|
||||
"part_storage_location": "Local de armazenamento",
|
||||
"part_product_url": "URL do produto",
|
||||
"part_unit": "Unidade",
|
||||
"part_cost": "Preço unitário",
|
||||
"part_stock": "Estoque",
|
||||
"part_reorder_threshold": "Repor em",
|
||||
"part_restock_quantity": "Quantidade de reposição",
|
||||
"part_auto_buy": "Criar tarefa de compra automaticamente quando estiver baixo",
|
||||
"part_restock": "Ajustar estoque",
|
||||
"restock_quantity_label": "Quantidade comprada",
|
||||
"consumes_parts_label": "Consome peças",
|
||||
"parts_load_failed": "Não foi possível carregar as peças deste objeto — as opções de consumo de peças estão indisponíveis no momento.",
|
||||
"adopt_problem_button": "Adotar sensores de problema",
|
||||
"adopt_problem_title": "Adotar sensores de problema",
|
||||
"adopt_problem_hint": "Transforme sensores de problema do HA (erros de impressora, avisos de filtro, bateria fraca) em tarefas de manutenção que são acionadas enquanto o problema está ativo e se resolvem sozinhas quando ele desaparece.",
|
||||
"adopt_problem_none": "Nenhum sensor de problema encontrado que ainda não seja acompanhado.",
|
||||
"adopt_problem_active": "ativo",
|
||||
"adopt_problem_ok": "ok",
|
||||
"adopt_problem_new_object": "(novo)",
|
||||
"adopt_problem_adopt": "Adotar selecionados",
|
||||
"adopt_problem_done": "{tasks} sensor(es) de problema adotado(s)",
|
||||
"views_label": "Visualizações",
|
||||
"views_none": "— Nenhuma visualização —",
|
||||
"views_manage": "Salvar / gerenciar visualizações",
|
||||
"views_dialog_title": "Visualizações salvas",
|
||||
"views_dialog_hint": "Salve os filtros atuais como uma visualização nomeada que todos podem reutilizar.",
|
||||
"views_name_placeholder": "Nome da visualização",
|
||||
"views_save_current": "Salvar filtros atuais",
|
||||
"views_none_yet": "Ainda não há visualizações salvas.",
|
||||
"close": "Fechar",
|
||||
"trigger_hint_now": "O sensor lê {value} neste momento.",
|
||||
"trigger_hint_above": "A tarefa é acionada quando o valor sobe acima de {target}.",
|
||||
"trigger_hint_below": "É acionada quando o valor cai abaixo de {target}.",
|
||||
"trigger_hint_counter_delta": "Conta a partir da leitura atual ({value}): vence em {due} (+{target}), e a contagem recomeça após cada conclusão.",
|
||||
"trigger_hint_counter_delta_edit": "Conta o uso desde a última conclusão: vence após +{target}; a contagem recomeça após cada conclusão.",
|
||||
"trigger_hint_counter_abs": "A tarefa vence quando o sensor atinge {target}.",
|
||||
"trigger_hint_runtime": "A tarefa vence após {hours} h de funcionamento acumulado; o contador recomeça após cada conclusão.",
|
||||
"trigger_hint_state_change": "A tarefa vence após {count} mudança(s) de estado.",
|
||||
"trigger_hint_state_change_to": "A tarefa vence após {count} mudança(s) para “{state}”.",
|
||||
"trigger_hint_state_now": "Estado atual: {value}.",
|
||||
"adopt_problem_part": "Usa a peça: {name}",
|
||||
"label_filter": "Etiqueta",
|
||||
"all_labels": "Todas as etiquetas",
|
||||
"settings_notify_scope": "Notificar apenas para a visualização",
|
||||
"settings_notify_scope_all": "Todas as tarefas",
|
||||
"settings_notify_scope_hint": "Apenas tarefas que correspondem aos filtros de etiqueta/usuário da visualização salva selecionada enviam lembretes. Status, ordenação e agrupamento da visualização são ignorados aqui.",
|
||||
"card_saved_view": "Visualização salva",
|
||||
"card_saved_view_none": "Nenhuma",
|
||||
"card_saved_view_help": "Aplica os filtros de status, usuário e etiqueta da visualização por cima dos filtros acima. A ordenação e o agrupamento da visualização são configurações de exibição do painel e não se aplicam ao cartão.",
|
||||
"doc_part_none": "Nenhum documento vinculado a esta peça.",
|
||||
"settings_templates_toggle_group": "Ativar ou desativar todos os modelos deste grupo",
|
||||
"setups_button": "Configurações sugeridas",
|
||||
"setups_title": "Configurações sugeridas (Beta)",
|
||||
"setups_hint": "Dispositivos de integrações compatíveis cujos sensores de consumíveis podem alimentar tarefas de manutenção. Adotar cria o objeto e conecta cada tarefa ao seu sensor — ela é acionada quando o consumível fica baixo e se resolve sozinha após a troca.",
|
||||
"setups_none": "Nenhum dispositivo compatível com sensores de consumíveis ainda não conectados foi encontrado.",
|
||||
"setups_adopt": "Configurar selecionados",
|
||||
"setups_done": "{tasks} tarefas conectadas a sensores foram criadas.",
|
||||
"complete_parts_used": "Peças usadas desta vez",
|
||||
"part_delete_confirm": "Excluir a peça '{name}'? O controle de estoque, os vínculos com tarefas e qualquer lembrete de compra aberto serão removidos.",
|
||||
"baseline_start_value": "Leitura inicial (opcional)",
|
||||
"baseline_start_help": "A contagem começa a partir desta leitura. Deixe vazio para contar a partir do valor atual; informe a leitura da última manutenção para que o uso desde então já seja contado.",
|
||||
"setups_baseline_hint": "leitura na última manutenção (opcional)",
|
||||
"baseline_start_help_edit": "Deixe vazio para manter a contagem existente. Informar um valor reancora a contagem (ex.: a leitura da última manutenção).",
|
||||
"baseline_current_effective": "Valor inicial efetivo atual: {value}",
|
||||
"runtime_on_states": "Estados ativos (separados por vírgula)",
|
||||
"runtime_on_states_help": "Estados que contam como em funcionamento — padrão: on. Ex.: mowing, cleaning, printing. Com um atributo selecionado, os valores dele são comparados.",
|
||||
"setups_target_new": "Criar novo: {name}",
|
||||
"schedule_preview_title": "Próximas datas",
|
||||
"schedule_preview_ontime": "Supondo conclusão em dia.",
|
||||
"schedule_preview_ends": "(a série termina)",
|
||||
"adopt_problem_responsible": "Usuário responsável por todas as tarefas adotadas (opcional)",
|
||||
"adopt_problem_configure": "Configurar",
|
||||
"history_auto": "Automática",
|
||||
"battery_fleet_title": "Frota de baterias",
|
||||
"battery_fleet_none_low": "Todas as baterias OK — nada a substituir.",
|
||||
"battery_fleet_buy_now": "Comprar agora",
|
||||
"battery_fleet_soon": "Necessárias em breve",
|
||||
"battery_fleet_soon_hint": "Previsto a partir da data da última troca — compre com antecedência.",
|
||||
"battery_fleet_mark_all": "Marcar todas como trocadas",
|
||||
"battery_fleet_mark_one": "Marcar esta bateria como trocada",
|
||||
"battery_fleet_offline": "offline",
|
||||
"battery_fleet_trigger_lost": "O gatilho do sensor desta tarefa foi perdido — ela não será acionada nem concluída automaticamente.",
|
||||
"battery_fleet_repair": "Reparar",
|
||||
"battery_fleet_exclude": "Remover da frota",
|
||||
"battery_fleet_excluded": "Removida",
|
||||
"battery_fleet_include": "Acompanhar novamente",
|
||||
"battery_fleet_total": "{n} baterias acompanhadas",
|
||||
"battery_fleet_setup_button": "Frota de baterias",
|
||||
"battery_fleet_setup_done": "Frota de baterias configurada — uma única tarefa acompanha todas as suas baterias.",
|
||||
"update_banner": "Há uma versão mais nova do Maintenance Supporter no servidor — recarregue para atualizar o painel.",
|
||||
"update_reload": "Recarregar"
|
||||
}
|
||||
@@ -0,0 +1,811 @@
|
||||
{
|
||||
"maintenance": "Bakım",
|
||||
"objects": "Nesneler",
|
||||
"tasks": "Görevler",
|
||||
"overdue": "Gecikmiş",
|
||||
"due_soon": "Yaklaşan",
|
||||
"triggered": "Tetiklendi",
|
||||
"trigger_replaced": "Tetikleyici değiştirildi",
|
||||
"ok": "Tamam",
|
||||
"all": "Tümü",
|
||||
"new_object": "+ Yeni Nesne",
|
||||
"templates_from": "Şablondan",
|
||||
"templates_title": "Bir şablonla başlayın",
|
||||
"templates_task_count": "{n} görev",
|
||||
"template_created": "Şablondan oluşturuldu",
|
||||
"onboard_hint": "Bakım takibine başlamak için ilk nesnenizi ekleyin.",
|
||||
"edit": "Düzenle",
|
||||
"duplicate": "Çoğalt",
|
||||
"task_duplicated": "Görev çoğaltıldı",
|
||||
"object_duplicated": "Nesne çoğaltıldı",
|
||||
"delete": "Sil",
|
||||
"add_task": "+ Görev Ekle",
|
||||
"complete": "Tamamla",
|
||||
"completed": "Tamamlandı",
|
||||
"skip": "Atla",
|
||||
"skipped": "Atlandı",
|
||||
"missed": "Kaçırıldı",
|
||||
"reset": "Sıfırla",
|
||||
"snooze": "Ertele",
|
||||
"snoozed": "Ertelendi",
|
||||
"cancel": "İptal",
|
||||
"bulk_select": "Seç",
|
||||
"bulk_select_all": "Tümünü seç",
|
||||
"bulk_n_selected": "{n} seçildi",
|
||||
"bulk_completed": "{n} görev tamamlandı",
|
||||
"bulk_archived": "{n} görev arşivlendi",
|
||||
"completing": "Tamamlanıyor…",
|
||||
"interval": "Aralık",
|
||||
"warning": "Uyarı",
|
||||
"last_performed": "Son yapılma",
|
||||
"next_due": "Sonraki vade",
|
||||
"days_until_due": "Vadeye kalan gün",
|
||||
"avg_duration": "Ort. süre",
|
||||
"trigger": "Tetikleyici",
|
||||
"trigger_type": "Tetikleyici türü",
|
||||
"threshold_above": "Üst sınır",
|
||||
"threshold_below": "Alt sınır",
|
||||
"threshold": "Eşik",
|
||||
"counter": "Sayaç",
|
||||
"state_change": "Durum değişikliği",
|
||||
"runtime": "Çalışma süresi",
|
||||
"runtime_hours": "Hedef çalışma süresi (saat)",
|
||||
"target_value": "Hedef değer",
|
||||
"baseline": "Başlangıç değeri",
|
||||
"target_changes": "Hedef değişiklik sayısı",
|
||||
"for_minutes": "Süre (dakika)",
|
||||
"time_based": "Zamana dayalı",
|
||||
"sensor_based": "Sensöre dayalı",
|
||||
"manual": "Manuel",
|
||||
"one_time": "Tek seferlik",
|
||||
"weekdays": "Haftanın günleri",
|
||||
"nth_weekday": "Ayın n. hafta günü",
|
||||
"day_of_month": "Ayın günü",
|
||||
"recurrence_on_days": "Tekrar günleri",
|
||||
"recurrence_occurrence": "Kaçıncı",
|
||||
"recurrence_weekday": "Haftanın günü",
|
||||
"recurrence_day": "Ayın günü (1–31)",
|
||||
"recurrence_last_day": "Ayın son günü",
|
||||
"recurrence_business_day": "Yalnızca iş günleri (hafta sonundan geriye kaydır)",
|
||||
"recurrence_offset": "Kaydırma (gün, ±)",
|
||||
"recurrence_offset_help": "Tarihi ±N gün kaydırır, örn. -2 = iki gün önce.",
|
||||
"last_day_month": "Ayın son günü",
|
||||
"last_business_day_month": "Son iş günü",
|
||||
"ord_1": "1.",
|
||||
"ord_2": "2.",
|
||||
"ord_3": "3.",
|
||||
"ord_4": "4.",
|
||||
"ord_5": "5.",
|
||||
"ord_last": "Son",
|
||||
"day_word": "Gün",
|
||||
"interval_value": "Aralık",
|
||||
"interval_unit": "Birim",
|
||||
"unit_days": "Gün",
|
||||
"unit_weeks": "Hafta",
|
||||
"unit_months": "Ay",
|
||||
"unit_years": "Yıl",
|
||||
"due_date": "Vade tarihi",
|
||||
"cleaning": "Temizlik",
|
||||
"inspection": "Kontrol",
|
||||
"replacement": "Değişim",
|
||||
"calibration": "Kalibrasyon",
|
||||
"service": "Servis",
|
||||
"reading": "Okuma",
|
||||
"custom": "Özel",
|
||||
"history": "Geçmiş",
|
||||
"cost": "Maliyet",
|
||||
"report_button": "Rapor",
|
||||
"report_title": "Bakım raporu",
|
||||
"report_generated": "Oluşturulma",
|
||||
"report_times_done": "Yapıldı",
|
||||
"report_total_cost": "Toplam maliyet",
|
||||
"report_every": "her {n} {unit}",
|
||||
"report_notes": "Notlar",
|
||||
"report_col_type": "Tür",
|
||||
"report_col_status": "Durum",
|
||||
"report_col_schedule": "Zamanlama",
|
||||
"duration": "Süre",
|
||||
"both": "Her ikisi",
|
||||
"trigger_val": "Tetikleme değeri",
|
||||
"complete_title": "Tamamla: ",
|
||||
"checklist": "Kontrol listesi",
|
||||
"checklist_steps_optional": "Kontrol listesi adımları (isteğe bağlı)",
|
||||
"checklist_placeholder": "Filtreyi temizle\nContayı değiştir\nBasıncı test et",
|
||||
"checklist_help": "Her satıra bir adım. En fazla 100 madde.",
|
||||
"err_too_long": "{field}: çok uzun (en fazla {n} karakter)",
|
||||
"err_too_short": "{field}: çok kısa (en az {n} karakter)",
|
||||
"err_value_too_high": "{field}: çok büyük (en fazla {n})",
|
||||
"err_value_too_low": "{field}: çok küçük (en az {n})",
|
||||
"err_required": "{field}: zorunlu",
|
||||
"err_wrong_type": "{field}: yanlış tür (beklenen: {type})",
|
||||
"err_invalid_choice": "{field}: izin verilen bir değer değil",
|
||||
"err_invalid_value": "{field}: geçersiz değer",
|
||||
"feat_schedule_time": "Gün içi saat zamanlaması",
|
||||
"feat_schedule_time_desc": "Görevler gece yarısı yerine günün belirli bir saatinde gecikmiş olur.",
|
||||
"schedule_time_optional": "Vade saati (isteğe bağlı, SS:DD)",
|
||||
"schedule_time_help": "Boş = gece yarısı (varsayılan). HA saat dilimi.",
|
||||
"at_time": "saat",
|
||||
"notes_optional": "Notlar (isteğe bağlı)",
|
||||
"cost_optional": "Maliyet (isteğe bağlı)",
|
||||
"duration_minutes": "Dakika cinsinden süre (isteğe bağlı)",
|
||||
"days": "gün",
|
||||
"day": "gün",
|
||||
"today": "Bugün",
|
||||
"d_overdue": "g gecikmiş",
|
||||
"no_tasks": "Henüz bakım görevi yok. Başlamak için bir nesne oluşturun.",
|
||||
"no_tasks_short": "Görev yok",
|
||||
"no_history": "Henüz geçmiş kaydı yok.",
|
||||
"show_all": "Tümünü göster",
|
||||
"cost_duration_chart": "Maliyet ve Süre",
|
||||
"installed": "Kurulum",
|
||||
"confirm_delete_object": "Bu nesne ve tüm görevleri silinsin mi?",
|
||||
"confirm_delete_task": "Bu görev silinsin mi?",
|
||||
"min": "Min",
|
||||
"max": "Maks",
|
||||
"save": "Kaydet",
|
||||
"saving": "Kaydediliyor…",
|
||||
"edit_task": "Görevi Düzenle",
|
||||
"new_task": "Yeni Bakım Görevi",
|
||||
"task_name": "Görev adı",
|
||||
"maintenance_type": "Bakım türü",
|
||||
"priority": "Öncelik",
|
||||
"labels": "Etiketler",
|
||||
"labels_placeholder": "örn. güvenlik, mevsimlik, kiracıya görünür",
|
||||
"labels_help": "Filtreleme ve raporlama için virgülle ayrılmış etiketler.",
|
||||
"priority_low": "Düşük",
|
||||
"priority_normal": "Normal",
|
||||
"priority_high": "Yüksek",
|
||||
"schedule_type": "Zamanlama türü",
|
||||
"interval_days": "Aralık (gün)",
|
||||
"warning_days": "Uyarı günleri",
|
||||
"earliest_completion_days": "En erken tamamlama (vadeden gün önce)",
|
||||
"earliest_completion_days_help": "Her zaman tamamlanabilmesi için boş bırakın. 0 = yalnızca vade gününde veya sonrasında.",
|
||||
"last_performed_optional": "Son yapılma (isteğe bağlı)",
|
||||
"interval_anchor": "Aralık referansı",
|
||||
"anchor_completion": "Tamamlama tarihinden",
|
||||
"anchor_planned": "Planlanan tarihten (kayma olmaz)",
|
||||
"edit_object": "Nesneyi Düzenle",
|
||||
"name": "Ad",
|
||||
"manufacturer_optional": "Üretici (isteğe bağlı)",
|
||||
"model_optional": "Model (isteğe bağlı)",
|
||||
"serial_number_optional": "Seri numarası (isteğe bağlı)",
|
||||
"serial_number_label": "S/N",
|
||||
"documentation_url_label": "Kılavuz",
|
||||
"object_notes_label": "Notlar",
|
||||
"sort_due_date": "Vade tarihi",
|
||||
"sort_object": "Nesne adı",
|
||||
"sort_type": "Tür",
|
||||
"sort_task_name": "Görev adı",
|
||||
"all_objects": "Tüm nesneler",
|
||||
"tasks_lower": "görev",
|
||||
"no_tasks_yet": "Henüz görev yok",
|
||||
"add_first_task": "İlk görevi ekle",
|
||||
"trigger_configuration": "Tetikleyici Yapılandırması",
|
||||
"entity_id": "Varlık kimliği",
|
||||
"comma_separated": "virgülle ayrılmış",
|
||||
"entity_logic": "Varlık mantığı",
|
||||
"entity_logic_any": "Herhangi bir varlık tetikler",
|
||||
"entity_logic_all": "Tüm varlıklar tetiklemeli",
|
||||
"entities": "varlık",
|
||||
"attribute_optional": "Öznitelik (isteğe bağlı, boş = durum)",
|
||||
"use_entity_state": "Varlık durumunu kullan (öznitelik yok)",
|
||||
"trigger_above": "Üstünde tetikle",
|
||||
"trigger_below": "Altında tetikle",
|
||||
"for_at_least_minutes": "En az (dakika)",
|
||||
"safety_interval_days": "Güvenlik aralığı (gün, isteğe bağlı)",
|
||||
"safety_interval": "Güvenlik aralığı (isteğe bağlı)",
|
||||
"delta_mode": "Fark modu",
|
||||
"from_state_optional": "Başlangıç durumu (isteğe bağlı)",
|
||||
"to_state_optional": "Hedef durum (isteğe bağlı)",
|
||||
"documentation_url_optional": "Dokümantasyon URL'si (isteğe bağlı)",
|
||||
"object_notes_optional": "Notlar (isteğe bağlı)",
|
||||
"nfc_tag_id_optional": "NFC Etiket Kimliği (isteğe bağlı)",
|
||||
"nfc_tags_empty_help": "Home Assistant'ta henüz kayıtlı NFC etiketi yok.",
|
||||
"nfc_tags_open_settings": "Etiket ayarlarını aç",
|
||||
"nfc_tags_refresh": "Yenile",
|
||||
"environmental_entity_optional": "Çevresel sensör (isteğe bağlı)",
|
||||
"environmental_entity_helper": "örn. sensor.outdoor_temperature — aralığı çevresel koşullara göre ayarlar",
|
||||
"environmental_attribute_optional": "Çevresel öznitelik (isteğe bağlı)",
|
||||
"nfc_tag_id": "NFC Etiket Kimliği",
|
||||
"nfc_linked": "NFC etiketi bağlandı",
|
||||
"nfc_link_hint": "NFC etiketi bağlamak için tıklayın",
|
||||
"responsible_user": "Sorumlu Kullanıcı",
|
||||
"shared_with": "Paylaşılanlar (rotasyon)",
|
||||
"shared_with_help": "Bu görevi paylaşmak için birden fazla kişi seçin; sorumlu kişi her tamamlamada sırayla değişir.",
|
||||
"rotation_strategy": "Rotasyon",
|
||||
"rotation_none": "Rotasyon yok",
|
||||
"rotation_round_robin": "Sırayla",
|
||||
"rotation_least_completed": "En az tamamlayan",
|
||||
"rotation_random": "Rastgele",
|
||||
"no_user_assigned": "(Kullanıcı atanmadı)",
|
||||
"all_users": "Tüm Kullanıcılar",
|
||||
"my_tasks": "Görevlerim",
|
||||
"tab_calendar": "Takvim",
|
||||
"cal_no_events": "Bakım yok",
|
||||
"cal_window_7": "7 gün",
|
||||
"cal_window_14": "14 gün",
|
||||
"cal_window_30": "30 gün",
|
||||
"cal_window_365": "1 yıl",
|
||||
"cal_every_n_days": "her {n} günde bir",
|
||||
"cal_source_time": "Zamana dayalı",
|
||||
"cal_source_time_adaptive": "Zamana dayalı (uyarlanabilir)",
|
||||
"cal_source_sensor": "Sensöre dayalı",
|
||||
"cal_predicted": "tahmini",
|
||||
"cal_confidence_high": "yüksek güven",
|
||||
"cal_confidence_medium": "orta güven",
|
||||
"cal_confidence_low": "düşük güven",
|
||||
"budget_monthly": "Aylık bütçe",
|
||||
"budget_yearly": "Yıllık bütçe",
|
||||
"groups": "Gruplar",
|
||||
"new_group": "Yeni grup",
|
||||
"edit_group": "Grubu düzenle",
|
||||
"no_groups": "Henüz grup yok",
|
||||
"delete_group": "Grubu sil",
|
||||
"delete_group_confirm": "'{name}' grubu silinsin mi?",
|
||||
"group_select_tasks": "Görevleri seç",
|
||||
"group_name_required": "Ad zorunludur",
|
||||
"description_optional": "Açıklama (isteğe bağlı)",
|
||||
"selected": "Seçili",
|
||||
"loading_chart": "Grafik verileri yükleniyor...",
|
||||
"hide_outliers": "Aykırı değerleri gizle (sensör hataları)",
|
||||
"was_maintenance_needed": "Bu bakım gerekli miydi?",
|
||||
"feedback_needed": "Gerekliydi",
|
||||
"feedback_not_needed": "Gerekli değildi",
|
||||
"feedback_not_sure": "Emin değilim",
|
||||
"suggested_interval": "Önerilen aralık",
|
||||
"apply_suggestion": "Uygula",
|
||||
"reanalyze": "Yeniden analiz et",
|
||||
"reanalyze_result": "Yeni analiz",
|
||||
"reanalyze_insufficient_data": "Öneri üretmek için yeterli veri yok",
|
||||
"data_points": "veri noktası",
|
||||
"dismiss_suggestion": "Yoksay",
|
||||
"confidence_low": "Düşük",
|
||||
"confidence_medium": "Orta",
|
||||
"confidence_high": "Yüksek",
|
||||
"recommended": "önerilen",
|
||||
"seasonal_awareness": "Mevsimsel Farkındalık",
|
||||
"edit_seasonal_overrides": "Mevsimsel faktörleri düzenle",
|
||||
"seasonal_overrides_title": "Mevsimsel faktörler (elle ayar)",
|
||||
"seasonal_overrides_hint": "Ay başına faktör (0.1–5.0). Boş = otomatik öğrenilir.",
|
||||
"seasonal_override_invalid": "Geçersiz değer",
|
||||
"seasonal_override_range": "Faktör 0.1 ile 5.0 arasında olmalıdır",
|
||||
"clear_all": "Tümünü temizle",
|
||||
"seasonal_chart_title": "Mevsimsel Faktörler",
|
||||
"seasonal_learned": "Öğrenilmiş",
|
||||
"seasonal_manual": "Manuel",
|
||||
"month_jan": "Oca",
|
||||
"month_feb": "Şub",
|
||||
"month_mar": "Mar",
|
||||
"month_apr": "Nis",
|
||||
"month_may": "May",
|
||||
"month_jun": "Haz",
|
||||
"month_jul": "Tem",
|
||||
"month_aug": "Ağu",
|
||||
"month_sep": "Eyl",
|
||||
"month_oct": "Eki",
|
||||
"month_nov": "Kas",
|
||||
"month_dec": "Ara",
|
||||
"sensor_prediction": "Sensör Tahmini",
|
||||
"degradation_trend": "Eğilim",
|
||||
"trend_rising": "Yükseliyor",
|
||||
"trend_falling": "Düşüyor",
|
||||
"trend_stable": "Sabit",
|
||||
"trend_insufficient_data": "Yetersiz veri",
|
||||
"days_until_threshold": "Eşiğe kalan gün",
|
||||
"threshold_exceeded": "Eşik aşıldı",
|
||||
"environmental_adjustment": "Çevresel faktör",
|
||||
"sensor_prediction_urgency": "Sensör, eşiğe ~{days} gün kaldığını öngörüyor",
|
||||
"day_short": "gün",
|
||||
"weibull_reliability_curve": "Güvenilirlik Eğrisi",
|
||||
"weibull_failure_probability": "Arıza Olasılığı",
|
||||
"weibull_r_squared": "Uyum R²",
|
||||
"beta_early_failures": "Erken Arızalar",
|
||||
"beta_random_failures": "Rastgele Arızalar",
|
||||
"beta_wear_out": "Aşınma",
|
||||
"beta_highly_predictable": "Yüksek Öngörülebilirlik",
|
||||
"confidence_interval": "Güven Aralığı",
|
||||
"confidence_conservative": "Temkinli",
|
||||
"confidence_aggressive": "İyimser",
|
||||
"current_interval_marker": "Mevcut aralık",
|
||||
"recommended_marker": "Önerilen",
|
||||
"characteristic_life": "Karakteristik ömür",
|
||||
"chart_mini_sparkline": "Eğilim mini grafiği",
|
||||
"chart_history": "Maliyet ve süre geçmişi",
|
||||
"chart_seasonal": "Mevsimsel faktörler, 12 ay",
|
||||
"chart_weibull": "Weibull güvenilirlik eğrisi",
|
||||
"chart_sparkline": "Sensör tetikleme değeri grafiği",
|
||||
"days_progress": "Gün ilerlemesi",
|
||||
"qr_code": "QR Kodu",
|
||||
"qr_generating": "QR kodu oluşturuluyor…",
|
||||
"qr_error": "QR kodu oluşturulamadı.",
|
||||
"qr_error_no_url": "Yapılandırılmış bir HA URL'si yok. Lütfen Ayarlar → Sistem → Ağ bölümünden bir dış veya iç URL ayarlayın.",
|
||||
"save_error": "Kaydedilemedi. Lütfen tekrar deneyin.",
|
||||
"qr_print": "Yazdır",
|
||||
"qr_download": "SVG indir",
|
||||
"qr_action": "Tarama eylemi",
|
||||
"qr_action_view": "Bakım bilgisini görüntüle",
|
||||
"qr_action_complete": "Bakımı tamamlandı olarak işaretle",
|
||||
"qr_url_mode": "Bağlantı türü",
|
||||
"qr_mode_companion": "Companion uygulaması",
|
||||
"qr_mode_local": "Yerel (mDNS)",
|
||||
"qr_mode_server": "Sunucu URL'si",
|
||||
"overview": "Genel Bakış",
|
||||
"analysis": "Analiz",
|
||||
"recent_activities": "Son Etkinlikler",
|
||||
"search_notes": "Notlarda ara",
|
||||
"avg_cost": "Ort. Maliyet",
|
||||
"no_advanced_features": "Etkin gelişmiş özellik yok",
|
||||
"no_advanced_features_hint": "Burada analiz verilerini görmek için entegrasyon ayarlarından “Uyarlanabilir Aralıklar” veya “Mevsimsel Desenler” özelliğini etkinleştirin.",
|
||||
"analysis_not_enough_data": "Analiz için henüz yeterli veri yok.",
|
||||
"analysis_not_enough_data_hint": "Weibull analizi en az 5 tamamlanmış bakım gerektirir; mevsimsel desenler ay başına 6+ veri noktasından sonra görünür olur.",
|
||||
"analysis_manual_task_hint": "Aralığı olmayan manuel görevler analiz verisi üretmez.",
|
||||
"completions": "tamamlama",
|
||||
"current": "Mevcut",
|
||||
"shorter": "Daha kısa",
|
||||
"longer": "Daha uzun",
|
||||
"normal": "Normal",
|
||||
"disabled": "Devre dışı",
|
||||
"compound_logic": "Bileşik mantık",
|
||||
"compound": "Bileşik (birden fazla koşul)",
|
||||
"compound_logic_and": "VE — tüm koşullar tetiklenmeli",
|
||||
"compound_logic_or": "VEYA — herhangi bir koşul tetikler",
|
||||
"compound_help": "Birden fazla sensör koşulunu tek bir tetikleyicide birleştirin.",
|
||||
"compound_no_conditions": "Henüz koşul yok — en az bir tane ekleyin.",
|
||||
"compound_add_condition": "Koşul ekle",
|
||||
"compound_condition": "Koşul",
|
||||
"compound_remove_condition": "Koşulu kaldır",
|
||||
"card_title": "Başlık",
|
||||
"card_show_header": "İstatistikli başlığı göster",
|
||||
"card_show_actions": "Eylem düğmelerini göster",
|
||||
"card_compact": "Kompakt mod",
|
||||
"card_max_items": "En fazla öğe (0 = tümü)",
|
||||
"card_filter_status": "Duruma göre filtrele",
|
||||
"card_filter_status_help": "Boş = tüm durumları göster.",
|
||||
"card_filter_objects": "Nesnelere göre filtrele",
|
||||
"card_filter_objects_help": "Boş = tüm nesneleri göster.",
|
||||
"card_filter_entities": "Varlıklara göre filtrele (entity_id)",
|
||||
"card_filter_entities_help": "Bu entegrasyonun sensor / binary_sensor varlıklarını seçin. Boş = tümü.",
|
||||
"card_loading_objects": "Nesneler yükleniyor…",
|
||||
"card_load_error": "Nesneler yüklenemedi — WebSocket bağlantısını kontrol edin.",
|
||||
"card_no_tasks_title": "Henüz bakım görevi yok",
|
||||
"card_no_tasks_cta": "→ Bakım panelinde bir tane oluşturun",
|
||||
"no_objects": "Henüz nesne yok.",
|
||||
"action_error": "Eylem başarısız oldu. Lütfen tekrar deneyin.",
|
||||
"area_id_optional": "Alan (isteğe bağlı)",
|
||||
"installation_date_optional": "Kurulum tarihi (isteğe bağlı)",
|
||||
"warranty_expiry_optional": "Garanti bitişi (isteğe bağlı)",
|
||||
"warranty": "Garanti",
|
||||
"warranty_valid_until": "{date} tarihine kadar geçerli",
|
||||
"warranty_expires_in": "{days} gün içinde sona eriyor",
|
||||
"warranty_expired": "süresi doldu",
|
||||
"cal_past_windows": "Geçmiş dönemler",
|
||||
"cal_forward_windows": "Gelecek dönemler",
|
||||
"history_edit_title": "Geçmiş kaydını düzenle",
|
||||
"history_edit_timestamp": "Zaman damgası",
|
||||
"manufacturer": "Üretici",
|
||||
"model": "Model",
|
||||
"area": "Alan",
|
||||
"actions": "Eylemler",
|
||||
"view_mode_label": "Görünüm",
|
||||
"view_cards": "Kart görünümü",
|
||||
"view_table": "Tablo görünümü",
|
||||
"objects_table_columns_label": "Nesne tablosu sütunları",
|
||||
"objects_table_columns_hint": "Nesne tablosu görünümünde hangi sütunların görüneceğini seçin.",
|
||||
"custom_icon_optional": "Simge (isteğe bağlı, örn. mdi:wrench)",
|
||||
"task_enabled": "Görev etkin",
|
||||
"skip_reason_prompt": "Bu görev atlansın mı?",
|
||||
"reason_optional": "Neden (isteğe bağlı)",
|
||||
"reset_date_prompt": "Görev yapıldı olarak işaretlensin mi?",
|
||||
"reset_date_optional": "Son yapılma tarihi (isteğe bağlı, varsayılan bugün)",
|
||||
"notes_label": "Notlar",
|
||||
"documentation_label": "Dokümantasyon",
|
||||
"no_nfc_tag": "— Etiket yok —",
|
||||
"dashboard": "Gösterge Paneli",
|
||||
"tab_today": "Bugün",
|
||||
"palette_placeholder": "Nesne ve görevlerde ara…",
|
||||
"palette_no_results": "Eşleşme yok",
|
||||
"palette_hint": "↑↓ gezinme · Enter açma · Esc kapatma",
|
||||
"today_all_caught_up": "Her şey tamam! Bu hafta vadesi gelen yok.",
|
||||
"today_overdue": "Gecikmiş",
|
||||
"today_due_today": "Bugün vadeli",
|
||||
"today_this_week": "Bu hafta",
|
||||
"settings": "Ayarlar",
|
||||
"settings_features": "Gelişmiş Özellikler",
|
||||
"settings_features_desc": "Gelişmiş özellikleri etkinleştirin veya devre dışı bırakın. Devre dışı bırakmak onları arayüzden gizler ancak verileri silmez.",
|
||||
"feat_adaptive": "Uyarlanabilir Zamanlama",
|
||||
"feat_adaptive_desc": "Bakım geçmişinden en uygun aralıkları öğren",
|
||||
"feat_predictions": "Sensör Tahminleri",
|
||||
"feat_predictions_desc": "Sensör bozulmasından tetiklenme tarihlerini öngör",
|
||||
"feat_seasonal": "Mevsimsel Ayarlamalar",
|
||||
"feat_seasonal_desc": "Aralıkları mevsimsel desenlere göre ayarla",
|
||||
"feat_environmental": "Çevresel Korelasyon",
|
||||
"feat_environmental_desc": "Aralıkları sıcaklık/nemle ilişkilendir",
|
||||
"feat_budget": "Bütçe Takibi",
|
||||
"feat_budget_desc": "Aylık ve yıllık bakım harcamalarını takip et",
|
||||
"feat_groups": "Görev Grupları",
|
||||
"feat_groups_desc": "Görevleri mantıksal gruplar halinde düzenle",
|
||||
"feat_checklists": "Kontrol Listeleri",
|
||||
"feat_checklists_desc": "Görev tamamlama için çok adımlı prosedürler",
|
||||
"settings_general": "Genel",
|
||||
"settings_default_warning": "Varsayılan uyarı günleri",
|
||||
"settings_panel_enabled": "Kenar çubuğu paneli",
|
||||
"settings_panel_title": "Kenar çubuğu paneli başlığı",
|
||||
"settings_notifications": "Bildirimler",
|
||||
"settings_notify_service": "Bildirim servisi",
|
||||
"test_notification": "Test bildirimi",
|
||||
"send_test": "Test gönder",
|
||||
"testing": "Gönderiliyor…",
|
||||
"test_notification_success": "Test bildirimi gönderildi",
|
||||
"test_notification_failed": "Test bildirimi başarısız oldu",
|
||||
"settings_notify_due_soon": "Vade yaklaştığında bildir",
|
||||
"settings_notify_overdue": "Geciktiğinde bildir",
|
||||
"settings_notify_triggered": "Tetiklendiğinde bildir",
|
||||
"settings_interval_hours": "Tekrar aralığı (saat, 0 = bir kez)",
|
||||
"settings_quiet_hours": "Sessiz saatler",
|
||||
"settings_quiet_start": "Başlangıç",
|
||||
"settings_quiet_end": "Bitiş",
|
||||
"settings_max_per_day": "Günlük en fazla bildirim (0 = sınırsız)",
|
||||
"settings_bundling": "Bildirimleri grupla",
|
||||
"settings_bundle_threshold": "Gruplama eşiği",
|
||||
"settings_reminder_leads": "Ek hatırlatmalar (vadeden gün önce)",
|
||||
"settings_reminder_leads_hint": "Virgülle ayrılmış süreler, örn. 14, 3, 0 — eşleşen her günde bir ek hatırlatma gönderilir. Boş = kapalı.",
|
||||
"settings_actions": "Mobil Eylem Düğmeleri",
|
||||
"settings_action_complete": "'Tamamla' düğmesini göster",
|
||||
"settings_action_skip": "'Atla' düğmesini göster",
|
||||
"settings_action_snooze": "'Ertele' düğmesini göster",
|
||||
"settings_weekly_digest": "Haftalık özet",
|
||||
"settings_weekly_digest_hint": "Vadesi gelen görevler olduğunda pazartesi sabahı tek bir özet bildirimi.",
|
||||
"settings_warranty_reminder": "Garanti bitiş hatırlatması",
|
||||
"settings_warranty_reminder_days": "Bitişten gün önce",
|
||||
"settings_warranty_reminder_hint": "Bir nesnenin garantisinin bitmesine bu kadar gün kaldığında bir kez bildir.",
|
||||
"settings_snooze_hours": "Erteleme süresi (saat)",
|
||||
"settings_budget": "Bütçe",
|
||||
"settings_currency": "Para birimi",
|
||||
"settings_budget_monthly": "Aylık bütçe",
|
||||
"settings_budget_yearly": "Yıllık bütçe",
|
||||
"settings_budget_alerts": "Bütçe uyarıları",
|
||||
"settings_budget_threshold": "Uyarı eşiği (%)",
|
||||
"settings_import_export": "İçe / Dışa Aktarma",
|
||||
"settings_export_json": "JSON dışa aktar",
|
||||
"settings_export_yaml": "YAML dışa aktar",
|
||||
"settings_export_csv": "CSV dışa aktar",
|
||||
"settings_import_csv": "CSV içe aktar",
|
||||
"settings_import_placeholder": "JSON veya CSV içeriğini buraya yapıştırın…",
|
||||
"settings_import_btn": "İçe aktar",
|
||||
"settings_import_success": "{count} nesne başarıyla içe aktarıldı.",
|
||||
"settings_export_success": "Dışa aktarma indirildi.",
|
||||
"settings_saved": "Ayar kaydedildi.",
|
||||
"settings_include_history": "Geçmişi dahil et",
|
||||
"settings_export_selection": "Seçili nesnelerle sınırla (isteğe bağlı)",
|
||||
"settings_docs_archive": "Belge arşivi (dosyalarla birlikte)",
|
||||
"settings_docs_archive_hint": "JSON/YAML/CSV dışa aktarmaları yalnızca ayarları içerir. Bu ZIP, geri yüklemenin eksiksiz olması için yüklenen dosya içeriklerini de kapsar.",
|
||||
"settings_docs_export_btn": "Belge ZIP'ini indir",
|
||||
"settings_docs_import_btn": "Belge ZIP'ini geri yükle",
|
||||
"settings_docs_import_success": "Geri yüklendi: {blobs} dosya, {docs} belge",
|
||||
"sort_alphabetical": "Alfabetik",
|
||||
"sort_due_soonest": "En yakın vade",
|
||||
"sort_task_count": "Görev sayısı",
|
||||
"sort_area": "Alan",
|
||||
"sort_assigned_user": "Atanan kullanıcı",
|
||||
"sort_group": "Grup",
|
||||
"groupby_none": "Gruplama yok",
|
||||
"groupby_area": "Alana göre",
|
||||
"groupby_group": "Gruba göre",
|
||||
"groupby_user": "Kullanıcıya göre",
|
||||
"filter_label": "Filtre",
|
||||
"user_label": "Kullanıcı",
|
||||
"sort_label": "Sırala",
|
||||
"group_by_label": "Grupla",
|
||||
"state_value_help": "HA durum değerini kullanın (genellikle küçük harf, örn. \"on\"/\"off\"). Büyük/küçük harf kaydederken normalleştirilir.",
|
||||
"target_changes_help": "Tetikleyici çalışmadan önceki eşleşen geçiş sayısı (varsayılan: 1).",
|
||||
"qr_print_title": "QR kodlarını yazdır",
|
||||
"qr_print_desc": "Kesip ekipmanınıza yapıştırmak için yazdırılabilir bir QR kodu sayfası oluşturun.",
|
||||
"qr_print_load": "Nesneleri yükle",
|
||||
"qr_print_filter": "Filtre",
|
||||
"qr_print_objects": "Nesneler",
|
||||
"qr_print_actions": "Eylemler",
|
||||
"qr_print_url_mode": "Bağlantı türü",
|
||||
"qr_print_estimate": "Tahmini QR kodu sayısı",
|
||||
"qr_print_over_limit": "üst sınır 200, filtreyi daraltın",
|
||||
"qr_print_generate": "QR kodları oluştur",
|
||||
"qr_print_generating": "Oluşturuluyor…",
|
||||
"qr_print_ready": "QR kodları hazır",
|
||||
"qr_print_print_button": "Yazdır",
|
||||
"qr_print_empty": "Oluşturulacak bir şey yok",
|
||||
"qr_action_skip": "Atla",
|
||||
"vacation_title": "Tatil modu",
|
||||
"vacation_active": "etkin",
|
||||
"vacation_ended": "sona erdi",
|
||||
"vacation_desc": "Bir tatil planlayın: bildirimler bu dönem artı tampon günler boyunca duraklatılır. Belirli görevleri yine de bildirime dahil edebilirsiniz.",
|
||||
"vacation_enable": "Tatil modunu etkinleştir",
|
||||
"vacation_start": "Başlangıç",
|
||||
"vacation_end": "Bitiş",
|
||||
"vacation_buffer": "Tampon (gün)",
|
||||
"vacation_exempt_title": "Tatilde yine de bildir",
|
||||
"vacation_exempt_desc": "Tatil sırasında yine de bildirim göndermesi gereken görevleri seçin (örn. kritik havuz kimyası).",
|
||||
"vacation_load_tasks": "Görevleri yükle",
|
||||
"vacation_preview_btn": "Önizlemeyi göster",
|
||||
"vacation_preview_affected": "görev etkileniyor",
|
||||
"vacation_event_due_soon": "vadesi yaklaşacak",
|
||||
"vacation_event_overdue": "gecikecek",
|
||||
"vacation_event_triggered_est": "sensör tetiklemesi olası",
|
||||
"vacation_sensor_based": "(sensöre dayalı)",
|
||||
"vacation_action_notify": "Yine de bildir",
|
||||
"vacation_action_unsilence": "Yeniden sustur",
|
||||
"vacation_marked_complete": "Tamamlandı olarak işaretlendi",
|
||||
"vacation_marked_skip": "Atlandı",
|
||||
"vacation_end_now": "Tatili şimdi bitir",
|
||||
"add": "Ekle",
|
||||
"show_stats": "İstatistik + grafikleri göster",
|
||||
"hide_stats": "İstatistikleri gizle",
|
||||
"adaptive_no_data": "Uyarlanabilir analiz için henüz yeterli tamamlama geçmişi yok. Aralık önerilerini ve güvenilirlik grafiklerini açmak için bu görevi birkaç kez daha tamamlayın.",
|
||||
"suggestion_applied": "Önerilen aralık uygulandı",
|
||||
"vacation_mode": "Tatil modu",
|
||||
"vacation_status_active": "Şu an etkin",
|
||||
"vacation_status_scheduled": "Planlandı",
|
||||
"vacation_status_inactive": "Devre dışı",
|
||||
"vacation_end_now_confirm": "Tatil hemen bitirilsin mi?",
|
||||
"vacation_exempt_count": "muaf",
|
||||
"vacation_advanced": "Gelişmiş…",
|
||||
"vacation_open_panel": "Panelde aç",
|
||||
"enable": "Etkinleştir",
|
||||
"saved": "Kaydedildi",
|
||||
"budget_monthly_set": "Aylık ayarla",
|
||||
"budget_yearly_set": "Yıllık ayarla",
|
||||
"budget_advanced": "Para birimi, uyarılar…",
|
||||
"budget_open_panel": "Panelde aç",
|
||||
"groups_empty": "Henüz grup yok.",
|
||||
"group_new_placeholder": "Grup ekle…",
|
||||
"group_delete_confirm": "\"{name}\" grubu silinsin mi?",
|
||||
"groups_manage_tasks": "Görev atamalarını yönet…",
|
||||
"groups_open_panel": "Panelde aç",
|
||||
"unassigned": "Atanmamış",
|
||||
"no_area": "Alan yok",
|
||||
"has_overdue": "Gecikmiş görevi var",
|
||||
"object": "Nesne",
|
||||
"settings_panel_access": "Panel erişimi",
|
||||
"settings_panel_access_desc": "Yöneticiler her zaman tam erişime sahiptir. Oluşturma, düzenleme ve silmeyi belirli yönetici olmayan kullanıcılara devretmek için bunu açın ve onları aşağıdan seçin — diğer herkes yalnızca Tamamla ve Atla görür.",
|
||||
"settings_operator_write": "Seçili kullanıcılara oluşturma, düzenleme ve silme izni ver",
|
||||
"settings_operator_write_desc": "Kapalı: içeriği yalnızca yöneticiler değiştirebilir. Açık: aşağıda seçilen kullanıcılar da tam erişim alır.",
|
||||
"no_non_admin_users": "Yönetici olmayan kullanıcı bulunamadı. Ayarlar → Kişiler bölümünden ekleyin.",
|
||||
"owner_label": "Sahip",
|
||||
"feat_completion_actions": "Tamamlama eylemleri",
|
||||
"feat_completion_actions_desc": "Görev başına tamamlamada HA eylemi + önceden ayarlı değerlerle hızlı tamamlama QR'ı.",
|
||||
"on_complete_action_title": "Tamamlandığında: HA eylemi tetikle (isteğe bağlı)",
|
||||
"on_complete_action_desc": "Görev tamamlandığında bir HA servisi çağırır — örn. cihazdaki bir sayacı sıfırlar.",
|
||||
"on_complete_action_service": "Servis",
|
||||
"on_complete_action_target": "Hedef varlık",
|
||||
"on_complete_action_target_hint": "Not: varlık alan adı servisle eşleşmelidir — örn. 'button.press' yalnızca button.* üzerinde, 'counter.increment' yalnızca counter.* üzerinde, 'input_button.press' yalnızca input_button.* üzerinde çalışır. Eşleşmezse eylem sessizce başarısız olur (HA günlüğü: 'Referenced entities ... missing or not currently available').",
|
||||
"on_complete_action_data": "Veri (JSON, isteğe bağlı)",
|
||||
"on_complete_action_test": "Yapılandırmayı doğrula",
|
||||
"on_complete_action_test_success": "✓ Yapılandırma geçerli (eylem yalnızca görev tamamlandığında çalışır)",
|
||||
"on_complete_action_test_failed": "Başarısız",
|
||||
"quick_complete_defaults_title": "Hızlı tamamlama varsayılanları (QR taramaları için, isteğe bağlı)",
|
||||
"quick_complete_defaults_desc": "Hızlı tamamlama QR taramaları için önceden ayarlı değerler. Bunlar olmadan QR, tamamlama penceresini açar.",
|
||||
"quick_complete_defaults_notes": "Notlar",
|
||||
"quick_complete_defaults_cost": "Maliyet",
|
||||
"quick_complete_defaults_duration": "Süre (dakika)",
|
||||
"quick_complete_defaults_feedback_none": "Geri bildirim yok",
|
||||
"quick_complete_defaults_feedback_needed": "Gerekliydi",
|
||||
"quick_complete_defaults_feedback_not_needed": "Gerekli değildi",
|
||||
"quick_complete_success": "Hızlıca tamamlandı olarak işaretlendi",
|
||||
"show_all_objects": "Tüm nesneleri göster",
|
||||
"show_all_tasks": "Filtreyi temizle — tüm görevleri göster",
|
||||
"filter_to_overdue": "Görev listesini yalnızca gecikmişlere filtrele",
|
||||
"filter_to_due_soon": "Görev listesini yalnızca vadesi yaklaşanlara filtrele",
|
||||
"filter_to_triggered": "Görev listesini yalnızca tetiklenenlere filtrele",
|
||||
"open_task": "Görevi aç",
|
||||
"show_details": "Geçmiş + istatistikleri göster",
|
||||
"hide_details": "Ayrıntıları gizle",
|
||||
"history_empty": "Henüz geçmiş yok.",
|
||||
"history_edit_button": "Kaydı düzenle",
|
||||
"total_cost": "Toplam maliyet",
|
||||
"times_performed": "Yapılma sayısı",
|
||||
"older_entries": "daha eski",
|
||||
"open_in_panel": "Bakım panelinde aç",
|
||||
"skip_reason": "Atlama nedeni (isteğe bağlı)",
|
||||
"reset_to_date": "Son yapılmayı şu tarihe sıfırla",
|
||||
"delete_task_confirm": "Bu görev ve geçmişi silinsin mi?",
|
||||
"delete_object_confirm": "Bu nesne ve tüm görevleri silinsin mi?",
|
||||
"loading": "Yükleniyor…",
|
||||
"archive": "Arşivle",
|
||||
"undo": "Geri al",
|
||||
"task_archived": "Görev arşivlendi",
|
||||
"object_archived": "Nesne arşivlendi",
|
||||
"unarchive": "Arşivden çıkar",
|
||||
"archived": "Arşivlendi",
|
||||
"show_archived": "Arşivlenenleri göster",
|
||||
"hide_archived": "Arşivlenenleri gizle",
|
||||
"confirm_archive_object": "Bu nesne ve görevleri arşivlensin mi? Geçmişleri korunur ve daha sonra arşivden çıkarılabilirler.",
|
||||
"settings_archive": "Arşiv ve Saklama",
|
||||
"settings_archive_desc": "Tamamlanmış tek seferlik görevleri silmeden emekliye ayırın. Arşivlenen öğeler gizlenir ve pasiftir ancak geçmişlerini ve maliyetlerini korurlar.",
|
||||
"settings_archive_oneoff_days": "Tamamlanan tek seferlik görevleri şu kadar gün sonra otomatik arşivle (0 = kapalı)",
|
||||
"settings_delete_archived_oneoff_days": "Arşivlenen tek seferlik görevleri şu kadar gün sonra otomatik sil (0 = asla)",
|
||||
"archive_object": "Nesneyi arşivle",
|
||||
"unarchive_object": "Nesneyi arşivden çıkar",
|
||||
"documents": "Belgeler",
|
||||
"documents_empty": "Henüz belge yok.",
|
||||
"doc_upload": "Dosya yükle",
|
||||
"doc_uploading": "Yükleniyor…",
|
||||
"doc_add_link": "Bağlantı ekle",
|
||||
"doc_link_url": "URL (https://…)",
|
||||
"doc_link_title": "Başlık (isteğe bağlı)",
|
||||
"doc_open": "Aç",
|
||||
"doc_delete_confirm": "\"{name}\" silinsin mi?",
|
||||
"doc_too_large": "Dosya çok büyük (en fazla 25 MB).",
|
||||
"doc_upload_failed": "Yükleme başarısız oldu.",
|
||||
"completion_photo_optional": "Tamamlama fotoğrafı (isteğe bağlı)",
|
||||
"add_photo": "Fotoğraf ekle",
|
||||
"uploading": "Yükleniyor…",
|
||||
"remove": "Kaldır",
|
||||
"doc_deduped": "Zaten başka bir yerde saklı — paylaşıldı, ek alan kullanılmadı.",
|
||||
"doc_dup_in_object": "Bu dosya zaten bu nesneye ekli.",
|
||||
"doc_link_invalid": "Yalnızca http/https bağlantılarına izin verilir.",
|
||||
"doc_cat_manual": "Kılavuz",
|
||||
"doc_cat_warranty": "Garanti",
|
||||
"doc_cat_invoice": "Fatura",
|
||||
"doc_cat_spare_parts": "Yedek parçalar",
|
||||
"doc_cat_photo": "Fotoğraf",
|
||||
"doc_cat_other": "Diğer",
|
||||
"doc_link_badge": "Bağlantı",
|
||||
"doc_storage_title": "Belge depolama",
|
||||
"doc_storage_saved": "Tekilleştirmeyle kazanıldı",
|
||||
"doc_storage_refresh": "Yenile",
|
||||
"doc_download": "İndir",
|
||||
"doc_close": "Kapat",
|
||||
"doc_camera": "Fotoğraf çek",
|
||||
"doc_drop_hint": "Dosyaları buraya bırakın",
|
||||
"doc_task_none": "Bu göreve bağlı belge yok.",
|
||||
"doc_link_existing": "Belge bağla…",
|
||||
"doc_attach": "Bağla",
|
||||
"doc_unlink": "Bağlantıyı kaldır",
|
||||
"doc_page": "Sayfa",
|
||||
"chart_range_7d": "7g",
|
||||
"chart_range_30d": "30g",
|
||||
"chart_range_90d": "90g",
|
||||
"chart_range_1y": "1y",
|
||||
"chart_since_service": "son servisten beri",
|
||||
"chart_no_stats": "Bu varlık için uzun dönem istatistiği yok — yalnızca bakım olayı değerleri gösteriliyor",
|
||||
"auto_complete_on_recovery": "Sensör düzelince otomatik tamamla",
|
||||
"auto_complete_on_recovery_help": "Tetikleyici kendiliğinden temizlendiğinde bir tamamlama kaydeder (son yapılmayı ayarlar) — örn. tuz dolduruldu, filtre değiştirildi.",
|
||||
"doc_search": "Belgelerde ara…",
|
||||
"doc_search_none": "Eşleşen belge yok",
|
||||
"link_device_optional": "Mevcut bir cihaza bağla (isteğe bağlı)",
|
||||
"parent_object_optional": "Üst nesne (isteğe bağlı)",
|
||||
"parent_none": "(Üst nesne yok)",
|
||||
"paused": "Duraklatıldı",
|
||||
"pause_object": "Duraklat",
|
||||
"resume_object": "Devam ettir",
|
||||
"pause_until_prompt": "Bu nesnenin zamanlamalarını dondurur — devam ettirilene kadar hiçbir şeyin vadesi gelmez ve bildirim gönderilmez. İsteğe bağlı olarak bir otomatik devam tarihi ayarlayın.",
|
||||
"pause_until_label": "Devam tarihi (isteğe bağlı)",
|
||||
"object_paused": "Nesne duraklatıldı",
|
||||
"object_resumed": "Nesne devam ettirildi — zamanlamalar yeniden başlatıldı",
|
||||
"object_paused_badge": "Duraklatıldı",
|
||||
"paused_until_label": "şu tarihe kadar",
|
||||
"replace_object": "Değiştir…",
|
||||
"replace_object_prompt": "Bu nesneyi emekliye ayırın ve bir halef oluşturun. Geçmiş ve maliyetler eski nesnede arşivli kalır; görevler ve belgeler yenisine taşınır, sayaçlar sıfırdan başlar.",
|
||||
"replace_name_label": "Yeni nesne adı",
|
||||
"object_replaced": "Nesne değiştirildi — halefi oluşturuldu",
|
||||
"reading_unit_label": "Okuma birimi (örn. kWh, m³)",
|
||||
"reading_unit_help": "Bu görevi tamamlarken kaydedilen değerin yanında gösterilir.",
|
||||
"reading_value_label": "Okuma değeri",
|
||||
"reading_label": "Okuma",
|
||||
"settings_templates_label": "Şablon galerisi",
|
||||
"settings_templates_hint": "Asla ihtiyaç duymayacağınız şablonların işaretini kaldırın — \"Şablondan\" seçicilerinden (panel ve yapılandırma akışı) kaybolurlar. Başka hiçbir şey değişmez; istediğiniz zaman yeniden etkinleştirebilirsiniz.",
|
||||
"worksheet": "Çalışma sayfası",
|
||||
"worksheet_scan_view": "Görevi açmak için tarayın",
|
||||
"worksheet_scan_complete": "Tamamlamak için tarayın",
|
||||
"worksheet_manual_excerpt": "Kılavuz alıntısı",
|
||||
"worksheet_pages": "sayfa",
|
||||
"worksheet_printed": "Yazdırıldı",
|
||||
"worksheet_never": "Hiç",
|
||||
"card_all_caught_up": "Her şey tamam — ilgilenilmesi gereken bir şey yok",
|
||||
"postpone": "Ötele",
|
||||
"postpone_date_prompt": "Bu tekrar hangi tarihe ötelensin?",
|
||||
"postpone_date_label": "Yeni vade tarihi",
|
||||
"postponed": "Ötelendi",
|
||||
"postponed_to": "Şu tarihe ötelendi",
|
||||
"season_window_label": "Mevsim penceresi (aylar)",
|
||||
"season_window_hint": "Yalnızca seçili aylarda vadesi gelir; sezon dışı tarihler bir sonraki etkin aya kayar. Hiçbiri = tüm yıl.",
|
||||
"series_end_label": "Bitiş",
|
||||
"series_end_never": "Asla (süresiz tekrar eder)",
|
||||
"series_end_after_count": "Belirli bir sayıdan sonra",
|
||||
"series_end_until": "Bir tarihte",
|
||||
"series_end_count_label": "Tekrar sayısı",
|
||||
"series_end_until_label": "Bitiş tarihi",
|
||||
"parts_section": "Parçalar ve sarf malzemeleri",
|
||||
"part_add": "Parça ekle",
|
||||
"part_name": "Ad",
|
||||
"part_vendor": "Üretici",
|
||||
"part_storage_location": "Saklama yeri",
|
||||
"part_product_url": "Ürün URL'si",
|
||||
"part_unit": "Birim",
|
||||
"part_cost": "Birim fiyat",
|
||||
"part_stock": "Stok",
|
||||
"part_reorder_threshold": "Sipariş eşiği",
|
||||
"part_restock_quantity": "Stok yenileme miktarı",
|
||||
"part_auto_buy": "Azaldığında otomatik satın alma görevi oluştur",
|
||||
"part_restock": "Stoku ayarla",
|
||||
"restock_quantity_label": "Satın alınan miktar",
|
||||
"consumes_parts_label": "Parça tüketir",
|
||||
"parts_load_failed": "Bu nesnenin parçaları yüklenemedi — parça tüketimi seçenekleri şu anda kullanılamıyor.",
|
||||
"adopt_problem_button": "Sorun sensörlerini devral",
|
||||
"adopt_problem_title": "Sorun sensörlerini devral",
|
||||
"adopt_problem_hint": "HA sorun sensörlerini (yazıcı hataları, filtre uyarıları, düşük pil) sorun etkinken tetiklenen ve sorun çözülünce kendini temizleyen bakım görevlerine dönüştürün.",
|
||||
"adopt_problem_none": "Halihazırda takip edilmeyen sorun sensörü bulunamadı.",
|
||||
"adopt_problem_active": "etkin",
|
||||
"adopt_problem_ok": "tamam",
|
||||
"adopt_problem_new_object": "(yeni)",
|
||||
"adopt_problem_adopt": "Seçilenleri devral",
|
||||
"adopt_problem_done": "{tasks} sorun sensörü devralındı",
|
||||
"views_label": "Görünümler",
|
||||
"views_none": "— Görünüm yok —",
|
||||
"views_manage": "Görünümleri kaydet / yönet",
|
||||
"views_dialog_title": "Kayıtlı görünümler",
|
||||
"views_dialog_hint": "Geçerli filtreleri herkesin yeniden kullanabileceği adlandırılmış bir görünüm olarak kaydedin.",
|
||||
"views_name_placeholder": "Görünüm adı",
|
||||
"views_save_current": "Geçerli filtreleri kaydet",
|
||||
"views_none_yet": "Henüz kayıtlı görünüm yok.",
|
||||
"close": "Kapat",
|
||||
"trigger_hint_now": "Sensör şu anda {value} değerini okuyor.",
|
||||
"trigger_hint_above": "Görev, değer {target} üzerine çıktığında tetiklenir.",
|
||||
"trigger_hint_below": "Değer {target} altına düştüğünde tetiklenir.",
|
||||
"trigger_hint_counter_delta": "Mevcut okumadan ({value}) itibaren sayar: {due} değerinde vadesi gelir (+{target}) ve sayım her tamamlamadan sonra yeniden başlar.",
|
||||
"trigger_hint_counter_delta_edit": "Son tamamlamadan bu yana kullanımı sayar: +{target} sonrasında vadesi gelir; sayım her tamamlamadan sonra yeniden başlar.",
|
||||
"trigger_hint_counter_abs": "Sensör {target} değerine ulaştığında görevin vadesi gelir.",
|
||||
"trigger_hint_runtime": "Görevin vadesi, toplam {hours} saatlik çalışma süresinden sonra gelir; sayaç her tamamlamadan sonra yeniden başlar.",
|
||||
"trigger_hint_state_change": "Görevin vadesi {count} durum değişikliğinden sonra gelir.",
|
||||
"trigger_hint_state_change_to": "Görevin vadesi, “{state}” durumuna {count} geçişten sonra gelir.",
|
||||
"trigger_hint_state_now": "Mevcut durum: {value}.",
|
||||
"adopt_problem_part": "Kullanılan parça: {name}",
|
||||
"label_filter": "Etiket",
|
||||
"all_labels": "Tüm etiketler",
|
||||
"settings_notify_scope": "Yalnızca şu görünüm için bildir",
|
||||
"settings_notify_scope_all": "Tüm görevler",
|
||||
"settings_notify_scope_hint": "Yalnızca seçili kayıtlı görünümün etiket/kullanıcı filtreleriyle eşleşen görevler hatırlatma gönderir. Görünümün durum, sıralama ve gruplaması burada dikkate alınmaz.",
|
||||
"card_saved_view": "Kayıtlı görünüm",
|
||||
"card_saved_view_none": "Yok",
|
||||
"card_saved_view_help": "Görünümün durum, kullanıcı ve etiket filtrelerini yukarıdaki filtrelerin üzerine uygular. Görünümün sıralaması ve gruplaması panel görüntüleme ayarlarıdır ve kartta uygulanmaz.",
|
||||
"doc_part_none": "Bu parçaya bağlı belge yok.",
|
||||
"settings_templates_toggle_group": "Bu gruptaki tüm şablonları etkinleştir veya devre dışı bırak",
|
||||
"setups_button": "Önerilen kurulumlar",
|
||||
"setups_title": "Önerilen kurulumlar (Beta)",
|
||||
"setups_hint": "Sarf malzemesi sensörleri bakım görevlerini yönetebilecek, desteklenen entegrasyonlara ait cihazlar. Devralma, nesneyi oluşturur ve her görevi sensörüne bağlar — sarf malzemesi azalınca tetiklenir ve değişimden sonra kendini çözer.",
|
||||
"setups_none": "Bağlanmamış sarf malzemesi sensörü olan desteklenen cihaz bulunamadı.",
|
||||
"setups_adopt": "Seçilenleri kur",
|
||||
"setups_done": "{tasks} sensöre bağlı görev oluşturuldu.",
|
||||
"complete_parts_used": "Bu sefer kullanılan parçalar",
|
||||
"part_delete_confirm": "'{name}' parçası silinsin mi? Stok takibi, görev bağlantıları ve açık satın alma hatırlatmaları kaldırılacak.",
|
||||
"baseline_start_value": "Başlangıç okuması (isteğe bağlı)",
|
||||
"baseline_start_help": "Sayım bu okumadan başlar. Mevcut değerden saymak için boş bırakın; son servisteki okumayı girerseniz o zamandan beri olan kullanım da sayılır.",
|
||||
"setups_baseline_hint": "son servisteki okuma (isteğe bağlı)",
|
||||
"baseline_start_help_edit": "Mevcut sayımı korumak için boş bırakın. Bir değer girmek sayımı yeniden sabitler (örn. son servisteki okuma).",
|
||||
"baseline_current_effective": "Şu anda geçerli başlangıç değeri: {value}",
|
||||
"runtime_on_states": "Etkin durumlar (virgülle ayrılmış)",
|
||||
"runtime_on_states_help": "Çalışıyor sayılan durumlar — varsayılan: on. Örn. mowing, cleaning, printing. Bir öznitelik seçiliyse onun değerleri eşleştirilir.",
|
||||
"setups_target_new": "Yeni oluştur: {name}",
|
||||
"schedule_preview_title": "Sonraki tarihler",
|
||||
"schedule_preview_ontime": "Zamanında tamamlama varsayılarak.",
|
||||
"schedule_preview_ends": "(seri sona erer)",
|
||||
"adopt_problem_responsible": "Devralınan tüm görevler için sorumlu kullanıcı (isteğe bağlı)",
|
||||
"adopt_problem_configure": "Yapılandır",
|
||||
"history_auto": "Otomatik",
|
||||
"battery_fleet_title": "Pil filosu",
|
||||
"battery_fleet_none_low": "Tüm piller iyi durumda — değiştirilecek bir şey yok.",
|
||||
"battery_fleet_buy_now": "Şimdi satın al",
|
||||
"battery_fleet_soon": "Yakında gerekli",
|
||||
"battery_fleet_soon_hint": "Son değişim tarihinden tahmin edildi — önceden sipariş verin.",
|
||||
"battery_fleet_mark_all": "Tümünü değiştirildi olarak işaretle",
|
||||
"battery_fleet_mark_one": "Bu pili değiştirildi olarak işaretle",
|
||||
"battery_fleet_offline": "çevrimdışı",
|
||||
"battery_fleet_trigger_lost": "Bu görevin sensör tetikleyicisi kayboldu — tetiklenmeyecek ve otomatik tamamlanmayacak.",
|
||||
"battery_fleet_repair": "Onar",
|
||||
"battery_fleet_exclude": "Filodan hariç tut",
|
||||
"battery_fleet_excluded": "Hariç tutuldu",
|
||||
"battery_fleet_include": "Yeniden takip et",
|
||||
"battery_fleet_total": "{n} pil takip ediliyor",
|
||||
"battery_fleet_setup_button": "Pil filosu",
|
||||
"battery_fleet_setup_done": "Pil filosu kuruldu — tek bir görev tüm pillerinizi takip ediyor.",
|
||||
"update_banner": "Sunucuda Maintenance Supporter'ın daha yeni bir sürümü var — paneli güncellemek için sayfayı yeniden yükleyin.",
|
||||
"update_reload": "Yeniden yükle"
|
||||
}
|
||||
@@ -0,0 +1,811 @@
|
||||
{
|
||||
"maintenance": "Karbantartás",
|
||||
"objects": "Objektumok",
|
||||
"tasks": "Feladatok",
|
||||
"overdue": "Lejárt",
|
||||
"due_soon": "Hamarosan esedékes",
|
||||
"triggered": "Aktiválva",
|
||||
"trigger_replaced": "Kiváltó lecserélve",
|
||||
"ok": "OK",
|
||||
"all": "Összes",
|
||||
"new_object": "+ Új objektum",
|
||||
"templates_from": "Sablonból",
|
||||
"templates_title": "Kezdés sablonból",
|
||||
"templates_task_count": "{n} feladat",
|
||||
"template_created": "Létrehozva sablonból",
|
||||
"onboard_hint": "Adja hozzá az első objektumot a karbantartások nyomon követéséhez.",
|
||||
"edit": "Szerkesztés",
|
||||
"duplicate": "Duplikálás",
|
||||
"task_duplicated": "Feladat duplikálva",
|
||||
"object_duplicated": "Objektum duplikálva",
|
||||
"delete": "Törlés",
|
||||
"add_task": "+ Új feladat",
|
||||
"complete": "Elvégzés",
|
||||
"completed": "Elvégezve",
|
||||
"skip": "Kihagyás",
|
||||
"skipped": "Kihagyva",
|
||||
"missed": "Elmulasztva",
|
||||
"reset": "Visszaállítás",
|
||||
"snooze": "Szundi",
|
||||
"snoozed": "Szundiztatva",
|
||||
"cancel": "Mégse",
|
||||
"bulk_select": "Kijelölés",
|
||||
"bulk_select_all": "Összes kijelölése",
|
||||
"bulk_n_selected": "{n} kijelölve",
|
||||
"bulk_completed": "{n} feladat elvégezve",
|
||||
"bulk_archived": "{n} feladat archiválva",
|
||||
"completing": "Elvégzés…",
|
||||
"interval": "Intervallum",
|
||||
"warning": "Figyelmeztetés",
|
||||
"last_performed": "Utoljára elvégezve",
|
||||
"next_due": "Következő esedékesség",
|
||||
"days_until_due": "Napok az esedékességig",
|
||||
"avg_duration": "Átl. időtartam",
|
||||
"trigger": "Kiváltó",
|
||||
"trigger_type": "Kiváltó típusa",
|
||||
"threshold_above": "Felső határ",
|
||||
"threshold_below": "Alsó határ",
|
||||
"threshold": "Küszöbérték",
|
||||
"counter": "Számláló",
|
||||
"state_change": "Állapotváltozás",
|
||||
"runtime": "Üzemidő",
|
||||
"runtime_hours": "Cél üzemidő (óra)",
|
||||
"target_value": "Célérték",
|
||||
"baseline": "Kiindulási érték",
|
||||
"target_changes": "Cél változásszám",
|
||||
"for_minutes": "Ennyi ideig (perc)",
|
||||
"time_based": "Időalapú",
|
||||
"sensor_based": "Érzékelőalapú",
|
||||
"manual": "Kézi",
|
||||
"one_time": "Egyszeri",
|
||||
"weekdays": "Hét napjai",
|
||||
"nth_weekday": "A hónap n. hétnapja",
|
||||
"day_of_month": "A hónap napja",
|
||||
"recurrence_on_days": "Ismétlés ezeken a napokon",
|
||||
"recurrence_occurrence": "Előfordulás",
|
||||
"recurrence_weekday": "Hét napja",
|
||||
"recurrence_day": "A hónap napja (1–31)",
|
||||
"recurrence_last_day": "A hónap utolsó napja",
|
||||
"recurrence_business_day": "Csak munkanapokon (hétvégéről visszalépve)",
|
||||
"recurrence_offset": "Eltolás (nap, ±)",
|
||||
"recurrence_offset_help": "A dátum eltolása ±N nappal, pl. -2 = két nappal korábban.",
|
||||
"last_day_month": "A hónap utolsó napja",
|
||||
"last_business_day_month": "Utolsó munkanap",
|
||||
"ord_1": "1.",
|
||||
"ord_2": "2.",
|
||||
"ord_3": "3.",
|
||||
"ord_4": "4.",
|
||||
"ord_5": "5.",
|
||||
"ord_last": "Utolsó",
|
||||
"day_word": "Nap",
|
||||
"interval_value": "Intervallum",
|
||||
"interval_unit": "Egység",
|
||||
"unit_days": "Nap",
|
||||
"unit_weeks": "Hét",
|
||||
"unit_months": "Hónap",
|
||||
"unit_years": "Év",
|
||||
"due_date": "Határidő",
|
||||
"cleaning": "Tisztítás",
|
||||
"inspection": "Ellenőrzés",
|
||||
"replacement": "Csere",
|
||||
"calibration": "Kalibrálás",
|
||||
"service": "Szerviz",
|
||||
"reading": "Leolvasás",
|
||||
"custom": "Egyéni",
|
||||
"history": "Előzmények",
|
||||
"cost": "Költség",
|
||||
"report_button": "Jelentés",
|
||||
"report_title": "Karbantartási jelentés",
|
||||
"report_generated": "Létrehozva",
|
||||
"report_times_done": "Elvégezve",
|
||||
"report_total_cost": "Összköltség",
|
||||
"report_every": "minden {n}. {unit}",
|
||||
"report_notes": "Megjegyzések",
|
||||
"report_col_type": "Típus",
|
||||
"report_col_status": "Állapot",
|
||||
"report_col_schedule": "Ütemezés",
|
||||
"duration": "Időtartam",
|
||||
"both": "Mindkettő",
|
||||
"trigger_val": "Kiváltó érték",
|
||||
"complete_title": "Elvégzés: ",
|
||||
"checklist": "Ellenőrzőlista",
|
||||
"checklist_steps_optional": "Ellenőrzőlista lépései (opcionális)",
|
||||
"checklist_placeholder": "Szűrő tisztítása\nTömítés cseréje\nNyomáspróba",
|
||||
"checklist_help": "Soronként egy lépés. Legfeljebb 100 elem.",
|
||||
"err_too_long": "{field}: túl hosszú (max. {n} karakter)",
|
||||
"err_too_short": "{field}: túl rövid (min. {n} karakter)",
|
||||
"err_value_too_high": "{field}: túl nagy (max. {n})",
|
||||
"err_value_too_low": "{field}: túl kicsi (min. {n})",
|
||||
"err_required": "{field}: kötelező",
|
||||
"err_wrong_type": "{field}: hibás típus (várt: {type})",
|
||||
"err_invalid_choice": "{field}: nem megengedett érték",
|
||||
"err_invalid_value": "{field}: érvénytelen érték",
|
||||
"feat_schedule_time": "Napszakhoz kötött ütemezés",
|
||||
"feat_schedule_time_desc": "A feladatok nem éjfélkor, hanem egy megadott napszakban válnak lejárttá.",
|
||||
"schedule_time_optional": "Esedékesség időpontja (opcionális, ÓÓ:PP)",
|
||||
"schedule_time_help": "Üres = éjfél (alapértelmezés). HA időzóna.",
|
||||
"at_time": "ekkor:",
|
||||
"notes_optional": "Megjegyzések (opcionális)",
|
||||
"cost_optional": "Költség (opcionális)",
|
||||
"duration_minutes": "Időtartam percben (opcionális)",
|
||||
"days": "nap",
|
||||
"day": "nap",
|
||||
"today": "Ma",
|
||||
"d_overdue": "napja lejárt",
|
||||
"no_tasks": "Még nincsenek karbantartási feladatok. Első lépésként hozzon létre egy objektumot.",
|
||||
"no_tasks_short": "Nincs feladat",
|
||||
"no_history": "Még nincsenek előzmények.",
|
||||
"show_all": "Összes megjelenítése",
|
||||
"cost_duration_chart": "Költség és időtartam",
|
||||
"installed": "Telepítve",
|
||||
"confirm_delete_object": "Törli az objektumot az összes feladatával együtt?",
|
||||
"confirm_delete_task": "Törli ezt a feladatot?",
|
||||
"min": "Min",
|
||||
"max": "Max",
|
||||
"save": "Mentés",
|
||||
"saving": "Mentés…",
|
||||
"edit_task": "Feladat szerkesztése",
|
||||
"new_task": "Új karbantartási feladat",
|
||||
"task_name": "Feladat neve",
|
||||
"maintenance_type": "Karbantartás típusa",
|
||||
"priority": "Prioritás",
|
||||
"labels": "Címkék",
|
||||
"labels_placeholder": "pl. biztonság, szezonális, bérlőnek látható",
|
||||
"labels_help": "Vesszővel elválasztott címkék szűréshez és jelentésekhez.",
|
||||
"priority_low": "Alacsony",
|
||||
"priority_normal": "Normál",
|
||||
"priority_high": "Magas",
|
||||
"schedule_type": "Ütemezés típusa",
|
||||
"interval_days": "Intervallum (nap)",
|
||||
"warning_days": "Figyelmeztetési napok",
|
||||
"earliest_completion_days": "Legkorábbi elvégzés (nappal az esedékesség előtt)",
|
||||
"earliest_completion_days_help": "Hagyja üresen, ha bármikor elvégezhető. 0 = csak az esedékesség napján vagy utána.",
|
||||
"last_performed_optional": "Utoljára elvégezve (opcionális)",
|
||||
"interval_anchor": "Intervallum horgonya",
|
||||
"anchor_completion": "Az elvégzés dátumától",
|
||||
"anchor_planned": "A tervezett dátumtól (nincs csúszás)",
|
||||
"edit_object": "Objektum szerkesztése",
|
||||
"name": "Név",
|
||||
"manufacturer_optional": "Gyártó (opcionális)",
|
||||
"model_optional": "Modell (opcionális)",
|
||||
"serial_number_optional": "Sorozatszám (opcionális)",
|
||||
"serial_number_label": "Sorozatszám",
|
||||
"documentation_url_label": "Kézikönyv",
|
||||
"object_notes_label": "Megjegyzések",
|
||||
"sort_due_date": "Határidő",
|
||||
"sort_object": "Objektum neve",
|
||||
"sort_type": "Típus",
|
||||
"sort_task_name": "Feladat neve",
|
||||
"all_objects": "Minden objektum",
|
||||
"tasks_lower": "feladat",
|
||||
"no_tasks_yet": "Még nincs feladat",
|
||||
"add_first_task": "Első feladat hozzáadása",
|
||||
"trigger_configuration": "Kiváltó beállítása",
|
||||
"entity_id": "Entitásazonosító",
|
||||
"comma_separated": "vesszővel elválasztva",
|
||||
"entity_logic": "Entitáslogika",
|
||||
"entity_logic_any": "Bármely entitás kivált",
|
||||
"entity_logic_all": "Minden entitásnak ki kell váltania",
|
||||
"entities": "entitás",
|
||||
"attribute_optional": "Attribútum (opcionális, üres = állapot)",
|
||||
"use_entity_state": "Entitás állapotának használata (attribútum nélkül)",
|
||||
"trigger_above": "Kiváltás e fölött",
|
||||
"trigger_below": "Kiváltás ez alatt",
|
||||
"for_at_least_minutes": "Legalább ennyi ideig (perc)",
|
||||
"safety_interval_days": "Biztonsági intervallum (nap, opcionális)",
|
||||
"safety_interval": "Biztonsági intervallum (opcionális)",
|
||||
"delta_mode": "Delta mód",
|
||||
"from_state_optional": "Kezdő állapot (opcionális)",
|
||||
"to_state_optional": "Célállapot (opcionális)",
|
||||
"documentation_url_optional": "Dokumentáció URL (opcionális)",
|
||||
"object_notes_optional": "Megjegyzések (opcionális)",
|
||||
"nfc_tag_id_optional": "NFC címke azonosító (opcionális)",
|
||||
"nfc_tags_empty_help": "Még nincs NFC címke regisztrálva a Home Assistantban.",
|
||||
"nfc_tags_open_settings": "Címkebeállítások megnyitása",
|
||||
"nfc_tags_refresh": "Frissítés",
|
||||
"environmental_entity_optional": "Környezeti érzékelő (opcionális)",
|
||||
"environmental_entity_helper": "pl. sensor.outdoor_temperature — a környezeti feltételek alapján igazítja az intervallumot",
|
||||
"environmental_attribute_optional": "Környezeti attribútum (opcionális)",
|
||||
"nfc_tag_id": "NFC címke azonosító",
|
||||
"nfc_linked": "NFC címke hozzárendelve",
|
||||
"nfc_link_hint": "Kattintson az NFC címke hozzárendeléséhez",
|
||||
"responsible_user": "Felelős felhasználó",
|
||||
"shared_with": "Megosztva (rotáció)",
|
||||
"shared_with_help": "Válasszon több személyt a feladat megosztásához; a felelős minden elvégzés után váltakozik.",
|
||||
"rotation_strategy": "Rotáció",
|
||||
"rotation_none": "Nincs rotáció",
|
||||
"rotation_round_robin": "Körforgás",
|
||||
"rotation_least_completed": "Legkevesebbet végezte",
|
||||
"rotation_random": "Véletlenszerű",
|
||||
"no_user_assigned": "(Nincs felhasználó hozzárendelve)",
|
||||
"all_users": "Minden felhasználó",
|
||||
"my_tasks": "Saját feladataim",
|
||||
"tab_calendar": "Naptár",
|
||||
"cal_no_events": "Nincs karbantartás",
|
||||
"cal_window_7": "7 nap",
|
||||
"cal_window_14": "14 nap",
|
||||
"cal_window_30": "30 nap",
|
||||
"cal_window_365": "1 év",
|
||||
"cal_every_n_days": "{n} naponta",
|
||||
"cal_source_time": "Időalapú",
|
||||
"cal_source_time_adaptive": "Időalapú (adaptív)",
|
||||
"cal_source_sensor": "Érzékelőalapú",
|
||||
"cal_predicted": "előrejelzett",
|
||||
"cal_confidence_high": "nagy megbízhatóság",
|
||||
"cal_confidence_medium": "közepes megbízhatóság",
|
||||
"cal_confidence_low": "alacsony megbízhatóság",
|
||||
"budget_monthly": "Havi költségkeret",
|
||||
"budget_yearly": "Éves költségkeret",
|
||||
"groups": "Csoportok",
|
||||
"new_group": "Új csoport",
|
||||
"edit_group": "Csoport szerkesztése",
|
||||
"no_groups": "Még nincsenek csoportok",
|
||||
"delete_group": "Csoport törlése",
|
||||
"delete_group_confirm": "Törli a(z) „{name}” csoportot?",
|
||||
"group_select_tasks": "Feladatok kiválasztása",
|
||||
"group_name_required": "A név megadása kötelező",
|
||||
"description_optional": "Leírás (opcionális)",
|
||||
"selected": "Kiválasztva",
|
||||
"loading_chart": "Diagramadatok betöltése…",
|
||||
"hide_outliers": "Kiugró értékek elrejtése (érzékelőhibák)",
|
||||
"was_maintenance_needed": "Szükség volt erre a karbantartásra?",
|
||||
"feedback_needed": "Szükséges volt",
|
||||
"feedback_not_needed": "Nem volt szükséges",
|
||||
"feedback_not_sure": "Nem biztos",
|
||||
"suggested_interval": "Javasolt intervallum",
|
||||
"apply_suggestion": "Alkalmaz",
|
||||
"reanalyze": "Újraelemzés",
|
||||
"reanalyze_result": "Új elemzés",
|
||||
"reanalyze_insufficient_data": "Nincs elég adat ajánlás készítéséhez",
|
||||
"data_points": "adatpont",
|
||||
"dismiss_suggestion": "Elvetés",
|
||||
"confidence_low": "Alacsony",
|
||||
"confidence_medium": "Közepes",
|
||||
"confidence_high": "Magas",
|
||||
"recommended": "ajánlott",
|
||||
"seasonal_awareness": "Szezonális igazodás",
|
||||
"edit_seasonal_overrides": "Szezonális tényezők szerkesztése",
|
||||
"seasonal_overrides_title": "Szezonális tényezők (felülbírálat)",
|
||||
"seasonal_overrides_hint": "Tényező havonta (0,1–5,0). Üres = automatikusan tanult.",
|
||||
"seasonal_override_invalid": "Érvénytelen érték",
|
||||
"seasonal_override_range": "A tényezőnek 0,1 és 5,0 között kell lennie",
|
||||
"clear_all": "Összes törlése",
|
||||
"seasonal_chart_title": "Szezonális tényezők",
|
||||
"seasonal_learned": "Tanult",
|
||||
"seasonal_manual": "Kézi",
|
||||
"month_jan": "Jan",
|
||||
"month_feb": "Febr",
|
||||
"month_mar": "Márc",
|
||||
"month_apr": "Ápr",
|
||||
"month_may": "Máj",
|
||||
"month_jun": "Jún",
|
||||
"month_jul": "Júl",
|
||||
"month_aug": "Aug",
|
||||
"month_sep": "Szept",
|
||||
"month_oct": "Okt",
|
||||
"month_nov": "Nov",
|
||||
"month_dec": "Dec",
|
||||
"sensor_prediction": "Érzékelő-előrejelzés",
|
||||
"degradation_trend": "Trend",
|
||||
"trend_rising": "Emelkedő",
|
||||
"trend_falling": "Csökkenő",
|
||||
"trend_stable": "Stabil",
|
||||
"trend_insufficient_data": "Nincs elég adat",
|
||||
"days_until_threshold": "Napok a küszöbértékig",
|
||||
"threshold_exceeded": "Küszöbérték túllépve",
|
||||
"environmental_adjustment": "Környezeti tényező",
|
||||
"sensor_prediction_urgency": "Az érzékelő ~{days} napon belül jelzi a küszöbérték elérését",
|
||||
"day_short": "nap",
|
||||
"weibull_reliability_curve": "Megbízhatósági görbe",
|
||||
"weibull_failure_probability": "Meghibásodási valószínűség",
|
||||
"weibull_r_squared": "Illeszkedés R²",
|
||||
"beta_early_failures": "Korai meghibásodások",
|
||||
"beta_random_failures": "Véletlen meghibásodások",
|
||||
"beta_wear_out": "Elhasználódás",
|
||||
"beta_highly_predictable": "Jól előrejelezhető",
|
||||
"confidence_interval": "Konfidenciaintervallum",
|
||||
"confidence_conservative": "Konzervatív",
|
||||
"confidence_aggressive": "Optimista",
|
||||
"current_interval_marker": "Jelenlegi intervallum",
|
||||
"recommended_marker": "Ajánlott",
|
||||
"characteristic_life": "Karakterisztikus élettartam",
|
||||
"chart_mini_sparkline": "Trendvonal",
|
||||
"chart_history": "Költség- és időtartam-előzmények",
|
||||
"chart_seasonal": "Szezonális tényezők, 12 hónap",
|
||||
"chart_weibull": "Weibull megbízhatósági görbe",
|
||||
"chart_sparkline": "Érzékelő kiváltóérték-diagram",
|
||||
"days_progress": "Napok előrehaladása",
|
||||
"qr_code": "QR-kód",
|
||||
"qr_generating": "QR-kód generálása…",
|
||||
"qr_error": "A QR-kód generálása nem sikerült.",
|
||||
"qr_error_no_url": "Nincs HA URL beállítva. Adjon meg külső vagy belső URL-t a Beállítások → Rendszer → Hálózat alatt.",
|
||||
"save_error": "A mentés nem sikerült. Próbálja újra.",
|
||||
"qr_print": "Nyomtatás",
|
||||
"qr_download": "SVG letöltése",
|
||||
"qr_action": "Művelet beolvasáskor",
|
||||
"qr_action_view": "Karbantartási adatok megtekintése",
|
||||
"qr_action_complete": "Karbantartás elvégzettként jelölése",
|
||||
"qr_url_mode": "Hivatkozás típusa",
|
||||
"qr_mode_companion": "Companion alkalmazás",
|
||||
"qr_mode_local": "Helyi (mDNS)",
|
||||
"qr_mode_server": "Szerver URL",
|
||||
"overview": "Áttekintés",
|
||||
"analysis": "Elemzés",
|
||||
"recent_activities": "Legutóbbi tevékenységek",
|
||||
"search_notes": "Keresés a megjegyzésekben",
|
||||
"avg_cost": "Átl. költség",
|
||||
"no_advanced_features": "Nincsenek engedélyezett speciális funkciók",
|
||||
"no_advanced_features_hint": "Az elemzési adatok megjelenítéséhez engedélyezze az „Adaptív ütemezés” vagy a „Szezonális minták” funkciót az integráció beállításaiban.",
|
||||
"analysis_not_enough_data": "Még nincs elég adat az elemzéshez.",
|
||||
"analysis_not_enough_data_hint": "A Weibull-elemzéshez legalább 5 elvégzett karbantartás szükséges; a szezonális minták havi 6+ adatpont után válnak láthatóvá.",
|
||||
"analysis_manual_task_hint": "Az intervallum nélküli kézi feladatok nem termelnek elemzési adatot.",
|
||||
"completions": "elvégzés",
|
||||
"current": "Jelenlegi",
|
||||
"shorter": "Rövidebb",
|
||||
"longer": "Hosszabb",
|
||||
"normal": "Normál",
|
||||
"disabled": "Letiltva",
|
||||
"compound_logic": "Összetett logika",
|
||||
"compound": "Összetett (több feltétel)",
|
||||
"compound_logic_and": "ÉS — minden feltételnek teljesülnie kell",
|
||||
"compound_logic_or": "VAGY — bármely feltétel kivált",
|
||||
"compound_help": "Több érzékelőfeltétel egyetlen kiváltóvá kombinálása.",
|
||||
"compound_no_conditions": "Még nincs feltétel — adjon hozzá legalább egyet.",
|
||||
"compound_add_condition": "Feltétel hozzáadása",
|
||||
"compound_condition": "Feltétel",
|
||||
"compound_remove_condition": "Feltétel eltávolítása",
|
||||
"card_title": "Cím",
|
||||
"card_show_header": "Fejléc megjelenítése statisztikákkal",
|
||||
"card_show_actions": "Műveletgombok megjelenítése",
|
||||
"card_compact": "Kompakt mód",
|
||||
"card_max_items": "Max. elemszám (0 = mind)",
|
||||
"card_filter_status": "Szűrés állapot szerint",
|
||||
"card_filter_status_help": "Üres = minden állapot megjelenik.",
|
||||
"card_filter_objects": "Szűrés objektumok szerint",
|
||||
"card_filter_objects_help": "Üres = minden objektum megjelenik.",
|
||||
"card_filter_entities": "Szűrés entitások szerint (entity_id-k)",
|
||||
"card_filter_entities_help": "Válasszon sensor / binary_sensor entitásokat ebből az integrációból. Üres = mind.",
|
||||
"card_loading_objects": "Objektumok betöltése…",
|
||||
"card_load_error": "Az objektumok betöltése nem sikerült — ellenőrizze a WebSocket-kapcsolatot.",
|
||||
"card_no_tasks_title": "Még nincsenek karbantartási feladatok",
|
||||
"card_no_tasks_cta": "→ Hozzon létre egyet a Karbantartás panelen",
|
||||
"no_objects": "Még nincsenek objektumok.",
|
||||
"action_error": "A művelet nem sikerült. Próbálja újra.",
|
||||
"area_id_optional": "Terület (opcionális)",
|
||||
"installation_date_optional": "Telepítés dátuma (opcionális)",
|
||||
"warranty_expiry_optional": "Garancia lejárta (opcionális)",
|
||||
"warranty": "Garancia",
|
||||
"warranty_valid_until": "érvényes eddig: {date}",
|
||||
"warranty_expires_in": "{days} nap múlva lejár",
|
||||
"warranty_expired": "lejárt",
|
||||
"cal_past_windows": "Korábbi időszakok",
|
||||
"cal_forward_windows": "Jövőbeli időszakok",
|
||||
"history_edit_title": "Előzménybejegyzés szerkesztése",
|
||||
"history_edit_timestamp": "Időbélyeg",
|
||||
"manufacturer": "Gyártó",
|
||||
"model": "Modell",
|
||||
"area": "Terület",
|
||||
"actions": "Műveletek",
|
||||
"view_mode_label": "Nézet",
|
||||
"view_cards": "Kártyanézet",
|
||||
"view_table": "Táblázatnézet",
|
||||
"objects_table_columns_label": "Objektumtáblázat oszlopai",
|
||||
"objects_table_columns_hint": "Válassza ki, mely oszlopok jelenjenek meg az objektumok táblázatnézetében.",
|
||||
"custom_icon_optional": "Ikon (opcionális, pl. mdi:wrench)",
|
||||
"task_enabled": "Feladat engedélyezve",
|
||||
"skip_reason_prompt": "Kihagyja ezt a feladatot?",
|
||||
"reason_optional": "Indoklás (opcionális)",
|
||||
"reset_date_prompt": "Elvégzettként jelöli a feladatot?",
|
||||
"reset_date_optional": "Utolsó elvégzés dátuma (opcionális, alapértelmezés: ma)",
|
||||
"notes_label": "Megjegyzések",
|
||||
"documentation_label": "Dokumentáció",
|
||||
"no_nfc_tag": "— Nincs címke —",
|
||||
"dashboard": "Irányítópult",
|
||||
"tab_today": "Ma",
|
||||
"palette_placeholder": "Objektumok és feladatok keresése…",
|
||||
"palette_no_results": "Nincs találat",
|
||||
"palette_hint": "↑↓ navigálás · Enter megnyitás · Esc bezárás",
|
||||
"today_all_caught_up": "Minden rendben! Ezen a héten nincs esedékes feladat.",
|
||||
"today_overdue": "Lejárt",
|
||||
"today_due_today": "Ma esedékes",
|
||||
"today_this_week": "Ezen a héten",
|
||||
"settings": "Beállítások",
|
||||
"settings_features": "Speciális funkciók",
|
||||
"settings_features_desc": "Speciális funkciók be- és kikapcsolása. A kikapcsolás elrejti őket a felületről, de nem töröl adatot.",
|
||||
"feat_adaptive": "Adaptív ütemezés",
|
||||
"feat_adaptive_desc": "Optimális intervallumok tanulása a karbantartási előzményekből",
|
||||
"feat_predictions": "Érzékelő-előrejelzések",
|
||||
"feat_predictions_desc": "Kiváltási dátumok előrejelzése az érzékelőértékek romlásából",
|
||||
"feat_seasonal": "Szezonális igazítások",
|
||||
"feat_seasonal_desc": "Intervallumok igazítása szezonális minták alapján",
|
||||
"feat_environmental": "Környezeti korreláció",
|
||||
"feat_environmental_desc": "Intervallumok korrelálása hőmérséklettel/páratartalommal",
|
||||
"feat_budget": "Költségkeret követése",
|
||||
"feat_budget_desc": "Havi és éves karbantartási kiadások követése",
|
||||
"feat_groups": "Feladatcsoportok",
|
||||
"feat_groups_desc": "Feladatok logikai csoportokba rendezése",
|
||||
"feat_checklists": "Ellenőrzőlisták",
|
||||
"feat_checklists_desc": "Többlépéses eljárások a feladatok elvégzéséhez",
|
||||
"settings_general": "Általános",
|
||||
"settings_default_warning": "Alapértelmezett figyelmeztetési napok",
|
||||
"settings_panel_enabled": "Oldalsáv-panel",
|
||||
"settings_panel_title": "Oldalsáv-panel címe",
|
||||
"settings_notifications": "Értesítések",
|
||||
"settings_notify_service": "Értesítési szolgáltatás",
|
||||
"test_notification": "Tesztértesítés",
|
||||
"send_test": "Teszt küldése",
|
||||
"testing": "Küldés…",
|
||||
"test_notification_success": "Tesztértesítés elküldve",
|
||||
"test_notification_failed": "A tesztértesítés nem sikerült",
|
||||
"settings_notify_due_soon": "Értesítés, ha hamarosan esedékes",
|
||||
"settings_notify_overdue": "Értesítés lejáratkor",
|
||||
"settings_notify_triggered": "Értesítés kiváltáskor",
|
||||
"settings_interval_hours": "Ismétlési intervallum (óra, 0 = egyszer)",
|
||||
"settings_quiet_hours": "Csendes órák",
|
||||
"settings_quiet_start": "Kezdete",
|
||||
"settings_quiet_end": "Vége",
|
||||
"settings_max_per_day": "Max. értesítés naponta (0 = korlátlan)",
|
||||
"settings_bundling": "Értesítések összevonása",
|
||||
"settings_bundle_threshold": "Összevonási küszöb",
|
||||
"settings_reminder_leads": "Extra emlékeztetők (nappal az esedékesség előtt)",
|
||||
"settings_reminder_leads_hint": "Vesszővel elválasztott napok, pl. 14, 3, 0 — minden egyező napon egy extra emlékeztető megy ki. Üres = kikapcsolva.",
|
||||
"settings_actions": "Mobil műveletgombok",
|
||||
"settings_action_complete": "„Elvégzés” gomb megjelenítése",
|
||||
"settings_action_skip": "„Kihagyás” gomb megjelenítése",
|
||||
"settings_action_snooze": "„Szundi” gomb megjelenítése",
|
||||
"settings_weekly_digest": "Heti összefoglaló",
|
||||
"settings_weekly_digest_hint": "Egyetlen összefoglaló értesítés hétfő reggel, ha vannak esedékes feladatok.",
|
||||
"settings_warranty_reminder": "Garancialejárati emlékeztető",
|
||||
"settings_warranty_reminder_days": "Nappal a lejárat előtt",
|
||||
"settings_warranty_reminder_hint": "Egyszeri értesítés, amikor egy objektum garanciája ennyi napra van a lejárattól.",
|
||||
"settings_snooze_hours": "Szundi időtartama (óra)",
|
||||
"settings_budget": "Költségkeret",
|
||||
"settings_currency": "Pénznem",
|
||||
"settings_budget_monthly": "Havi költségkeret",
|
||||
"settings_budget_yearly": "Éves költségkeret",
|
||||
"settings_budget_alerts": "Költségkeret-riasztások",
|
||||
"settings_budget_threshold": "Riasztási küszöb (%)",
|
||||
"settings_import_export": "Importálás / Exportálás",
|
||||
"settings_export_json": "JSON exportálása",
|
||||
"settings_export_yaml": "YAML exportálása",
|
||||
"settings_export_csv": "CSV exportálása",
|
||||
"settings_import_csv": "CSV importálása",
|
||||
"settings_import_placeholder": "Illessze be ide a JSON vagy CSV tartalmat…",
|
||||
"settings_import_btn": "Importálás",
|
||||
"settings_import_success": "{count} objektum sikeresen importálva.",
|
||||
"settings_export_success": "Export letöltve.",
|
||||
"settings_saved": "Beállítás mentve.",
|
||||
"settings_include_history": "Előzményekkel együtt",
|
||||
"settings_export_selection": "Csak a kiválasztott objektumok (opcionális)",
|
||||
"settings_docs_archive": "Dokumentumarchívum (fájlokkal)",
|
||||
"settings_docs_archive_hint": "A JSON/YAML/CSV export csak a beállításokat tartalmazza. Ez a ZIP a feltöltött fájlok tartalmát is magában foglalja, így a visszaállítás teljes.",
|
||||
"settings_docs_export_btn": "Dokumentum-ZIP letöltése",
|
||||
"settings_docs_import_btn": "Dokumentum-ZIP visszaállítása",
|
||||
"settings_docs_import_success": "Visszaállítva: {blobs} fájl, {docs} dokumentum",
|
||||
"sort_alphabetical": "Ábécésorrend",
|
||||
"sort_due_soonest": "Leghamarabb esedékes",
|
||||
"sort_task_count": "Feladatok száma",
|
||||
"sort_area": "Terület",
|
||||
"sort_assigned_user": "Hozzárendelt felhasználó",
|
||||
"sort_group": "Csoport",
|
||||
"groupby_none": "Nincs csoportosítás",
|
||||
"groupby_area": "Terület szerint",
|
||||
"groupby_group": "Csoport szerint",
|
||||
"groupby_user": "Felhasználó szerint",
|
||||
"filter_label": "Szűrő",
|
||||
"user_label": "Felhasználó",
|
||||
"sort_label": "Rendezés",
|
||||
"group_by_label": "Csoportosítás",
|
||||
"state_value_help": "A HA állapotértékét használja (általában kisbetűs, pl. „on”/„off”). A kis- és nagybetűk mentéskor normalizálódnak.",
|
||||
"target_changes_help": "Az egyező átmenetek száma a kiváltás előtt (alapértelmezés: 1).",
|
||||
"qr_print_title": "QR-kódok nyomtatása",
|
||||
"qr_print_desc": "Nyomtatható oldal QR-kódokkal — vágja ki és ragassza fel a berendezésekre.",
|
||||
"qr_print_load": "Objektumok betöltése",
|
||||
"qr_print_filter": "Szűrő",
|
||||
"qr_print_objects": "Objektumok",
|
||||
"qr_print_actions": "Műveletek",
|
||||
"qr_print_url_mode": "Hivatkozás típusa",
|
||||
"qr_print_estimate": "Becsült QR-kódok száma",
|
||||
"qr_print_over_limit": "a korlát 200, szűkítse a szűrőt",
|
||||
"qr_print_generate": "QR-kódok generálása",
|
||||
"qr_print_generating": "Generálás…",
|
||||
"qr_print_ready": "QR-kódok készen",
|
||||
"qr_print_print_button": "Nyomtatás",
|
||||
"qr_print_empty": "Nincs mit generálni",
|
||||
"qr_action_skip": "Kihagyás",
|
||||
"vacation_title": "Nyaralási mód",
|
||||
"vacation_active": "aktív",
|
||||
"vacation_ended": "véget ért",
|
||||
"vacation_desc": "Tervezzen nyaralást: az értesítések szünetelnek az időszak alatt, plusz egy puffernyi napig. Egyes feladatokat kivételként visszakapcsolhat.",
|
||||
"vacation_enable": "Nyaralási mód bekapcsolása",
|
||||
"vacation_start": "Kezdete",
|
||||
"vacation_end": "Vége",
|
||||
"vacation_buffer": "Puffer (nap)",
|
||||
"vacation_exempt_title": "Értesítés a nyaralás alatt is",
|
||||
"vacation_exempt_desc": "Válassza ki azokat a feladatokat, amelyek a nyaralás alatt is értesítsenek (pl. kritikus medencekémia).",
|
||||
"vacation_load_tasks": "Feladatok betöltése",
|
||||
"vacation_preview_btn": "Előnézet megjelenítése",
|
||||
"vacation_preview_affected": "érintett feladat",
|
||||
"vacation_event_due_soon": "hamarosan esedékessé válik",
|
||||
"vacation_event_overdue": "lejárttá válik",
|
||||
"vacation_event_triggered_est": "érzékelős kiváltás lehetséges",
|
||||
"vacation_sensor_based": "(érzékelőalapú)",
|
||||
"vacation_action_notify": "Értesítsen mégis",
|
||||
"vacation_action_unsilence": "Némítás újra",
|
||||
"vacation_marked_complete": "Elvégzettként jelölve",
|
||||
"vacation_marked_skip": "Kihagyva",
|
||||
"vacation_end_now": "Nyaralás befejezése most",
|
||||
"add": "Hozzáadás",
|
||||
"show_stats": "Statisztikák és grafikonok",
|
||||
"hide_stats": "Statisztikák elrejtése",
|
||||
"adaptive_no_data": "Még nincs elég elvégzési előzmény az adaptív elemzéshez. Végezze el a feladatot még néhányszor az intervallumjavaslatok és a megbízhatósági diagramok feloldásához.",
|
||||
"suggestion_applied": "Javasolt intervallum alkalmazva",
|
||||
"vacation_mode": "Nyaralási mód",
|
||||
"vacation_status_active": "Most aktív",
|
||||
"vacation_status_scheduled": "Ütemezve",
|
||||
"vacation_status_inactive": "Inaktív",
|
||||
"vacation_end_now_confirm": "Azonnal befejezi a nyaralást?",
|
||||
"vacation_exempt_count": "kivétel",
|
||||
"vacation_advanced": "Speciális…",
|
||||
"vacation_open_panel": "Megnyitás a panelen",
|
||||
"enable": "Engedélyezés",
|
||||
"saved": "Mentve",
|
||||
"budget_monthly_set": "Havi keret beállítása",
|
||||
"budget_yearly_set": "Éves keret beállítása",
|
||||
"budget_advanced": "Pénznem, riasztások…",
|
||||
"budget_open_panel": "Megnyitás a panelen",
|
||||
"groups_empty": "Még nincsenek csoportok.",
|
||||
"group_new_placeholder": "Csoport hozzáadása…",
|
||||
"group_delete_confirm": "Törli a(z) „{name}” csoportot?",
|
||||
"groups_manage_tasks": "Feladat-hozzárendelések kezelése…",
|
||||
"groups_open_panel": "Megnyitás a panelen",
|
||||
"unassigned": "Nincs hozzárendelve",
|
||||
"no_area": "Nincs terület",
|
||||
"has_overdue": "Van lejárt feladata",
|
||||
"object": "Objektum",
|
||||
"settings_panel_access": "Panel-hozzáférés",
|
||||
"settings_panel_access_desc": "Az adminok mindig teljes hozzáféréssel rendelkeznek. Ha a létrehozást, szerkesztést és törlést adott nem admin felhasználókra bízná, kapcsolja be ezt, és válassza ki őket lent — mindenki más csak az Elvégzés és a Kihagyás gombot látja.",
|
||||
"settings_operator_write": "A kiválasztott felhasználók létrehozhatnak, szerkeszthetnek és törölhetnek",
|
||||
"settings_operator_write_desc": "Ki: csak adminok módosíthatnak tartalmat. Be: a lent kiválasztott felhasználók is teljes hozzáférést kapnak.",
|
||||
"no_non_admin_users": "Nem található nem admin felhasználó. Vegyen fel néhányat a Beállítások → Személyek alatt.",
|
||||
"owner_label": "Tulajdonos",
|
||||
"feat_completion_actions": "Elvégzési műveletek",
|
||||
"feat_completion_actions_desc": "Feladatonkénti HA művelet elvégzéskor + gyorselvégző QR előre beállított értékekkel.",
|
||||
"on_complete_action_title": "Elvégzéskor: HA művelet indítása (opcionális)",
|
||||
"on_complete_action_desc": "HA szolgáltatást hív meg a feladat elvégzésekor — pl. számláló nullázása az eszközön.",
|
||||
"on_complete_action_service": "Szolgáltatás",
|
||||
"on_complete_action_target": "Cél entitás",
|
||||
"on_complete_action_target_hint": "Megjegyzés: az entitás doménjének egyeznie kell a szolgáltatással — pl. a „button.press” csak button.* entitáson működik, a „counter.increment” csak counter.* entitáson, az „input_button.press” csak input_button.* entitáson stb. Eltérés esetén a művelet csendben meghiúsul (a HA naplóban: „Referenced entities ... missing or not currently available”).",
|
||||
"on_complete_action_data": "Adatok (JSON, opcionális)",
|
||||
"on_complete_action_test": "Konfiguráció ellenőrzése",
|
||||
"on_complete_action_test_success": "✓ A konfiguráció érvényes (a művelet csak a feladat elvégzésekor fut le)",
|
||||
"on_complete_action_test_failed": "Sikertelen",
|
||||
"quick_complete_defaults_title": "Gyorselvégzés alapértékei (QR-beolvasáshoz, opcionális)",
|
||||
"quick_complete_defaults_desc": "Előre beállított értékek a gyorselvégző QR-beolvasásokhoz. Ezek nélkül a QR az elvégzési párbeszédablakot nyitja meg.",
|
||||
"quick_complete_defaults_notes": "Megjegyzések",
|
||||
"quick_complete_defaults_cost": "Költség",
|
||||
"quick_complete_defaults_duration": "Időtartam (perc)",
|
||||
"quick_complete_defaults_feedback_none": "Nincs visszajelzés",
|
||||
"quick_complete_defaults_feedback_needed": "Szükséges volt",
|
||||
"quick_complete_defaults_feedback_not_needed": "Nem volt szükséges",
|
||||
"quick_complete_success": "Gyorsan elvégzettként jelölve",
|
||||
"show_all_objects": "Minden objektum megjelenítése",
|
||||
"show_all_tasks": "Szűrő törlése — minden feladat megjelenítése",
|
||||
"filter_to_overdue": "Szűrés csak a lejárt feladatokra",
|
||||
"filter_to_due_soon": "Szűrés csak a hamarosan esedékes feladatokra",
|
||||
"filter_to_triggered": "Szűrés csak az aktivált feladatokra",
|
||||
"open_task": "Feladat megnyitása",
|
||||
"show_details": "Előzmények és statisztikák",
|
||||
"hide_details": "Részletek elrejtése",
|
||||
"history_empty": "Még nincsenek előzmények.",
|
||||
"history_edit_button": "Bejegyzés szerkesztése",
|
||||
"total_cost": "Összköltség",
|
||||
"times_performed": "Elvégezve",
|
||||
"older_entries": "régebbi",
|
||||
"open_in_panel": "Megnyitás a Karbantartás panelen",
|
||||
"skip_reason": "Kihagyás oka (opcionális)",
|
||||
"reset_to_date": "Utolsó elvégzés visszaállítása erre:",
|
||||
"delete_task_confirm": "Törli a feladatot az előzményeivel együtt?",
|
||||
"delete_object_confirm": "Törli az objektumot az összes feladatával együtt?",
|
||||
"loading": "Betöltés…",
|
||||
"archive": "Archiválás",
|
||||
"undo": "Visszavonás",
|
||||
"task_archived": "Feladat archiválva",
|
||||
"object_archived": "Objektum archiválva",
|
||||
"unarchive": "Archiválás visszavonása",
|
||||
"archived": "Archiválva",
|
||||
"show_archived": "Archiváltak megjelenítése",
|
||||
"hide_archived": "Archiváltak elrejtése",
|
||||
"confirm_archive_object": "Archiválja az objektumot és a feladatait? Megtartják előzményeiket, és később visszaállíthatók.",
|
||||
"settings_archive": "Archiválás és megőrzés",
|
||||
"settings_archive_desc": "Elvégzett egyszeri feladatok kivezetése törlés nélkül. Az archivált elemek rejtettek és inaktívak, de megtartják előzményeiket és költségeiket.",
|
||||
"settings_archive_oneoff_days": "Elvégzett egyszeri feladatok automatikus archiválása ennyi nap után (0 = ki)",
|
||||
"settings_delete_archived_oneoff_days": "Archivált egyszeri feladatok automatikus törlése ennyi nap után (0 = soha)",
|
||||
"archive_object": "Objektum archiválása",
|
||||
"unarchive_object": "Objektum visszaállítása",
|
||||
"documents": "Dokumentumok",
|
||||
"documents_empty": "Még nincsenek dokumentumok.",
|
||||
"doc_upload": "Fájl feltöltése",
|
||||
"doc_uploading": "Feltöltés…",
|
||||
"doc_add_link": "Hivatkozás hozzáadása",
|
||||
"doc_link_url": "URL (https://…)",
|
||||
"doc_link_title": "Cím (opcionális)",
|
||||
"doc_open": "Megnyitás",
|
||||
"doc_delete_confirm": "Törli a(z) „{name}” elemet?",
|
||||
"doc_too_large": "A fájl túl nagy (max. 25 MB).",
|
||||
"doc_upload_failed": "A feltöltés nem sikerült.",
|
||||
"completion_photo_optional": "Fotó az elvégzésről (opcionális)",
|
||||
"add_photo": "Fotó hozzáadása",
|
||||
"uploading": "Feltöltés…",
|
||||
"remove": "Eltávolítás",
|
||||
"doc_deduped": "Már máshol is tárolva — megosztott, nem foglal extra helyet.",
|
||||
"doc_dup_in_object": "Ez a fájl már csatolva van ehhez az objektumhoz.",
|
||||
"doc_link_invalid": "Csak http/https hivatkozás engedélyezett.",
|
||||
"doc_cat_manual": "Kézikönyv",
|
||||
"doc_cat_warranty": "Garancia",
|
||||
"doc_cat_invoice": "Számla",
|
||||
"doc_cat_spare_parts": "Pótalkatrészek",
|
||||
"doc_cat_photo": "Fotó",
|
||||
"doc_cat_other": "Egyéb",
|
||||
"doc_link_badge": "Hivatkozás",
|
||||
"doc_storage_title": "Dokumentumtárhely",
|
||||
"doc_storage_saved": "Deduplikációval megtakarítva",
|
||||
"doc_storage_refresh": "Frissítés",
|
||||
"doc_download": "Letöltés",
|
||||
"doc_close": "Bezárás",
|
||||
"doc_camera": "Fotó készítése",
|
||||
"doc_drop_hint": "Húzza ide a fájlokat",
|
||||
"doc_task_none": "Ehhez a feladathoz nincs dokumentum csatolva.",
|
||||
"doc_link_existing": "Dokumentum hozzárendelése…",
|
||||
"doc_attach": "Hozzárendelés",
|
||||
"doc_unlink": "Leválasztás",
|
||||
"doc_page": "Oldal",
|
||||
"chart_range_7d": "7 nap",
|
||||
"chart_range_30d": "30 nap",
|
||||
"chart_range_90d": "90 nap",
|
||||
"chart_range_1y": "1 év",
|
||||
"chart_since_service": "az utolsó szerviz óta",
|
||||
"chart_no_stats": "Nincs hosszú távú statisztika ehhez az entitáshoz — csak a karbantartási események értékei láthatók",
|
||||
"auto_complete_on_recovery": "Automatikus elvégzés, ha az érzékelő helyreáll",
|
||||
"auto_complete_on_recovery_help": "Elvégzést rögzít (beállítja az utolsó elvégzést), amikor a kiváltás magától megszűnik — pl. só utántöltve, szűrő kicserélve.",
|
||||
"doc_search": "Dokumentumok keresése…",
|
||||
"doc_search_none": "Nincs egyező dokumentum",
|
||||
"link_device_optional": "Meglévő eszközhöz kapcsolás (opcionális)",
|
||||
"parent_object_optional": "Szülőobjektum (opcionális)",
|
||||
"parent_none": "(Nincs szülő)",
|
||||
"paused": "Szüneteltetve",
|
||||
"pause_object": "Szüneteltetés",
|
||||
"resume_object": "Folytatás",
|
||||
"pause_until_prompt": "Az objektum ütemezéseinek befagyasztása — semmi nem válik esedékessé, és nincs értesítés a folytatásig. Megadhat automatikus folytatási dátumot is.",
|
||||
"pause_until_label": "Folytatás ekkor (opcionális)",
|
||||
"object_paused": "Objektum szüneteltetve",
|
||||
"object_resumed": "Objektum folytatva — az ütemezések újraindultak",
|
||||
"object_paused_badge": "Szüneteltetve",
|
||||
"paused_until_label": "eddig:",
|
||||
"replace_object": "Csere…",
|
||||
"replace_object_prompt": "Az objektum kivezetése és utód létrehozása. Az előzmények és a költségek archiválva a régin maradnak; a feladatok és a dokumentumok átkerülnek az újra, a számlálók nulláról indulnak.",
|
||||
"replace_name_label": "Utód neve",
|
||||
"object_replaced": "Objektum lecserélve — utód létrehozva",
|
||||
"reading_unit_label": "Leolvasás mértékegysége (pl. kWh, m³)",
|
||||
"reading_unit_help": "A rögzített érték mellett jelenik meg a feladat elvégzésekor.",
|
||||
"reading_value_label": "Leolvasott érték",
|
||||
"reading_label": "Leolvasás",
|
||||
"settings_templates_label": "Sablongaléria",
|
||||
"settings_templates_hint": "Vegye ki a pipát a sosem használt sablonoknál — így eltűnnek a „Sablonból” választókból (panel és konfigurációs folyamat). Semmi más nem változik; bármikor újra engedélyezheti őket.",
|
||||
"worksheet": "Munkalap",
|
||||
"worksheet_scan_view": "Olvassa be a feladat megnyitásához",
|
||||
"worksheet_scan_complete": "Olvassa be az elvégzéshez",
|
||||
"worksheet_manual_excerpt": "Kézikönyv-részlet",
|
||||
"worksheet_pages": "oldal",
|
||||
"worksheet_printed": "Nyomtatva",
|
||||
"worksheet_never": "Soha",
|
||||
"card_all_caught_up": "Minden rendben — semmi nem igényel figyelmet",
|
||||
"postpone": "Halasztás",
|
||||
"postpone_date_prompt": "Melyik dátumra halasztja ezt az alkalmat?",
|
||||
"postpone_date_label": "Új határidő",
|
||||
"postponed": "Elhalasztva",
|
||||
"postponed_to": "Elhalasztva erre:",
|
||||
"season_window_label": "Szezonális időablak (hónapok)",
|
||||
"season_window_hint": "Csak a kiválasztott hónapokban esedékes; a szezonon kívüli dátumok a következő aktív hónapra tolódnak. Nincs = egész évben.",
|
||||
"series_end_label": "Befejeződik",
|
||||
"series_end_never": "Soha (végtelen ismétlés)",
|
||||
"series_end_after_count": "Adott számú alkalom után",
|
||||
"series_end_until": "Egy adott dátumon",
|
||||
"series_end_count_label": "Alkalmak száma",
|
||||
"series_end_until_label": "Befejezés dátuma",
|
||||
"parts_section": "Alkatrészek és fogyóeszközök",
|
||||
"part_add": "Alkatrész hozzáadása",
|
||||
"part_name": "Név",
|
||||
"part_vendor": "Gyártó",
|
||||
"part_storage_location": "Tárolási hely",
|
||||
"part_product_url": "Termék URL",
|
||||
"part_unit": "Egység",
|
||||
"part_cost": "Egységár",
|
||||
"part_stock": "Készlet",
|
||||
"part_reorder_threshold": "Újrarendelés ennél",
|
||||
"part_restock_quantity": "Feltöltési mennyiség",
|
||||
"part_auto_buy": "Vásárlási feladat automatikus létrehozása, ha kevés van",
|
||||
"part_restock": "Készlet módosítása",
|
||||
"restock_quantity_label": "Vásárolt mennyiség",
|
||||
"consumes_parts_label": "Felhasznált alkatrészek",
|
||||
"parts_load_failed": "Az objektum alkatrészei nem tölthetők be — a felhasznált alkatrészek beállításai most nem érhetők el.",
|
||||
"adopt_problem_button": "Problémaérzékelők átvétele",
|
||||
"adopt_problem_title": "Problémaérzékelők átvétele",
|
||||
"adopt_problem_hint": "Alakítsa a HA problémaérzékelőit (nyomtatóhibák, szűrőfigyelmeztetések, gyenge elem) karbantartási feladatokká, amelyek a probléma fennállása alatt aktívak, és maguktól lezáródnak, amikor a probléma megoldódik.",
|
||||
"adopt_problem_none": "Nem található még nem követett problémaérzékelő.",
|
||||
"adopt_problem_active": "aktív",
|
||||
"adopt_problem_ok": "ok",
|
||||
"adopt_problem_new_object": "(új)",
|
||||
"adopt_problem_adopt": "Kijelöltek átvétele",
|
||||
"adopt_problem_done": "{tasks} problémaérzékelő átvéve",
|
||||
"views_label": "Nézetek",
|
||||
"views_none": "— Nincs nézet —",
|
||||
"views_manage": "Nézetek mentése / kezelése",
|
||||
"views_dialog_title": "Mentett nézetek",
|
||||
"views_dialog_hint": "Mentse el az aktuális szűrőket névvel ellátott nézetként, amelyet mindenki használhat.",
|
||||
"views_name_placeholder": "Nézet neve",
|
||||
"views_save_current": "Aktuális szűrők mentése",
|
||||
"views_none_yet": "Még nincsenek mentett nézetek.",
|
||||
"close": "Bezárás",
|
||||
"trigger_hint_now": "Az érzékelő jelenlegi értéke: {value}.",
|
||||
"trigger_hint_above": "A feladat akkor aktiválódik, amikor az érték {target} fölé emelkedik.",
|
||||
"trigger_hint_below": "Akkor aktiválódik, amikor az érték {target} alá csökken.",
|
||||
"trigger_hint_counter_delta": "A jelenlegi értéktől ({value}) számol: esedékes {due} értéknél (+{target}), és a számlálás minden elvégzés után újraindul.",
|
||||
"trigger_hint_counter_delta_edit": "A legutóbbi elvégzés óta számolja a használatot: esedékes +{target} után; a számlálás minden elvégzés után újraindul.",
|
||||
"trigger_hint_counter_abs": "A feladat akkor válik esedékessé, amikor az érzékelő eléri a(z) {target} értéket.",
|
||||
"trigger_hint_runtime": "A feladat {hours} óra összesített üzemidő után válik esedékessé; a számláló minden elvégzés után újraindul.",
|
||||
"trigger_hint_state_change": "A feladat {count} állapotváltozás után válik esedékessé.",
|
||||
"trigger_hint_state_change_to": "A feladat {count} alkalommal „{state}” állapotra váltás után válik esedékessé.",
|
||||
"trigger_hint_state_now": "Jelenlegi állapot: {value}.",
|
||||
"adopt_problem_part": "Alkatrészt használ: {name}",
|
||||
"label_filter": "Címke",
|
||||
"all_labels": "Minden címke",
|
||||
"settings_notify_scope": "Értesítés csak erre a nézetre",
|
||||
"settings_notify_scope_all": "Minden feladat",
|
||||
"settings_notify_scope_hint": "Csak a kiválasztott mentett nézet címke-/felhasználószűrőinek megfelelő feladatok küldenek emlékeztetőt. A nézet állapot-, rendezési és csoportosítási beállításait itt figyelmen kívül hagyjuk.",
|
||||
"card_saved_view": "Mentett nézet",
|
||||
"card_saved_view_none": "Nincs",
|
||||
"card_saved_view_help": "A nézet állapot-, felhasználó- és címkeszűrőit a fenti szűrőkön felül alkalmazza. A nézet rendezése és csoportosítása a panel megjelenítési beállítása, a kártyán nem érvényesül.",
|
||||
"doc_part_none": "Ehhez az alkatrészhez nincs dokumentum csatolva.",
|
||||
"settings_templates_toggle_group": "A csoport összes sablonjának be- vagy kikapcsolása",
|
||||
"setups_button": "Javasolt beállítások",
|
||||
"setups_title": "Javasolt beállítások (béta)",
|
||||
"setups_hint": "Támogatott integrációk eszközei, amelyek fogyóeszköz-érzékelői karbantartási feladatokat vezérelhetnek. Az átvétel létrehozza az objektumot, és minden feladatot az érzékelőjéhez köt — a feladat akkor aktiválódik, amikor a fogyóeszköz fogytán van, és a csere után magától lezáródik.",
|
||||
"setups_none": "Nem található támogatott eszköz bekötetlen fogyóeszköz-érzékelővel.",
|
||||
"setups_adopt": "Kijelöltek beállítása",
|
||||
"setups_done": "{tasks} érzékelőhöz kötött feladat létrehozva.",
|
||||
"complete_parts_used": "Most felhasznált alkatrészek",
|
||||
"part_delete_confirm": "Törli a(z) „{name}” alkatrészt? A készletkövetése, a feladatkapcsolatai és minden nyitott vásárlási emlékeztetője is törlődik.",
|
||||
"baseline_start_value": "Kezdő leolvasás (opcionális)",
|
||||
"baseline_start_help": "A számlálás ettől az értéktől indul. Hagyja üresen, ha a jelenlegi értéktől számolna; adja meg az utolsó szerviz értékét, hogy az azóta felhalmozott használat is beleszámítson.",
|
||||
"setups_baseline_hint": "érték az utolsó szerviznél (opcionális)",
|
||||
"baseline_start_help_edit": "Üresen hagyva a meglévő számlálás marad. Érték megadása újrahorgonyozza a számlálást (pl. az utolsó szerviz leolvasott értéke).",
|
||||
"baseline_current_effective": "Jelenleg érvényes kezdőérték: {value}",
|
||||
"runtime_on_states": "Aktív állapotok (vesszővel elválasztva)",
|
||||
"runtime_on_states_help": "Működésként számító állapotok — alapértelmezés: on. Pl. mowing, cleaning, printing. Attribútum kiválasztásakor annak értékei számítanak.",
|
||||
"setups_target_new": "Új létrehozása: {name}",
|
||||
"schedule_preview_title": "Következő dátumok",
|
||||
"schedule_preview_ontime": "Időben történő elvégzést feltételezve.",
|
||||
"schedule_preview_ends": "(a sorozat véget ér)",
|
||||
"adopt_problem_responsible": "Felelős felhasználó az összes átvett feladathoz (opcionális)",
|
||||
"adopt_problem_configure": "Beállítás",
|
||||
"history_auto": "Automatikus",
|
||||
"battery_fleet_title": "Elemflotta",
|
||||
"battery_fleet_none_low": "Minden elem rendben — nincs mit cserélni.",
|
||||
"battery_fleet_buy_now": "Vásárlás most",
|
||||
"battery_fleet_soon": "Hamarosan szükséges",
|
||||
"battery_fleet_soon_hint": "Az utolsó cseredátumból előrejelezve — rendeljen előre.",
|
||||
"battery_fleet_mark_all": "Mind cseréltként jelölése",
|
||||
"battery_fleet_mark_one": "Elem cseréltként jelölése",
|
||||
"battery_fleet_offline": "offline",
|
||||
"battery_fleet_trigger_lost": "A feladat érzékelős kiváltója elveszett — nem fog aktiválódni és automatikusan lezáródni sem.",
|
||||
"battery_fleet_repair": "Javítás",
|
||||
"battery_fleet_exclude": "Kizárás a flottából",
|
||||
"battery_fleet_excluded": "Kizárva",
|
||||
"battery_fleet_include": "Követés újra",
|
||||
"battery_fleet_total": "{n} elem követve",
|
||||
"battery_fleet_setup_button": "Elemflotta",
|
||||
"battery_fleet_setup_done": "Elemflotta beállítva — egyetlen feladat követi az összes elemet.",
|
||||
"update_banner": "A Maintenance Supporter újabb verziója érhető el a szerveren — töltse újra az oldalt a panel frissítéséhez.",
|
||||
"update_reload": "Újratöltés"
|
||||
}
|
||||
@@ -0,0 +1,811 @@
|
||||
{
|
||||
"maintenance": "유지보수",
|
||||
"objects": "객체",
|
||||
"tasks": "작업",
|
||||
"overdue": "기한 초과",
|
||||
"due_soon": "기한 임박",
|
||||
"triggered": "트리거됨",
|
||||
"trigger_replaced": "트리거 교체됨",
|
||||
"ok": "정상",
|
||||
"all": "전체",
|
||||
"new_object": "+ 새 객체",
|
||||
"templates_from": "템플릿에서",
|
||||
"templates_title": "템플릿으로 시작하기",
|
||||
"templates_task_count": "작업 {n}개",
|
||||
"template_created": "템플릿에서 생성됨",
|
||||
"onboard_hint": "첫 객체를 추가하여 유지보수 추적을 시작하세요.",
|
||||
"edit": "편집",
|
||||
"duplicate": "복제",
|
||||
"task_duplicated": "작업이 복제되었습니다",
|
||||
"object_duplicated": "객체가 복제되었습니다",
|
||||
"delete": "삭제",
|
||||
"add_task": "+ 작업 추가",
|
||||
"complete": "완료",
|
||||
"completed": "완료됨",
|
||||
"skip": "건너뛰기",
|
||||
"skipped": "건너뜀",
|
||||
"missed": "놓침",
|
||||
"reset": "초기화",
|
||||
"snooze": "다시 알림",
|
||||
"snoozed": "다시 알림 설정됨",
|
||||
"cancel": "취소",
|
||||
"bulk_select": "선택",
|
||||
"bulk_select_all": "모두 선택",
|
||||
"bulk_n_selected": "{n}개 선택됨",
|
||||
"bulk_completed": "작업 {n}개 완료됨",
|
||||
"bulk_archived": "작업 {n}개 보관됨",
|
||||
"completing": "완료 처리 중…",
|
||||
"interval": "주기",
|
||||
"warning": "경고",
|
||||
"last_performed": "마지막 수행일",
|
||||
"next_due": "다음 예정일",
|
||||
"days_until_due": "남은 일수",
|
||||
"avg_duration": "평균 소요 시간",
|
||||
"trigger": "트리거",
|
||||
"trigger_type": "트리거 유형",
|
||||
"threshold_above": "상한",
|
||||
"threshold_below": "하한",
|
||||
"threshold": "임계값",
|
||||
"counter": "카운터",
|
||||
"state_change": "상태 변경",
|
||||
"runtime": "가동 시간",
|
||||
"runtime_hours": "목표 가동 시간 (시간)",
|
||||
"target_value": "목표값",
|
||||
"baseline": "기준값",
|
||||
"target_changes": "목표 변경 횟수",
|
||||
"for_minutes": "지속 시간 (분)",
|
||||
"time_based": "시간 기반",
|
||||
"sensor_based": "센서 기반",
|
||||
"manual": "수동",
|
||||
"one_time": "일회성",
|
||||
"weekdays": "요일",
|
||||
"nth_weekday": "매월 N번째 요일",
|
||||
"day_of_month": "매월 특정 일",
|
||||
"recurrence_on_days": "반복 요일",
|
||||
"recurrence_occurrence": "회차",
|
||||
"recurrence_weekday": "요일",
|
||||
"recurrence_day": "일 (1–31)",
|
||||
"recurrence_last_day": "매월 마지막 날",
|
||||
"recurrence_business_day": "평일만 (주말이면 앞당김)",
|
||||
"recurrence_offset": "오프셋 (일, ±)",
|
||||
"recurrence_offset_help": "날짜를 ±N일 이동합니다. 예: -2 = 이틀 전.",
|
||||
"last_day_month": "매월 마지막 날",
|
||||
"last_business_day_month": "마지막 평일",
|
||||
"ord_1": "첫째",
|
||||
"ord_2": "둘째",
|
||||
"ord_3": "셋째",
|
||||
"ord_4": "넷째",
|
||||
"ord_5": "다섯째",
|
||||
"ord_last": "마지막",
|
||||
"day_word": "일",
|
||||
"interval_value": "주기",
|
||||
"interval_unit": "단위",
|
||||
"unit_days": "일",
|
||||
"unit_weeks": "주",
|
||||
"unit_months": "개월",
|
||||
"unit_years": "년",
|
||||
"due_date": "예정일",
|
||||
"cleaning": "청소",
|
||||
"inspection": "점검",
|
||||
"replacement": "교체",
|
||||
"calibration": "보정",
|
||||
"service": "정비",
|
||||
"reading": "검침",
|
||||
"custom": "사용자 지정",
|
||||
"history": "기록",
|
||||
"cost": "비용",
|
||||
"report_button": "보고서",
|
||||
"report_title": "유지보수 보고서",
|
||||
"report_generated": "생성일",
|
||||
"report_times_done": "수행 횟수",
|
||||
"report_total_cost": "총 비용",
|
||||
"report_every": "{n} {unit}마다",
|
||||
"report_notes": "메모",
|
||||
"report_col_type": "유형",
|
||||
"report_col_status": "상태",
|
||||
"report_col_schedule": "일정",
|
||||
"duration": "소요 시간",
|
||||
"both": "둘 다",
|
||||
"trigger_val": "트리거 값",
|
||||
"complete_title": "완료: ",
|
||||
"checklist": "체크리스트",
|
||||
"checklist_steps_optional": "체크리스트 단계 (선택)",
|
||||
"checklist_placeholder": "필터 청소\n씰 교체\n압력 테스트",
|
||||
"checklist_help": "한 줄에 한 단계씩 입력하세요. 최대 100개.",
|
||||
"err_too_long": "{field}: 너무 깁니다 (최대 {n}자)",
|
||||
"err_too_short": "{field}: 너무 짧습니다 (최소 {n}자)",
|
||||
"err_value_too_high": "{field}: 너무 큽니다 (최대 {n})",
|
||||
"err_value_too_low": "{field}: 너무 작습니다 (최소 {n})",
|
||||
"err_required": "{field}: 필수 항목입니다",
|
||||
"err_wrong_type": "{field}: 잘못된 형식입니다 (예상: {type})",
|
||||
"err_invalid_choice": "{field}: 허용되지 않는 값입니다",
|
||||
"err_invalid_value": "{field}: 유효하지 않은 값입니다",
|
||||
"feat_schedule_time": "시각 지정 일정",
|
||||
"feat_schedule_time_desc": "작업이 자정이 아닌 지정한 시각에 기한 초과로 전환됩니다.",
|
||||
"schedule_time_optional": "기한 시각 (선택, HH:MM)",
|
||||
"schedule_time_help": "비워두면 자정(기본값)입니다. HA 시간대 기준.",
|
||||
"at_time": "시각",
|
||||
"notes_optional": "메모 (선택)",
|
||||
"cost_optional": "비용 (선택)",
|
||||
"duration_minutes": "소요 시간(분, 선택)",
|
||||
"days": "일",
|
||||
"day": "일",
|
||||
"today": "오늘",
|
||||
"d_overdue": "일 초과",
|
||||
"no_tasks": "아직 유지보수 작업이 없습니다. 객체를 만들어 시작하세요.",
|
||||
"no_tasks_short": "작업 없음",
|
||||
"no_history": "아직 기록이 없습니다.",
|
||||
"show_all": "모두 보기",
|
||||
"cost_duration_chart": "비용 및 소요 시간",
|
||||
"installed": "설치일",
|
||||
"confirm_delete_object": "이 객체와 모든 작업을 삭제할까요?",
|
||||
"confirm_delete_task": "이 작업을 삭제할까요?",
|
||||
"min": "최소",
|
||||
"max": "최대",
|
||||
"save": "저장",
|
||||
"saving": "저장 중…",
|
||||
"edit_task": "작업 편집",
|
||||
"new_task": "새 유지보수 작업",
|
||||
"task_name": "작업 이름",
|
||||
"maintenance_type": "유지보수 유형",
|
||||
"priority": "우선순위",
|
||||
"labels": "라벨",
|
||||
"labels_placeholder": "예: 안전, 계절, 세입자용",
|
||||
"labels_help": "필터링과 보고서에 쓰이는 쉼표로 구분된 태그입니다.",
|
||||
"priority_low": "낮음",
|
||||
"priority_normal": "보통",
|
||||
"priority_high": "높음",
|
||||
"schedule_type": "일정 유형",
|
||||
"interval_days": "주기 (일)",
|
||||
"warning_days": "경고 일수",
|
||||
"earliest_completion_days": "조기 완료 허용 (기한 전 일수)",
|
||||
"earliest_completion_days_help": "비워두면 언제든 완료할 수 있습니다. 0 = 기한 당일 이후에만.",
|
||||
"last_performed_optional": "마지막 수행일 (선택)",
|
||||
"interval_anchor": "주기 기준",
|
||||
"anchor_completion": "완료일 기준",
|
||||
"anchor_planned": "예정일 기준 (밀림 없음)",
|
||||
"edit_object": "객체 편집",
|
||||
"name": "이름",
|
||||
"manufacturer_optional": "제조사 (선택)",
|
||||
"model_optional": "모델 (선택)",
|
||||
"serial_number_optional": "일련번호 (선택)",
|
||||
"serial_number_label": "일련번호",
|
||||
"documentation_url_label": "설명서",
|
||||
"object_notes_label": "메모",
|
||||
"sort_due_date": "예정일",
|
||||
"sort_object": "객체 이름",
|
||||
"sort_type": "유형",
|
||||
"sort_task_name": "작업 이름",
|
||||
"all_objects": "모든 객체",
|
||||
"tasks_lower": "작업",
|
||||
"no_tasks_yet": "아직 작업 없음",
|
||||
"add_first_task": "첫 작업 추가",
|
||||
"trigger_configuration": "트리거 설정",
|
||||
"entity_id": "엔티티 ID",
|
||||
"comma_separated": "쉼표로 구분",
|
||||
"entity_logic": "엔티티 논리",
|
||||
"entity_logic_any": "하나라도 트리거되면",
|
||||
"entity_logic_all": "모든 엔티티가 트리거되어야 함",
|
||||
"entities": "엔티티",
|
||||
"attribute_optional": "속성 (선택, 비우면 상태 사용)",
|
||||
"use_entity_state": "엔티티 상태 사용 (속성 없음)",
|
||||
"trigger_above": "초과 시 트리거",
|
||||
"trigger_below": "미만 시 트리거",
|
||||
"for_at_least_minutes": "최소 지속 시간 (분)",
|
||||
"safety_interval_days": "안전 주기 (일, 선택)",
|
||||
"safety_interval": "안전 주기 (선택)",
|
||||
"delta_mode": "델타 모드",
|
||||
"from_state_optional": "변경 전 상태 (선택)",
|
||||
"to_state_optional": "변경 후 상태 (선택)",
|
||||
"documentation_url_optional": "설명서 URL (선택)",
|
||||
"object_notes_optional": "메모 (선택)",
|
||||
"nfc_tag_id_optional": "NFC 태그 ID (선택)",
|
||||
"nfc_tags_empty_help": "Home Assistant에 등록된 NFC 태그가 아직 없습니다.",
|
||||
"nfc_tags_open_settings": "태그 설정 열기",
|
||||
"nfc_tags_refresh": "새로 고침",
|
||||
"environmental_entity_optional": "환경 센서 (선택)",
|
||||
"environmental_entity_helper": "예: sensor.outdoor_temperature — 환경 조건에 따라 주기를 조정합니다",
|
||||
"environmental_attribute_optional": "환경 속성 (선택)",
|
||||
"nfc_tag_id": "NFC 태그 ID",
|
||||
"nfc_linked": "NFC 태그 연결됨",
|
||||
"nfc_link_hint": "클릭하여 NFC 태그 연결",
|
||||
"responsible_user": "담당자",
|
||||
"shared_with": "공유 대상 (순환 담당)",
|
||||
"shared_with_help": "여러 명을 선택해 작업을 공유하세요. 완료할 때마다 담당자가 교대됩니다.",
|
||||
"rotation_strategy": "교대 방식",
|
||||
"rotation_none": "교대 없음",
|
||||
"rotation_round_robin": "순서대로",
|
||||
"rotation_least_completed": "완료 횟수가 적은 사람",
|
||||
"rotation_random": "무작위",
|
||||
"no_user_assigned": "(담당자 없음)",
|
||||
"all_users": "모든 사용자",
|
||||
"my_tasks": "내 작업",
|
||||
"tab_calendar": "캘린더",
|
||||
"cal_no_events": "유지보수 없음",
|
||||
"cal_window_7": "7일",
|
||||
"cal_window_14": "14일",
|
||||
"cal_window_30": "30일",
|
||||
"cal_window_365": "1년",
|
||||
"cal_every_n_days": "{n}일마다",
|
||||
"cal_source_time": "시간 기반",
|
||||
"cal_source_time_adaptive": "시간 기반 (적응형)",
|
||||
"cal_source_sensor": "센서 기반",
|
||||
"cal_predicted": "예측됨",
|
||||
"cal_confidence_high": "높은 신뢰도",
|
||||
"cal_confidence_medium": "중간 신뢰도",
|
||||
"cal_confidence_low": "낮은 신뢰도",
|
||||
"budget_monthly": "월 예산",
|
||||
"budget_yearly": "연 예산",
|
||||
"groups": "그룹",
|
||||
"new_group": "새 그룹",
|
||||
"edit_group": "그룹 편집",
|
||||
"no_groups": "아직 그룹 없음",
|
||||
"delete_group": "그룹 삭제",
|
||||
"delete_group_confirm": "'{name}' 그룹을 삭제할까요?",
|
||||
"group_select_tasks": "작업 선택",
|
||||
"group_name_required": "이름은 필수입니다",
|
||||
"description_optional": "설명 (선택)",
|
||||
"selected": "선택됨",
|
||||
"loading_chart": "차트 데이터 불러오는 중...",
|
||||
"hide_outliers": "이상값 숨기기 (센서 오류)",
|
||||
"was_maintenance_needed": "이 유지보수가 필요했나요?",
|
||||
"feedback_needed": "필요했음",
|
||||
"feedback_not_needed": "불필요했음",
|
||||
"feedback_not_sure": "잘 모름",
|
||||
"suggested_interval": "제안 주기",
|
||||
"apply_suggestion": "적용",
|
||||
"reanalyze": "재분석",
|
||||
"reanalyze_result": "새 분석 결과",
|
||||
"reanalyze_insufficient_data": "권장값을 산출하기에 데이터가 부족합니다",
|
||||
"data_points": "데이터 포인트",
|
||||
"dismiss_suggestion": "무시",
|
||||
"confidence_low": "낮음",
|
||||
"confidence_medium": "중간",
|
||||
"confidence_high": "높음",
|
||||
"recommended": "권장",
|
||||
"seasonal_awareness": "계절 인식",
|
||||
"edit_seasonal_overrides": "계절 계수 편집",
|
||||
"seasonal_overrides_title": "계절 계수 (수동 설정)",
|
||||
"seasonal_overrides_hint": "월별 계수 (0.1–5.0). 비워두면 자동으로 학습됩니다.",
|
||||
"seasonal_override_invalid": "유효하지 않은 값",
|
||||
"seasonal_override_range": "계수는 0.1에서 5.0 사이여야 합니다",
|
||||
"clear_all": "모두 지우기",
|
||||
"seasonal_chart_title": "계절 계수",
|
||||
"seasonal_learned": "학습됨",
|
||||
"seasonal_manual": "수동",
|
||||
"month_jan": "1월",
|
||||
"month_feb": "2월",
|
||||
"month_mar": "3월",
|
||||
"month_apr": "4월",
|
||||
"month_may": "5월",
|
||||
"month_jun": "6월",
|
||||
"month_jul": "7월",
|
||||
"month_aug": "8월",
|
||||
"month_sep": "9월",
|
||||
"month_oct": "10월",
|
||||
"month_nov": "11월",
|
||||
"month_dec": "12월",
|
||||
"sensor_prediction": "센서 예측",
|
||||
"degradation_trend": "추세",
|
||||
"trend_rising": "상승",
|
||||
"trend_falling": "하강",
|
||||
"trend_stable": "안정",
|
||||
"trend_insufficient_data": "데이터 부족",
|
||||
"days_until_threshold": "임계값까지 남은 일수",
|
||||
"threshold_exceeded": "임계값 초과",
|
||||
"environmental_adjustment": "환경 계수",
|
||||
"sensor_prediction_urgency": "센서 예측: 약 {days}일 후 임계값 도달",
|
||||
"day_short": "일",
|
||||
"weibull_reliability_curve": "신뢰도 곡선",
|
||||
"weibull_failure_probability": "고장 확률",
|
||||
"weibull_r_squared": "적합도 R²",
|
||||
"beta_early_failures": "초기 고장",
|
||||
"beta_random_failures": "무작위 고장",
|
||||
"beta_wear_out": "마모 고장",
|
||||
"beta_highly_predictable": "매우 예측 가능",
|
||||
"confidence_interval": "신뢰 구간",
|
||||
"confidence_conservative": "보수적",
|
||||
"confidence_aggressive": "낙관적",
|
||||
"current_interval_marker": "현재 주기",
|
||||
"recommended_marker": "권장",
|
||||
"characteristic_life": "특성 수명",
|
||||
"chart_mini_sparkline": "추세 스파크라인",
|
||||
"chart_history": "비용 및 소요 시간 기록",
|
||||
"chart_seasonal": "계절 계수, 12개월",
|
||||
"chart_weibull": "Weibull 신뢰도 곡선",
|
||||
"chart_sparkline": "센서 트리거 값 차트",
|
||||
"days_progress": "일수 진행률",
|
||||
"qr_code": "QR 코드",
|
||||
"qr_generating": "QR 코드 생성 중…",
|
||||
"qr_error": "QR 코드 생성에 실패했습니다.",
|
||||
"qr_error_no_url": "설정된 HA URL이 없습니다. 설정 → 시스템 → 네트워크에서 외부 또는 내부 URL을 설정해 주세요.",
|
||||
"save_error": "저장에 실패했습니다. 다시 시도해 주세요.",
|
||||
"qr_print": "인쇄",
|
||||
"qr_download": "SVG 다운로드",
|
||||
"qr_action": "스캔 시 동작",
|
||||
"qr_action_view": "유지보수 정보 보기",
|
||||
"qr_action_complete": "유지보수 완료로 표시",
|
||||
"qr_url_mode": "링크 유형",
|
||||
"qr_mode_companion": "Companion 앱",
|
||||
"qr_mode_local": "로컬 (mDNS)",
|
||||
"qr_mode_server": "서버 URL",
|
||||
"overview": "개요",
|
||||
"analysis": "분석",
|
||||
"recent_activities": "최근 활동",
|
||||
"search_notes": "메모 검색",
|
||||
"avg_cost": "평균 비용",
|
||||
"no_advanced_features": "활성화된 고급 기능 없음",
|
||||
"no_advanced_features_hint": "통합구성요소 설정에서 “적응형 일정” 또는 “계절 패턴”을 활성화하면 여기에서 분석 데이터를 볼 수 있습니다.",
|
||||
"analysis_not_enough_data": "아직 분석할 데이터가 충분하지 않습니다.",
|
||||
"analysis_not_enough_data_hint": "Weibull 분석에는 최소 5회의 완료 기록이 필요하며, 계절 패턴은 월별 6개 이상의 데이터 포인트가 쌓이면 표시됩니다.",
|
||||
"analysis_manual_task_hint": "주기가 없는 수동 작업은 분석 데이터를 생성하지 않습니다.",
|
||||
"completions": "회 완료",
|
||||
"current": "현재",
|
||||
"shorter": "더 짧게",
|
||||
"longer": "더 길게",
|
||||
"normal": "보통",
|
||||
"disabled": "비활성화됨",
|
||||
"compound_logic": "복합 논리",
|
||||
"compound": "복합 (여러 조건)",
|
||||
"compound_logic_and": "AND — 모든 조건이 트리거되어야 함",
|
||||
"compound_logic_or": "OR — 하나의 조건만 트리거되면 됨",
|
||||
"compound_help": "여러 센서 조건을 하나의 트리거로 결합합니다.",
|
||||
"compound_no_conditions": "아직 조건이 없습니다 — 최소 하나를 추가하세요.",
|
||||
"compound_add_condition": "조건 추가",
|
||||
"compound_condition": "조건",
|
||||
"compound_remove_condition": "조건 제거",
|
||||
"card_title": "제목",
|
||||
"card_show_header": "통계 헤더 표시",
|
||||
"card_show_actions": "동작 버튼 표시",
|
||||
"card_compact": "컴팩트 모드",
|
||||
"card_max_items": "최대 항목 수 (0 = 전체)",
|
||||
"card_filter_status": "상태로 필터",
|
||||
"card_filter_status_help": "비워두면 모든 상태를 표시합니다.",
|
||||
"card_filter_objects": "객체로 필터",
|
||||
"card_filter_objects_help": "비워두면 모든 객체를 표시합니다.",
|
||||
"card_filter_entities": "엔티티로 필터 (entity_ids)",
|
||||
"card_filter_entities_help": "이 통합구성요소의 sensor / binary_sensor 엔티티를 선택하세요. 비워두면 전체.",
|
||||
"card_loading_objects": "객체 불러오는 중…",
|
||||
"card_load_error": "객체를 불러올 수 없습니다 — WebSocket 연결을 확인하세요.",
|
||||
"card_no_tasks_title": "아직 유지보수 작업이 없습니다",
|
||||
"card_no_tasks_cta": "→ 유지보수 패널에서 만들어 보세요",
|
||||
"no_objects": "아직 객체가 없습니다.",
|
||||
"action_error": "동작에 실패했습니다. 다시 시도해 주세요.",
|
||||
"area_id_optional": "구역 (선택)",
|
||||
"installation_date_optional": "설치일 (선택)",
|
||||
"warranty_expiry_optional": "보증 만료일 (선택)",
|
||||
"warranty": "보증",
|
||||
"warranty_valid_until": "{date}까지 유효",
|
||||
"warranty_expires_in": "{days}일 후 만료",
|
||||
"warranty_expired": "만료됨",
|
||||
"cal_past_windows": "이전 기간",
|
||||
"cal_forward_windows": "이후 기간",
|
||||
"history_edit_title": "기록 항목 편집",
|
||||
"history_edit_timestamp": "타임스탬프",
|
||||
"manufacturer": "제조사",
|
||||
"model": "모델",
|
||||
"area": "구역",
|
||||
"actions": "동작",
|
||||
"view_mode_label": "보기",
|
||||
"view_cards": "카드 보기",
|
||||
"view_table": "표 보기",
|
||||
"objects_table_columns_label": "객체 표 열",
|
||||
"objects_table_columns_hint": "객체 표 보기에 표시할 열을 선택하세요.",
|
||||
"custom_icon_optional": "아이콘 (선택, 예: mdi:wrench)",
|
||||
"task_enabled": "작업 활성화",
|
||||
"skip_reason_prompt": "이 작업을 건너뛸까요?",
|
||||
"reason_optional": "사유 (선택)",
|
||||
"reset_date_prompt": "작업을 수행한 것으로 표시할까요?",
|
||||
"reset_date_optional": "마지막 수행일 (선택, 기본값은 오늘)",
|
||||
"notes_label": "메모",
|
||||
"documentation_label": "문서",
|
||||
"no_nfc_tag": "— 태그 없음 —",
|
||||
"dashboard": "대시보드",
|
||||
"tab_today": "오늘",
|
||||
"palette_placeholder": "객체와 작업 검색…",
|
||||
"palette_no_results": "일치 항목 없음",
|
||||
"palette_hint": "↑↓ 이동 · Enter 열기 · Esc 닫기",
|
||||
"today_all_caught_up": "모두 처리했습니다! 이번 주에 예정된 작업이 없습니다.",
|
||||
"today_overdue": "기한 초과",
|
||||
"today_due_today": "오늘 예정",
|
||||
"today_this_week": "이번 주",
|
||||
"settings": "설정",
|
||||
"settings_features": "고급 기능",
|
||||
"settings_features_desc": "고급 기능을 켜거나 끕니다. 끄면 UI에서 숨겨질 뿐 데이터는 삭제되지 않습니다.",
|
||||
"feat_adaptive": "적응형 일정",
|
||||
"feat_adaptive_desc": "유지보수 기록에서 최적 주기를 학습합니다",
|
||||
"feat_predictions": "센서 예측",
|
||||
"feat_predictions_desc": "센서 열화로부터 트리거 시점을 예측합니다",
|
||||
"feat_seasonal": "계절 조정",
|
||||
"feat_seasonal_desc": "계절 패턴에 따라 주기를 조정합니다",
|
||||
"feat_environmental": "환경 상관관계",
|
||||
"feat_environmental_desc": "온도/습도와 주기의 상관관계를 분석합니다",
|
||||
"feat_budget": "예산 추적",
|
||||
"feat_budget_desc": "월별·연별 유지보수 지출을 추적합니다",
|
||||
"feat_groups": "작업 그룹",
|
||||
"feat_groups_desc": "작업을 논리적 그룹으로 정리합니다",
|
||||
"feat_checklists": "체크리스트",
|
||||
"feat_checklists_desc": "작업 완료를 위한 다단계 절차",
|
||||
"settings_general": "일반",
|
||||
"settings_default_warning": "기본 경고 일수",
|
||||
"settings_panel_enabled": "사이드바 패널",
|
||||
"settings_panel_title": "사이드바 패널 제목",
|
||||
"settings_notifications": "알림",
|
||||
"settings_notify_service": "알림 서비스",
|
||||
"test_notification": "테스트 알림",
|
||||
"send_test": "테스트 보내기",
|
||||
"testing": "보내는 중…",
|
||||
"test_notification_success": "테스트 알림을 보냈습니다",
|
||||
"test_notification_failed": "테스트 알림 전송 실패",
|
||||
"settings_notify_due_soon": "기한 임박 시 알림",
|
||||
"settings_notify_overdue": "기한 초과 시 알림",
|
||||
"settings_notify_triggered": "트리거 시 알림",
|
||||
"settings_interval_hours": "반복 주기 (시간, 0 = 한 번만)",
|
||||
"settings_quiet_hours": "방해 금지 시간",
|
||||
"settings_quiet_start": "시작",
|
||||
"settings_quiet_end": "종료",
|
||||
"settings_max_per_day": "하루 최대 알림 수 (0 = 무제한)",
|
||||
"settings_bundling": "알림 묶기",
|
||||
"settings_bundle_threshold": "묶음 기준 개수",
|
||||
"settings_reminder_leads": "추가 알림 (기한 전 일수)",
|
||||
"settings_reminder_leads_hint": "쉼표로 구분한 사전 알림 시점입니다. 예: 14, 3, 0 — 해당하는 날마다 추가 알림이 한 번 발송됩니다. 비워두면 꺼짐.",
|
||||
"settings_actions": "모바일 동작 버튼",
|
||||
"settings_action_complete": "'완료' 버튼 표시",
|
||||
"settings_action_skip": "'건너뛰기' 버튼 표시",
|
||||
"settings_action_snooze": "'다시 알림' 버튼 표시",
|
||||
"settings_weekly_digest": "주간 요약",
|
||||
"settings_weekly_digest_hint": "예정된 작업이 있으면 월요일 아침에 요약 알림을 한 번 보냅니다.",
|
||||
"settings_warranty_reminder": "보증 만료 알림",
|
||||
"settings_warranty_reminder_days": "만료 전 일수",
|
||||
"settings_warranty_reminder_hint": "객체의 보증 만료가 설정한 일수만큼 남았을 때 한 번 알립니다.",
|
||||
"settings_snooze_hours": "다시 알림 대기 시간 (시간)",
|
||||
"settings_budget": "예산",
|
||||
"settings_currency": "통화",
|
||||
"settings_budget_monthly": "월 예산",
|
||||
"settings_budget_yearly": "연 예산",
|
||||
"settings_budget_alerts": "예산 경고",
|
||||
"settings_budget_threshold": "경고 기준 (%)",
|
||||
"settings_import_export": "가져오기 / 내보내기",
|
||||
"settings_export_json": "JSON 내보내기",
|
||||
"settings_export_yaml": "YAML 내보내기",
|
||||
"settings_export_csv": "CSV 내보내기",
|
||||
"settings_import_csv": "CSV 가져오기",
|
||||
"settings_import_placeholder": "JSON 또는 CSV 내용을 여기에 붙여넣으세요…",
|
||||
"settings_import_btn": "가져오기",
|
||||
"settings_import_success": "객체 {count}개를 성공적으로 가져왔습니다.",
|
||||
"settings_export_success": "내보내기 파일이 다운로드되었습니다.",
|
||||
"settings_saved": "설정이 저장되었습니다.",
|
||||
"settings_include_history": "기록 포함",
|
||||
"settings_export_selection": "선택한 객체로 제한 (선택)",
|
||||
"settings_docs_archive": "문서 아카이브 (파일 포함)",
|
||||
"settings_docs_archive_hint": "JSON/YAML/CSV 내보내기에는 설정만 포함됩니다. 이 ZIP에는 업로드한 파일 내용까지 포함되어 완전한 복원이 가능합니다.",
|
||||
"settings_docs_export_btn": "문서 ZIP 다운로드",
|
||||
"settings_docs_import_btn": "문서 ZIP 복원",
|
||||
"settings_docs_import_success": "복원됨: 파일 {blobs}개, 문서 {docs}개",
|
||||
"sort_alphabetical": "가나다순",
|
||||
"sort_due_soonest": "예정일 빠른 순",
|
||||
"sort_task_count": "작업 수",
|
||||
"sort_area": "구역",
|
||||
"sort_assigned_user": "담당자",
|
||||
"sort_group": "그룹",
|
||||
"groupby_none": "그룹화 없음",
|
||||
"groupby_area": "구역별",
|
||||
"groupby_group": "그룹별",
|
||||
"groupby_user": "사용자별",
|
||||
"filter_label": "필터",
|
||||
"user_label": "사용자",
|
||||
"sort_label": "정렬",
|
||||
"group_by_label": "그룹화",
|
||||
"state_value_help": "HA 상태 값을 사용하세요(보통 소문자, 예: \"on\"/\"off\"). 대소문자는 저장 시 정규화됩니다.",
|
||||
"target_changes_help": "트리거가 발동하기까지 필요한 일치 전환 횟수입니다 (기본값: 1).",
|
||||
"qr_print_title": "QR 코드 인쇄",
|
||||
"qr_print_desc": "잘라서 장비에 붙일 수 있는 QR 코드 인쇄 페이지를 생성합니다.",
|
||||
"qr_print_load": "객체 불러오기",
|
||||
"qr_print_filter": "필터",
|
||||
"qr_print_objects": "객체",
|
||||
"qr_print_actions": "동작",
|
||||
"qr_print_url_mode": "링크 유형",
|
||||
"qr_print_estimate": "예상 QR 코드 수",
|
||||
"qr_print_over_limit": "최대 200개입니다. 필터를 좁혀 주세요",
|
||||
"qr_print_generate": "QR 코드 생성",
|
||||
"qr_print_generating": "생성 중…",
|
||||
"qr_print_ready": "QR 코드 준비 완료",
|
||||
"qr_print_print_button": "인쇄",
|
||||
"qr_print_empty": "생성할 항목 없음",
|
||||
"qr_action_skip": "건너뛰기",
|
||||
"vacation_title": "휴가 모드",
|
||||
"vacation_active": "활성",
|
||||
"vacation_ended": "종료됨",
|
||||
"vacation_desc": "휴가를 계획하세요. 휴가 기간과 버퍼 일수 동안 알림이 일시 중지됩니다. 특정 작업은 예외로 되돌릴 수 있습니다.",
|
||||
"vacation_enable": "휴가 모드 활성화",
|
||||
"vacation_start": "시작",
|
||||
"vacation_end": "종료",
|
||||
"vacation_buffer": "버퍼 (일)",
|
||||
"vacation_exempt_title": "휴가 중에도 알림 받기",
|
||||
"vacation_exempt_desc": "휴가 중에도 알림을 받을 작업을 선택하세요 (예: 중요한 수영장 수질 관리).",
|
||||
"vacation_load_tasks": "작업 불러오기",
|
||||
"vacation_preview_btn": "미리보기 표시",
|
||||
"vacation_preview_affected": "개 작업 영향받음",
|
||||
"vacation_event_due_soon": "기한 임박 예정",
|
||||
"vacation_event_overdue": "기한 초과 예정",
|
||||
"vacation_event_triggered_est": "센서 트리거 가능",
|
||||
"vacation_sensor_based": "(센서 기반)",
|
||||
"vacation_action_notify": "그래도 알림",
|
||||
"vacation_action_unsilence": "다시 음소거",
|
||||
"vacation_marked_complete": "완료로 표시됨",
|
||||
"vacation_marked_skip": "건너뜀",
|
||||
"vacation_end_now": "지금 휴가 종료",
|
||||
"add": "추가",
|
||||
"show_stats": "통계 + 그래프 보기",
|
||||
"hide_stats": "통계 숨기기",
|
||||
"adaptive_no_data": "적응형 분석에 필요한 완료 기록이 아직 부족합니다. 이 작업을 몇 번 더 완료하면 주기 추천과 신뢰도 차트가 열립니다.",
|
||||
"suggestion_applied": "제안 주기가 적용되었습니다",
|
||||
"vacation_mode": "휴가 모드",
|
||||
"vacation_status_active": "현재 활성",
|
||||
"vacation_status_scheduled": "예약됨",
|
||||
"vacation_status_inactive": "비활성",
|
||||
"vacation_end_now_confirm": "휴가를 지금 바로 종료할까요?",
|
||||
"vacation_exempt_count": "예외",
|
||||
"vacation_advanced": "고급…",
|
||||
"vacation_open_panel": "패널에서 열기",
|
||||
"enable": "활성화",
|
||||
"saved": "저장됨",
|
||||
"budget_monthly_set": "월 예산 설정",
|
||||
"budget_yearly_set": "연 예산 설정",
|
||||
"budget_advanced": "통화, 경고…",
|
||||
"budget_open_panel": "패널에서 열기",
|
||||
"groups_empty": "아직 그룹이 없습니다.",
|
||||
"group_new_placeholder": "그룹 추가…",
|
||||
"group_delete_confirm": "\"{name}\" 그룹을 삭제할까요?",
|
||||
"groups_manage_tasks": "작업 배정 관리…",
|
||||
"groups_open_panel": "패널에서 열기",
|
||||
"unassigned": "미배정",
|
||||
"no_area": "구역 없음",
|
||||
"has_overdue": "기한 초과 작업 있음",
|
||||
"object": "객체",
|
||||
"settings_panel_access": "패널 접근 권한",
|
||||
"settings_panel_access_desc": "관리자는 항상 전체 권한을 가집니다. 특정 비관리자에게 생성·편집·삭제를 위임하려면 이 옵션을 켜고 아래에서 선택하세요. 나머지 사용자에게는 완료와 건너뛰기만 표시됩니다.",
|
||||
"settings_operator_write": "선택한 사용자에게 생성·편집·삭제 허용",
|
||||
"settings_operator_write_desc": "끔: 관리자만 내용을 변경할 수 있습니다. 켬: 아래에서 선택한 사용자도 전체 권한을 갖습니다.",
|
||||
"no_non_admin_users": "비관리자 사용자가 없습니다. 설정 → 사람에서 추가하세요.",
|
||||
"owner_label": "소유자",
|
||||
"feat_completion_actions": "완료 동작",
|
||||
"feat_completion_actions_desc": "완료 시 작업별 HA 동작 실행 + 사전 설정값이 있는 빠른 완료 QR.",
|
||||
"on_complete_action_title": "완료 시: HA 동작 실행 (선택)",
|
||||
"on_complete_action_desc": "작업이 완료되면 HA 서비스를 호출합니다 — 예: 기기의 카운터 초기화.",
|
||||
"on_complete_action_service": "서비스",
|
||||
"on_complete_action_target": "대상 엔티티",
|
||||
"on_complete_action_target_hint": "참고: 엔티티 도메인이 서비스와 일치해야 합니다 — 예: 'button.press'는 button.*에서만, 'counter.increment'는 counter.*에서만, 'input_button.press'는 input_button.*에서만 동작합니다. 불일치 시 동작이 조용히 실패합니다 (HA 로그에 'Referenced entities ... missing or not currently available' 기록).",
|
||||
"on_complete_action_data": "데이터 (JSON, 선택)",
|
||||
"on_complete_action_test": "설정 검증",
|
||||
"on_complete_action_test_success": "✓ 설정이 유효합니다 (동작은 작업 완료 시에만 실행됩니다)",
|
||||
"on_complete_action_test_failed": "실패",
|
||||
"quick_complete_defaults_title": "빠른 완료 기본값 (QR 스캔용, 선택)",
|
||||
"quick_complete_defaults_desc": "빠른 완료 QR 스캔에 쓰이는 사전 설정값입니다. 없으면 QR이 완료 대화상자를 엽니다.",
|
||||
"quick_complete_defaults_notes": "메모",
|
||||
"quick_complete_defaults_cost": "비용",
|
||||
"quick_complete_defaults_duration": "소요 시간 (분)",
|
||||
"quick_complete_defaults_feedback_none": "피드백 없음",
|
||||
"quick_complete_defaults_feedback_needed": "필요했음",
|
||||
"quick_complete_defaults_feedback_not_needed": "불필요했음",
|
||||
"quick_complete_success": "빠르게 완료로 표시됨",
|
||||
"show_all_objects": "모든 객체 보기",
|
||||
"show_all_tasks": "필터 해제 — 모든 작업 보기",
|
||||
"filter_to_overdue": "기한 초과 작업만 보기",
|
||||
"filter_to_due_soon": "기한 임박 작업만 보기",
|
||||
"filter_to_triggered": "트리거된 작업만 보기",
|
||||
"open_task": "작업 열기",
|
||||
"show_details": "기록 + 통계 보기",
|
||||
"hide_details": "상세 숨기기",
|
||||
"history_empty": "아직 기록이 없습니다.",
|
||||
"history_edit_button": "항목 편집",
|
||||
"total_cost": "총 비용",
|
||||
"times_performed": "수행 횟수",
|
||||
"older_entries": "이전 항목",
|
||||
"open_in_panel": "유지보수 패널에서 열기",
|
||||
"skip_reason": "건너뛰기 사유 (선택)",
|
||||
"reset_to_date": "마지막 수행일 재설정",
|
||||
"delete_task_confirm": "이 작업과 기록을 삭제할까요?",
|
||||
"delete_object_confirm": "이 객체와 모든 작업을 삭제할까요?",
|
||||
"loading": "불러오는 중…",
|
||||
"archive": "보관",
|
||||
"undo": "실행 취소",
|
||||
"task_archived": "작업이 보관되었습니다",
|
||||
"object_archived": "객체가 보관되었습니다",
|
||||
"unarchive": "보관 해제",
|
||||
"archived": "보관됨",
|
||||
"show_archived": "보관된 항목 보기",
|
||||
"hide_archived": "보관된 항목 숨기기",
|
||||
"confirm_archive_object": "이 객체와 작업을 보관할까요? 기록은 유지되며 나중에 보관 해제할 수 있습니다.",
|
||||
"settings_archive": "보관 및 보존",
|
||||
"settings_archive_desc": "완료된 일회성 작업을 삭제하지 않고 정리합니다. 보관된 항목은 숨겨지고 동작하지 않지만 기록과 비용은 유지됩니다.",
|
||||
"settings_archive_oneoff_days": "완료된 일회성 작업 자동 보관 (일, 0 = 끔)",
|
||||
"settings_delete_archived_oneoff_days": "보관된 일회성 작업 자동 삭제 (일, 0 = 안 함)",
|
||||
"archive_object": "객체 보관",
|
||||
"unarchive_object": "객체 보관 해제",
|
||||
"documents": "문서",
|
||||
"documents_empty": "아직 문서가 없습니다.",
|
||||
"doc_upload": "파일 업로드",
|
||||
"doc_uploading": "업로드 중…",
|
||||
"doc_add_link": "링크 추가",
|
||||
"doc_link_url": "링크 URL (https://…)",
|
||||
"doc_link_title": "제목 (선택)",
|
||||
"doc_open": "열기",
|
||||
"doc_delete_confirm": "\"{name}\"을(를) 삭제할까요?",
|
||||
"doc_too_large": "파일이 너무 큽니다 (최대 25 MB).",
|
||||
"doc_upload_failed": "업로드에 실패했습니다.",
|
||||
"completion_photo_optional": "완료 사진 (선택)",
|
||||
"add_photo": "사진 추가",
|
||||
"uploading": "업로드 중…",
|
||||
"remove": "제거",
|
||||
"doc_deduped": "이미 다른 곳에 저장됨 — 공유되어 추가 공간을 쓰지 않습니다.",
|
||||
"doc_dup_in_object": "이 파일은 이미 이 객체에 첨부되어 있습니다.",
|
||||
"doc_link_invalid": "http/https 링크만 허용됩니다.",
|
||||
"doc_cat_manual": "설명서",
|
||||
"doc_cat_warranty": "보증서",
|
||||
"doc_cat_invoice": "영수증",
|
||||
"doc_cat_spare_parts": "예비 부품",
|
||||
"doc_cat_photo": "사진",
|
||||
"doc_cat_other": "기타",
|
||||
"doc_link_badge": "링크",
|
||||
"doc_storage_title": "문서 저장소",
|
||||
"doc_storage_saved": "중복 제거로 절약됨",
|
||||
"doc_storage_refresh": "새로 고침",
|
||||
"doc_download": "다운로드",
|
||||
"doc_close": "닫기",
|
||||
"doc_camera": "사진 촬영",
|
||||
"doc_drop_hint": "파일을 여기에 놓으세요",
|
||||
"doc_task_none": "이 작업에 연결된 문서가 없습니다.",
|
||||
"doc_link_existing": "문서 연결…",
|
||||
"doc_attach": "연결",
|
||||
"doc_unlink": "연결 해제",
|
||||
"doc_page": "페이지",
|
||||
"chart_range_7d": "7일",
|
||||
"chart_range_30d": "30일",
|
||||
"chart_range_90d": "90일",
|
||||
"chart_range_1y": "1년",
|
||||
"chart_since_service": "마지막 정비 이후",
|
||||
"chart_no_stats": "이 엔티티의 장기 통계가 없습니다 — 유지보수 이벤트 값만 표시합니다",
|
||||
"auto_complete_on_recovery": "센서가 정상으로 돌아오면 자동 완료",
|
||||
"auto_complete_on_recovery_help": "트리거가 스스로 해제되면 완료를 기록합니다 (마지막 수행일 갱신) — 예: 소금 보충, 필터 교체.",
|
||||
"doc_search": "문서 검색…",
|
||||
"doc_search_none": "일치하는 문서 없음",
|
||||
"link_device_optional": "기존 기기와 연결 (선택)",
|
||||
"parent_object_optional": "상위 객체 (선택)",
|
||||
"parent_none": "(상위 없음)",
|
||||
"paused": "일시 중지됨",
|
||||
"pause_object": "일시 중지",
|
||||
"resume_object": "재개",
|
||||
"pause_until_prompt": "이 객체의 일정을 동결합니다 — 재개할 때까지 어떤 작업도 기한이 되지 않고 알림도 오지 않습니다. 자동 재개 날짜를 선택적으로 설정할 수 있습니다.",
|
||||
"pause_until_label": "재개일 (선택)",
|
||||
"object_paused": "객체가 일시 중지되었습니다",
|
||||
"object_resumed": "객체가 재개되었습니다 — 일정이 다시 시작됩니다",
|
||||
"object_paused_badge": "일시 중지됨",
|
||||
"paused_until_label": "재개일",
|
||||
"replace_object": "교체…",
|
||||
"replace_object_prompt": "이 객체를 퇴역시키고 후속 객체를 만듭니다. 기록과 비용은 기존 객체에 보관된 채 남고, 작업과 문서는 새 객체로 이어지며 카운터는 새로 시작됩니다.",
|
||||
"replace_name_label": "후속 객체 이름",
|
||||
"object_replaced": "객체가 교체되었습니다 — 후속 객체 생성됨",
|
||||
"reading_unit_label": "검침 단위 (예: kWh, m³)",
|
||||
"reading_unit_help": "이 작업을 완료할 때 기록 값 옆에 표시됩니다.",
|
||||
"reading_value_label": "검침 값",
|
||||
"reading_label": "검침",
|
||||
"settings_templates_label": "템플릿 갤러리",
|
||||
"settings_templates_hint": "필요 없는 템플릿의 체크를 해제하세요 — \"템플릿에서\" 선택 목록(패널 및 설정 흐름)에서 사라집니다. 다른 변화는 없으며 언제든 다시 활성화할 수 있습니다.",
|
||||
"worksheet": "작업 시트",
|
||||
"worksheet_scan_view": "스캔하여 작업 열기",
|
||||
"worksheet_scan_complete": "스캔하여 완료",
|
||||
"worksheet_manual_excerpt": "설명서 발췌",
|
||||
"worksheet_pages": "페이지",
|
||||
"worksheet_printed": "인쇄됨",
|
||||
"worksheet_never": "없음",
|
||||
"card_all_caught_up": "모두 처리했습니다 — 주의가 필요한 항목이 없습니다",
|
||||
"postpone": "연기",
|
||||
"postpone_date_prompt": "이번 회차를 언제로 연기할까요?",
|
||||
"postpone_date_label": "새 예정일",
|
||||
"postponed": "연기됨",
|
||||
"postponed_to": "연기됨:",
|
||||
"season_window_label": "계절 기간 (월)",
|
||||
"season_window_hint": "선택한 달에만 기한이 됩니다. 비수기 날짜는 다음 활성 달로 넘어갑니다. 선택 없음 = 연중.",
|
||||
"series_end_label": "종료",
|
||||
"series_end_never": "없음 (무기한 반복)",
|
||||
"series_end_after_count": "지정 횟수 후",
|
||||
"series_end_until": "특정 날짜에",
|
||||
"series_end_count_label": "횟수",
|
||||
"series_end_until_label": "종료일",
|
||||
"parts_section": "부품 및 소모품",
|
||||
"part_add": "부품 추가",
|
||||
"part_name": "이름",
|
||||
"part_vendor": "제조사",
|
||||
"part_storage_location": "보관 위치",
|
||||
"part_product_url": "제품 URL",
|
||||
"part_unit": "단위",
|
||||
"part_cost": "단가",
|
||||
"part_stock": "재고",
|
||||
"part_reorder_threshold": "재주문 기준",
|
||||
"part_restock_quantity": "보충 수량",
|
||||
"part_auto_buy": "재고 부족 시 구매 작업 자동 생성",
|
||||
"part_restock": "재고 조정",
|
||||
"restock_quantity_label": "구매 수량",
|
||||
"consumes_parts_label": "사용하는 부품",
|
||||
"parts_load_failed": "이 객체의 부품을 불러올 수 없습니다 — 부품 사용 옵션을 지금은 쓸 수 없습니다.",
|
||||
"adopt_problem_button": "문제 센서 가져오기",
|
||||
"adopt_problem_title": "문제 센서 가져오기",
|
||||
"adopt_problem_hint": "HA 문제 센서(프린터 오류, 필터 경고, 배터리 부족)를 유지보수 작업으로 전환합니다. 문제가 활성인 동안 트리거되고 해결되면 자동으로 해제됩니다.",
|
||||
"adopt_problem_none": "아직 추적되지 않은 문제 센서를 찾지 못했습니다.",
|
||||
"adopt_problem_active": "활성",
|
||||
"adopt_problem_ok": "정상",
|
||||
"adopt_problem_new_object": "(신규)",
|
||||
"adopt_problem_adopt": "선택 항목 가져오기",
|
||||
"adopt_problem_done": "문제 센서 {tasks}개를 가져왔습니다",
|
||||
"views_label": "보기",
|
||||
"views_none": "— 보기 없음 —",
|
||||
"views_manage": "보기 저장 / 관리",
|
||||
"views_dialog_title": "저장된 보기",
|
||||
"views_dialog_hint": "현재 필터를 이름 있는 보기로 저장하면 모두가 다시 사용할 수 있습니다.",
|
||||
"views_name_placeholder": "보기 이름",
|
||||
"views_save_current": "현재 필터 저장",
|
||||
"views_none_yet": "저장된 보기가 아직 없습니다.",
|
||||
"close": "닫기",
|
||||
"trigger_hint_now": "센서의 현재 값은 {value}입니다.",
|
||||
"trigger_hint_above": "{target}을(를) 초과하면 작업이 트리거됩니다.",
|
||||
"trigger_hint_below": "{target} 미만으로 떨어지면 트리거됩니다.",
|
||||
"trigger_hint_counter_delta": "현재 값({value})부터 계수합니다: {due} 도달 시 기한 (+{target}), 완료할 때마다 계수가 다시 시작됩니다.",
|
||||
"trigger_hint_counter_delta_edit": "마지막 완료 이후 사용량을 계수합니다: +{target} 후 기한이 되며, 완료할 때마다 계수가 다시 시작됩니다.",
|
||||
"trigger_hint_counter_abs": "센서가 {target}에 도달하면 작업 기한이 됩니다.",
|
||||
"trigger_hint_runtime": "누적 가동 {hours}시간 후 작업 기한이 됩니다. 카운터는 완료할 때마다 다시 시작됩니다.",
|
||||
"trigger_hint_state_change": "상태가 {count}회 변경되면 작업 기한이 됩니다.",
|
||||
"trigger_hint_state_change_to": "“{state}”(으)로 {count}회 변경되면 작업 기한이 됩니다.",
|
||||
"trigger_hint_state_now": "현재 상태: {value}.",
|
||||
"adopt_problem_part": "사용 부품: {name}",
|
||||
"label_filter": "라벨",
|
||||
"all_labels": "모든 라벨",
|
||||
"settings_notify_scope": "특정 보기만 알림",
|
||||
"settings_notify_scope_all": "모든 작업",
|
||||
"settings_notify_scope_hint": "선택한 저장된 보기의 라벨/사용자 필터와 일치하는 작업만 알림을 보냅니다. 보기의 상태·정렬·그룹화는 여기서 무시됩니다.",
|
||||
"card_saved_view": "저장된 보기",
|
||||
"card_saved_view_none": "없음",
|
||||
"card_saved_view_help": "위 필터에 더해 보기의 상태·사용자·라벨 필터를 적용합니다. 보기의 정렬과 그룹화는 패널 표시 설정이며 카드에는 적용되지 않습니다.",
|
||||
"doc_part_none": "이 부품에 연결된 문서가 없습니다.",
|
||||
"settings_templates_toggle_group": "이 그룹의 모든 템플릿을 켜거나 끄기",
|
||||
"setups_button": "추천 설정",
|
||||
"setups_title": "추천 설정 (베타)",
|
||||
"setups_hint": "소모품 센서로 유지보수 작업을 구동할 수 있는 지원 통합구성요소의 기기입니다. 가져오면 객체가 생성되고 각 작업이 센서에 연결됩니다 — 소모품이 부족해지면 트리거되고 교체 후 자동으로 해제됩니다.",
|
||||
"setups_none": "연결되지 않은 소모품 센서를 가진 지원 기기를 찾지 못했습니다.",
|
||||
"setups_adopt": "선택 항목 설정",
|
||||
"setups_done": "센서 연결 작업 {tasks}개가 생성되었습니다.",
|
||||
"complete_parts_used": "이번에 사용한 부품",
|
||||
"part_delete_confirm": "'{name}' 부품을 삭제할까요? 재고 추적, 작업 연결, 진행 중인 구매 알림이 모두 제거됩니다.",
|
||||
"baseline_start_value": "시작 값 (선택)",
|
||||
"baseline_start_help": "이 값부터 계수를 시작합니다. 비워두면 현재 값부터 계수합니다. 마지막 정비 시점의 값을 입력하면 그 이후의 사용량이 바로 반영됩니다.",
|
||||
"setups_baseline_hint": "마지막 정비 시점의 값 (선택)",
|
||||
"baseline_start_help_edit": "비워두면 기존 계수를 유지합니다. 값을 입력하면 계수 기준이 다시 설정됩니다 (예: 마지막 정비 시점의 값).",
|
||||
"baseline_current_effective": "현재 적용 중인 시작 값: {value}",
|
||||
"runtime_on_states": "활성 상태 (쉼표로 구분)",
|
||||
"runtime_on_states_help": "가동 중으로 계산할 상태입니다 — 기본값: on. 예: mowing, cleaning, printing. 속성을 선택한 경우 해당 속성 값과 비교합니다.",
|
||||
"setups_target_new": "새로 만들기: {name}",
|
||||
"schedule_preview_title": "다음 예정일",
|
||||
"schedule_preview_ontime": "제때 완료한다고 가정한 일정입니다.",
|
||||
"schedule_preview_ends": "(시리즈 종료)",
|
||||
"adopt_problem_responsible": "가져온 모든 작업의 담당자 (선택)",
|
||||
"adopt_problem_configure": "구성",
|
||||
"history_auto": "자동",
|
||||
"battery_fleet_title": "배터리 플릿",
|
||||
"battery_fleet_none_low": "모든 배터리 정상 — 교체할 것이 없습니다.",
|
||||
"battery_fleet_buy_now": "지금 구매",
|
||||
"battery_fleet_soon": "곧 필요",
|
||||
"battery_fleet_soon_hint": "마지막 교체일로부터 예측한 값입니다 — 미리 주문해 두세요.",
|
||||
"battery_fleet_mark_all": "모두 교체됨으로 표시",
|
||||
"battery_fleet_mark_one": "이 배터리를 교체됨으로 표시",
|
||||
"battery_fleet_offline": "오프라인",
|
||||
"battery_fleet_trigger_lost": "이 작업의 센서 트리거가 사라졌습니다 — 트리거도 자동 완료도 되지 않습니다.",
|
||||
"battery_fleet_repair": "복구",
|
||||
"battery_fleet_exclude": "플릿에서 제외",
|
||||
"battery_fleet_excluded": "제외됨",
|
||||
"battery_fleet_include": "다시 추적",
|
||||
"battery_fleet_total": "배터리 {n}개 추적 중",
|
||||
"battery_fleet_setup_button": "배터리 플릿",
|
||||
"battery_fleet_setup_done": "배터리 플릿이 설정되었습니다 — 하나의 작업이 모든 배터리를 추적합니다.",
|
||||
"update_banner": "서버에 Maintenance Supporter의 새 버전이 있습니다 — 패널을 업데이트하려면 새로 고침하세요.",
|
||||
"update_reload": "새로 고침"
|
||||
}
|
||||
@@ -0,0 +1,811 @@
|
||||
{
|
||||
"maintenance": "Manutenção",
|
||||
"objects": "Objetos",
|
||||
"tasks": "Tarefas",
|
||||
"overdue": "Atrasada",
|
||||
"due_soon": "Vence em breve",
|
||||
"triggered": "Acionada",
|
||||
"trigger_replaced": "Gatilho substituído",
|
||||
"ok": "OK",
|
||||
"all": "Todas",
|
||||
"new_object": "+ Novo objeto",
|
||||
"templates_from": "A partir de modelo",
|
||||
"templates_title": "Comece com um modelo",
|
||||
"templates_task_count": "{n} tarefas",
|
||||
"template_created": "Criado a partir do modelo",
|
||||
"onboard_hint": "Adicione seu primeiro objeto para começar a acompanhar a manutenção.",
|
||||
"edit": "Editar",
|
||||
"duplicate": "Duplicar",
|
||||
"task_duplicated": "Tarefa duplicada",
|
||||
"object_duplicated": "Objeto duplicado",
|
||||
"delete": "Excluir",
|
||||
"add_task": "+ Adicionar tarefa",
|
||||
"complete": "Concluir",
|
||||
"completed": "Concluída",
|
||||
"skip": "Pular",
|
||||
"skipped": "Pulada",
|
||||
"missed": "Perdida",
|
||||
"reset": "Redefinir",
|
||||
"snooze": "Soneca",
|
||||
"snoozed": "Em soneca",
|
||||
"cancel": "Cancelar",
|
||||
"bulk_select": "Selecionar",
|
||||
"bulk_select_all": "Selecionar tudo",
|
||||
"bulk_n_selected": "{n} selecionadas",
|
||||
"bulk_completed": "{n} tarefas concluídas",
|
||||
"bulk_archived": "{n} tarefas arquivadas",
|
||||
"completing": "Concluindo…",
|
||||
"interval": "Intervalo",
|
||||
"warning": "Aviso",
|
||||
"last_performed": "Última execução",
|
||||
"next_due": "Próximo vencimento",
|
||||
"days_until_due": "Dias até o vencimento",
|
||||
"avg_duration": "Duração média",
|
||||
"trigger": "Gatilho",
|
||||
"trigger_type": "Tipo de gatilho",
|
||||
"threshold_above": "Limite superior",
|
||||
"threshold_below": "Limite inferior",
|
||||
"threshold": "Limite",
|
||||
"counter": "Contador",
|
||||
"state_change": "Mudança de estado",
|
||||
"runtime": "Tempo de operação",
|
||||
"runtime_hours": "Tempo de operação alvo (horas)",
|
||||
"target_value": "Valor alvo",
|
||||
"baseline": "Linha de base",
|
||||
"target_changes": "Mudanças alvo",
|
||||
"for_minutes": "Durante (minutos)",
|
||||
"time_based": "Baseado em tempo",
|
||||
"sensor_based": "Baseado em sensor",
|
||||
"manual": "Manual",
|
||||
"one_time": "Única vez",
|
||||
"weekdays": "Dias da semana",
|
||||
"nth_weekday": "Enésimo dia da semana do mês",
|
||||
"day_of_month": "Dia do mês",
|
||||
"recurrence_on_days": "Repetir em",
|
||||
"recurrence_occurrence": "Ocorrência",
|
||||
"recurrence_weekday": "Dia da semana",
|
||||
"recurrence_day": "Dia do mês (1–31)",
|
||||
"recurrence_last_day": "Último dia do mês",
|
||||
"recurrence_business_day": "Somente dias úteis (antecipar do fim de semana)",
|
||||
"recurrence_offset": "Deslocamento (dias, ±)",
|
||||
"recurrence_offset_help": "Desloque a data em ±N dias, ex.: -2 = dois dias antes.",
|
||||
"last_day_month": "Último dia do mês",
|
||||
"last_business_day_month": "Último dia útil",
|
||||
"ord_1": "1º",
|
||||
"ord_2": "2º",
|
||||
"ord_3": "3º",
|
||||
"ord_4": "4º",
|
||||
"ord_5": "5º",
|
||||
"ord_last": "Último",
|
||||
"day_word": "Dia",
|
||||
"interval_value": "Intervalo",
|
||||
"interval_unit": "Unidade",
|
||||
"unit_days": "Dias",
|
||||
"unit_weeks": "Semanas",
|
||||
"unit_months": "Meses",
|
||||
"unit_years": "Anos",
|
||||
"due_date": "Data de vencimento",
|
||||
"cleaning": "Limpeza",
|
||||
"inspection": "Inspeção",
|
||||
"replacement": "Substituição",
|
||||
"calibration": "Calibração",
|
||||
"service": "Revisão",
|
||||
"reading": "Leitura",
|
||||
"custom": "Personalizado",
|
||||
"history": "Histórico",
|
||||
"cost": "Custo",
|
||||
"report_button": "Relatório",
|
||||
"report_title": "Relatório de manutenção",
|
||||
"report_generated": "Gerado em",
|
||||
"report_times_done": "Concluídas",
|
||||
"report_total_cost": "Custo total",
|
||||
"report_every": "a cada {n} {unit}",
|
||||
"report_notes": "Observações",
|
||||
"report_col_type": "Tipo",
|
||||
"report_col_status": "Status",
|
||||
"report_col_schedule": "Agendamento",
|
||||
"duration": "Duração",
|
||||
"both": "Ambos",
|
||||
"trigger_val": "Valor do gatilho",
|
||||
"complete_title": "Concluir: ",
|
||||
"checklist": "Checklist",
|
||||
"checklist_steps_optional": "Etapas do checklist (opcional)",
|
||||
"checklist_placeholder": "Limpar o filtro\nTrocar a vedação\nTestar a pressão",
|
||||
"checklist_help": "Uma etapa por linha. Máx. 100 itens.",
|
||||
"err_too_long": "{field}: muito longo (máx. {n} caracteres)",
|
||||
"err_too_short": "{field}: muito curto (mín. {n} caracteres)",
|
||||
"err_value_too_high": "{field}: muito grande (máx. {n})",
|
||||
"err_value_too_low": "{field}: muito pequeno (mín. {n})",
|
||||
"err_required": "{field}: obrigatório",
|
||||
"err_wrong_type": "{field}: tipo incorreto (esperado: {type})",
|
||||
"err_invalid_choice": "{field}: valor não permitido",
|
||||
"err_invalid_value": "{field}: valor inválido",
|
||||
"feat_schedule_time": "Agendamento por horário",
|
||||
"feat_schedule_time_desc": "As tarefas ficam atrasadas em um horário específico do dia, em vez de à meia-noite.",
|
||||
"schedule_time_optional": "Vence às (opcional, HH:MM)",
|
||||
"schedule_time_help": "Vazio = meia-noite (padrão). Fuso horário do HA.",
|
||||
"at_time": "às",
|
||||
"notes_optional": "Observações (opcional)",
|
||||
"cost_optional": "Custo (opcional)",
|
||||
"duration_minutes": "Duração em minutos (opcional)",
|
||||
"days": "dias",
|
||||
"day": "dia",
|
||||
"today": "Hoje",
|
||||
"d_overdue": "d de atraso",
|
||||
"no_tasks": "Ainda não há tarefas de manutenção. Crie um objeto para começar.",
|
||||
"no_tasks_short": "Sem tarefas",
|
||||
"no_history": "Ainda não há entradas no histórico.",
|
||||
"show_all": "Mostrar tudo",
|
||||
"cost_duration_chart": "Custo e duração",
|
||||
"installed": "Instalado",
|
||||
"confirm_delete_object": "Excluir este objeto e todas as suas tarefas?",
|
||||
"confirm_delete_task": "Excluir esta tarefa?",
|
||||
"min": "Mín",
|
||||
"max": "Máx",
|
||||
"save": "Salvar",
|
||||
"saving": "Salvando…",
|
||||
"edit_task": "Editar tarefa",
|
||||
"new_task": "Nova tarefa de manutenção",
|
||||
"task_name": "Nome da tarefa",
|
||||
"maintenance_type": "Tipo de manutenção",
|
||||
"priority": "Prioridade",
|
||||
"labels": "Etiquetas",
|
||||
"labels_placeholder": "ex.: segurança, sazonal, visível ao inquilino",
|
||||
"labels_help": "Tags separadas por vírgula para filtragem e relatórios.",
|
||||
"priority_low": "Baixa",
|
||||
"priority_normal": "Normal",
|
||||
"priority_high": "Alta",
|
||||
"schedule_type": "Tipo de agendamento",
|
||||
"interval_days": "Intervalo (dias)",
|
||||
"warning_days": "Dias de aviso",
|
||||
"earliest_completion_days": "Conclusão antecipada (dias antes do vencimento)",
|
||||
"earliest_completion_days_help": "Deixe vazio para permitir concluir a qualquer momento. 0 = somente no dia do vencimento ou depois.",
|
||||
"last_performed_optional": "Última execução (opcional)",
|
||||
"interval_anchor": "Âncora do intervalo",
|
||||
"anchor_completion": "A partir da data de conclusão",
|
||||
"anchor_planned": "A partir da data planejada (sem deriva)",
|
||||
"edit_object": "Editar objeto",
|
||||
"name": "Nome",
|
||||
"manufacturer_optional": "Fabricante (opcional)",
|
||||
"model_optional": "Modelo (opcional)",
|
||||
"serial_number_optional": "Número de série (opcional)",
|
||||
"serial_number_label": "N/S",
|
||||
"documentation_url_label": "Manual",
|
||||
"object_notes_label": "Observações",
|
||||
"sort_due_date": "Data de vencimento",
|
||||
"sort_object": "Nome do objeto",
|
||||
"sort_type": "Tipo",
|
||||
"sort_task_name": "Nome da tarefa",
|
||||
"all_objects": "Todos os objetos",
|
||||
"tasks_lower": "tarefas",
|
||||
"no_tasks_yet": "Ainda sem tarefas",
|
||||
"add_first_task": "Adicionar a primeira tarefa",
|
||||
"trigger_configuration": "Configuração do gatilho",
|
||||
"entity_id": "ID da entidade",
|
||||
"comma_separated": "separado por vírgulas",
|
||||
"entity_logic": "Lógica das entidades",
|
||||
"entity_logic_any": "Qualquer entidade aciona",
|
||||
"entity_logic_all": "Todas as entidades devem acionar",
|
||||
"entities": "entidades",
|
||||
"attribute_optional": "Atributo (opcional, vazio = estado)",
|
||||
"use_entity_state": "Usar o estado da entidade (sem atributo)",
|
||||
"trigger_above": "Acionar acima de",
|
||||
"trigger_below": "Acionar abaixo de",
|
||||
"for_at_least_minutes": "Por pelo menos (minutos)",
|
||||
"safety_interval_days": "Intervalo de segurança (dias, opcional)",
|
||||
"safety_interval": "Intervalo de segurança (opcional)",
|
||||
"delta_mode": "Modo delta",
|
||||
"from_state_optional": "Do estado (opcional)",
|
||||
"to_state_optional": "Para o estado (opcional)",
|
||||
"documentation_url_optional": "URL da documentação (opcional)",
|
||||
"object_notes_optional": "Observações (opcional)",
|
||||
"nfc_tag_id_optional": "ID da tag NFC (opcional)",
|
||||
"nfc_tags_empty_help": "Ainda não há tags NFC registradas no Home Assistant.",
|
||||
"nfc_tags_open_settings": "Abrir configurações de tags",
|
||||
"nfc_tags_refresh": "Atualizar",
|
||||
"environmental_entity_optional": "Sensor ambiental (opcional)",
|
||||
"environmental_entity_helper": "ex.: sensor.outdoor_temperature — ajusta o intervalo com base nas condições ambientais",
|
||||
"environmental_attribute_optional": "Atributo ambiental (opcional)",
|
||||
"nfc_tag_id": "ID da tag NFC",
|
||||
"nfc_linked": "Tag NFC vinculada",
|
||||
"nfc_link_hint": "Clique para vincular uma tag NFC",
|
||||
"responsible_user": "Usuário responsável",
|
||||
"shared_with": "Compartilhada com (rodízio)",
|
||||
"shared_with_help": "Escolha várias pessoas para compartilhar esta tarefa; o responsável muda em rodízio a cada conclusão.",
|
||||
"rotation_strategy": "Rodízio",
|
||||
"rotation_none": "Sem rodízio",
|
||||
"rotation_round_robin": "Revezamento",
|
||||
"rotation_least_completed": "Quem concluiu menos",
|
||||
"rotation_random": "Aleatório",
|
||||
"no_user_assigned": "(Nenhum usuário atribuído)",
|
||||
"all_users": "Todos os usuários",
|
||||
"my_tasks": "Minhas tarefas",
|
||||
"tab_calendar": "Calendário",
|
||||
"cal_no_events": "Sem manutenção",
|
||||
"cal_window_7": "7 dias",
|
||||
"cal_window_14": "14 dias",
|
||||
"cal_window_30": "30 dias",
|
||||
"cal_window_365": "1 ano",
|
||||
"cal_every_n_days": "a cada {n} dias",
|
||||
"cal_source_time": "Baseado em tempo",
|
||||
"cal_source_time_adaptive": "Baseado em tempo (adaptativo)",
|
||||
"cal_source_sensor": "Baseado em sensor",
|
||||
"cal_predicted": "previsto",
|
||||
"cal_confidence_high": "confiança alta",
|
||||
"cal_confidence_medium": "confiança média",
|
||||
"cal_confidence_low": "confiança baixa",
|
||||
"budget_monthly": "Orçamento mensal",
|
||||
"budget_yearly": "Orçamento anual",
|
||||
"groups": "Grupos",
|
||||
"new_group": "Novo grupo",
|
||||
"edit_group": "Editar grupo",
|
||||
"no_groups": "Ainda sem grupos",
|
||||
"delete_group": "Excluir grupo",
|
||||
"delete_group_confirm": "Excluir o grupo '{name}'?",
|
||||
"group_select_tasks": "Selecionar tarefas",
|
||||
"group_name_required": "O nome é obrigatório",
|
||||
"description_optional": "Descrição (opcional)",
|
||||
"selected": "Selecionadas",
|
||||
"loading_chart": "Carregando dados do gráfico...",
|
||||
"hide_outliers": "Ocultar valores atípicos (falhas do sensor)",
|
||||
"was_maintenance_needed": "Esta manutenção era necessária?",
|
||||
"feedback_needed": "Necessária",
|
||||
"feedback_not_needed": "Desnecessária",
|
||||
"feedback_not_sure": "Não sei",
|
||||
"suggested_interval": "Intervalo sugerido",
|
||||
"apply_suggestion": "Aplicar",
|
||||
"reanalyze": "Reanalisar",
|
||||
"reanalyze_result": "Nova análise",
|
||||
"reanalyze_insufficient_data": "Dados insuficientes para gerar uma recomendação",
|
||||
"data_points": "pontos de dados",
|
||||
"dismiss_suggestion": "Dispensar",
|
||||
"confidence_low": "Baixa",
|
||||
"confidence_medium": "Média",
|
||||
"confidence_high": "Alta",
|
||||
"recommended": "recomendado",
|
||||
"seasonal_awareness": "Sazonalidade",
|
||||
"edit_seasonal_overrides": "Editar fatores sazonais",
|
||||
"seasonal_overrides_title": "Fatores sazonais (manual)",
|
||||
"seasonal_overrides_hint": "Fator por mês (0,1–5,0). Vazio = aprendido automaticamente.",
|
||||
"seasonal_override_invalid": "Valor inválido",
|
||||
"seasonal_override_range": "O fator deve estar entre 0,1 e 5,0",
|
||||
"clear_all": "Limpar tudo",
|
||||
"seasonal_chart_title": "Fatores sazonais",
|
||||
"seasonal_learned": "Aprendido",
|
||||
"seasonal_manual": "Manual",
|
||||
"month_jan": "Jan",
|
||||
"month_feb": "Fev",
|
||||
"month_mar": "Mar",
|
||||
"month_apr": "Abr",
|
||||
"month_may": "Mai",
|
||||
"month_jun": "Jun",
|
||||
"month_jul": "Jul",
|
||||
"month_aug": "Ago",
|
||||
"month_sep": "Set",
|
||||
"month_oct": "Out",
|
||||
"month_nov": "Nov",
|
||||
"month_dec": "Dez",
|
||||
"sensor_prediction": "Previsão do sensor",
|
||||
"degradation_trend": "Tendência",
|
||||
"trend_rising": "Subindo",
|
||||
"trend_falling": "Caindo",
|
||||
"trend_stable": "Estável",
|
||||
"trend_insufficient_data": "Dados insuficientes",
|
||||
"days_until_threshold": "Dias até o limite",
|
||||
"threshold_exceeded": "Limite excedido",
|
||||
"environmental_adjustment": "Fator ambiental",
|
||||
"sensor_prediction_urgency": "O sensor prevê atingir o limite em ~{days} dias",
|
||||
"day_short": "dia",
|
||||
"weibull_reliability_curve": "Curva de confiabilidade",
|
||||
"weibull_failure_probability": "Probabilidade de falha",
|
||||
"weibull_r_squared": "R² do ajuste",
|
||||
"beta_early_failures": "Falhas precoces",
|
||||
"beta_random_failures": "Falhas aleatórias",
|
||||
"beta_wear_out": "Desgaste",
|
||||
"beta_highly_predictable": "Altamente previsível",
|
||||
"confidence_interval": "Intervalo de confiança",
|
||||
"confidence_conservative": "Conservador",
|
||||
"confidence_aggressive": "Otimista",
|
||||
"current_interval_marker": "Intervalo atual",
|
||||
"recommended_marker": "Recomendado",
|
||||
"characteristic_life": "Vida característica",
|
||||
"chart_mini_sparkline": "Minigráfico de tendência",
|
||||
"chart_history": "Histórico de custo e duração",
|
||||
"chart_seasonal": "Fatores sazonais, 12 meses",
|
||||
"chart_weibull": "Curva de confiabilidade Weibull",
|
||||
"chart_sparkline": "Gráfico do valor do gatilho do sensor",
|
||||
"days_progress": "Progresso em dias",
|
||||
"qr_code": "Código QR",
|
||||
"qr_generating": "Gerando código QR…",
|
||||
"qr_error": "Falha ao gerar o código QR.",
|
||||
"qr_error_no_url": "Nenhuma URL do HA configurada. Defina uma URL externa ou interna em Configurações → Sistema → Rede.",
|
||||
"save_error": "Falha ao salvar. Tente novamente.",
|
||||
"qr_print": "Imprimir",
|
||||
"qr_download": "Baixar SVG",
|
||||
"qr_action": "Ação ao escanear",
|
||||
"qr_action_view": "Ver informações de manutenção",
|
||||
"qr_action_complete": "Marcar a manutenção como concluída",
|
||||
"qr_url_mode": "Tipo de link",
|
||||
"qr_mode_companion": "Companion App",
|
||||
"qr_mode_local": "Local (mDNS)",
|
||||
"qr_mode_server": "URL do servidor",
|
||||
"overview": "Visão geral",
|
||||
"analysis": "Análise",
|
||||
"recent_activities": "Atividades recentes",
|
||||
"search_notes": "Pesquisar observações",
|
||||
"avg_cost": "Custo médio",
|
||||
"no_advanced_features": "Nenhum recurso avançado ativado",
|
||||
"no_advanced_features_hint": "Ative “Intervalos adaptativos” ou “Padrões sazonais” nas configurações da integração para ver dados de análise aqui.",
|
||||
"analysis_not_enough_data": "Ainda não há dados suficientes para análise.",
|
||||
"analysis_not_enough_data_hint": "A análise de Weibull exige pelo menos 5 manutenções concluídas; padrões sazonais aparecem após 6+ pontos de dados por mês.",
|
||||
"analysis_manual_task_hint": "Tarefas manuais sem intervalo não geram dados de análise.",
|
||||
"completions": "conclusões",
|
||||
"current": "Atual",
|
||||
"shorter": "Mais curto",
|
||||
"longer": "Mais longo",
|
||||
"normal": "Normal",
|
||||
"disabled": "Desativado",
|
||||
"compound_logic": "Lógica composta",
|
||||
"compound": "Composto (várias condições)",
|
||||
"compound_logic_and": "E — todas as condições devem acionar",
|
||||
"compound_logic_or": "OU — qualquer condição aciona",
|
||||
"compound_help": "Combine várias condições de sensor em um único gatilho.",
|
||||
"compound_no_conditions": "Ainda sem condições — adicione pelo menos uma.",
|
||||
"compound_add_condition": "Adicionar condição",
|
||||
"compound_condition": "Condição",
|
||||
"compound_remove_condition": "Remover condição",
|
||||
"card_title": "Título",
|
||||
"card_show_header": "Mostrar cabeçalho com estatísticas",
|
||||
"card_show_actions": "Mostrar botões de ação",
|
||||
"card_compact": "Modo compacto",
|
||||
"card_max_items": "Máx. de itens (0 = todos)",
|
||||
"card_filter_status": "Filtrar por status",
|
||||
"card_filter_status_help": "Vazio = mostrar todos os status.",
|
||||
"card_filter_objects": "Filtrar por objetos",
|
||||
"card_filter_objects_help": "Vazio = mostrar todos os objetos.",
|
||||
"card_filter_entities": "Filtrar por entidades (entity_ids)",
|
||||
"card_filter_entities_help": "Escolha entidades sensor / binary_sensor desta integração. Vazio = todas.",
|
||||
"card_loading_objects": "Carregando objetos…",
|
||||
"card_load_error": "Não foi possível carregar os objetos — verifique a conexão WebSocket.",
|
||||
"card_no_tasks_title": "Ainda não há tarefas de manutenção",
|
||||
"card_no_tasks_cta": "→ Crie uma no painel de Manutenção",
|
||||
"no_objects": "Ainda não há objetos.",
|
||||
"action_error": "A ação falhou. Tente novamente.",
|
||||
"area_id_optional": "Área (opcional)",
|
||||
"installation_date_optional": "Data de instalação (opcional)",
|
||||
"warranty_expiry_optional": "Fim da garantia (opcional)",
|
||||
"warranty": "Garantia",
|
||||
"warranty_valid_until": "válida até {date}",
|
||||
"warranty_expires_in": "expira em {days} dias",
|
||||
"warranty_expired": "expirada",
|
||||
"cal_past_windows": "Janelas passadas",
|
||||
"cal_forward_windows": "Janelas futuras",
|
||||
"history_edit_title": "Editar entrada do histórico",
|
||||
"history_edit_timestamp": "Data e hora",
|
||||
"manufacturer": "Fabricante",
|
||||
"model": "Modelo",
|
||||
"area": "Área",
|
||||
"actions": "Ações",
|
||||
"view_mode_label": "Visualização",
|
||||
"view_cards": "Cartões",
|
||||
"view_table": "Tabela",
|
||||
"objects_table_columns_label": "Colunas da tabela de objetos",
|
||||
"objects_table_columns_hint": "Escolha quais colunas aparecem na visualização em tabela dos objetos.",
|
||||
"custom_icon_optional": "Ícone (opcional, ex.: mdi:wrench)",
|
||||
"task_enabled": "Tarefa ativada",
|
||||
"skip_reason_prompt": "Pular esta tarefa?",
|
||||
"reason_optional": "Motivo (opcional)",
|
||||
"reset_date_prompt": "Marcar a tarefa como realizada?",
|
||||
"reset_date_optional": "Data da última execução (opcional, padrão: hoje)",
|
||||
"notes_label": "Observações",
|
||||
"documentation_label": "Documentação",
|
||||
"no_nfc_tag": "— Sem tag —",
|
||||
"dashboard": "Painel",
|
||||
"tab_today": "Hoje",
|
||||
"palette_placeholder": "Pesquisar objetos e tarefas…",
|
||||
"palette_no_results": "Nenhum resultado",
|
||||
"palette_hint": "↑↓ para navegar · Enter para abrir · Esc para fechar",
|
||||
"today_all_caught_up": "Tudo em dia! Nada vence esta semana.",
|
||||
"today_overdue": "Atrasadas",
|
||||
"today_due_today": "Vencem hoje",
|
||||
"today_this_week": "Esta semana",
|
||||
"settings": "Configurações",
|
||||
"settings_features": "Recursos avançados",
|
||||
"settings_features_desc": "Ative ou desative recursos avançados. Desativar apenas os oculta da interface, sem excluir dados.",
|
||||
"feat_adaptive": "Agendamento adaptativo",
|
||||
"feat_adaptive_desc": "Aprende intervalos ideais a partir do histórico de manutenção",
|
||||
"feat_predictions": "Previsões de sensor",
|
||||
"feat_predictions_desc": "Prevê datas de acionamento a partir da degradação do sensor",
|
||||
"feat_seasonal": "Ajustes sazonais",
|
||||
"feat_seasonal_desc": "Ajusta intervalos com base em padrões sazonais",
|
||||
"feat_environmental": "Correlação ambiental",
|
||||
"feat_environmental_desc": "Correlaciona intervalos com temperatura/umidade",
|
||||
"feat_budget": "Controle de orçamento",
|
||||
"feat_budget_desc": "Acompanha gastos mensais e anuais de manutenção",
|
||||
"feat_groups": "Grupos de tarefas",
|
||||
"feat_groups_desc": "Organiza tarefas em grupos lógicos",
|
||||
"feat_checklists": "Checklists",
|
||||
"feat_checklists_desc": "Procedimentos em várias etapas para concluir tarefas",
|
||||
"settings_general": "Geral",
|
||||
"settings_default_warning": "Dias de aviso padrão",
|
||||
"settings_panel_enabled": "Painel na barra lateral",
|
||||
"settings_panel_title": "Título do painel na barra lateral",
|
||||
"settings_notifications": "Notificações",
|
||||
"settings_notify_service": "Serviço de notificação",
|
||||
"test_notification": "Notificação de teste",
|
||||
"send_test": "Enviar teste",
|
||||
"testing": "Enviando…",
|
||||
"test_notification_success": "Notificação de teste enviada",
|
||||
"test_notification_failed": "Falha na notificação de teste",
|
||||
"settings_notify_due_soon": "Notificar quando vencer em breve",
|
||||
"settings_notify_overdue": "Notificar quando atrasada",
|
||||
"settings_notify_triggered": "Notificar quando acionada",
|
||||
"settings_interval_hours": "Intervalo de repetição (horas, 0 = uma vez)",
|
||||
"settings_quiet_hours": "Horário de silêncio",
|
||||
"settings_quiet_start": "Início",
|
||||
"settings_quiet_end": "Fim",
|
||||
"settings_max_per_day": "Máx. de notificações por dia (0 = ilimitado)",
|
||||
"settings_bundling": "Agrupar notificações",
|
||||
"settings_bundle_threshold": "Limite para agrupar",
|
||||
"settings_reminder_leads": "Lembretes extras (dias antes do vencimento)",
|
||||
"settings_reminder_leads_hint": "Antecedências separadas por vírgula, ex.: 14, 3, 0 — um lembrete extra é enviado em cada dia correspondente. Vazio = desativado.",
|
||||
"settings_actions": "Botões de ação no celular",
|
||||
"settings_action_complete": "Mostrar botão 'Concluir'",
|
||||
"settings_action_skip": "Mostrar botão 'Pular'",
|
||||
"settings_action_snooze": "Mostrar botão 'Soneca'",
|
||||
"settings_weekly_digest": "Resumo semanal",
|
||||
"settings_weekly_digest_hint": "Uma única notificação de resumo na segunda-feira de manhã quando houver tarefas vencendo.",
|
||||
"settings_warranty_reminder": "Lembrete de fim de garantia",
|
||||
"settings_warranty_reminder_days": "Dias antes do vencimento",
|
||||
"settings_warranty_reminder_hint": "Notifica uma vez quando faltar este número de dias para a garantia de um objeto expirar.",
|
||||
"settings_snooze_hours": "Duração da soneca (horas)",
|
||||
"settings_budget": "Orçamento",
|
||||
"settings_currency": "Moeda",
|
||||
"settings_budget_monthly": "Orçamento mensal",
|
||||
"settings_budget_yearly": "Orçamento anual",
|
||||
"settings_budget_alerts": "Alertas de orçamento",
|
||||
"settings_budget_threshold": "Limite de alerta (%)",
|
||||
"settings_import_export": "Importar / Exportar",
|
||||
"settings_export_json": "Exportar JSON",
|
||||
"settings_export_yaml": "Exportar YAML",
|
||||
"settings_export_csv": "Exportar CSV",
|
||||
"settings_import_csv": "Importar CSV",
|
||||
"settings_import_placeholder": "Cole o conteúdo JSON ou CSV aqui…",
|
||||
"settings_import_btn": "Importar",
|
||||
"settings_import_success": "{count} objetos importados com sucesso.",
|
||||
"settings_export_success": "Exportação baixada.",
|
||||
"settings_saved": "Configuração salva.",
|
||||
"settings_include_history": "Incluir histórico",
|
||||
"settings_export_selection": "Limitar aos objetos selecionados (opcional)",
|
||||
"settings_docs_archive": "Arquivo de documentos (com arquivos)",
|
||||
"settings_docs_archive_hint": "As exportações JSON/YAML/CSV levam apenas as configurações. Este ZIP inclui o conteúdo dos arquivos enviados para que a restauração seja completa.",
|
||||
"settings_docs_export_btn": "Baixar ZIP de documentos",
|
||||
"settings_docs_import_btn": "Restaurar ZIP de documentos",
|
||||
"settings_docs_import_success": "Restaurados: {blobs} arquivos, {docs} documentos",
|
||||
"sort_alphabetical": "Alfabética",
|
||||
"sort_due_soonest": "Vencimento mais próximo",
|
||||
"sort_task_count": "Número de tarefas",
|
||||
"sort_area": "Área",
|
||||
"sort_assigned_user": "Usuário atribuído",
|
||||
"sort_group": "Grupo",
|
||||
"groupby_none": "Sem agrupamento",
|
||||
"groupby_area": "Por área",
|
||||
"groupby_group": "Por grupo",
|
||||
"groupby_user": "Por usuário",
|
||||
"filter_label": "Filtro",
|
||||
"user_label": "Usuário",
|
||||
"sort_label": "Ordenar",
|
||||
"group_by_label": "Agrupar por",
|
||||
"state_value_help": "Use o valor de estado do HA (geralmente minúsculo, ex.: \"on\"/\"off\"). Maiúsculas e minúsculas são normalizadas ao salvar.",
|
||||
"target_changes_help": "Número de transições correspondentes antes de o gatilho disparar (padrão: 1).",
|
||||
"qr_print_title": "Imprimir códigos QR",
|
||||
"qr_print_desc": "Gere uma página imprimível de códigos QR para recortar e colar nos seus equipamentos.",
|
||||
"qr_print_load": "Carregar objetos",
|
||||
"qr_print_filter": "Filtro",
|
||||
"qr_print_objects": "Objetos",
|
||||
"qr_print_actions": "Ações",
|
||||
"qr_print_url_mode": "Tipo de link",
|
||||
"qr_print_estimate": "Códigos QR estimados",
|
||||
"qr_print_over_limit": "o limite é 200, restrinja o filtro",
|
||||
"qr_print_generate": "Gerar códigos QR",
|
||||
"qr_print_generating": "Gerando…",
|
||||
"qr_print_ready": "Códigos QR prontos",
|
||||
"qr_print_print_button": "Imprimir",
|
||||
"qr_print_empty": "Nada para gerar",
|
||||
"qr_action_skip": "Pular",
|
||||
"vacation_title": "Modo férias",
|
||||
"vacation_active": "ativo",
|
||||
"vacation_ended": "encerrado",
|
||||
"vacation_desc": "Planeje as férias: as notificações ficam pausadas durante o período mais uma margem de dias. Você pode reativar tarefas específicas.",
|
||||
"vacation_enable": "Ativar modo férias",
|
||||
"vacation_start": "Início",
|
||||
"vacation_end": "Fim",
|
||||
"vacation_buffer": "Margem (dias)",
|
||||
"vacation_exempt_title": "Notificar mesmo assim durante as férias",
|
||||
"vacation_exempt_desc": "Escolha tarefas que ainda devem notificar durante as férias (ex.: química crítica da piscina).",
|
||||
"vacation_load_tasks": "Carregar tarefas",
|
||||
"vacation_preview_btn": "Mostrar prévia",
|
||||
"vacation_preview_affected": "tarefas afetadas",
|
||||
"vacation_event_due_soon": "passa a vencer em breve",
|
||||
"vacation_event_overdue": "fica atrasada",
|
||||
"vacation_event_triggered_est": "possível acionamento por sensor",
|
||||
"vacation_sensor_based": "(baseado em sensor)",
|
||||
"vacation_action_notify": "Notificar mesmo assim",
|
||||
"vacation_action_unsilence": "Silenciar novamente",
|
||||
"vacation_marked_complete": "Marcada como concluída",
|
||||
"vacation_marked_skip": "Pulada",
|
||||
"vacation_end_now": "Encerrar as férias agora",
|
||||
"add": "Adicionar",
|
||||
"show_stats": "Mostrar estatísticas + gráficos",
|
||||
"hide_stats": "Ocultar estatísticas",
|
||||
"adaptive_no_data": "Ainda não há histórico de conclusões suficiente para a análise adaptativa. Conclua esta tarefa mais algumas vezes para desbloquear recomendações de intervalo e gráficos de confiabilidade.",
|
||||
"suggestion_applied": "Intervalo sugerido aplicado",
|
||||
"vacation_mode": "Modo férias",
|
||||
"vacation_status_active": "Ativo agora",
|
||||
"vacation_status_scheduled": "Agendado",
|
||||
"vacation_status_inactive": "Inativo",
|
||||
"vacation_end_now_confirm": "Encerrar as férias imediatamente?",
|
||||
"vacation_exempt_count": "isentas",
|
||||
"vacation_advanced": "Avançado…",
|
||||
"vacation_open_panel": "Abrir no painel",
|
||||
"enable": "Ativar",
|
||||
"saved": "Salvo",
|
||||
"budget_monthly_set": "Definir mensal",
|
||||
"budget_yearly_set": "Definir anual",
|
||||
"budget_advanced": "Moeda, alertas…",
|
||||
"budget_open_panel": "Abrir no painel",
|
||||
"groups_empty": "Ainda sem grupos.",
|
||||
"group_new_placeholder": "Adicionar grupo…",
|
||||
"group_delete_confirm": "Excluir o grupo \"{name}\"?",
|
||||
"groups_manage_tasks": "Gerenciar atribuições de tarefas…",
|
||||
"groups_open_panel": "Abrir no painel",
|
||||
"unassigned": "Sem atribuição",
|
||||
"no_area": "Sem área",
|
||||
"has_overdue": "Tem tarefas atrasadas",
|
||||
"object": "Objeto",
|
||||
"settings_panel_access": "Acesso ao painel",
|
||||
"settings_panel_access_desc": "Administradores sempre têm acesso total. Para delegar criação, edição e exclusão a não administradores específicos, ative esta opção e selecione-os abaixo — os demais veem apenas Concluir e Pular.",
|
||||
"settings_operator_write": "Permitir que os usuários selecionados criem, editem e excluam",
|
||||
"settings_operator_write_desc": "Desligado: apenas administradores podem alterar o conteúdo. Ligado: os usuários selecionados abaixo também recebem acesso total.",
|
||||
"no_non_admin_users": "Nenhum usuário não administrador encontrado. Adicione em Configurações → Pessoas.",
|
||||
"owner_label": "Proprietário",
|
||||
"feat_completion_actions": "Ações de conclusão",
|
||||
"feat_completion_actions_desc": "Ação do HA por tarefa ao concluir + QR de conclusão rápida com valores predefinidos.",
|
||||
"on_complete_action_title": "Ao concluir: acionar ação do HA (opcional)",
|
||||
"on_complete_action_desc": "Chama um serviço do HA quando a tarefa é concluída — ex.: zerar um contador no dispositivo.",
|
||||
"on_complete_action_service": "Serviço",
|
||||
"on_complete_action_target": "Entidade alvo",
|
||||
"on_complete_action_target_hint": "Atenção: o domínio da entidade deve corresponder ao serviço — ex.: 'button.press' só funciona em button.*, 'counter.increment' só em counter.*, 'input_button.press' só em input_button.* etc. Em caso de divergência, a ação falhará silenciosamente (o HA registra 'Referenced entities ... missing or not currently available').",
|
||||
"on_complete_action_data": "Dados (JSON, opcional)",
|
||||
"on_complete_action_test": "Validar configuração",
|
||||
"on_complete_action_test_success": "✓ Configuração válida (a ação só disparará na conclusão da tarefa)",
|
||||
"on_complete_action_test_failed": "Falhou",
|
||||
"quick_complete_defaults_title": "Padrões de conclusão rápida (para leituras de QR, opcional)",
|
||||
"quick_complete_defaults_desc": "Valores predefinidos para conclusões rápidas via QR. Sem eles, o QR abre o diálogo de conclusão.",
|
||||
"quick_complete_defaults_notes": "Observações",
|
||||
"quick_complete_defaults_cost": "Custo",
|
||||
"quick_complete_defaults_duration": "Duração (minutos)",
|
||||
"quick_complete_defaults_feedback_none": "Sem feedback",
|
||||
"quick_complete_defaults_feedback_needed": "Era necessária",
|
||||
"quick_complete_defaults_feedback_not_needed": "Não era necessária",
|
||||
"quick_complete_success": "Concluída rapidamente",
|
||||
"show_all_objects": "Mostrar todos os objetos",
|
||||
"show_all_tasks": "Limpar filtro — mostrar todas as tarefas",
|
||||
"filter_to_overdue": "Filtrar a lista de tarefas para apenas atrasadas",
|
||||
"filter_to_due_soon": "Filtrar a lista de tarefas para apenas vencendo em breve",
|
||||
"filter_to_triggered": "Filtrar a lista de tarefas para apenas acionadas",
|
||||
"open_task": "Abrir tarefa",
|
||||
"show_details": "Mostrar histórico + estatísticas",
|
||||
"hide_details": "Ocultar detalhes",
|
||||
"history_empty": "Ainda sem histórico.",
|
||||
"history_edit_button": "Editar entrada",
|
||||
"total_cost": "Custo total",
|
||||
"times_performed": "Realizada",
|
||||
"older_entries": "mais antigas",
|
||||
"open_in_panel": "Abrir no painel de Manutenção",
|
||||
"skip_reason": "Motivo para pular (opcional)",
|
||||
"reset_to_date": "Redefinir última execução para",
|
||||
"delete_task_confirm": "Excluir esta tarefa e seu histórico?",
|
||||
"delete_object_confirm": "Excluir este objeto e todas as suas tarefas?",
|
||||
"loading": "Carregando…",
|
||||
"archive": "Arquivar",
|
||||
"undo": "Desfazer",
|
||||
"task_archived": "Tarefa arquivada",
|
||||
"object_archived": "Objeto arquivado",
|
||||
"unarchive": "Desarquivar",
|
||||
"archived": "Arquivada",
|
||||
"show_archived": "Mostrar arquivados",
|
||||
"hide_archived": "Ocultar arquivados",
|
||||
"confirm_archive_object": "Arquivar este objeto e suas tarefas? Eles mantêm o histórico e podem ser desarquivados depois.",
|
||||
"settings_archive": "Arquivamento e retenção",
|
||||
"settings_archive_desc": "Aposente tarefas únicas concluídas sem excluí-las. Itens arquivados ficam ocultos e inativos, mas mantêm o histórico e o custo.",
|
||||
"settings_archive_oneoff_days": "Arquivar automaticamente tarefas únicas concluídas após (dias, 0 = desativado)",
|
||||
"settings_delete_archived_oneoff_days": "Excluir automaticamente tarefas únicas arquivadas após (dias, 0 = nunca)",
|
||||
"archive_object": "Arquivar objeto",
|
||||
"unarchive_object": "Desarquivar objeto",
|
||||
"documents": "Documentos",
|
||||
"documents_empty": "Ainda não há documentos.",
|
||||
"doc_upload": "Enviar arquivo",
|
||||
"doc_uploading": "Enviando…",
|
||||
"doc_add_link": "Adicionar link",
|
||||
"doc_link_url": "URL (https://…)",
|
||||
"doc_link_title": "Título (opcional)",
|
||||
"doc_open": "Abrir",
|
||||
"doc_delete_confirm": "Excluir \"{name}\"?",
|
||||
"doc_too_large": "O arquivo é muito grande (máx. 25 MB).",
|
||||
"doc_upload_failed": "Falha no envio.",
|
||||
"completion_photo_optional": "Foto da conclusão (opcional)",
|
||||
"add_photo": "Adicionar foto",
|
||||
"uploading": "Enviando…",
|
||||
"remove": "Remover",
|
||||
"doc_deduped": "Já armazenado em outro lugar — compartilhado, sem uso de espaço extra.",
|
||||
"doc_dup_in_object": "Este arquivo já está anexado a este objeto.",
|
||||
"doc_link_invalid": "Apenas links http/https são permitidos.",
|
||||
"doc_cat_manual": "Manual",
|
||||
"doc_cat_warranty": "Garantia",
|
||||
"doc_cat_invoice": "Nota fiscal",
|
||||
"doc_cat_spare_parts": "Peças de reposição",
|
||||
"doc_cat_photo": "Foto",
|
||||
"doc_cat_other": "Outros",
|
||||
"doc_link_badge": "Link",
|
||||
"doc_storage_title": "Armazenamento de documentos",
|
||||
"doc_storage_saved": "Economizado por deduplicação",
|
||||
"doc_storage_refresh": "Atualizar",
|
||||
"doc_download": "Baixar",
|
||||
"doc_close": "Fechar",
|
||||
"doc_camera": "Tirar foto",
|
||||
"doc_drop_hint": "Solte os arquivos aqui",
|
||||
"doc_task_none": "Nenhum documento vinculado a esta tarefa.",
|
||||
"doc_link_existing": "Vincular um documento…",
|
||||
"doc_attach": "Vincular",
|
||||
"doc_unlink": "Desvincular",
|
||||
"doc_page": "Página",
|
||||
"chart_range_7d": "7d",
|
||||
"chart_range_30d": "30d",
|
||||
"chart_range_90d": "90d",
|
||||
"chart_range_1y": "1a",
|
||||
"chart_since_service": "desde a última manutenção",
|
||||
"chart_no_stats": "Sem estatísticas de longo prazo para esta entidade — mostrando apenas valores de eventos de manutenção",
|
||||
"auto_complete_on_recovery": "Concluir automaticamente quando o sensor se recuperar",
|
||||
"auto_complete_on_recovery_help": "Registra uma conclusão (define a última execução) quando o gatilho se resolve sozinho — ex.: sal reposto, filtro trocado.",
|
||||
"doc_search": "Pesquisar documentos…",
|
||||
"doc_search_none": "Nenhum documento correspondente",
|
||||
"link_device_optional": "Vincular a um dispositivo existente (opcional)",
|
||||
"parent_object_optional": "Objeto pai (opcional)",
|
||||
"parent_none": "(Sem pai)",
|
||||
"paused": "Pausado",
|
||||
"pause_object": "Pausar",
|
||||
"resume_object": "Retomar",
|
||||
"pause_until_prompt": "Congele os agendamentos deste objeto — nada vence e nada notifica até que ele seja retomado. Opcionalmente, defina uma data de retomada automática.",
|
||||
"pause_until_label": "Retomar em (opcional)",
|
||||
"object_paused": "Objeto pausado",
|
||||
"object_resumed": "Objeto retomado — agendamentos reiniciados",
|
||||
"object_paused_badge": "Pausado",
|
||||
"paused_until_label": "até",
|
||||
"replace_object": "Substituir…",
|
||||
"replace_object_prompt": "Aposente este objeto e crie um sucessor. O histórico e os custos ficam arquivados no antigo; as tarefas e os documentos passam para o novo, e os contadores recomeçam do zero.",
|
||||
"replace_name_label": "Nome do sucessor",
|
||||
"object_replaced": "Objeto substituído — sucessor criado",
|
||||
"reading_unit_label": "Unidade da leitura (ex.: kWh, m³)",
|
||||
"reading_unit_help": "Exibida ao lado do valor registrado ao concluir esta tarefa.",
|
||||
"reading_value_label": "Valor da leitura",
|
||||
"reading_label": "Leitura",
|
||||
"settings_templates_label": "Galeria de modelos",
|
||||
"settings_templates_hint": "Desmarque os modelos de que você nunca precisará — eles somem dos seletores \"A partir de modelo\" (painel e fluxo de configuração). Nada mais muda; você pode reativá-los a qualquer momento.",
|
||||
"worksheet": "Folha de trabalho",
|
||||
"worksheet_scan_view": "Escaneie para abrir a tarefa",
|
||||
"worksheet_scan_complete": "Escaneie para concluir",
|
||||
"worksheet_manual_excerpt": "Trecho do manual",
|
||||
"worksheet_pages": "páginas",
|
||||
"worksheet_printed": "Impressa em",
|
||||
"worksheet_never": "Nunca",
|
||||
"card_all_caught_up": "Tudo em dia — nada precisa de atenção",
|
||||
"postpone": "Adiar",
|
||||
"postpone_date_prompt": "Adiar esta ocorrência para qual data?",
|
||||
"postpone_date_label": "Nova data de vencimento",
|
||||
"postponed": "Adiada",
|
||||
"postponed_to": "Adiada para",
|
||||
"season_window_label": "Janela sazonal (meses)",
|
||||
"season_window_hint": "Vence apenas nos meses selecionados; datas fora de temporada passam para o próximo mês ativo. Nenhum = o ano todo.",
|
||||
"series_end_label": "Termina",
|
||||
"series_end_never": "Nunca (repete indefinidamente)",
|
||||
"series_end_after_count": "Após um número de vezes",
|
||||
"series_end_until": "Em uma data",
|
||||
"series_end_count_label": "Número de vezes",
|
||||
"series_end_until_label": "Data final",
|
||||
"parts_section": "Peças e consumíveis",
|
||||
"part_add": "Adicionar peça",
|
||||
"part_name": "Nome",
|
||||
"part_vendor": "Fabricante",
|
||||
"part_storage_location": "Local de armazenamento",
|
||||
"part_product_url": "URL do produto",
|
||||
"part_unit": "Unidade",
|
||||
"part_cost": "Preço unitário",
|
||||
"part_stock": "Estoque",
|
||||
"part_reorder_threshold": "Repor em",
|
||||
"part_restock_quantity": "Quantidade de reposição",
|
||||
"part_auto_buy": "Criar tarefa de compra automaticamente quando estiver baixo",
|
||||
"part_restock": "Ajustar estoque",
|
||||
"restock_quantity_label": "Quantidade comprada",
|
||||
"consumes_parts_label": "Consome peças",
|
||||
"parts_load_failed": "Não foi possível carregar as peças deste objeto — as opções de consumo de peças estão indisponíveis no momento.",
|
||||
"adopt_problem_button": "Adotar sensores de problema",
|
||||
"adopt_problem_title": "Adotar sensores de problema",
|
||||
"adopt_problem_hint": "Transforme sensores de problema do HA (erros de impressora, avisos de filtro, bateria fraca) em tarefas de manutenção que são acionadas enquanto o problema está ativo e se resolvem sozinhas quando ele desaparece.",
|
||||
"adopt_problem_none": "Nenhum sensor de problema encontrado que ainda não seja acompanhado.",
|
||||
"adopt_problem_active": "ativo",
|
||||
"adopt_problem_ok": "ok",
|
||||
"adopt_problem_new_object": "(novo)",
|
||||
"adopt_problem_adopt": "Adotar selecionados",
|
||||
"adopt_problem_done": "{tasks} sensor(es) de problema adotado(s)",
|
||||
"views_label": "Visualizações",
|
||||
"views_none": "— Nenhuma visualização —",
|
||||
"views_manage": "Salvar / gerenciar visualizações",
|
||||
"views_dialog_title": "Visualizações salvas",
|
||||
"views_dialog_hint": "Salve os filtros atuais como uma visualização nomeada que todos podem reutilizar.",
|
||||
"views_name_placeholder": "Nome da visualização",
|
||||
"views_save_current": "Salvar filtros atuais",
|
||||
"views_none_yet": "Ainda não há visualizações salvas.",
|
||||
"close": "Fechar",
|
||||
"trigger_hint_now": "O sensor lê {value} neste momento.",
|
||||
"trigger_hint_above": "A tarefa é acionada quando o valor sobe acima de {target}.",
|
||||
"trigger_hint_below": "É acionada quando o valor cai abaixo de {target}.",
|
||||
"trigger_hint_counter_delta": "Conta a partir da leitura atual ({value}): vence em {due} (+{target}), e a contagem recomeça após cada conclusão.",
|
||||
"trigger_hint_counter_delta_edit": "Conta o uso desde a última conclusão: vence após +{target}; a contagem recomeça após cada conclusão.",
|
||||
"trigger_hint_counter_abs": "A tarefa vence quando o sensor atinge {target}.",
|
||||
"trigger_hint_runtime": "A tarefa vence após {hours} h de funcionamento acumulado; o contador recomeça após cada conclusão.",
|
||||
"trigger_hint_state_change": "A tarefa vence após {count} mudança(s) de estado.",
|
||||
"trigger_hint_state_change_to": "A tarefa vence após {count} mudança(s) para “{state}”.",
|
||||
"trigger_hint_state_now": "Estado atual: {value}.",
|
||||
"adopt_problem_part": "Usa a peça: {name}",
|
||||
"label_filter": "Etiqueta",
|
||||
"all_labels": "Todas as etiquetas",
|
||||
"settings_notify_scope": "Notificar apenas para a visualização",
|
||||
"settings_notify_scope_all": "Todas as tarefas",
|
||||
"settings_notify_scope_hint": "Apenas tarefas que correspondem aos filtros de etiqueta/usuário da visualização salva selecionada enviam lembretes. Status, ordenação e agrupamento da visualização são ignorados aqui.",
|
||||
"card_saved_view": "Visualização salva",
|
||||
"card_saved_view_none": "Nenhuma",
|
||||
"card_saved_view_help": "Aplica os filtros de status, usuário e etiqueta da visualização por cima dos filtros acima. A ordenação e o agrupamento da visualização são configurações de exibição do painel e não se aplicam ao cartão.",
|
||||
"doc_part_none": "Nenhum documento vinculado a esta peça.",
|
||||
"settings_templates_toggle_group": "Ativar ou desativar todos os modelos deste grupo",
|
||||
"setups_button": "Configurações sugeridas",
|
||||
"setups_title": "Configurações sugeridas (Beta)",
|
||||
"setups_hint": "Dispositivos de integrações compatíveis cujos sensores de consumíveis podem alimentar tarefas de manutenção. Adotar cria o objeto e conecta cada tarefa ao seu sensor — ela é acionada quando o consumível fica baixo e se resolve sozinha após a troca.",
|
||||
"setups_none": "Nenhum dispositivo compatível com sensores de consumíveis ainda não conectados foi encontrado.",
|
||||
"setups_adopt": "Configurar selecionados",
|
||||
"setups_done": "{tasks} tarefas conectadas a sensores foram criadas.",
|
||||
"complete_parts_used": "Peças usadas desta vez",
|
||||
"part_delete_confirm": "Excluir a peça '{name}'? O controle de estoque, os vínculos com tarefas e qualquer lembrete de compra aberto serão removidos.",
|
||||
"baseline_start_value": "Leitura inicial (opcional)",
|
||||
"baseline_start_help": "A contagem começa a partir desta leitura. Deixe vazio para contar a partir do valor atual; informe a leitura da última manutenção para que o uso desde então já seja contado.",
|
||||
"setups_baseline_hint": "leitura na última manutenção (opcional)",
|
||||
"baseline_start_help_edit": "Deixe vazio para manter a contagem existente. Informar um valor reancora a contagem (ex.: a leitura da última manutenção).",
|
||||
"baseline_current_effective": "Valor inicial efetivo atual: {value}",
|
||||
"runtime_on_states": "Estados ativos (separados por vírgula)",
|
||||
"runtime_on_states_help": "Estados que contam como em funcionamento — padrão: on. Ex.: mowing, cleaning, printing. Com um atributo selecionado, os valores dele são comparados.",
|
||||
"setups_target_new": "Criar novo: {name}",
|
||||
"schedule_preview_title": "Próximas datas",
|
||||
"schedule_preview_ontime": "Supondo conclusão em dia.",
|
||||
"schedule_preview_ends": "(a série termina)",
|
||||
"adopt_problem_responsible": "Usuário responsável por todas as tarefas adotadas (opcional)",
|
||||
"adopt_problem_configure": "Configurar",
|
||||
"history_auto": "Automática",
|
||||
"battery_fleet_title": "Frota de baterias",
|
||||
"battery_fleet_none_low": "Todas as baterias OK — nada a substituir.",
|
||||
"battery_fleet_buy_now": "Comprar agora",
|
||||
"battery_fleet_soon": "Necessárias em breve",
|
||||
"battery_fleet_soon_hint": "Previsto a partir da data da última troca — compre com antecedência.",
|
||||
"battery_fleet_mark_all": "Marcar todas como trocadas",
|
||||
"battery_fleet_mark_one": "Marcar esta bateria como trocada",
|
||||
"battery_fleet_offline": "offline",
|
||||
"battery_fleet_trigger_lost": "O gatilho do sensor desta tarefa foi perdido — ela não será acionada nem concluída automaticamente.",
|
||||
"battery_fleet_repair": "Reparar",
|
||||
"battery_fleet_exclude": "Remover da frota",
|
||||
"battery_fleet_excluded": "Removida",
|
||||
"battery_fleet_include": "Acompanhar novamente",
|
||||
"battery_fleet_total": "{n} baterias acompanhadas",
|
||||
"battery_fleet_setup_button": "Frota de baterias",
|
||||
"battery_fleet_setup_done": "Frota de baterias configurada — uma única tarefa acompanha todas as suas baterias.",
|
||||
"update_banner": "Há uma versão mais nova do Maintenance Supporter no servidor — recarregue para atualizar o painel.",
|
||||
"update_reload": "Recarregar"
|
||||
}
|
||||
@@ -0,0 +1,811 @@
|
||||
{
|
||||
"maintenance": "Bakım",
|
||||
"objects": "Nesneler",
|
||||
"tasks": "Görevler",
|
||||
"overdue": "Gecikmiş",
|
||||
"due_soon": "Yaklaşan",
|
||||
"triggered": "Tetiklendi",
|
||||
"trigger_replaced": "Tetikleyici değiştirildi",
|
||||
"ok": "Tamam",
|
||||
"all": "Tümü",
|
||||
"new_object": "+ Yeni Nesne",
|
||||
"templates_from": "Şablondan",
|
||||
"templates_title": "Bir şablonla başlayın",
|
||||
"templates_task_count": "{n} görev",
|
||||
"template_created": "Şablondan oluşturuldu",
|
||||
"onboard_hint": "Bakım takibine başlamak için ilk nesnenizi ekleyin.",
|
||||
"edit": "Düzenle",
|
||||
"duplicate": "Çoğalt",
|
||||
"task_duplicated": "Görev çoğaltıldı",
|
||||
"object_duplicated": "Nesne çoğaltıldı",
|
||||
"delete": "Sil",
|
||||
"add_task": "+ Görev Ekle",
|
||||
"complete": "Tamamla",
|
||||
"completed": "Tamamlandı",
|
||||
"skip": "Atla",
|
||||
"skipped": "Atlandı",
|
||||
"missed": "Kaçırıldı",
|
||||
"reset": "Sıfırla",
|
||||
"snooze": "Ertele",
|
||||
"snoozed": "Ertelendi",
|
||||
"cancel": "İptal",
|
||||
"bulk_select": "Seç",
|
||||
"bulk_select_all": "Tümünü seç",
|
||||
"bulk_n_selected": "{n} seçildi",
|
||||
"bulk_completed": "{n} görev tamamlandı",
|
||||
"bulk_archived": "{n} görev arşivlendi",
|
||||
"completing": "Tamamlanıyor…",
|
||||
"interval": "Aralık",
|
||||
"warning": "Uyarı",
|
||||
"last_performed": "Son yapılma",
|
||||
"next_due": "Sonraki vade",
|
||||
"days_until_due": "Vadeye kalan gün",
|
||||
"avg_duration": "Ort. süre",
|
||||
"trigger": "Tetikleyici",
|
||||
"trigger_type": "Tetikleyici türü",
|
||||
"threshold_above": "Üst sınır",
|
||||
"threshold_below": "Alt sınır",
|
||||
"threshold": "Eşik",
|
||||
"counter": "Sayaç",
|
||||
"state_change": "Durum değişikliği",
|
||||
"runtime": "Çalışma süresi",
|
||||
"runtime_hours": "Hedef çalışma süresi (saat)",
|
||||
"target_value": "Hedef değer",
|
||||
"baseline": "Başlangıç değeri",
|
||||
"target_changes": "Hedef değişiklik sayısı",
|
||||
"for_minutes": "Süre (dakika)",
|
||||
"time_based": "Zamana dayalı",
|
||||
"sensor_based": "Sensöre dayalı",
|
||||
"manual": "Manuel",
|
||||
"one_time": "Tek seferlik",
|
||||
"weekdays": "Haftanın günleri",
|
||||
"nth_weekday": "Ayın n. hafta günü",
|
||||
"day_of_month": "Ayın günü",
|
||||
"recurrence_on_days": "Tekrar günleri",
|
||||
"recurrence_occurrence": "Kaçıncı",
|
||||
"recurrence_weekday": "Haftanın günü",
|
||||
"recurrence_day": "Ayın günü (1–31)",
|
||||
"recurrence_last_day": "Ayın son günü",
|
||||
"recurrence_business_day": "Yalnızca iş günleri (hafta sonundan geriye kaydır)",
|
||||
"recurrence_offset": "Kaydırma (gün, ±)",
|
||||
"recurrence_offset_help": "Tarihi ±N gün kaydırır, örn. -2 = iki gün önce.",
|
||||
"last_day_month": "Ayın son günü",
|
||||
"last_business_day_month": "Son iş günü",
|
||||
"ord_1": "1.",
|
||||
"ord_2": "2.",
|
||||
"ord_3": "3.",
|
||||
"ord_4": "4.",
|
||||
"ord_5": "5.",
|
||||
"ord_last": "Son",
|
||||
"day_word": "Gün",
|
||||
"interval_value": "Aralık",
|
||||
"interval_unit": "Birim",
|
||||
"unit_days": "Gün",
|
||||
"unit_weeks": "Hafta",
|
||||
"unit_months": "Ay",
|
||||
"unit_years": "Yıl",
|
||||
"due_date": "Vade tarihi",
|
||||
"cleaning": "Temizlik",
|
||||
"inspection": "Kontrol",
|
||||
"replacement": "Değişim",
|
||||
"calibration": "Kalibrasyon",
|
||||
"service": "Servis",
|
||||
"reading": "Okuma",
|
||||
"custom": "Özel",
|
||||
"history": "Geçmiş",
|
||||
"cost": "Maliyet",
|
||||
"report_button": "Rapor",
|
||||
"report_title": "Bakım raporu",
|
||||
"report_generated": "Oluşturulma",
|
||||
"report_times_done": "Yapıldı",
|
||||
"report_total_cost": "Toplam maliyet",
|
||||
"report_every": "her {n} {unit}",
|
||||
"report_notes": "Notlar",
|
||||
"report_col_type": "Tür",
|
||||
"report_col_status": "Durum",
|
||||
"report_col_schedule": "Zamanlama",
|
||||
"duration": "Süre",
|
||||
"both": "Her ikisi",
|
||||
"trigger_val": "Tetikleme değeri",
|
||||
"complete_title": "Tamamla: ",
|
||||
"checklist": "Kontrol listesi",
|
||||
"checklist_steps_optional": "Kontrol listesi adımları (isteğe bağlı)",
|
||||
"checklist_placeholder": "Filtreyi temizle\nContayı değiştir\nBasıncı test et",
|
||||
"checklist_help": "Her satıra bir adım. En fazla 100 madde.",
|
||||
"err_too_long": "{field}: çok uzun (en fazla {n} karakter)",
|
||||
"err_too_short": "{field}: çok kısa (en az {n} karakter)",
|
||||
"err_value_too_high": "{field}: çok büyük (en fazla {n})",
|
||||
"err_value_too_low": "{field}: çok küçük (en az {n})",
|
||||
"err_required": "{field}: zorunlu",
|
||||
"err_wrong_type": "{field}: yanlış tür (beklenen: {type})",
|
||||
"err_invalid_choice": "{field}: izin verilen bir değer değil",
|
||||
"err_invalid_value": "{field}: geçersiz değer",
|
||||
"feat_schedule_time": "Gün içi saat zamanlaması",
|
||||
"feat_schedule_time_desc": "Görevler gece yarısı yerine günün belirli bir saatinde gecikmiş olur.",
|
||||
"schedule_time_optional": "Vade saati (isteğe bağlı, SS:DD)",
|
||||
"schedule_time_help": "Boş = gece yarısı (varsayılan). HA saat dilimi.",
|
||||
"at_time": "saat",
|
||||
"notes_optional": "Notlar (isteğe bağlı)",
|
||||
"cost_optional": "Maliyet (isteğe bağlı)",
|
||||
"duration_minutes": "Dakika cinsinden süre (isteğe bağlı)",
|
||||
"days": "gün",
|
||||
"day": "gün",
|
||||
"today": "Bugün",
|
||||
"d_overdue": "g gecikmiş",
|
||||
"no_tasks": "Henüz bakım görevi yok. Başlamak için bir nesne oluşturun.",
|
||||
"no_tasks_short": "Görev yok",
|
||||
"no_history": "Henüz geçmiş kaydı yok.",
|
||||
"show_all": "Tümünü göster",
|
||||
"cost_duration_chart": "Maliyet ve Süre",
|
||||
"installed": "Kurulum",
|
||||
"confirm_delete_object": "Bu nesne ve tüm görevleri silinsin mi?",
|
||||
"confirm_delete_task": "Bu görev silinsin mi?",
|
||||
"min": "Min",
|
||||
"max": "Maks",
|
||||
"save": "Kaydet",
|
||||
"saving": "Kaydediliyor…",
|
||||
"edit_task": "Görevi Düzenle",
|
||||
"new_task": "Yeni Bakım Görevi",
|
||||
"task_name": "Görev adı",
|
||||
"maintenance_type": "Bakım türü",
|
||||
"priority": "Öncelik",
|
||||
"labels": "Etiketler",
|
||||
"labels_placeholder": "örn. güvenlik, mevsimlik, kiracıya görünür",
|
||||
"labels_help": "Filtreleme ve raporlama için virgülle ayrılmış etiketler.",
|
||||
"priority_low": "Düşük",
|
||||
"priority_normal": "Normal",
|
||||
"priority_high": "Yüksek",
|
||||
"schedule_type": "Zamanlama türü",
|
||||
"interval_days": "Aralık (gün)",
|
||||
"warning_days": "Uyarı günleri",
|
||||
"earliest_completion_days": "En erken tamamlama (vadeden gün önce)",
|
||||
"earliest_completion_days_help": "Her zaman tamamlanabilmesi için boş bırakın. 0 = yalnızca vade gününde veya sonrasında.",
|
||||
"last_performed_optional": "Son yapılma (isteğe bağlı)",
|
||||
"interval_anchor": "Aralık referansı",
|
||||
"anchor_completion": "Tamamlama tarihinden",
|
||||
"anchor_planned": "Planlanan tarihten (kayma olmaz)",
|
||||
"edit_object": "Nesneyi Düzenle",
|
||||
"name": "Ad",
|
||||
"manufacturer_optional": "Üretici (isteğe bağlı)",
|
||||
"model_optional": "Model (isteğe bağlı)",
|
||||
"serial_number_optional": "Seri numarası (isteğe bağlı)",
|
||||
"serial_number_label": "S/N",
|
||||
"documentation_url_label": "Kılavuz",
|
||||
"object_notes_label": "Notlar",
|
||||
"sort_due_date": "Vade tarihi",
|
||||
"sort_object": "Nesne adı",
|
||||
"sort_type": "Tür",
|
||||
"sort_task_name": "Görev adı",
|
||||
"all_objects": "Tüm nesneler",
|
||||
"tasks_lower": "görev",
|
||||
"no_tasks_yet": "Henüz görev yok",
|
||||
"add_first_task": "İlk görevi ekle",
|
||||
"trigger_configuration": "Tetikleyici Yapılandırması",
|
||||
"entity_id": "Varlık kimliği",
|
||||
"comma_separated": "virgülle ayrılmış",
|
||||
"entity_logic": "Varlık mantığı",
|
||||
"entity_logic_any": "Herhangi bir varlık tetikler",
|
||||
"entity_logic_all": "Tüm varlıklar tetiklemeli",
|
||||
"entities": "varlık",
|
||||
"attribute_optional": "Öznitelik (isteğe bağlı, boş = durum)",
|
||||
"use_entity_state": "Varlık durumunu kullan (öznitelik yok)",
|
||||
"trigger_above": "Üstünde tetikle",
|
||||
"trigger_below": "Altında tetikle",
|
||||
"for_at_least_minutes": "En az (dakika)",
|
||||
"safety_interval_days": "Güvenlik aralığı (gün, isteğe bağlı)",
|
||||
"safety_interval": "Güvenlik aralığı (isteğe bağlı)",
|
||||
"delta_mode": "Fark modu",
|
||||
"from_state_optional": "Başlangıç durumu (isteğe bağlı)",
|
||||
"to_state_optional": "Hedef durum (isteğe bağlı)",
|
||||
"documentation_url_optional": "Dokümantasyon URL'si (isteğe bağlı)",
|
||||
"object_notes_optional": "Notlar (isteğe bağlı)",
|
||||
"nfc_tag_id_optional": "NFC Etiket Kimliği (isteğe bağlı)",
|
||||
"nfc_tags_empty_help": "Home Assistant'ta henüz kayıtlı NFC etiketi yok.",
|
||||
"nfc_tags_open_settings": "Etiket ayarlarını aç",
|
||||
"nfc_tags_refresh": "Yenile",
|
||||
"environmental_entity_optional": "Çevresel sensör (isteğe bağlı)",
|
||||
"environmental_entity_helper": "örn. sensor.outdoor_temperature — aralığı çevresel koşullara göre ayarlar",
|
||||
"environmental_attribute_optional": "Çevresel öznitelik (isteğe bağlı)",
|
||||
"nfc_tag_id": "NFC Etiket Kimliği",
|
||||
"nfc_linked": "NFC etiketi bağlandı",
|
||||
"nfc_link_hint": "NFC etiketi bağlamak için tıklayın",
|
||||
"responsible_user": "Sorumlu Kullanıcı",
|
||||
"shared_with": "Paylaşılanlar (rotasyon)",
|
||||
"shared_with_help": "Bu görevi paylaşmak için birden fazla kişi seçin; sorumlu kişi her tamamlamada sırayla değişir.",
|
||||
"rotation_strategy": "Rotasyon",
|
||||
"rotation_none": "Rotasyon yok",
|
||||
"rotation_round_robin": "Sırayla",
|
||||
"rotation_least_completed": "En az tamamlayan",
|
||||
"rotation_random": "Rastgele",
|
||||
"no_user_assigned": "(Kullanıcı atanmadı)",
|
||||
"all_users": "Tüm Kullanıcılar",
|
||||
"my_tasks": "Görevlerim",
|
||||
"tab_calendar": "Takvim",
|
||||
"cal_no_events": "Bakım yok",
|
||||
"cal_window_7": "7 gün",
|
||||
"cal_window_14": "14 gün",
|
||||
"cal_window_30": "30 gün",
|
||||
"cal_window_365": "1 yıl",
|
||||
"cal_every_n_days": "her {n} günde bir",
|
||||
"cal_source_time": "Zamana dayalı",
|
||||
"cal_source_time_adaptive": "Zamana dayalı (uyarlanabilir)",
|
||||
"cal_source_sensor": "Sensöre dayalı",
|
||||
"cal_predicted": "tahmini",
|
||||
"cal_confidence_high": "yüksek güven",
|
||||
"cal_confidence_medium": "orta güven",
|
||||
"cal_confidence_low": "düşük güven",
|
||||
"budget_monthly": "Aylık bütçe",
|
||||
"budget_yearly": "Yıllık bütçe",
|
||||
"groups": "Gruplar",
|
||||
"new_group": "Yeni grup",
|
||||
"edit_group": "Grubu düzenle",
|
||||
"no_groups": "Henüz grup yok",
|
||||
"delete_group": "Grubu sil",
|
||||
"delete_group_confirm": "'{name}' grubu silinsin mi?",
|
||||
"group_select_tasks": "Görevleri seç",
|
||||
"group_name_required": "Ad zorunludur",
|
||||
"description_optional": "Açıklama (isteğe bağlı)",
|
||||
"selected": "Seçili",
|
||||
"loading_chart": "Grafik verileri yükleniyor...",
|
||||
"hide_outliers": "Aykırı değerleri gizle (sensör hataları)",
|
||||
"was_maintenance_needed": "Bu bakım gerekli miydi?",
|
||||
"feedback_needed": "Gerekliydi",
|
||||
"feedback_not_needed": "Gerekli değildi",
|
||||
"feedback_not_sure": "Emin değilim",
|
||||
"suggested_interval": "Önerilen aralık",
|
||||
"apply_suggestion": "Uygula",
|
||||
"reanalyze": "Yeniden analiz et",
|
||||
"reanalyze_result": "Yeni analiz",
|
||||
"reanalyze_insufficient_data": "Öneri üretmek için yeterli veri yok",
|
||||
"data_points": "veri noktası",
|
||||
"dismiss_suggestion": "Yoksay",
|
||||
"confidence_low": "Düşük",
|
||||
"confidence_medium": "Orta",
|
||||
"confidence_high": "Yüksek",
|
||||
"recommended": "önerilen",
|
||||
"seasonal_awareness": "Mevsimsel Farkındalık",
|
||||
"edit_seasonal_overrides": "Mevsimsel faktörleri düzenle",
|
||||
"seasonal_overrides_title": "Mevsimsel faktörler (elle ayar)",
|
||||
"seasonal_overrides_hint": "Ay başına faktör (0.1–5.0). Boş = otomatik öğrenilir.",
|
||||
"seasonal_override_invalid": "Geçersiz değer",
|
||||
"seasonal_override_range": "Faktör 0.1 ile 5.0 arasında olmalıdır",
|
||||
"clear_all": "Tümünü temizle",
|
||||
"seasonal_chart_title": "Mevsimsel Faktörler",
|
||||
"seasonal_learned": "Öğrenilmiş",
|
||||
"seasonal_manual": "Manuel",
|
||||
"month_jan": "Oca",
|
||||
"month_feb": "Şub",
|
||||
"month_mar": "Mar",
|
||||
"month_apr": "Nis",
|
||||
"month_may": "May",
|
||||
"month_jun": "Haz",
|
||||
"month_jul": "Tem",
|
||||
"month_aug": "Ağu",
|
||||
"month_sep": "Eyl",
|
||||
"month_oct": "Eki",
|
||||
"month_nov": "Kas",
|
||||
"month_dec": "Ara",
|
||||
"sensor_prediction": "Sensör Tahmini",
|
||||
"degradation_trend": "Eğilim",
|
||||
"trend_rising": "Yükseliyor",
|
||||
"trend_falling": "Düşüyor",
|
||||
"trend_stable": "Sabit",
|
||||
"trend_insufficient_data": "Yetersiz veri",
|
||||
"days_until_threshold": "Eşiğe kalan gün",
|
||||
"threshold_exceeded": "Eşik aşıldı",
|
||||
"environmental_adjustment": "Çevresel faktör",
|
||||
"sensor_prediction_urgency": "Sensör, eşiğe ~{days} gün kaldığını öngörüyor",
|
||||
"day_short": "gün",
|
||||
"weibull_reliability_curve": "Güvenilirlik Eğrisi",
|
||||
"weibull_failure_probability": "Arıza Olasılığı",
|
||||
"weibull_r_squared": "Uyum R²",
|
||||
"beta_early_failures": "Erken Arızalar",
|
||||
"beta_random_failures": "Rastgele Arızalar",
|
||||
"beta_wear_out": "Aşınma",
|
||||
"beta_highly_predictable": "Yüksek Öngörülebilirlik",
|
||||
"confidence_interval": "Güven Aralığı",
|
||||
"confidence_conservative": "Temkinli",
|
||||
"confidence_aggressive": "İyimser",
|
||||
"current_interval_marker": "Mevcut aralık",
|
||||
"recommended_marker": "Önerilen",
|
||||
"characteristic_life": "Karakteristik ömür",
|
||||
"chart_mini_sparkline": "Eğilim mini grafiği",
|
||||
"chart_history": "Maliyet ve süre geçmişi",
|
||||
"chart_seasonal": "Mevsimsel faktörler, 12 ay",
|
||||
"chart_weibull": "Weibull güvenilirlik eğrisi",
|
||||
"chart_sparkline": "Sensör tetikleme değeri grafiği",
|
||||
"days_progress": "Gün ilerlemesi",
|
||||
"qr_code": "QR Kodu",
|
||||
"qr_generating": "QR kodu oluşturuluyor…",
|
||||
"qr_error": "QR kodu oluşturulamadı.",
|
||||
"qr_error_no_url": "Yapılandırılmış bir HA URL'si yok. Lütfen Ayarlar → Sistem → Ağ bölümünden bir dış veya iç URL ayarlayın.",
|
||||
"save_error": "Kaydedilemedi. Lütfen tekrar deneyin.",
|
||||
"qr_print": "Yazdır",
|
||||
"qr_download": "SVG indir",
|
||||
"qr_action": "Tarama eylemi",
|
||||
"qr_action_view": "Bakım bilgisini görüntüle",
|
||||
"qr_action_complete": "Bakımı tamamlandı olarak işaretle",
|
||||
"qr_url_mode": "Bağlantı türü",
|
||||
"qr_mode_companion": "Companion uygulaması",
|
||||
"qr_mode_local": "Yerel (mDNS)",
|
||||
"qr_mode_server": "Sunucu URL'si",
|
||||
"overview": "Genel Bakış",
|
||||
"analysis": "Analiz",
|
||||
"recent_activities": "Son Etkinlikler",
|
||||
"search_notes": "Notlarda ara",
|
||||
"avg_cost": "Ort. Maliyet",
|
||||
"no_advanced_features": "Etkin gelişmiş özellik yok",
|
||||
"no_advanced_features_hint": "Burada analiz verilerini görmek için entegrasyon ayarlarından “Uyarlanabilir Aralıklar” veya “Mevsimsel Desenler” özelliğini etkinleştirin.",
|
||||
"analysis_not_enough_data": "Analiz için henüz yeterli veri yok.",
|
||||
"analysis_not_enough_data_hint": "Weibull analizi en az 5 tamamlanmış bakım gerektirir; mevsimsel desenler ay başına 6+ veri noktasından sonra görünür olur.",
|
||||
"analysis_manual_task_hint": "Aralığı olmayan manuel görevler analiz verisi üretmez.",
|
||||
"completions": "tamamlama",
|
||||
"current": "Mevcut",
|
||||
"shorter": "Daha kısa",
|
||||
"longer": "Daha uzun",
|
||||
"normal": "Normal",
|
||||
"disabled": "Devre dışı",
|
||||
"compound_logic": "Bileşik mantık",
|
||||
"compound": "Bileşik (birden fazla koşul)",
|
||||
"compound_logic_and": "VE — tüm koşullar tetiklenmeli",
|
||||
"compound_logic_or": "VEYA — herhangi bir koşul tetikler",
|
||||
"compound_help": "Birden fazla sensör koşulunu tek bir tetikleyicide birleştirin.",
|
||||
"compound_no_conditions": "Henüz koşul yok — en az bir tane ekleyin.",
|
||||
"compound_add_condition": "Koşul ekle",
|
||||
"compound_condition": "Koşul",
|
||||
"compound_remove_condition": "Koşulu kaldır",
|
||||
"card_title": "Başlık",
|
||||
"card_show_header": "İstatistikli başlığı göster",
|
||||
"card_show_actions": "Eylem düğmelerini göster",
|
||||
"card_compact": "Kompakt mod",
|
||||
"card_max_items": "En fazla öğe (0 = tümü)",
|
||||
"card_filter_status": "Duruma göre filtrele",
|
||||
"card_filter_status_help": "Boş = tüm durumları göster.",
|
||||
"card_filter_objects": "Nesnelere göre filtrele",
|
||||
"card_filter_objects_help": "Boş = tüm nesneleri göster.",
|
||||
"card_filter_entities": "Varlıklara göre filtrele (entity_id)",
|
||||
"card_filter_entities_help": "Bu entegrasyonun sensor / binary_sensor varlıklarını seçin. Boş = tümü.",
|
||||
"card_loading_objects": "Nesneler yükleniyor…",
|
||||
"card_load_error": "Nesneler yüklenemedi — WebSocket bağlantısını kontrol edin.",
|
||||
"card_no_tasks_title": "Henüz bakım görevi yok",
|
||||
"card_no_tasks_cta": "→ Bakım panelinde bir tane oluşturun",
|
||||
"no_objects": "Henüz nesne yok.",
|
||||
"action_error": "Eylem başarısız oldu. Lütfen tekrar deneyin.",
|
||||
"area_id_optional": "Alan (isteğe bağlı)",
|
||||
"installation_date_optional": "Kurulum tarihi (isteğe bağlı)",
|
||||
"warranty_expiry_optional": "Garanti bitişi (isteğe bağlı)",
|
||||
"warranty": "Garanti",
|
||||
"warranty_valid_until": "{date} tarihine kadar geçerli",
|
||||
"warranty_expires_in": "{days} gün içinde sona eriyor",
|
||||
"warranty_expired": "süresi doldu",
|
||||
"cal_past_windows": "Geçmiş dönemler",
|
||||
"cal_forward_windows": "Gelecek dönemler",
|
||||
"history_edit_title": "Geçmiş kaydını düzenle",
|
||||
"history_edit_timestamp": "Zaman damgası",
|
||||
"manufacturer": "Üretici",
|
||||
"model": "Model",
|
||||
"area": "Alan",
|
||||
"actions": "Eylemler",
|
||||
"view_mode_label": "Görünüm",
|
||||
"view_cards": "Kart görünümü",
|
||||
"view_table": "Tablo görünümü",
|
||||
"objects_table_columns_label": "Nesne tablosu sütunları",
|
||||
"objects_table_columns_hint": "Nesne tablosu görünümünde hangi sütunların görüneceğini seçin.",
|
||||
"custom_icon_optional": "Simge (isteğe bağlı, örn. mdi:wrench)",
|
||||
"task_enabled": "Görev etkin",
|
||||
"skip_reason_prompt": "Bu görev atlansın mı?",
|
||||
"reason_optional": "Neden (isteğe bağlı)",
|
||||
"reset_date_prompt": "Görev yapıldı olarak işaretlensin mi?",
|
||||
"reset_date_optional": "Son yapılma tarihi (isteğe bağlı, varsayılan bugün)",
|
||||
"notes_label": "Notlar",
|
||||
"documentation_label": "Dokümantasyon",
|
||||
"no_nfc_tag": "— Etiket yok —",
|
||||
"dashboard": "Gösterge Paneli",
|
||||
"tab_today": "Bugün",
|
||||
"palette_placeholder": "Nesne ve görevlerde ara…",
|
||||
"palette_no_results": "Eşleşme yok",
|
||||
"palette_hint": "↑↓ gezinme · Enter açma · Esc kapatma",
|
||||
"today_all_caught_up": "Her şey tamam! Bu hafta vadesi gelen yok.",
|
||||
"today_overdue": "Gecikmiş",
|
||||
"today_due_today": "Bugün vadeli",
|
||||
"today_this_week": "Bu hafta",
|
||||
"settings": "Ayarlar",
|
||||
"settings_features": "Gelişmiş Özellikler",
|
||||
"settings_features_desc": "Gelişmiş özellikleri etkinleştirin veya devre dışı bırakın. Devre dışı bırakmak onları arayüzden gizler ancak verileri silmez.",
|
||||
"feat_adaptive": "Uyarlanabilir Zamanlama",
|
||||
"feat_adaptive_desc": "Bakım geçmişinden en uygun aralıkları öğren",
|
||||
"feat_predictions": "Sensör Tahminleri",
|
||||
"feat_predictions_desc": "Sensör bozulmasından tetiklenme tarihlerini öngör",
|
||||
"feat_seasonal": "Mevsimsel Ayarlamalar",
|
||||
"feat_seasonal_desc": "Aralıkları mevsimsel desenlere göre ayarla",
|
||||
"feat_environmental": "Çevresel Korelasyon",
|
||||
"feat_environmental_desc": "Aralıkları sıcaklık/nemle ilişkilendir",
|
||||
"feat_budget": "Bütçe Takibi",
|
||||
"feat_budget_desc": "Aylık ve yıllık bakım harcamalarını takip et",
|
||||
"feat_groups": "Görev Grupları",
|
||||
"feat_groups_desc": "Görevleri mantıksal gruplar halinde düzenle",
|
||||
"feat_checklists": "Kontrol Listeleri",
|
||||
"feat_checklists_desc": "Görev tamamlama için çok adımlı prosedürler",
|
||||
"settings_general": "Genel",
|
||||
"settings_default_warning": "Varsayılan uyarı günleri",
|
||||
"settings_panel_enabled": "Kenar çubuğu paneli",
|
||||
"settings_panel_title": "Kenar çubuğu paneli başlığı",
|
||||
"settings_notifications": "Bildirimler",
|
||||
"settings_notify_service": "Bildirim servisi",
|
||||
"test_notification": "Test bildirimi",
|
||||
"send_test": "Test gönder",
|
||||
"testing": "Gönderiliyor…",
|
||||
"test_notification_success": "Test bildirimi gönderildi",
|
||||
"test_notification_failed": "Test bildirimi başarısız oldu",
|
||||
"settings_notify_due_soon": "Vade yaklaştığında bildir",
|
||||
"settings_notify_overdue": "Geciktiğinde bildir",
|
||||
"settings_notify_triggered": "Tetiklendiğinde bildir",
|
||||
"settings_interval_hours": "Tekrar aralığı (saat, 0 = bir kez)",
|
||||
"settings_quiet_hours": "Sessiz saatler",
|
||||
"settings_quiet_start": "Başlangıç",
|
||||
"settings_quiet_end": "Bitiş",
|
||||
"settings_max_per_day": "Günlük en fazla bildirim (0 = sınırsız)",
|
||||
"settings_bundling": "Bildirimleri grupla",
|
||||
"settings_bundle_threshold": "Gruplama eşiği",
|
||||
"settings_reminder_leads": "Ek hatırlatmalar (vadeden gün önce)",
|
||||
"settings_reminder_leads_hint": "Virgülle ayrılmış süreler, örn. 14, 3, 0 — eşleşen her günde bir ek hatırlatma gönderilir. Boş = kapalı.",
|
||||
"settings_actions": "Mobil Eylem Düğmeleri",
|
||||
"settings_action_complete": "'Tamamla' düğmesini göster",
|
||||
"settings_action_skip": "'Atla' düğmesini göster",
|
||||
"settings_action_snooze": "'Ertele' düğmesini göster",
|
||||
"settings_weekly_digest": "Haftalık özet",
|
||||
"settings_weekly_digest_hint": "Vadesi gelen görevler olduğunda pazartesi sabahı tek bir özet bildirimi.",
|
||||
"settings_warranty_reminder": "Garanti bitiş hatırlatması",
|
||||
"settings_warranty_reminder_days": "Bitişten gün önce",
|
||||
"settings_warranty_reminder_hint": "Bir nesnenin garantisinin bitmesine bu kadar gün kaldığında bir kez bildir.",
|
||||
"settings_snooze_hours": "Erteleme süresi (saat)",
|
||||
"settings_budget": "Bütçe",
|
||||
"settings_currency": "Para birimi",
|
||||
"settings_budget_monthly": "Aylık bütçe",
|
||||
"settings_budget_yearly": "Yıllık bütçe",
|
||||
"settings_budget_alerts": "Bütçe uyarıları",
|
||||
"settings_budget_threshold": "Uyarı eşiği (%)",
|
||||
"settings_import_export": "İçe / Dışa Aktarma",
|
||||
"settings_export_json": "JSON dışa aktar",
|
||||
"settings_export_yaml": "YAML dışa aktar",
|
||||
"settings_export_csv": "CSV dışa aktar",
|
||||
"settings_import_csv": "CSV içe aktar",
|
||||
"settings_import_placeholder": "JSON veya CSV içeriğini buraya yapıştırın…",
|
||||
"settings_import_btn": "İçe aktar",
|
||||
"settings_import_success": "{count} nesne başarıyla içe aktarıldı.",
|
||||
"settings_export_success": "Dışa aktarma indirildi.",
|
||||
"settings_saved": "Ayar kaydedildi.",
|
||||
"settings_include_history": "Geçmişi dahil et",
|
||||
"settings_export_selection": "Seçili nesnelerle sınırla (isteğe bağlı)",
|
||||
"settings_docs_archive": "Belge arşivi (dosyalarla birlikte)",
|
||||
"settings_docs_archive_hint": "JSON/YAML/CSV dışa aktarmaları yalnızca ayarları içerir. Bu ZIP, geri yüklemenin eksiksiz olması için yüklenen dosya içeriklerini de kapsar.",
|
||||
"settings_docs_export_btn": "Belge ZIP'ini indir",
|
||||
"settings_docs_import_btn": "Belge ZIP'ini geri yükle",
|
||||
"settings_docs_import_success": "Geri yüklendi: {blobs} dosya, {docs} belge",
|
||||
"sort_alphabetical": "Alfabetik",
|
||||
"sort_due_soonest": "En yakın vade",
|
||||
"sort_task_count": "Görev sayısı",
|
||||
"sort_area": "Alan",
|
||||
"sort_assigned_user": "Atanan kullanıcı",
|
||||
"sort_group": "Grup",
|
||||
"groupby_none": "Gruplama yok",
|
||||
"groupby_area": "Alana göre",
|
||||
"groupby_group": "Gruba göre",
|
||||
"groupby_user": "Kullanıcıya göre",
|
||||
"filter_label": "Filtre",
|
||||
"user_label": "Kullanıcı",
|
||||
"sort_label": "Sırala",
|
||||
"group_by_label": "Grupla",
|
||||
"state_value_help": "HA durum değerini kullanın (genellikle küçük harf, örn. \"on\"/\"off\"). Büyük/küçük harf kaydederken normalleştirilir.",
|
||||
"target_changes_help": "Tetikleyici çalışmadan önceki eşleşen geçiş sayısı (varsayılan: 1).",
|
||||
"qr_print_title": "QR kodlarını yazdır",
|
||||
"qr_print_desc": "Kesip ekipmanınıza yapıştırmak için yazdırılabilir bir QR kodu sayfası oluşturun.",
|
||||
"qr_print_load": "Nesneleri yükle",
|
||||
"qr_print_filter": "Filtre",
|
||||
"qr_print_objects": "Nesneler",
|
||||
"qr_print_actions": "Eylemler",
|
||||
"qr_print_url_mode": "Bağlantı türü",
|
||||
"qr_print_estimate": "Tahmini QR kodu sayısı",
|
||||
"qr_print_over_limit": "üst sınır 200, filtreyi daraltın",
|
||||
"qr_print_generate": "QR kodları oluştur",
|
||||
"qr_print_generating": "Oluşturuluyor…",
|
||||
"qr_print_ready": "QR kodları hazır",
|
||||
"qr_print_print_button": "Yazdır",
|
||||
"qr_print_empty": "Oluşturulacak bir şey yok",
|
||||
"qr_action_skip": "Atla",
|
||||
"vacation_title": "Tatil modu",
|
||||
"vacation_active": "etkin",
|
||||
"vacation_ended": "sona erdi",
|
||||
"vacation_desc": "Bir tatil planlayın: bildirimler bu dönem artı tampon günler boyunca duraklatılır. Belirli görevleri yine de bildirime dahil edebilirsiniz.",
|
||||
"vacation_enable": "Tatil modunu etkinleştir",
|
||||
"vacation_start": "Başlangıç",
|
||||
"vacation_end": "Bitiş",
|
||||
"vacation_buffer": "Tampon (gün)",
|
||||
"vacation_exempt_title": "Tatilde yine de bildir",
|
||||
"vacation_exempt_desc": "Tatil sırasında yine de bildirim göndermesi gereken görevleri seçin (örn. kritik havuz kimyası).",
|
||||
"vacation_load_tasks": "Görevleri yükle",
|
||||
"vacation_preview_btn": "Önizlemeyi göster",
|
||||
"vacation_preview_affected": "görev etkileniyor",
|
||||
"vacation_event_due_soon": "vadesi yaklaşacak",
|
||||
"vacation_event_overdue": "gecikecek",
|
||||
"vacation_event_triggered_est": "sensör tetiklemesi olası",
|
||||
"vacation_sensor_based": "(sensöre dayalı)",
|
||||
"vacation_action_notify": "Yine de bildir",
|
||||
"vacation_action_unsilence": "Yeniden sustur",
|
||||
"vacation_marked_complete": "Tamamlandı olarak işaretlendi",
|
||||
"vacation_marked_skip": "Atlandı",
|
||||
"vacation_end_now": "Tatili şimdi bitir",
|
||||
"add": "Ekle",
|
||||
"show_stats": "İstatistik + grafikleri göster",
|
||||
"hide_stats": "İstatistikleri gizle",
|
||||
"adaptive_no_data": "Uyarlanabilir analiz için henüz yeterli tamamlama geçmişi yok. Aralık önerilerini ve güvenilirlik grafiklerini açmak için bu görevi birkaç kez daha tamamlayın.",
|
||||
"suggestion_applied": "Önerilen aralık uygulandı",
|
||||
"vacation_mode": "Tatil modu",
|
||||
"vacation_status_active": "Şu an etkin",
|
||||
"vacation_status_scheduled": "Planlandı",
|
||||
"vacation_status_inactive": "Devre dışı",
|
||||
"vacation_end_now_confirm": "Tatil hemen bitirilsin mi?",
|
||||
"vacation_exempt_count": "muaf",
|
||||
"vacation_advanced": "Gelişmiş…",
|
||||
"vacation_open_panel": "Panelde aç",
|
||||
"enable": "Etkinleştir",
|
||||
"saved": "Kaydedildi",
|
||||
"budget_monthly_set": "Aylık ayarla",
|
||||
"budget_yearly_set": "Yıllık ayarla",
|
||||
"budget_advanced": "Para birimi, uyarılar…",
|
||||
"budget_open_panel": "Panelde aç",
|
||||
"groups_empty": "Henüz grup yok.",
|
||||
"group_new_placeholder": "Grup ekle…",
|
||||
"group_delete_confirm": "\"{name}\" grubu silinsin mi?",
|
||||
"groups_manage_tasks": "Görev atamalarını yönet…",
|
||||
"groups_open_panel": "Panelde aç",
|
||||
"unassigned": "Atanmamış",
|
||||
"no_area": "Alan yok",
|
||||
"has_overdue": "Gecikmiş görevi var",
|
||||
"object": "Nesne",
|
||||
"settings_panel_access": "Panel erişimi",
|
||||
"settings_panel_access_desc": "Yöneticiler her zaman tam erişime sahiptir. Oluşturma, düzenleme ve silmeyi belirli yönetici olmayan kullanıcılara devretmek için bunu açın ve onları aşağıdan seçin — diğer herkes yalnızca Tamamla ve Atla görür.",
|
||||
"settings_operator_write": "Seçili kullanıcılara oluşturma, düzenleme ve silme izni ver",
|
||||
"settings_operator_write_desc": "Kapalı: içeriği yalnızca yöneticiler değiştirebilir. Açık: aşağıda seçilen kullanıcılar da tam erişim alır.",
|
||||
"no_non_admin_users": "Yönetici olmayan kullanıcı bulunamadı. Ayarlar → Kişiler bölümünden ekleyin.",
|
||||
"owner_label": "Sahip",
|
||||
"feat_completion_actions": "Tamamlama eylemleri",
|
||||
"feat_completion_actions_desc": "Görev başına tamamlamada HA eylemi + önceden ayarlı değerlerle hızlı tamamlama QR'ı.",
|
||||
"on_complete_action_title": "Tamamlandığında: HA eylemi tetikle (isteğe bağlı)",
|
||||
"on_complete_action_desc": "Görev tamamlandığında bir HA servisi çağırır — örn. cihazdaki bir sayacı sıfırlar.",
|
||||
"on_complete_action_service": "Servis",
|
||||
"on_complete_action_target": "Hedef varlık",
|
||||
"on_complete_action_target_hint": "Not: varlık alan adı servisle eşleşmelidir — örn. 'button.press' yalnızca button.* üzerinde, 'counter.increment' yalnızca counter.* üzerinde, 'input_button.press' yalnızca input_button.* üzerinde çalışır. Eşleşmezse eylem sessizce başarısız olur (HA günlüğü: 'Referenced entities ... missing or not currently available').",
|
||||
"on_complete_action_data": "Veri (JSON, isteğe bağlı)",
|
||||
"on_complete_action_test": "Yapılandırmayı doğrula",
|
||||
"on_complete_action_test_success": "✓ Yapılandırma geçerli (eylem yalnızca görev tamamlandığında çalışır)",
|
||||
"on_complete_action_test_failed": "Başarısız",
|
||||
"quick_complete_defaults_title": "Hızlı tamamlama varsayılanları (QR taramaları için, isteğe bağlı)",
|
||||
"quick_complete_defaults_desc": "Hızlı tamamlama QR taramaları için önceden ayarlı değerler. Bunlar olmadan QR, tamamlama penceresini açar.",
|
||||
"quick_complete_defaults_notes": "Notlar",
|
||||
"quick_complete_defaults_cost": "Maliyet",
|
||||
"quick_complete_defaults_duration": "Süre (dakika)",
|
||||
"quick_complete_defaults_feedback_none": "Geri bildirim yok",
|
||||
"quick_complete_defaults_feedback_needed": "Gerekliydi",
|
||||
"quick_complete_defaults_feedback_not_needed": "Gerekli değildi",
|
||||
"quick_complete_success": "Hızlıca tamamlandı olarak işaretlendi",
|
||||
"show_all_objects": "Tüm nesneleri göster",
|
||||
"show_all_tasks": "Filtreyi temizle — tüm görevleri göster",
|
||||
"filter_to_overdue": "Görev listesini yalnızca gecikmişlere filtrele",
|
||||
"filter_to_due_soon": "Görev listesini yalnızca vadesi yaklaşanlara filtrele",
|
||||
"filter_to_triggered": "Görev listesini yalnızca tetiklenenlere filtrele",
|
||||
"open_task": "Görevi aç",
|
||||
"show_details": "Geçmiş + istatistikleri göster",
|
||||
"hide_details": "Ayrıntıları gizle",
|
||||
"history_empty": "Henüz geçmiş yok.",
|
||||
"history_edit_button": "Kaydı düzenle",
|
||||
"total_cost": "Toplam maliyet",
|
||||
"times_performed": "Yapılma sayısı",
|
||||
"older_entries": "daha eski",
|
||||
"open_in_panel": "Bakım panelinde aç",
|
||||
"skip_reason": "Atlama nedeni (isteğe bağlı)",
|
||||
"reset_to_date": "Son yapılmayı şu tarihe sıfırla",
|
||||
"delete_task_confirm": "Bu görev ve geçmişi silinsin mi?",
|
||||
"delete_object_confirm": "Bu nesne ve tüm görevleri silinsin mi?",
|
||||
"loading": "Yükleniyor…",
|
||||
"archive": "Arşivle",
|
||||
"undo": "Geri al",
|
||||
"task_archived": "Görev arşivlendi",
|
||||
"object_archived": "Nesne arşivlendi",
|
||||
"unarchive": "Arşivden çıkar",
|
||||
"archived": "Arşivlendi",
|
||||
"show_archived": "Arşivlenenleri göster",
|
||||
"hide_archived": "Arşivlenenleri gizle",
|
||||
"confirm_archive_object": "Bu nesne ve görevleri arşivlensin mi? Geçmişleri korunur ve daha sonra arşivden çıkarılabilirler.",
|
||||
"settings_archive": "Arşiv ve Saklama",
|
||||
"settings_archive_desc": "Tamamlanmış tek seferlik görevleri silmeden emekliye ayırın. Arşivlenen öğeler gizlenir ve pasiftir ancak geçmişlerini ve maliyetlerini korurlar.",
|
||||
"settings_archive_oneoff_days": "Tamamlanan tek seferlik görevleri şu kadar gün sonra otomatik arşivle (0 = kapalı)",
|
||||
"settings_delete_archived_oneoff_days": "Arşivlenen tek seferlik görevleri şu kadar gün sonra otomatik sil (0 = asla)",
|
||||
"archive_object": "Nesneyi arşivle",
|
||||
"unarchive_object": "Nesneyi arşivden çıkar",
|
||||
"documents": "Belgeler",
|
||||
"documents_empty": "Henüz belge yok.",
|
||||
"doc_upload": "Dosya yükle",
|
||||
"doc_uploading": "Yükleniyor…",
|
||||
"doc_add_link": "Bağlantı ekle",
|
||||
"doc_link_url": "URL (https://…)",
|
||||
"doc_link_title": "Başlık (isteğe bağlı)",
|
||||
"doc_open": "Aç",
|
||||
"doc_delete_confirm": "\"{name}\" silinsin mi?",
|
||||
"doc_too_large": "Dosya çok büyük (en fazla 25 MB).",
|
||||
"doc_upload_failed": "Yükleme başarısız oldu.",
|
||||
"completion_photo_optional": "Tamamlama fotoğrafı (isteğe bağlı)",
|
||||
"add_photo": "Fotoğraf ekle",
|
||||
"uploading": "Yükleniyor…",
|
||||
"remove": "Kaldır",
|
||||
"doc_deduped": "Zaten başka bir yerde saklı — paylaşıldı, ek alan kullanılmadı.",
|
||||
"doc_dup_in_object": "Bu dosya zaten bu nesneye ekli.",
|
||||
"doc_link_invalid": "Yalnızca http/https bağlantılarına izin verilir.",
|
||||
"doc_cat_manual": "Kılavuz",
|
||||
"doc_cat_warranty": "Garanti",
|
||||
"doc_cat_invoice": "Fatura",
|
||||
"doc_cat_spare_parts": "Yedek parçalar",
|
||||
"doc_cat_photo": "Fotoğraf",
|
||||
"doc_cat_other": "Diğer",
|
||||
"doc_link_badge": "Bağlantı",
|
||||
"doc_storage_title": "Belge depolama",
|
||||
"doc_storage_saved": "Tekilleştirmeyle kazanıldı",
|
||||
"doc_storage_refresh": "Yenile",
|
||||
"doc_download": "İndir",
|
||||
"doc_close": "Kapat",
|
||||
"doc_camera": "Fotoğraf çek",
|
||||
"doc_drop_hint": "Dosyaları buraya bırakın",
|
||||
"doc_task_none": "Bu göreve bağlı belge yok.",
|
||||
"doc_link_existing": "Belge bağla…",
|
||||
"doc_attach": "Bağla",
|
||||
"doc_unlink": "Bağlantıyı kaldır",
|
||||
"doc_page": "Sayfa",
|
||||
"chart_range_7d": "7g",
|
||||
"chart_range_30d": "30g",
|
||||
"chart_range_90d": "90g",
|
||||
"chart_range_1y": "1y",
|
||||
"chart_since_service": "son servisten beri",
|
||||
"chart_no_stats": "Bu varlık için uzun dönem istatistiği yok — yalnızca bakım olayı değerleri gösteriliyor",
|
||||
"auto_complete_on_recovery": "Sensör düzelince otomatik tamamla",
|
||||
"auto_complete_on_recovery_help": "Tetikleyici kendiliğinden temizlendiğinde bir tamamlama kaydeder (son yapılmayı ayarlar) — örn. tuz dolduruldu, filtre değiştirildi.",
|
||||
"doc_search": "Belgelerde ara…",
|
||||
"doc_search_none": "Eşleşen belge yok",
|
||||
"link_device_optional": "Mevcut bir cihaza bağla (isteğe bağlı)",
|
||||
"parent_object_optional": "Üst nesne (isteğe bağlı)",
|
||||
"parent_none": "(Üst nesne yok)",
|
||||
"paused": "Duraklatıldı",
|
||||
"pause_object": "Duraklat",
|
||||
"resume_object": "Devam ettir",
|
||||
"pause_until_prompt": "Bu nesnenin zamanlamalarını dondurur — devam ettirilene kadar hiçbir şeyin vadesi gelmez ve bildirim gönderilmez. İsteğe bağlı olarak bir otomatik devam tarihi ayarlayın.",
|
||||
"pause_until_label": "Devam tarihi (isteğe bağlı)",
|
||||
"object_paused": "Nesne duraklatıldı",
|
||||
"object_resumed": "Nesne devam ettirildi — zamanlamalar yeniden başlatıldı",
|
||||
"object_paused_badge": "Duraklatıldı",
|
||||
"paused_until_label": "şu tarihe kadar",
|
||||
"replace_object": "Değiştir…",
|
||||
"replace_object_prompt": "Bu nesneyi emekliye ayırın ve bir halef oluşturun. Geçmiş ve maliyetler eski nesnede arşivli kalır; görevler ve belgeler yenisine taşınır, sayaçlar sıfırdan başlar.",
|
||||
"replace_name_label": "Yeni nesne adı",
|
||||
"object_replaced": "Nesne değiştirildi — halefi oluşturuldu",
|
||||
"reading_unit_label": "Okuma birimi (örn. kWh, m³)",
|
||||
"reading_unit_help": "Bu görevi tamamlarken kaydedilen değerin yanında gösterilir.",
|
||||
"reading_value_label": "Okuma değeri",
|
||||
"reading_label": "Okuma",
|
||||
"settings_templates_label": "Şablon galerisi",
|
||||
"settings_templates_hint": "Asla ihtiyaç duymayacağınız şablonların işaretini kaldırın — \"Şablondan\" seçicilerinden (panel ve yapılandırma akışı) kaybolurlar. Başka hiçbir şey değişmez; istediğiniz zaman yeniden etkinleştirebilirsiniz.",
|
||||
"worksheet": "Çalışma sayfası",
|
||||
"worksheet_scan_view": "Görevi açmak için tarayın",
|
||||
"worksheet_scan_complete": "Tamamlamak için tarayın",
|
||||
"worksheet_manual_excerpt": "Kılavuz alıntısı",
|
||||
"worksheet_pages": "sayfa",
|
||||
"worksheet_printed": "Yazdırıldı",
|
||||
"worksheet_never": "Hiç",
|
||||
"card_all_caught_up": "Her şey tamam — ilgilenilmesi gereken bir şey yok",
|
||||
"postpone": "Ötele",
|
||||
"postpone_date_prompt": "Bu tekrar hangi tarihe ötelensin?",
|
||||
"postpone_date_label": "Yeni vade tarihi",
|
||||
"postponed": "Ötelendi",
|
||||
"postponed_to": "Şu tarihe ötelendi",
|
||||
"season_window_label": "Mevsim penceresi (aylar)",
|
||||
"season_window_hint": "Yalnızca seçili aylarda vadesi gelir; sezon dışı tarihler bir sonraki etkin aya kayar. Hiçbiri = tüm yıl.",
|
||||
"series_end_label": "Bitiş",
|
||||
"series_end_never": "Asla (süresiz tekrar eder)",
|
||||
"series_end_after_count": "Belirli bir sayıdan sonra",
|
||||
"series_end_until": "Bir tarihte",
|
||||
"series_end_count_label": "Tekrar sayısı",
|
||||
"series_end_until_label": "Bitiş tarihi",
|
||||
"parts_section": "Parçalar ve sarf malzemeleri",
|
||||
"part_add": "Parça ekle",
|
||||
"part_name": "Ad",
|
||||
"part_vendor": "Üretici",
|
||||
"part_storage_location": "Saklama yeri",
|
||||
"part_product_url": "Ürün URL'si",
|
||||
"part_unit": "Birim",
|
||||
"part_cost": "Birim fiyat",
|
||||
"part_stock": "Stok",
|
||||
"part_reorder_threshold": "Sipariş eşiği",
|
||||
"part_restock_quantity": "Stok yenileme miktarı",
|
||||
"part_auto_buy": "Azaldığında otomatik satın alma görevi oluştur",
|
||||
"part_restock": "Stoku ayarla",
|
||||
"restock_quantity_label": "Satın alınan miktar",
|
||||
"consumes_parts_label": "Parça tüketir",
|
||||
"parts_load_failed": "Bu nesnenin parçaları yüklenemedi — parça tüketimi seçenekleri şu anda kullanılamıyor.",
|
||||
"adopt_problem_button": "Sorun sensörlerini devral",
|
||||
"adopt_problem_title": "Sorun sensörlerini devral",
|
||||
"adopt_problem_hint": "HA sorun sensörlerini (yazıcı hataları, filtre uyarıları, düşük pil) sorun etkinken tetiklenen ve sorun çözülünce kendini temizleyen bakım görevlerine dönüştürün.",
|
||||
"adopt_problem_none": "Halihazırda takip edilmeyen sorun sensörü bulunamadı.",
|
||||
"adopt_problem_active": "etkin",
|
||||
"adopt_problem_ok": "tamam",
|
||||
"adopt_problem_new_object": "(yeni)",
|
||||
"adopt_problem_adopt": "Seçilenleri devral",
|
||||
"adopt_problem_done": "{tasks} sorun sensörü devralındı",
|
||||
"views_label": "Görünümler",
|
||||
"views_none": "— Görünüm yok —",
|
||||
"views_manage": "Görünümleri kaydet / yönet",
|
||||
"views_dialog_title": "Kayıtlı görünümler",
|
||||
"views_dialog_hint": "Geçerli filtreleri herkesin yeniden kullanabileceği adlandırılmış bir görünüm olarak kaydedin.",
|
||||
"views_name_placeholder": "Görünüm adı",
|
||||
"views_save_current": "Geçerli filtreleri kaydet",
|
||||
"views_none_yet": "Henüz kayıtlı görünüm yok.",
|
||||
"close": "Kapat",
|
||||
"trigger_hint_now": "Sensör şu anda {value} değerini okuyor.",
|
||||
"trigger_hint_above": "Görev, değer {target} üzerine çıktığında tetiklenir.",
|
||||
"trigger_hint_below": "Değer {target} altına düştüğünde tetiklenir.",
|
||||
"trigger_hint_counter_delta": "Mevcut okumadan ({value}) itibaren sayar: {due} değerinde vadesi gelir (+{target}) ve sayım her tamamlamadan sonra yeniden başlar.",
|
||||
"trigger_hint_counter_delta_edit": "Son tamamlamadan bu yana kullanımı sayar: +{target} sonrasında vadesi gelir; sayım her tamamlamadan sonra yeniden başlar.",
|
||||
"trigger_hint_counter_abs": "Sensör {target} değerine ulaştığında görevin vadesi gelir.",
|
||||
"trigger_hint_runtime": "Görevin vadesi, toplam {hours} saatlik çalışma süresinden sonra gelir; sayaç her tamamlamadan sonra yeniden başlar.",
|
||||
"trigger_hint_state_change": "Görevin vadesi {count} durum değişikliğinden sonra gelir.",
|
||||
"trigger_hint_state_change_to": "Görevin vadesi, “{state}” durumuna {count} geçişten sonra gelir.",
|
||||
"trigger_hint_state_now": "Mevcut durum: {value}.",
|
||||
"adopt_problem_part": "Kullanılan parça: {name}",
|
||||
"label_filter": "Etiket",
|
||||
"all_labels": "Tüm etiketler",
|
||||
"settings_notify_scope": "Yalnızca şu görünüm için bildir",
|
||||
"settings_notify_scope_all": "Tüm görevler",
|
||||
"settings_notify_scope_hint": "Yalnızca seçili kayıtlı görünümün etiket/kullanıcı filtreleriyle eşleşen görevler hatırlatma gönderir. Görünümün durum, sıralama ve gruplaması burada dikkate alınmaz.",
|
||||
"card_saved_view": "Kayıtlı görünüm",
|
||||
"card_saved_view_none": "Yok",
|
||||
"card_saved_view_help": "Görünümün durum, kullanıcı ve etiket filtrelerini yukarıdaki filtrelerin üzerine uygular. Görünümün sıralaması ve gruplaması panel görüntüleme ayarlarıdır ve kartta uygulanmaz.",
|
||||
"doc_part_none": "Bu parçaya bağlı belge yok.",
|
||||
"settings_templates_toggle_group": "Bu gruptaki tüm şablonları etkinleştir veya devre dışı bırak",
|
||||
"setups_button": "Önerilen kurulumlar",
|
||||
"setups_title": "Önerilen kurulumlar (Beta)",
|
||||
"setups_hint": "Sarf malzemesi sensörleri bakım görevlerini yönetebilecek, desteklenen entegrasyonlara ait cihazlar. Devralma, nesneyi oluşturur ve her görevi sensörüne bağlar — sarf malzemesi azalınca tetiklenir ve değişimden sonra kendini çözer.",
|
||||
"setups_none": "Bağlanmamış sarf malzemesi sensörü olan desteklenen cihaz bulunamadı.",
|
||||
"setups_adopt": "Seçilenleri kur",
|
||||
"setups_done": "{tasks} sensöre bağlı görev oluşturuldu.",
|
||||
"complete_parts_used": "Bu sefer kullanılan parçalar",
|
||||
"part_delete_confirm": "'{name}' parçası silinsin mi? Stok takibi, görev bağlantıları ve açık satın alma hatırlatmaları kaldırılacak.",
|
||||
"baseline_start_value": "Başlangıç okuması (isteğe bağlı)",
|
||||
"baseline_start_help": "Sayım bu okumadan başlar. Mevcut değerden saymak için boş bırakın; son servisteki okumayı girerseniz o zamandan beri olan kullanım da sayılır.",
|
||||
"setups_baseline_hint": "son servisteki okuma (isteğe bağlı)",
|
||||
"baseline_start_help_edit": "Mevcut sayımı korumak için boş bırakın. Bir değer girmek sayımı yeniden sabitler (örn. son servisteki okuma).",
|
||||
"baseline_current_effective": "Şu anda geçerli başlangıç değeri: {value}",
|
||||
"runtime_on_states": "Etkin durumlar (virgülle ayrılmış)",
|
||||
"runtime_on_states_help": "Çalışıyor sayılan durumlar — varsayılan: on. Örn. mowing, cleaning, printing. Bir öznitelik seçiliyse onun değerleri eşleştirilir.",
|
||||
"setups_target_new": "Yeni oluştur: {name}",
|
||||
"schedule_preview_title": "Sonraki tarihler",
|
||||
"schedule_preview_ontime": "Zamanında tamamlama varsayılarak.",
|
||||
"schedule_preview_ends": "(seri sona erer)",
|
||||
"adopt_problem_responsible": "Devralınan tüm görevler için sorumlu kullanıcı (isteğe bağlı)",
|
||||
"adopt_problem_configure": "Yapılandır",
|
||||
"history_auto": "Otomatik",
|
||||
"battery_fleet_title": "Pil filosu",
|
||||
"battery_fleet_none_low": "Tüm piller iyi durumda — değiştirilecek bir şey yok.",
|
||||
"battery_fleet_buy_now": "Şimdi satın al",
|
||||
"battery_fleet_soon": "Yakında gerekli",
|
||||
"battery_fleet_soon_hint": "Son değişim tarihinden tahmin edildi — önceden sipariş verin.",
|
||||
"battery_fleet_mark_all": "Tümünü değiştirildi olarak işaretle",
|
||||
"battery_fleet_mark_one": "Bu pili değiştirildi olarak işaretle",
|
||||
"battery_fleet_offline": "çevrimdışı",
|
||||
"battery_fleet_trigger_lost": "Bu görevin sensör tetikleyicisi kayboldu — tetiklenmeyecek ve otomatik tamamlanmayacak.",
|
||||
"battery_fleet_repair": "Onar",
|
||||
"battery_fleet_exclude": "Filodan hariç tut",
|
||||
"battery_fleet_excluded": "Hariç tutuldu",
|
||||
"battery_fleet_include": "Yeniden takip et",
|
||||
"battery_fleet_total": "{n} pil takip ediliyor",
|
||||
"battery_fleet_setup_button": "Pil filosu",
|
||||
"battery_fleet_setup_done": "Pil filosu kuruldu — tek bir görev tüm pillerinizi takip ediyor.",
|
||||
"update_banner": "Sunucuda Maintenance Supporter'ın daha yeni bir sürümü var — paneli güncellemek için sayfayı yeniden yükleyin.",
|
||||
"update_reload": "Yeniden yükle"
|
||||
}
|
||||
+125
@@ -0,0 +1,125 @@
|
||||
import{a as f}from"./chunk-Q7DQUCT7.js";import{a as h,b as o,d as b,e as m,f as g,g as n,h as _,i as a,k as v,s as p}from"./chunk-X7OW5OLQ.js";import{a as i}from"./chunk-PEGRBZWY.js";var s=class extends m{constructor(){super(...arguments);this._config={type:""};this._status=null;this._busy=!1;this._error="";this._localMonthly="";this._localYearly="";this._dirty=!1;this._loaded=!1}setConfig(t){this._config=t}getCardSize(){return 2}get _lang(){return this.hass?.language||"en"}get _isAdmin(){return this.hass?.user?.is_admin??!0}updated(t){super.updated(t),t.has("hass")&&this.hass&&!this._loaded&&(this._loaded=!0,this._load(),v(this._lang).then(()=>this.requestUpdate()))}async _load(){try{let t=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/budget_status"});this._status=t,this._localMonthly=t.monthly_budget?String(t.monthly_budget):"",this._localYearly=t.yearly_budget?String(t.yearly_budget):"",this._dirty=!1}catch(t){this._error=p(t,this._lang)}}async _save(){if(this._isAdmin){this._busy=!0,this._error="";try{let t=parseFloat(this._localMonthly),e=parseFloat(this._localYearly),r={};!isNaN(t)&&t>=0&&(r.budget_monthly=t),!isNaN(e)&&e>=0&&(r.budget_yearly=e),await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/global/update",settings:r}),await this._load()}catch(t){this._error=p(t,this._lang)}finally{this._busy=!1}}}_onDeepLink(){history.pushState(null,"","/maintenance-supporter?ms_action=open_budget"),window.dispatchEvent(new CustomEvent("location-changed"))}render(){let t=this._lang,e=this._status;if(!e)return o`<ha-card><div class="loading">${a("loading",t)||"Loading\u2026"}</div></ha-card>`;let r=e.currency_symbol||_,l=e.monthly_budget?Math.min(100,(e.monthly_spent||0)/e.monthly_budget*100):0,d=e.yearly_budget?Math.min(100,(e.yearly_spent||0)/e.yearly_budget*100):0,u=l>=100?"danger":l>=80?"warning":"ok",y=d>=100?"danger":d>=80?"warning":"ok";return o`
|
||||
<ha-card>
|
||||
<div class="card-content">
|
||||
<div class="header">
|
||||
<div class="title">
|
||||
<span class="emoji">💰</span>
|
||||
<span>${this._config.title||a("settings_budget",t)||"Budget"}</span>
|
||||
</div>
|
||||
<span class="currency">${r}</span>
|
||||
</div>
|
||||
|
||||
${this._error?o`<div class="error">${this._error}</div>`:b}
|
||||
|
||||
<div class="track">
|
||||
<div class="track-label-row">
|
||||
<label>${a("budget_monthly",t)||"Monthly"}</label>
|
||||
<span class="track-numbers ${u}">
|
||||
${(e.monthly_spent||0).toFixed(0)} / ${(e.monthly_budget||0).toFixed(0)} ${r}
|
||||
</span>
|
||||
</div>
|
||||
<div class="bar"><div class="bar-fill ${u}" style="width:${l}%"></div></div>
|
||||
</div>
|
||||
|
||||
<div class="track">
|
||||
<div class="track-label-row">
|
||||
<label>${a("budget_yearly",t)||"Yearly"}</label>
|
||||
<span class="track-numbers ${y}">
|
||||
${(e.yearly_spent||0).toFixed(0)} / ${(e.yearly_budget||0).toFixed(0)} ${r}
|
||||
</span>
|
||||
</div>
|
||||
<div class="bar"><div class="bar-fill ${y}" style="width:${d}%"></div></div>
|
||||
</div>
|
||||
|
||||
${this._isAdmin?o`
|
||||
<div class="inputs-row">
|
||||
<div class="input-field">
|
||||
<label>${a("budget_monthly_set",t)||"Set monthly"}</label>
|
||||
<div class="input-wrap">
|
||||
<input type="number" min="0" step="1"
|
||||
.value=${this._localMonthly}
|
||||
?disabled=${this._busy}
|
||||
@input=${c=>{this._localMonthly=c.target.value,this._dirty=!0}} />
|
||||
<span class="input-suffix">${r}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="input-field">
|
||||
<label>${a("budget_yearly_set",t)||"Set yearly"}</label>
|
||||
<div class="input-wrap">
|
||||
<input type="number" min="0" step="1"
|
||||
.value=${this._localYearly}
|
||||
?disabled=${this._busy}
|
||||
@input=${c=>{this._localYearly=c.target.value,this._dirty=!0}} />
|
||||
<span class="input-suffix">${r}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="actions">
|
||||
<button class="btn ${this._dirty?"primary":"muted"}"
|
||||
@click=${this._save}
|
||||
?disabled=${this._busy||!this._dirty}>
|
||||
<ha-icon icon="${this._dirty?"mdi:content-save":"mdi:check"}"></ha-icon>
|
||||
${this._dirty?a("save",t)||"Save":a("saved",t)||"Saved"}
|
||||
</button>
|
||||
<button class="btn link" @click=${this._onDeepLink}>
|
||||
${a("budget_advanced",t)||"Currency, alerts\u2026"}
|
||||
</button>
|
||||
</div>
|
||||
`:o`
|
||||
<button class="btn link" @click=${this._onDeepLink}>
|
||||
${a("budget_open_panel",t)||"Open in panel"}
|
||||
</button>
|
||||
`}
|
||||
</div>
|
||||
</ha-card>
|
||||
`}};s.styles=[f,h`
|
||||
.currency {
|
||||
font-size: 14px; font-weight: 600;
|
||||
color: var(--secondary-text-color);
|
||||
background: var(--secondary-background-color);
|
||||
padding: 2px 10px; border-radius: 999px;
|
||||
}
|
||||
.track { display: flex; flex-direction: column; gap: 4px; }
|
||||
.track-label-row {
|
||||
display: flex; align-items: center; justify-content: space-between;
|
||||
}
|
||||
.track-label-row label {
|
||||
font-size: 12px; color: var(--secondary-text-color);
|
||||
text-transform: uppercase; letter-spacing: 0.5px;
|
||||
}
|
||||
.track-numbers { font-size: 13px; font-weight: 600; }
|
||||
.track-numbers.ok { color: var(--primary-text-color); }
|
||||
.track-numbers.warning { color: #ff9800; }
|
||||
.track-numbers.danger { color: var(--error-color, #f44336); }
|
||||
.bar {
|
||||
height: 6px; background: var(--secondary-background-color);
|
||||
border-radius: 3px; overflow: hidden;
|
||||
}
|
||||
.bar-fill { height: 100%; transition: width 0.3s; border-radius: 3px; }
|
||||
.bar-fill.ok { background: var(--primary-color); }
|
||||
.bar-fill.warning { background: #ff9800; }
|
||||
.bar-fill.danger { background: var(--error-color, #f44336); }
|
||||
.inputs-row {
|
||||
display: grid; grid-template-columns: 1fr 1fr; gap: 8px;
|
||||
padding-top: 4px; border-top: 1px solid var(--divider-color);
|
||||
}
|
||||
.input-field { display: flex; flex-direction: column; gap: 4px; }
|
||||
.input-field label {
|
||||
font-size: 11px; color: var(--secondary-text-color);
|
||||
text-transform: uppercase; letter-spacing: 0.3px;
|
||||
}
|
||||
.input-wrap { position: relative; display: flex; align-items: center; }
|
||||
.input-wrap input {
|
||||
flex: 1; padding: 6px 32px 6px 8px; font-size: 13px;
|
||||
background: var(--secondary-background-color, #2c2c2c);
|
||||
color: var(--primary-text-color);
|
||||
border: 1px solid var(--divider-color); border-radius: 6px;
|
||||
font-family: inherit;
|
||||
}
|
||||
.input-suffix {
|
||||
position: absolute; right: 8px;
|
||||
color: var(--secondary-text-color); font-size: 13px;
|
||||
pointer-events: none;
|
||||
}
|
||||
.actions { display: flex; gap: 8px; align-items: center; }
|
||||
`],i([g({attribute:!1})],s.prototype,"hass",2),i([n()],s.prototype,"_config",2),i([n()],s.prototype,"_status",2),i([n()],s.prototype,"_busy",2),i([n()],s.prototype,"_error",2),i([n()],s.prototype,"_localMonthly",2),i([n()],s.prototype,"_localYearly",2),i([n()],s.prototype,"_dirty",2);customElements.get("maintenance-budget-section-card")||customElements.define("maintenance-budget-section-card",s);window.customCards=window.customCards||[];window.customCards.push({type:"maintenance-budget-section-card",name:"Maintenance Supporter \u2014 Budget",description:"Inline monthly + yearly budget editor",preview:!1});export{s as MaintenanceBudgetSectionCard};
|
||||
@@ -0,0 +1,59 @@
|
||||
import{a as r}from"./chunk-X7OW5OLQ.js";var a=r`
|
||||
ha-card { overflow: hidden; }
|
||||
.card-content {
|
||||
padding: 16px;
|
||||
display: flex; flex-direction: column;
|
||||
gap: 12px;
|
||||
}
|
||||
.header {
|
||||
display: flex; align-items: center; justify-content: space-between;
|
||||
gap: 12px;
|
||||
}
|
||||
.title {
|
||||
display: flex; align-items: center; gap: 8px;
|
||||
font-size: 16px; font-weight: 500;
|
||||
}
|
||||
.emoji { font-size: 20px; }
|
||||
|
||||
/* Button family — primary action / muted-saved-state / link / icon-with-text */
|
||||
.btn {
|
||||
padding: 6px 12px; font-size: 13px;
|
||||
border-radius: 6px; cursor: pointer;
|
||||
border: 1px solid var(--divider-color);
|
||||
background: var(--secondary-background-color, transparent);
|
||||
color: var(--primary-text-color);
|
||||
font-weight: 500;
|
||||
display: inline-flex; align-items: center; gap: 4px;
|
||||
}
|
||||
.btn:hover { background: var(--state-icon-color, rgba(255,255,255,0.06)); }
|
||||
.btn[disabled] { opacity: 0.5; cursor: not-allowed; }
|
||||
.btn.primary {
|
||||
background: var(--primary-color);
|
||||
color: var(--text-primary-color, white);
|
||||
border-color: var(--primary-color);
|
||||
}
|
||||
.btn.primary[disabled] { opacity: 0.6; }
|
||||
.btn.muted {
|
||||
background: transparent;
|
||||
color: var(--secondary-text-color);
|
||||
border-style: dashed;
|
||||
}
|
||||
.btn.muted[disabled] { opacity: 1; cursor: default; }
|
||||
.btn.muted ha-icon, .btn.primary ha-icon { --mdc-icon-size: 14px; }
|
||||
.btn.link {
|
||||
background: transparent; border: none; padding: 6px 4px;
|
||||
color: var(--primary-color); margin-left: auto;
|
||||
}
|
||||
.btn.link:hover { background: transparent; text-decoration: underline; }
|
||||
|
||||
/* Error + loading states */
|
||||
.error {
|
||||
padding: 8px; border-radius: 6px;
|
||||
background: rgba(211, 47, 47, 0.1);
|
||||
color: var(--error-color, #d32f2f); font-size: 13px;
|
||||
}
|
||||
.loading {
|
||||
padding: 24px; text-align: center;
|
||||
color: var(--secondary-text-color);
|
||||
}
|
||||
`;export{a};
|
||||
File diff suppressed because one or more lines are too long
+2374
File diff suppressed because one or more lines are too long
+136
@@ -0,0 +1,136 @@
|
||||
import{a as m}from"./chunk-Q7DQUCT7.js";import{a as u,b as s,d as l,e as h,f as g,g as o,i,k as _,s as p}from"./chunk-X7OW5OLQ.js";import{a}from"./chunk-PEGRBZWY.js";var e=class extends h{constructor(){super(...arguments);this._config={type:""};this._groups={};this._loaded=!1;this._busy=!1;this._error="";this._newName="";this._editingId=null;this._editingName="";this._hasInitiallyLoaded=!1}setConfig(t){this._config=t}getCardSize(){return 2}get _lang(){return this.hass?.language||"en"}get _isAdmin(){return this.hass?.user?.is_admin??!0}updated(t){super.updated(t),t.has("hass")&&this.hass&&!this._hasInitiallyLoaded&&(this._hasInitiallyLoaded=!0,this._load(),_(this._lang).then(()=>this.requestUpdate()))}async _load(){try{let t=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/groups"});this._groups=t.groups||{},this._loaded=!0}catch(t){this._error=p(t,this._lang)}}async _addGroup(){if(!this._isAdmin)return;let t=this._newName.trim();if(t){this._busy=!0,this._error="";try{await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/group/create",name:t}),this._newName="",await this._load()}catch(r){this._error=p(r,this._lang)}finally{this._busy=!1}}}_startEdit(t){this._editingId=t,this._editingName=this._groups[t]?.name||""}async _saveEdit(){if(!this._isAdmin||!this._editingId)return;let t=this._editingName.trim();if(t){this._busy=!0,this._error="";try{await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/group/update",group_id:this._editingId,name:t}),this._editingId=null,this._editingName="",await this._load()}catch(r){this._error=p(r,this._lang)}finally{this._busy=!1}}}async _deleteGroup(t,r){if(!this._isAdmin)return;let n=(i("group_delete_confirm",this._lang)||'Delete group "{name}"?').replace("{name}",r);if(window.confirm(n)){this._busy=!0;try{await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/group/delete",group_id:t}),await this._load()}catch(d){this._error=p(d,this._lang)}finally{this._busy=!1}}}_onDeepLink(){history.pushState(null,"","/maintenance-supporter?ms_action=open_groups"),window.dispatchEvent(new CustomEvent("location-changed"))}_onKeyDown(t,r){t.key==="Enter"?(t.preventDefault(),r()):t.key==="Escape"&&(t.preventDefault(),this._editingId=null,this._editingName="")}render(){let t=this._lang;if(!this._loaded)return s`<ha-card><div class="loading">${i("loading",t)||"Loading\u2026"}</div></ha-card>`;let r=Object.keys(this._groups);return s`
|
||||
<ha-card>
|
||||
<div class="card-content">
|
||||
<div class="header">
|
||||
<div class="title">
|
||||
<span class="emoji">🏷️</span>
|
||||
<span>${this._config.title||i("groups",t)||"Groups"}</span>
|
||||
<span class="count">${r.length}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
${this._error?s`<div class="error">${this._error}</div>`:l}
|
||||
|
||||
${r.length===0?s`<div class="empty">${i("groups_empty",t)||"No groups yet."}</div>`:s`
|
||||
<div class="group-list">
|
||||
${r.map(n=>{let d=this._groups[n],v=d.task_refs?.length??0,b=this._editingId===n;return s`
|
||||
<div class="group-row">
|
||||
${b?s`
|
||||
<input class="edit-input" type="text"
|
||||
.value=${this._editingName}
|
||||
?disabled=${this._busy}
|
||||
@input=${c=>{this._editingName=c.target.value}}
|
||||
@keydown=${c=>this._onKeyDown(c,this._saveEdit.bind(this))} />
|
||||
<button class="btn small primary"
|
||||
@click=${this._saveEdit}
|
||||
?disabled=${this._busy||!this._editingName.trim()}>
|
||||
${i("save",t)||"Save"}
|
||||
</button>
|
||||
<button class="btn small"
|
||||
@click=${()=>{this._editingId=null}}>
|
||||
${i("cancel",t)||"Cancel"}
|
||||
</button>
|
||||
`:s`
|
||||
<span class="group-name">${d.name||"Unnamed"}</span>
|
||||
<span class="task-count">${v}</span>
|
||||
${this._isAdmin?s`
|
||||
<button class="icon-btn"
|
||||
title="${i("edit",t)||"Edit"}"
|
||||
@click=${()=>this._startEdit(n)}
|
||||
?disabled=${this._busy}>
|
||||
<ha-icon icon="mdi:pencil"></ha-icon>
|
||||
</button>
|
||||
<button class="icon-btn danger"
|
||||
title="${i("delete",t)||"Delete"}"
|
||||
@click=${()=>this._deleteGroup(n,d.name||"Unnamed")}
|
||||
?disabled=${this._busy}>
|
||||
<ha-icon icon="mdi:delete"></ha-icon>
|
||||
</button>
|
||||
`:l}
|
||||
`}
|
||||
</div>
|
||||
`})}
|
||||
</div>
|
||||
`}
|
||||
|
||||
${this._isAdmin?s`
|
||||
<div class="add-row">
|
||||
<input type="text"
|
||||
placeholder="${i("group_new_placeholder",t)||"Add group\u2026"}"
|
||||
.value=${this._newName}
|
||||
?disabled=${this._busy}
|
||||
@input=${n=>{this._newName=n.target.value}}
|
||||
@keydown=${n=>this._onKeyDown(n,this._addGroup.bind(this))} />
|
||||
<button class="btn primary"
|
||||
@click=${this._addGroup}
|
||||
?disabled=${this._busy||!this._newName.trim()}>
|
||||
<ha-icon icon="mdi:plus"></ha-icon>
|
||||
${i("add",t)||"Add"}
|
||||
</button>
|
||||
</div>
|
||||
<button class="btn link" @click=${this._onDeepLink}>
|
||||
${i("groups_manage_tasks",t)||"Manage task assignments\u2026"}
|
||||
</button>
|
||||
`:s`
|
||||
<button class="btn link" @click=${this._onDeepLink}>
|
||||
${i("groups_open_panel",t)||"Open in panel"}
|
||||
</button>
|
||||
`}
|
||||
</div>
|
||||
</ha-card>
|
||||
`}};e.styles=[m,u`
|
||||
.count {
|
||||
font-size: 12px; color: var(--secondary-text-color);
|
||||
background: var(--secondary-background-color);
|
||||
padding: 2px 8px; border-radius: 999px;
|
||||
}
|
||||
.empty {
|
||||
padding: 16px; text-align: center;
|
||||
color: var(--secondary-text-color); font-style: italic;
|
||||
}
|
||||
.group-list { display: flex; flex-direction: column; gap: 4px; }
|
||||
.group-row {
|
||||
display: flex; align-items: center; gap: 8px;
|
||||
padding: 6px 8px; border-radius: 6px;
|
||||
background: var(--secondary-background-color, rgba(255,255,255,0.03));
|
||||
}
|
||||
.group-name { flex: 1; font-size: 14px; }
|
||||
.task-count {
|
||||
font-size: 11px; color: var(--secondary-text-color);
|
||||
background: var(--card-background-color, rgba(0,0,0,0.2));
|
||||
padding: 1px 8px; border-radius: 999px;
|
||||
font-weight: 500;
|
||||
}
|
||||
.edit-input {
|
||||
flex: 1; padding: 4px 8px; font-size: 14px;
|
||||
background: var(--card-background-color, #1c1c1c);
|
||||
color: var(--primary-text-color);
|
||||
border: 1px solid var(--primary-color); border-radius: 4px;
|
||||
font-family: inherit;
|
||||
}
|
||||
.icon-btn {
|
||||
background: transparent; border: none; cursor: pointer;
|
||||
color: var(--secondary-text-color); padding: 4px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
.icon-btn:hover {
|
||||
background: var(--state-icon-color, rgba(255,255,255,0.06));
|
||||
color: var(--primary-text-color);
|
||||
}
|
||||
.icon-btn.danger:hover { color: var(--error-color); }
|
||||
.icon-btn ha-icon { --mdc-icon-size: 18px; }
|
||||
.add-row {
|
||||
display: flex; gap: 6px;
|
||||
padding-top: 8px; border-top: 1px solid var(--divider-color);
|
||||
}
|
||||
.add-row input {
|
||||
flex: 1; padding: 6px 8px; font-size: 13px;
|
||||
background: var(--secondary-background-color, #2c2c2c);
|
||||
color: var(--primary-text-color);
|
||||
border: 1px solid var(--divider-color); border-radius: 6px;
|
||||
font-family: inherit;
|
||||
}
|
||||
/* Card-specific overrides on the shared .btn */
|
||||
.btn.small { padding: 4px 8px; font-size: 12px; }
|
||||
.btn ha-icon { --mdc-icon-size: 16px; }
|
||||
`],a([g({attribute:!1})],e.prototype,"hass",2),a([o()],e.prototype,"_config",2),a([o()],e.prototype,"_groups",2),a([o()],e.prototype,"_loaded",2),a([o()],e.prototype,"_busy",2),a([o()],e.prototype,"_error",2),a([o()],e.prototype,"_newName",2),a([o()],e.prototype,"_editingId",2),a([o()],e.prototype,"_editingName",2);customElements.get("maintenance-groups-section-card")||customElements.define("maintenance-groups-section-card",e);window.customCards=window.customCards||[];window.customCards.push({type:"maintenance-groups-section-card",name:"Maintenance Supporter \u2014 Groups",description:"Inline group CRUD",preview:!1});export{e as MaintenanceGroupsSectionCard};
|
||||
+121
@@ -0,0 +1,121 @@
|
||||
import{a as m}from"./chunk-Q7DQUCT7.js";import{a as h,b as n,d as c,e as _,f as v,g as r,i as e,k as f,s as l}from"./chunk-X7OW5OLQ.js";import{a as i}from"./chunk-PEGRBZWY.js";var a=class extends _{constructor(){super(...arguments);this._config={type:""};this._state=null;this._busy=!1;this._error="";this._localStart="";this._localEnd="";this._localBuffer=7;this._dirty=!1;this._loaded=!1}setConfig(t){this._config=t}getCardSize(){return 2}get _lang(){return this.hass?.language||"en"}get _isAdmin(){return this.hass?.user?.is_admin??!0}updated(t){super.updated(t),t.has("hass")&&this.hass&&!this._loaded&&(this._loaded=!0,this._load(),f(this._lang).then(()=>this.requestUpdate()))}async _load(){try{let t=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/vacation/state"});this._state=t,this._localStart=t.start||"",this._localEnd=t.end||"",this._localBuffer=t.buffer_days??7,this._dirty=!1}catch(t){this._error=l(t,this._lang)}}async _toggleEnabled(t){this._busy=!0,this._error="";try{let s=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/vacation/update",enabled:t});this._state=s}catch(s){this._error=l(s,this._lang)}finally{this._busy=!1}}async _save(){if(this._isAdmin){this._busy=!0,this._error="";try{let t=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/vacation/update",start:this._localStart||null,end:this._localEnd||null,buffer_days:this._localBuffer});this._state=t,this._dirty=!1}catch(t){this._error=l(t,this._lang)}finally{this._busy=!1}}}async _endNow(){if(this._isAdmin&&window.confirm(e("vacation_end_now_confirm",this._lang)||"End vacation immediately?")){this._busy=!0;try{let t=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/vacation/end_now"});this._state=t,this._localStart=t.start||"",this._localEnd=t.end||""}catch(t){this._error=l(t,this._lang)}finally{this._busy=!1}}}_onDeepLink(){history.pushState(null,"","/maintenance-supporter?ms_action=open_vacation"),window.dispatchEvent(new CustomEvent("location-changed"))}render(){let t=this._lang,s=this._state;if(!s)return n`<ha-card><div class="loading">${e("loading",t)||"Loading\u2026"}</div></ha-card>`;let p=s.is_active===!0,d=s.enabled===!0,u=s.exempt_task_ids?.length??0,b=p?e("vacation_status_active",t)||"Active now":d?e("vacation_status_scheduled",t)||"Scheduled":e("vacation_status_inactive",t)||"Inactive",g=p?"active":d?"scheduled":"inactive";return n`
|
||||
<ha-card>
|
||||
<div class="card-content">
|
||||
<div class="header">
|
||||
<div class="title">
|
||||
<span class="emoji">🏖️</span>
|
||||
<span>${this._config.title||e("vacation_mode",t)||"Vacation mode"}</span>
|
||||
</div>
|
||||
<span class="status-pill ${g}">${b}</span>
|
||||
</div>
|
||||
|
||||
${this._error?n`<div class="error">${this._error}</div>`:c}
|
||||
|
||||
${this._isAdmin?n`
|
||||
<div class="row toggle-row">
|
||||
<label>${e("enable",t)||"Enable"}</label>
|
||||
<ha-switch
|
||||
.checked=${d}
|
||||
.disabled=${this._busy}
|
||||
@change=${o=>this._toggleEnabled(o.target.checked)}
|
||||
></ha-switch>
|
||||
</div>
|
||||
|
||||
<div class="dates-row">
|
||||
<div class="date-field">
|
||||
<label>${e("vacation_start",t)||"Start"}</label>
|
||||
<input type="date" .value=${this._localStart}
|
||||
?disabled=${this._busy}
|
||||
@input=${o=>{this._localStart=o.target.value,this._dirty=!0}} />
|
||||
</div>
|
||||
<div class="date-field">
|
||||
<label>${e("vacation_end",t)||"End"}</label>
|
||||
<input type="date" .value=${this._localEnd}
|
||||
?disabled=${this._busy}
|
||||
@input=${o=>{this._localEnd=o.target.value,this._dirty=!0}} />
|
||||
</div>
|
||||
<div class="date-field buffer">
|
||||
<label>${e("vacation_buffer",t)||"Buffer days"}</label>
|
||||
<input type="number" min="0" max="14"
|
||||
.value=${String(this._localBuffer)}
|
||||
?disabled=${this._busy}
|
||||
@input=${o=>{this._localBuffer=parseInt(o.target.value,10)||0,this._dirty=!0}} />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="actions">
|
||||
<button class="btn ${this._dirty?"primary":"muted"}"
|
||||
@click=${this._save}
|
||||
?disabled=${this._busy||!this._dirty}>
|
||||
<ha-icon icon="${this._dirty?"mdi:content-save":"mdi:check"}"></ha-icon>
|
||||
${this._dirty?e("save",t)||"Save":e("saved",t)||"Saved"}
|
||||
</button>
|
||||
${p?n`<button class="btn"
|
||||
@click=${this._endNow}
|
||||
?disabled=${this._busy}>
|
||||
${e("vacation_end_now",t)||"End now"}
|
||||
</button>`:c}
|
||||
${u>0?n`<button class="btn link"
|
||||
@click=${this._onDeepLink}>
|
||||
${u} ${e("vacation_exempt_count",t)||"exempt"}…
|
||||
</button>`:n`<button class="btn link"
|
||||
@click=${this._onDeepLink}>
|
||||
${e("vacation_advanced",t)||"Advanced\u2026"}
|
||||
</button>`}
|
||||
</div>
|
||||
`:n`
|
||||
<div class="readonly">
|
||||
${d&&s.start&&s.end?n`<div>${s.start} → ${s.end}</div>`:c}
|
||||
<button class="btn link" @click=${this._onDeepLink}>
|
||||
${e("vacation_open_panel",t)||"Open in panel"}
|
||||
</button>
|
||||
</div>
|
||||
`}
|
||||
</div>
|
||||
</ha-card>
|
||||
`}};a.styles=[m,h`
|
||||
.status-pill {
|
||||
font-size: 11px; font-weight: 600;
|
||||
padding: 3px 8px; border-radius: 999px;
|
||||
text-transform: uppercase; letter-spacing: 0.5px;
|
||||
}
|
||||
.status-pill.active {
|
||||
background: rgba(76, 175, 80, 0.15);
|
||||
color: #4caf50;
|
||||
}
|
||||
.status-pill.scheduled {
|
||||
background: rgba(255, 152, 0, 0.15);
|
||||
color: #ff9800;
|
||||
}
|
||||
.status-pill.inactive {
|
||||
background: rgba(158, 158, 158, 0.15);
|
||||
color: var(--secondary-text-color);
|
||||
}
|
||||
.row.toggle-row {
|
||||
display: flex; align-items: center; justify-content: space-between;
|
||||
}
|
||||
.row.toggle-row label {
|
||||
font-size: 14px; color: var(--primary-text-color);
|
||||
}
|
||||
.dates-row {
|
||||
display: grid; grid-template-columns: 1fr 1fr 100px; gap: 10px;
|
||||
}
|
||||
.date-field.buffer label { white-space: nowrap; }
|
||||
.date-field { display: flex; flex-direction: column; gap: 4px; }
|
||||
.date-field label {
|
||||
font-size: 11px; color: var(--secondary-text-color);
|
||||
text-transform: uppercase; letter-spacing: 0.3px;
|
||||
}
|
||||
.date-field input {
|
||||
padding: 6px 8px; font-size: 13px;
|
||||
background: var(--secondary-background-color, #2c2c2c);
|
||||
color: var(--primary-text-color);
|
||||
border: 1px solid var(--divider-color); border-radius: 6px;
|
||||
font-family: inherit;
|
||||
}
|
||||
.date-field input:disabled { opacity: 0.5; cursor: not-allowed; }
|
||||
.actions {
|
||||
display: flex; gap: 8px; align-items: center; flex-wrap: wrap;
|
||||
}
|
||||
.readonly { display: flex; flex-direction: column; gap: 8px; }
|
||||
`],i([v({attribute:!1})],a.prototype,"hass",2),i([r()],a.prototype,"_config",2),i([r()],a.prototype,"_state",2),i([r()],a.prototype,"_busy",2),i([r()],a.prototype,"_error",2),i([r()],a.prototype,"_localStart",2),i([r()],a.prototype,"_localEnd",2),i([r()],a.prototype,"_localBuffer",2),i([r()],a.prototype,"_dirty",2);customElements.get("maintenance-vacation-section-card")||customElements.define("maintenance-vacation-section-card",a);window.customCards=window.customCards||[];window.customCards.push({type:"maintenance-vacation-section-card",name:"Maintenance Supporter \u2014 Vacation",description:"Inline vacation mode toggle + dates",preview:!1});export{a as MaintenanceVacationSectionCard};
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,671 @@
|
||||
/**
|
||||
* TaskMate Routine Card (#676)
|
||||
*
|
||||
* A guided, one-task-at-a-time flow for morning and bedtime routines. The
|
||||
* child card is a checklist — good for scanning, poor for a five-year-old
|
||||
* being walked through getting ready. This shows a single task at a time with
|
||||
* a big Done button, a progress bar, and a celebration at the end.
|
||||
*
|
||||
* Availability comes from the backend's own chore_availability matrix rather
|
||||
* than a re-implementation of the child card's filter, so the weather gate,
|
||||
* reactive deadlines, dependencies and rotation are all honoured for free.
|
||||
*
|
||||
* Version: 1.0.0
|
||||
*/
|
||||
|
||||
const LitElement = customElements.get("hui-masonry-view")
|
||||
? Object.getPrototypeOf(customElements.get("hui-masonry-view"))
|
||||
: Object.getPrototypeOf(customElements.get("hui-view"));
|
||||
|
||||
const html = LitElement.prototype.html;
|
||||
const css = LitElement.prototype.css;
|
||||
|
||||
const _safeColor = (c, d) => (typeof c === "string" && /^#[0-9a-fA-F]{3,8}$/.test(c) ? c : d);
|
||||
|
||||
const TIME_CATEGORIES = ["all", "morning", "afternoon", "evening", "night", "anytime"];
|
||||
|
||||
// The card has ONE layout, so it consumes the design tokens directly rather
|
||||
// than carrying a second _renderDesigned() template like the multi-layout
|
||||
// cards do. Every --tmd-* reference below is written with the card's original
|
||||
// value as the fallback, so "classic" — which defines no tokens — renders
|
||||
// exactly as it did before the design system was wired in.
|
||||
const DEFAULT_ACCENT = "#7c3aed";
|
||||
|
||||
class TaskMateRoutineCard extends LitElement {
|
||||
static get properties() {
|
||||
return {
|
||||
hass: { type: Object },
|
||||
config: { type: Object },
|
||||
_index: { type: Number },
|
||||
_finished: { type: Boolean },
|
||||
_busy: { type: Boolean },
|
||||
};
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
this._index = 0;
|
||||
this._finished = false;
|
||||
this._busy = false;
|
||||
// Chores completed during THIS run, so the finish screen can total what
|
||||
// was just earned rather than everything the child has done today.
|
||||
this._runCompleted = new Map();
|
||||
// Tasks the child chose to leave for later. Kept for this run only.
|
||||
this._skipped = new Set();
|
||||
}
|
||||
|
||||
setConfig(config) {
|
||||
if (!config.entity) throw new Error("You need to define an entity");
|
||||
if (!config.child_id) throw new Error("You need to define a child_id");
|
||||
if (config.time_category && !TIME_CATEGORIES.includes(config.time_category)) {
|
||||
throw new Error(`time_category must be one of: ${TIME_CATEGORIES.join(", ")}`);
|
||||
}
|
||||
this.config = config;
|
||||
}
|
||||
|
||||
getCardSize() { return 8; }
|
||||
|
||||
static getStubConfig() {
|
||||
return { entity: "sensor.taskmate_overview", child_id: "", time_category: "morning" };
|
||||
}
|
||||
|
||||
shouldUpdate(changedProps) {
|
||||
if (changedProps.has("hass")) {
|
||||
return window.__taskmate_hasChanged
|
||||
? window.__taskmate_hasChanged(changedProps.get("hass"), this.hass, this.config?.entity)
|
||||
: true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
_t(key, params) {
|
||||
const fn = window.__taskmate_localize;
|
||||
return fn ? fn(this.hass, key, params) : key;
|
||||
}
|
||||
|
||||
_attrs() {
|
||||
return (window.__taskmate_attrs && window.__taskmate_attrs(this.hass, this.config.entity))
|
||||
|| this.hass?.states?.[this.config.entity]?.attributes || {};
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolve the active design, stamp data-tm-design on the host (which is what
|
||||
* makes the :host-scoped token block apply inside this shadow root), and
|
||||
* settle the header colour.
|
||||
*
|
||||
* The accent is set as an inline property on the host rather than from a
|
||||
* <style> in the template: a shadow tree's <style> is ordered BEFORE
|
||||
* adoptedStyleSheets, so it loses to the :host default in static styles()
|
||||
* at equal specificity. An element's own inline property beats both.
|
||||
* An explicit header_color always wins; otherwise the rule in styles()
|
||||
* takes the design's accent, falling back to the card's purple in classic.
|
||||
* Headers stay full-colour in every style per the house rule.
|
||||
*/
|
||||
_applyDesign() {
|
||||
const design = window.__taskmate_design
|
||||
? window.__taskmate_design.apply(this, this.hass, this.config, this.config.entity)
|
||||
: "classic";
|
||||
const configured = this.config.header_color;
|
||||
if (typeof configured === "string" && /^#[0-9a-fA-F]{3,8}$/.test(configured)) {
|
||||
this.style.setProperty("--routine-accent", _safeColor(configured, DEFAULT_ACCENT));
|
||||
} else {
|
||||
this.style.removeProperty("--routine-accent");
|
||||
}
|
||||
return design;
|
||||
}
|
||||
|
||||
_child() {
|
||||
const attrs = this._attrs();
|
||||
return (attrs.children || []).find(c => String(c.id) === String(this.config.child_id));
|
||||
}
|
||||
|
||||
/**
|
||||
* The routine's task list: chores the backend says are available to this
|
||||
* child, in the child's configured order, filtered to the card's period.
|
||||
* Chores completed during this run stay in the list (so the progress bar
|
||||
* doesn't jump around) but are marked done.
|
||||
*/
|
||||
_tasks() {
|
||||
const attrs = this._attrs();
|
||||
const child = this._child();
|
||||
if (!child) return [];
|
||||
|
||||
const childId = String(child.id);
|
||||
const availability = attrs.chore_availability || {};
|
||||
const period = this.config.time_category || "all";
|
||||
|
||||
const completedToday = new Set(
|
||||
(attrs.todays_completions || [])
|
||||
.filter(c => String(c.child_id) === childId && !c.bonus_subtask_id)
|
||||
.map(c => String(c.chore_id))
|
||||
);
|
||||
|
||||
const order = (child.chore_order || []).map(String);
|
||||
const list = (attrs.chores || []).filter(chore => {
|
||||
const id = String(chore.id);
|
||||
// Anything finished in this run stays visible as a completed step.
|
||||
if (this._runCompleted.has(id)) return true;
|
||||
if (!availability[id] || availability[id][childId] !== true) return false;
|
||||
if (completedToday.has(id)) return false;
|
||||
if (period !== "all" && chore.time_category !== period) return false;
|
||||
return true;
|
||||
});
|
||||
|
||||
list.sort((a, b) => {
|
||||
const ai = order.indexOf(String(a.id));
|
||||
const bi = order.indexOf(String(b.id));
|
||||
if (ai !== -1 && bi !== -1) return ai - bi;
|
||||
if (ai !== -1) return -1;
|
||||
if (bi !== -1) return 1;
|
||||
return String(a.name).localeCompare(String(b.name));
|
||||
});
|
||||
return list;
|
||||
}
|
||||
|
||||
_pointsFor(chore) {
|
||||
return chore.effective_points ?? chore.points ?? 0;
|
||||
}
|
||||
|
||||
async _complete(chore) {
|
||||
if (this._busy) return;
|
||||
const child = this._child();
|
||||
if (!child) return;
|
||||
this._busy = true;
|
||||
try {
|
||||
// Prefer the per-chore button entity so HA state-trigger automations
|
||||
// fire, exactly as the child card does. Fall back to the service when
|
||||
// the entity isn't registered yet (e.g. right after a restart).
|
||||
const buttonEntityId = window.__taskmate_find_button
|
||||
&& window.__taskmate_find_button(this.hass, child.id, "complete", chore.id);
|
||||
if (buttonEntityId) {
|
||||
await this.hass.callService("button", "press", { entity_id: buttonEntityId });
|
||||
} else {
|
||||
await this.hass.callService("taskmate", "complete_chore", {
|
||||
chore_id: chore.id, child_id: child.id,
|
||||
});
|
||||
}
|
||||
this._runCompleted.set(String(chore.id), {
|
||||
points: this._pointsFor(chore),
|
||||
pending: chore.requires_approval !== false,
|
||||
});
|
||||
// Skipped then done later is not "left for later" — otherwise the finish
|
||||
// screen claims tasks are outstanding that the child actually did.
|
||||
this._skipped.delete(String(chore.id));
|
||||
this._advance();
|
||||
} catch (err) {
|
||||
// Surface rather than silently stalling the routine on a failed call.
|
||||
this.dispatchEvent(new CustomEvent("hass-notification", {
|
||||
detail: { message: String(err?.message || err) }, bubbles: true, composed: true,
|
||||
}));
|
||||
} finally {
|
||||
this._busy = false;
|
||||
this.requestUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
_advance() {
|
||||
const total = this._tasks().length;
|
||||
if (this._index >= total - 1) {
|
||||
this._finished = true;
|
||||
} else {
|
||||
this._index = this._index + 1;
|
||||
}
|
||||
this.requestUpdate();
|
||||
}
|
||||
|
||||
_skip() {
|
||||
const tasks = this._tasks();
|
||||
const chore = tasks[this._index];
|
||||
if (chore) this._skipped.add(String(chore.id));
|
||||
this._advance();
|
||||
}
|
||||
|
||||
_back() {
|
||||
if (this._finished) { this._finished = false; return; }
|
||||
if (this._index > 0) this._index = this._index - 1;
|
||||
this.requestUpdate();
|
||||
}
|
||||
|
||||
_restart() {
|
||||
this._index = 0;
|
||||
this._finished = false;
|
||||
this._runCompleted = new Map();
|
||||
this._skipped = new Set();
|
||||
this.requestUpdate();
|
||||
}
|
||||
|
||||
render() {
|
||||
if (!this.hass || !this.config) return html``;
|
||||
this._applyDesign();
|
||||
const child = this._child();
|
||||
if (!child) {
|
||||
return html`<ha-card><div class="pad error">${this._t("routine.no_child")}</div></ha-card>`;
|
||||
}
|
||||
|
||||
const attrs = this._attrs();
|
||||
const pointsIcon = attrs.points_icon || "mdi:star";
|
||||
const tasks = this._tasks();
|
||||
const title = this.config.title || this._t("routine.title", { name: child.name });
|
||||
|
||||
if (!tasks.length) return this._renderEmpty(title);
|
||||
if (this._finished) return this._renderFinished(title, tasks, pointsIcon, child);
|
||||
|
||||
// Guard against the list shrinking underneath us (a parent ticking a chore
|
||||
// off elsewhere) — clamp rather than render undefined.
|
||||
const index = Math.min(this._index, tasks.length - 1);
|
||||
const chore = tasks[index];
|
||||
const done = this._runCompleted.get(String(chore.id));
|
||||
const pct = Math.round((index / tasks.length) * 100);
|
||||
|
||||
return html`
|
||||
<ha-card>
|
||||
<div class="head">
|
||||
<span class="who">${title}</span>
|
||||
</div>
|
||||
|
||||
<div class="progress">
|
||||
<div class="rt-bar"><i style="width:${pct}%"></i></div>
|
||||
<div class="count">${this._t("routine.task_of", { current: index + 1, total: tasks.length })}</div>
|
||||
</div>
|
||||
|
||||
<div class="dots">
|
||||
${tasks.map((t, i) => html`
|
||||
<span class="dot ${this._runCompleted.has(String(t.id)) ? "done" : ""} ${i === index ? "now" : ""}"></span>
|
||||
`)}
|
||||
</div>
|
||||
|
||||
<div class="body">
|
||||
<div class="icon"><ha-icon icon="${chore.icon || "mdi:checkbox-marked-circle-outline"}"></ha-icon></div>
|
||||
<div class="task">${chore.name}</div>
|
||||
${chore.description ? html`<div class="desc">${chore.description}</div>` : ""}
|
||||
<div class="points">
|
||||
<ha-icon icon="${pointsIcon}"></ha-icon> +${this._pointsFor(chore)}
|
||||
</div>
|
||||
${done?.pending ? html`<div class="pending">${this._t("routine.waiting_for_parent")}</div>` : ""}
|
||||
${chore.require_photo ? html`<div class="note">${this._t("routine.photo_note")}</div>` : ""}
|
||||
</div>
|
||||
|
||||
<div class="foot">
|
||||
${done
|
||||
? html`<button class="rt-btn rt-done is-done" disabled>
|
||||
${done.pending ? this._t("routine.sent_for_checking") : this._t("routine.completed")}
|
||||
</button>`
|
||||
: html`<button class="rt-btn rt-done" ?disabled=${this._busy}
|
||||
@click=${() => this._complete(chore)}>
|
||||
${this._t("routine.done")}
|
||||
</button>`}
|
||||
<div class="rt-row">
|
||||
<button class="rt-btn rt-back" ?disabled=${index === 0} @click=${this._back}>
|
||||
${this._t("routine.back")}
|
||||
</button>
|
||||
<button class="rt-btn rt-skip" @click=${this._skip}>
|
||||
${done ? this._t("routine.next") : this._t("routine.skip")}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</ha-card>
|
||||
`;
|
||||
}
|
||||
|
||||
_renderEmpty(title) {
|
||||
return html`
|
||||
<ha-card>
|
||||
<div class="head"><span class="who">${title}</span></div>
|
||||
<div class="empty">
|
||||
<ha-icon icon="mdi:check-circle-outline"></ha-icon>
|
||||
<h2>${this._t("routine.empty_title")}</h2>
|
||||
<p>${this._t("routine.empty_body")}</p>
|
||||
</div>
|
||||
</ha-card>
|
||||
`;
|
||||
}
|
||||
|
||||
_renderFinished(title, tasks, pointsIcon, child) {
|
||||
let earned = 0;
|
||||
let pending = 0;
|
||||
for (const entry of this._runCompleted.values()) {
|
||||
if (entry.pending) pending += entry.points; else earned += entry.points;
|
||||
}
|
||||
const skipped = this._skipped.size;
|
||||
|
||||
return html`
|
||||
<ha-card>
|
||||
<div class="head"><span class="who">${title}</span></div>
|
||||
<div class="progress">
|
||||
<div class="rt-bar"><i class="full" style="width:100%"></i></div>
|
||||
<div class="count">${this._t("routine.all_done_count", { total: tasks.length })}</div>
|
||||
</div>
|
||||
<div class="finished">
|
||||
<div class="cheer">🎉</div>
|
||||
<h2>${this._t("routine.finished_title")}</h2>
|
||||
<p>${this._t("routine.finished_body", { name: child.name })}</p>
|
||||
${earned > 0 ? html`
|
||||
<div class="earned"><ha-icon icon="${pointsIcon}"></ha-icon> ${this._t("routine.earned", { points: earned })}</div>
|
||||
` : ""}
|
||||
${pending > 0 ? html`
|
||||
<div class="earned pending-total">${this._t("routine.awaiting_points", { points: pending })}</div>
|
||||
` : ""}
|
||||
${skipped > 0 ? html`
|
||||
<p class="skipped">${this._t("routine.skipped_note", { count: skipped })}</p>
|
||||
` : ""}
|
||||
</div>
|
||||
<div class="foot">
|
||||
<button class="rt-btn rt-done" @click=${this._restart}>${this._t("routine.start_again")}</button>
|
||||
</div>
|
||||
</ha-card>
|
||||
`;
|
||||
}
|
||||
|
||||
static get styles() {
|
||||
// Layout classes carry an rt- prefix because the shared design kit defines
|
||||
// its own .btn and .bar, and its :host([data-tm-design=...]) .btn rules
|
||||
// outrank a bare .btn-done here — which repainted the green Done button
|
||||
// with the console gradient and gave Skip equal visual weight.
|
||||
const base = css`
|
||||
:host { display: block; --routine-accent: var(--tmd-accent, #7c3aed); }
|
||||
ha-card {
|
||||
overflow: hidden;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
min-height: 460px;
|
||||
font-family: var(--tmd-font-body, inherit);
|
||||
background: var(--tmd-surface, var(--ha-card-background, var(--card-background-color, #fff)));
|
||||
color: var(--tmd-text, var(--primary-text-color));
|
||||
border-radius: var(--tmd-radius, var(--ha-card-border-radius, 12px));
|
||||
}
|
||||
.head {
|
||||
background: var(--routine-accent);
|
||||
color: var(--tmd-hd-text, #fff);
|
||||
padding: 16px 20px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
}
|
||||
.who {
|
||||
font-weight: 800; font-size: 17px; flex: 1;
|
||||
font-family: var(--tmd-font-display, inherit);
|
||||
}
|
||||
|
||||
.progress { padding: 14px 20px 0; }
|
||||
.rt-bar {
|
||||
height: 8px;
|
||||
border-radius: 99px;
|
||||
background: var(--tmd-surface-2, var(--divider-color, #e5e7eb));
|
||||
border: 1px solid var(--tmd-border, transparent);
|
||||
box-sizing: border-box;
|
||||
overflow: hidden;
|
||||
}
|
||||
.rt-bar > i {
|
||||
display: block;
|
||||
height: 100%;
|
||||
border-radius: 99px;
|
||||
background: var(--routine-accent);
|
||||
transition: width 0.25s ease;
|
||||
}
|
||||
.rt-bar > i.full { background: var(--tmd-good, var(--success-color, #16a34a)); }
|
||||
.count {
|
||||
font-size: 12.5px;
|
||||
color: var(--tmd-dim, var(--secondary-text-color));
|
||||
margin-top: 7px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.dots {
|
||||
display: flex;
|
||||
gap: 6px;
|
||||
justify-content: center;
|
||||
padding: 10px 20px 0;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.dot {
|
||||
width: 9px; height: 9px;
|
||||
border-radius: 50%;
|
||||
background: var(--tmd-surface-2, var(--divider-color, #e5e7eb));
|
||||
/* Transparent under classic, so the outline only appears in the
|
||||
designed styles — it is what keeps the steps distinguishable in
|
||||
accessible, where meaning must not rest on hue alone. */
|
||||
border: 1px solid var(--tmd-border, transparent);
|
||||
box-sizing: border-box;
|
||||
transition: transform 0.2s ease;
|
||||
}
|
||||
.dot.done { background: var(--tmd-good, var(--success-color, #16a34a)); }
|
||||
.dot.now { background: var(--routine-accent); transform: scale(1.35); }
|
||||
|
||||
.body {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
text-align: center;
|
||||
padding: 20px 26px 8px;
|
||||
gap: 14px;
|
||||
}
|
||||
.icon {
|
||||
width: 128px; height: 128px;
|
||||
border-radius: var(--tmd-radius, 34px);
|
||||
background: color-mix(in srgb, var(--routine-accent), transparent 88%);
|
||||
display: grid;
|
||||
place-items: center;
|
||||
color: var(--routine-accent);
|
||||
}
|
||||
.icon ha-icon { --mdc-icon-size: 64px; }
|
||||
.task {
|
||||
font-size: 27px; font-weight: 800; line-height: 1.2;
|
||||
font-family: var(--tmd-font-display, inherit);
|
||||
}
|
||||
.desc {
|
||||
font-size: 14.5px; line-height: 1.45;
|
||||
color: var(--tmd-dim, var(--secondary-text-color));
|
||||
}
|
||||
.points {
|
||||
display: inline-flex; align-items: center; gap: 6px;
|
||||
background: color-mix(in srgb, var(--tmd-warn, #f59e0b) 16%, transparent);
|
||||
color: var(--tmd-gold, #92400e);
|
||||
padding: 5px 13px; border-radius: 99px;
|
||||
font-weight: 800; font-size: 14px;
|
||||
}
|
||||
.points ha-icon { --mdc-icon-size: 17px; }
|
||||
.pending {
|
||||
display: inline-flex; align-items: center; gap: 6px;
|
||||
background: color-mix(in srgb, var(--tmd-bad, #f97316) 12%, transparent);
|
||||
color: var(--tmd-bad, #9a3412);
|
||||
border: 1px solid color-mix(in srgb, var(--tmd-bad, #f97316) 35%, transparent);
|
||||
padding: 5px 12px; border-radius: 99px;
|
||||
font-weight: 700; font-size: 12.5px;
|
||||
}
|
||||
.note { font-size: 12.5px; color: var(--tmd-dim, var(--secondary-text-color)); }
|
||||
|
||||
.foot { padding: 14px 20px 20px; display: flex; flex-direction: column; gap: 10px; }
|
||||
.rt-btn {
|
||||
border: 0; border-radius: var(--tmd-radius-sm, 16px);
|
||||
font-family: var(--tmd-font-display, inherit); font-weight: 800;
|
||||
width: 100%; cursor: pointer;
|
||||
}
|
||||
.rt-btn:disabled { cursor: default; }
|
||||
.rt-done {
|
||||
background: var(--tmd-good, var(--success-color, #16a34a));
|
||||
color: #fff; padding: 19px; font-size: 19px;
|
||||
}
|
||||
/* The shared kit renders a "good" button as dark ink on the good colour
|
||||
(.btn.good in taskmate-design.js). Matching it here matters beyond
|
||||
consistency: on the accessible palette's #009E73, dark ink measures
|
||||
4.2:1 against white's 3.4:1. */
|
||||
:host([data-tm-design]:not([data-tm-design="classic"])) .rt-done { color: #06301f; }
|
||||
.rt-done.is-done {
|
||||
background: var(--tmd-dim, var(--disabled-text-color, #9ca3af));
|
||||
}
|
||||
:host([data-tm-design]:not([data-tm-design="classic"])) .rt-done.is-done { color: #fff; }
|
||||
.rt-row { display: flex; gap: 10px; }
|
||||
.rt-skip {
|
||||
background: var(--tmd-surface-2, var(--divider-color, #e5e7eb));
|
||||
color: var(--tmd-text, var(--primary-text-color));
|
||||
border: 1px solid var(--tmd-border, transparent);
|
||||
padding: 12px; font-size: 14px; flex: 1;
|
||||
}
|
||||
.rt-back {
|
||||
background: transparent;
|
||||
color: var(--tmd-dim, var(--secondary-text-color));
|
||||
border: 1px solid var(--tmd-border, var(--divider-color, #e5e7eb));
|
||||
padding: 12px; font-size: 14px; flex: 0 0 96px;
|
||||
}
|
||||
.rt-back:disabled { opacity: 0.4; }
|
||||
|
||||
.finished { text-align: center; padding: 34px 26px; flex: 1; }
|
||||
.finished .cheer { font-size: 66px; line-height: 1; }
|
||||
.finished h2 {
|
||||
font-size: 25px; margin: 12px 0 6px;
|
||||
font-family: var(--tmd-font-display, inherit);
|
||||
}
|
||||
.finished p {
|
||||
color: var(--tmd-dim, var(--secondary-text-color));
|
||||
font-size: 15px; margin: 0 0 6px;
|
||||
}
|
||||
.finished .skipped { font-size: 13px; margin-top: 12px; }
|
||||
.earned {
|
||||
display: inline-flex; gap: 6px; align-items: center; margin-top: 10px;
|
||||
background: color-mix(in srgb, var(--tmd-good, #16a34a) 14%, transparent);
|
||||
color: var(--tmd-good, #166534);
|
||||
padding: 9px 18px; border-radius: 99px;
|
||||
font-weight: 800; font-size: 16px;
|
||||
}
|
||||
.earned.pending-total {
|
||||
background: color-mix(in srgb, var(--tmd-bad, #f97316) 12%, transparent);
|
||||
color: var(--tmd-bad, #9a3412);
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.empty {
|
||||
text-align: center; padding: 64px 26px; flex: 1;
|
||||
color: var(--tmd-dim, var(--secondary-text-color));
|
||||
}
|
||||
.empty ha-icon { --mdc-icon-size: 60px; opacity: 0.5; }
|
||||
.empty h2 {
|
||||
font-size: 20px; margin: 14px 0 6px;
|
||||
color: var(--tmd-text, var(--primary-text-color));
|
||||
font-family: var(--tmd-font-display, inherit);
|
||||
}
|
||||
.empty p { font-size: 14.5px; margin: 0; }
|
||||
|
||||
.pad { padding: 24px; }
|
||||
.error { color: var(--tmd-bad, var(--error-color, #c62828)); }
|
||||
|
||||
@media (max-width: 420px) {
|
||||
.icon { width: 104px; height: 104px; border-radius: 28px; }
|
||||
.icon ha-icon { --mdc-icon-size: 52px; }
|
||||
.task { font-size: 23px; }
|
||||
}
|
||||
`;
|
||||
// The token block is :host-scoped, so it only takes effect when included
|
||||
// in THIS card's styles — a document-level rule cannot cross into the
|
||||
// shadow root.
|
||||
const tokens = window.__taskmate_design && window.__taskmate_design.styles
|
||||
? window.__taskmate_design.styles() : null;
|
||||
return tokens ? [tokens, base] : base;
|
||||
}
|
||||
}
|
||||
|
||||
class TaskMateRoutineCardEditor extends LitElement {
|
||||
static get properties() {
|
||||
return { hass: { type: Object }, _config: { type: Object } };
|
||||
}
|
||||
|
||||
setConfig(config) { this._config = { ...config }; }
|
||||
|
||||
_t(key, params) {
|
||||
const fn = window.__taskmate_localize;
|
||||
return fn ? fn(this.hass, key, params) : key;
|
||||
}
|
||||
|
||||
render() {
|
||||
if (!this._config) return html``;
|
||||
const attrs = (window.__taskmate_attrs && window.__taskmate_attrs(this.hass, this._config.entity)) || {};
|
||||
const children = attrs.children || [];
|
||||
return html`
|
||||
<div class="form">
|
||||
<ha-textfield
|
||||
label="Entity"
|
||||
.value=${this._config.entity || "sensor.taskmate_overview"}
|
||||
@input=${e => this._set("entity", e.target.value)}
|
||||
></ha-textfield>
|
||||
|
||||
<ha-select
|
||||
label="Child"
|
||||
.value=${this._config.child_id || ""}
|
||||
@selected=${e => this._set("child_id", e.target.value)}
|
||||
@closed=${e => e.stopPropagation()}
|
||||
>
|
||||
${children.map(c => html`<mwc-list-item .value=${c.id}>${c.name}</mwc-list-item>`)}
|
||||
</ha-select>
|
||||
|
||||
<ha-select
|
||||
label="Time of day"
|
||||
.value=${this._config.time_category || "all"}
|
||||
@selected=${e => this._set("time_category", e.target.value)}
|
||||
@closed=${e => e.stopPropagation()}
|
||||
>
|
||||
${TIME_CATEGORIES.map(t => html`<mwc-list-item .value=${t}>${t}</mwc-list-item>`)}
|
||||
</ha-select>
|
||||
|
||||
<ha-textfield
|
||||
label="Title (optional)"
|
||||
.value=${this._config.title || ""}
|
||||
@input=${e => this._set("title", e.target.value)}
|
||||
></ha-textfield>
|
||||
|
||||
<ha-select
|
||||
.label=${this._t("common.design.field_label")}
|
||||
.value=${this._config.card_design || "global"}
|
||||
@selected=${e => this._set("card_design", e.target.value)}
|
||||
@closed=${e => e.stopPropagation()}
|
||||
>
|
||||
${(window.__taskmate_design
|
||||
? window.__taskmate_design.editorOptions(this._t.bind(this))
|
||||
: [{ value: "global", label: "Use global default" }]
|
||||
).map(o => html`<mwc-list-item .value=${o.value}>${o.label}</mwc-list-item>`)}
|
||||
</ha-select>
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
|
||||
_set(key, value) {
|
||||
const newConfig = { ...this._config, [key]: value };
|
||||
// "global" is the absence of a per-card override, not a value to store.
|
||||
if (key === "card_design" && value === "global") delete newConfig[key];
|
||||
else if (value === null || value === "" || value === undefined) delete newConfig[key];
|
||||
this._config = newConfig;
|
||||
this.dispatchEvent(new CustomEvent("config-changed", {
|
||||
detail: { config: newConfig }, bubbles: true, composed: true,
|
||||
}));
|
||||
}
|
||||
|
||||
static get styles() {
|
||||
return css`
|
||||
.form { display: flex; flex-direction: column; gap: 14px; padding: 8px 0; }
|
||||
`;
|
||||
}
|
||||
}
|
||||
|
||||
customElements.define("taskmate-routine-card", TaskMateRoutineCard);
|
||||
customElements.define("taskmate-routine-card-editor", TaskMateRoutineCardEditor);
|
||||
|
||||
window.customCards = window.customCards || [];
|
||||
window.customCards.push({
|
||||
type: "taskmate-routine-card",
|
||||
name: "TaskMate Routine",
|
||||
description: "Guided one-task-at-a-time flow for morning and bedtime routines",
|
||||
preview: true,
|
||||
getEntitySuggestion: (hass, entityId) =>
|
||||
window.__taskmate_suggest(hass, entityId, "taskmate-routine-card", "overview"),
|
||||
});
|
||||
|
||||
// Version is injected by the HA resource URL (?v=x.x.x) and read from the DOM
|
||||
const _tmVersion = new URLSearchParams(
|
||||
Array.from(document.querySelectorAll('script[src*="/taskmate-routine-card.js"]'))
|
||||
.map(s => s.src.split("?")[1]).find(Boolean) || ""
|
||||
).get("v") || "?";
|
||||
console.info(
|
||||
"%c TASKMATE ROUTINE CARD %c v" + _tmVersion + " ",
|
||||
"background:#7c3aed;color:white;font-weight:bold;padding:2px 4px;border-radius:4px 0 0 4px;",
|
||||
"background:#2c3e50;color:white;font-weight:bold;padding:2px 4px;border-radius:0 4px 4px 0;"
|
||||
);
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/config.json",
|
||||
"mcp": {
|
||||
"ha-direct": {
|
||||
"type": "remote",
|
||||
"url": "http://192.168.1.140:9584/private_bjV5uaDnrjS1JEtBg8UP-g",
|
||||
"enabled": true
|
||||
}
|
||||
},
|
||||
"tools": {
|
||||
"ha-direct_*": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,240 @@
|
||||
# AI Camera Motion Automations - Optimization Session
|
||||
|
||||
**Date:** 2026-07-24 (updated)
|
||||
**Automations Modified:**
|
||||
- Motion Backyard - AI Description - Version 2
|
||||
- Motion Front Door - AI Description - Version 2
|
||||
- Motion Shed - AI Description - Version 2
|
||||
- Motion Garage - AI Description - Version 2
|
||||
|
||||
---
|
||||
|
||||
## Session 1 (Earlier today)
|
||||
|
||||
### 1. Added Snapshot Cleanup (shell_command)
|
||||
|
||||
**File:** `configuration.yaml`
|
||||
|
||||
```yaml
|
||||
shell_command:
|
||||
cleanup_blink_snapshots: "find /media -name 'blink_*.jpg' -mmin +60 -delete"
|
||||
```
|
||||
|
||||
### 2. Removed Duplicate Snapshot
|
||||
|
||||
Removed the second `camera.snapshot` to `/config/www/` from all 4 automations.
|
||||
|
||||
### 3. Added Snapshot Cleanup Action
|
||||
|
||||
Added `shell_command.cleanup_blink_snapshots` as first action in each automation.
|
||||
|
||||
### 4. Removed Empty `data: {}` from Switch Actions
|
||||
|
||||
Cleaned up unnecessary empty `data: {}` blocks.
|
||||
|
||||
### 5. Added 60-Second Cooldown Condition
|
||||
|
||||
Added rate-limiting condition using hardcoded entity references:
|
||||
```yaml
|
||||
value_template: "{{ (now() - state_attr('automation.<entity_id>', 'last_triggered')).total_seconds() > 60 }}"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Session 2 (This session)
|
||||
|
||||
### 1. Fixed Spook Warnings - Hardcoded Entity References
|
||||
|
||||
**File:** `automations.yaml` (all 4 automations)
|
||||
|
||||
**Before:**
|
||||
```yaml
|
||||
value_template: "{{ (now() - state_attr('automation.motion_backyard_ai_description_version_2', 'last_triggered')).total_seconds() > 60 }}"
|
||||
```
|
||||
|
||||
**After:**
|
||||
```yaml
|
||||
value_template: "{{ (now() - state_attr(this.entity_id, 'last_triggered')).total_seconds() > 60 }}"
|
||||
```
|
||||
|
||||
**Reason:** Spook reported unknown entities because the automation referenced itself by hardcoded entity ID. Using `this.entity_id` resolves this.
|
||||
|
||||
---
|
||||
|
||||
### 2. Re-added Second Snapshot to `/config/www/`
|
||||
|
||||
**File:** `automations.yaml` (all 4 automations)
|
||||
|
||||
Reverted the Session 1 change. Added back the second `camera.snapshot` to `/config/www/` for each automation. This is needed because persistent notifications use `/local/` which maps to `/config/www/`, not `/media/`.
|
||||
|
||||
```yaml
|
||||
- action: camera.snapshot
|
||||
target:
|
||||
entity_id: camera.blink_backyard
|
||||
data:
|
||||
filename: /media/{{ snapshot_filename }}
|
||||
- action: camera.snapshot
|
||||
target:
|
||||
entity_id: camera.blink_backyard
|
||||
data:
|
||||
filename: /config/www/{{ snapshot_filename }}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3. Updated Shell Command Cleanup
|
||||
|
||||
**File:** `configuration.yaml`
|
||||
|
||||
**Before:**
|
||||
```yaml
|
||||
cleanup_blink_snapshots: "find /media -name 'blink_*.jpg' -mmin +60 -delete"
|
||||
```
|
||||
|
||||
**After:**
|
||||
```yaml
|
||||
cleanup_blink_snapshots: "find /media /config/www -name 'blink_*.jpg' -mmin +60 -delete"
|
||||
```
|
||||
|
||||
**Reason:** Now that we save to both `/media/` and `/config/www/`, both directories need cleanup. Requires HA restart to take effect.
|
||||
|
||||
---
|
||||
|
||||
### 4. Created `/config/www/` Directory
|
||||
|
||||
The directory did not exist, so `camera.snapshot` to `/config/www/` was silently failing.
|
||||
|
||||
---
|
||||
|
||||
### 5. Added Images Back to Persistent Notifications
|
||||
|
||||
**File:** `automations.yaml` (Front Door, Shed, Garage)
|
||||
|
||||
Added `` to the persistent notification message for all 3 automations. The Backyard automation already had this.
|
||||
|
||||
---
|
||||
|
||||
### 6. Fixed Front Door Persistent Notification
|
||||
|
||||
**File:** `automations.yaml`
|
||||
|
||||
**Before:** Used broken `notify.persistent_notification` action (with duplicate `data:` keys) AND a separate `persistent_notification.create` without image.
|
||||
|
||||
**After:** Single `persistent_notification.create` with image in message, matching the working Backyard pattern.
|
||||
|
||||
---
|
||||
|
||||
### 7. Fixed Camera Targets (Critical Bug)
|
||||
|
||||
**File:** `automations.yaml`
|
||||
|
||||
| Automation | Before (WRONG) | After (CORRECT) |
|
||||
|---|---|---|
|
||||
| Front Door | `camera.blink_backyard` | `camera.blink_front` |
|
||||
| Shed | `camera.blink_backyard` | `camera.blink_backyard_shed` |
|
||||
| Backyard | `camera.blink_backyard` | `camera.blink_backyard` (correct) |
|
||||
| Garage | `camera.blink_backyard_tree` | `camera.blink_backyard_tree` (correct) |
|
||||
|
||||
**Reason:** Front Door and Shed were both snapshotting the backyard camera instead of their own cameras.
|
||||
|
||||
---
|
||||
|
||||
### 8. Updated Front Door AI Task Name
|
||||
|
||||
**Before:** `Nest Front Camera Analysis`
|
||||
**After:** `Blink Front Camera Analysis`
|
||||
|
||||
**Reason:** This is a Blink camera, not a Nest camera.
|
||||
|
||||
---
|
||||
|
||||
## Final State of All 4 Automations
|
||||
|
||||
| Automation | Camera | Filename Prefix | Snapshot Paths | Persistent Notification |
|
||||
|---|---|---|---|---|
|
||||
| Backyard | `camera.blink_backyard` | `blink_backyard_` | `/media/` + `/config/www/` | `![Snapshot]` included |
|
||||
| Front Door | `camera.blink_front` | `blink_Front_` | `/media/` + `/config/www/` | `![Snapshot]` included |
|
||||
| Shed | `camera.blink_backyard_shed` | `blink_shed_` | `/media/` + `/config/www/` | `![Snapshot]` included |
|
||||
| Garage | `camera.blink_backyard_tree` | `blink_Inshed_` | `/media/` + `/config/www/` | `![Snapshot]` included |
|
||||
|
||||
---
|
||||
|
||||
## System Architecture - Blink Cameras via Homebridge
|
||||
|
||||
**Critical Context:** Blink cameras are exposed to Home Assistant via **Homebridge**, NOT the native Blink integration.
|
||||
|
||||
**Why:** The built-in Blink integration stopped working. The user reverted to Homebridge which exposes the cameras again. However, there are 2 Homebridge plugins - one does NOT have the "force snapshot" capability.
|
||||
|
||||
**Homebridge Plugin:** `Homebridge Blink Cameras New API F12C` (confirmed via entity `button.homebridge_blink_cameras_new_api_f12c_identify`)
|
||||
|
||||
**Camera Entities (all via Homebridge):**
|
||||
- `camera.blink_backyard` - Backyard
|
||||
- `camera.blink_front` - Front
|
||||
- `camera.blink_backyard_shed` - Shed
|
||||
- `camera.blink_backyard_tree` - Garage (mislabeled - physically monitors garage area)
|
||||
- `camera.blink_garage_side` - Garage Side
|
||||
- `camera.blink_thermopump` - Thermopump
|
||||
|
||||
**Refresh Snapshot Switches:**
|
||||
- `switch.backyard_refresh_snapshot`
|
||||
- `switch.front_refresh_snapshot`
|
||||
- `switch.backyard_shed_refresh_snapshot`
|
||||
- `switch.backyard_tree_refresh_snapshot`
|
||||
- `switch.garage_side_refresh_snapshot`
|
||||
- `switch.thermopump_refresh_snapshot`
|
||||
|
||||
---
|
||||
|
||||
## Known Limitations
|
||||
|
||||
### Homebridge Integration Limitations (CRITICAL)
|
||||
|
||||
1. **No Force Refresh Capability** - The Homebridge Blink integration exposes cameras as basic entities with `supported_features: 0`. This means:
|
||||
- No `blink.trigger_camera` service (old Blink integration feature - DISABLED in automations)
|
||||
- No way to force the camera to take a fresh snapshot on demand
|
||||
- `camera.snapshot` action simply saves whatever image is currently cached by the integration
|
||||
|
||||
2. **Stale Image Problem** - When automation triggers:
|
||||
- `switch.*_refresh_snapshot` is turned on (purpose unclear - may not actually work)
|
||||
- Delays (30s + 5s) are used to give Blink time to update
|
||||
- `homeassistant.update_entity` is called to poll
|
||||
- `camera.snapshot` saves the current cached image (which may be OLD)
|
||||
|
||||
3. **Image Cache Timing** - Blink cameras cache images and update them periodically. There's no guaranteed way to force a fresh capture through Homebridge.
|
||||
|
||||
### Other Limitations
|
||||
|
||||
- Blink API throttling may cause stale snapshots when multiple automations run in quick succession
|
||||
- `camera.snapshot` returns success but may not write file if Blink hasn't refreshed its image cache
|
||||
- `shell_command` cleanup update requires HA restart to take effect
|
||||
- The `switch.*_refresh_snapshot` switches may be non-functional remnants from the old Blink integration
|
||||
|
||||
---
|
||||
|
||||
## Testing Results (2026-07-24)
|
||||
|
||||
- **Front Door**: **GOLD STANDARD** - Most reliable automation. Gets the latest image almost every time. Image processing via Ollama works correctly. This is the reference implementation the others should match.
|
||||
- **Backyard**: Working correctly - correct image, Ollama processing successful
|
||||
- **Shed**: Working correctly - correct image, Ollama processing successful
|
||||
- **Garage**: **ISSUE** - Sometimes uses stale/old image. The Homebridge integration may not have refreshed the camera's cached image before snapshot is taken.
|
||||
|
||||
**Note:** All 4 automations ran and captured the correct camera images. However, the **Garage automation** has been observed using old/stale images. This is a known limitation of the Homebridge integration - there's no guaranteed way to force a fresh snapshot. Long-term observation needed to determine if this is a timing issue or a hard limitation.
|
||||
|
||||
---
|
||||
|
||||
## Session 3 (Current - 2026-07-24)
|
||||
|
||||
### Issue Reported: Garage Automation Using Stale Image
|
||||
|
||||
**Problem:** User ran the garage automation and it used an old/cached image from the Blink camera instead of a fresh snapshot.
|
||||
|
||||
**Investigation Findings:**
|
||||
1. The `blink.trigger_camera` action in the automation is **DISABLED** (line 2880-2884) - this is old code from when the built-in Blink integration was working
|
||||
2. The built-in Blink integration **stopped working**, so the user reverted to **Homebridge** to expose cameras
|
||||
3. The Homebridge Blink integration (`Homebridge Blink Cameras New API F12C`) does NOT provide a "force snapshot" capability
|
||||
4. Camera entities have `supported_features: 0` - no special capabilities exposed
|
||||
5. The `switch.*_refresh_snapshot` switches may not actually trigger a fresh capture
|
||||
|
||||
**Root Cause:** This is a **hard limitation** of the Homebridge integration. The `camera.snapshot` action saves whatever image is currently cached by the integration. There's no way to force the camera to take a new photo on demand.
|
||||
|
||||
**Resolution:** User will monitor for a few days to see if the issue persists. The 30s + 5s delays in the automation are intended to give Blink time to update its cache, but this is not guaranteed to work.
|
||||
+4950
File diff suppressed because one or more lines are too long
@@ -0,0 +1,72 @@
|
||||
# ha-direct MCP Tools Reference
|
||||
|
||||
Use these tools only when ha-direct specific features are needed (BPS, backup, python_transform).
|
||||
|
||||
## Automations
|
||||
| Tool | Purpose |
|
||||
|------|---------|
|
||||
| `ha_config_get_automation` | Read automation config |
|
||||
| `ha_config_set_automation` | Create/update automation |
|
||||
| `ha_config_remove_automation` | Delete automation |
|
||||
| `ha_get_automation_traces` | Debug automation execution |
|
||||
|
||||
## Scripts
|
||||
| Tool | Purpose |
|
||||
|------|---------|
|
||||
| `ha_config_set_script` | Create/update script |
|
||||
|
||||
## Scenes
|
||||
| Tool | Purpose |
|
||||
|------|---------|
|
||||
| `ha_config_get_scene` | Read scene config |
|
||||
| `ha_config_set_scene` | Create/update scene |
|
||||
| `ha_config_remove_scene` | Delete scene |
|
||||
|
||||
## Dashboards
|
||||
| Tool | Purpose |
|
||||
|------|---------|
|
||||
| `ha_config_get_dashboard` | List/get/search dashboards |
|
||||
| `ha_config_set_dashboard` | Create/update dashboard |
|
||||
| `ha_config_delete_dashboard` | Delete dashboard |
|
||||
|
||||
## Entities
|
||||
| Tool | Purpose |
|
||||
|------|---------|
|
||||
| `ha_get_entity` | Get entity registry info |
|
||||
| `ha_set_entity` | Update entity properties |
|
||||
| `ha_remove_entity` | Remove entity |
|
||||
|
||||
## Labels/Categories
|
||||
| Tool | Purpose |
|
||||
|------|---------|
|
||||
| `ha_config_get_label` | List/get labels |
|
||||
| `ha_config_set_label` | Create/update label |
|
||||
| `ha_config_remove_label` | Delete label |
|
||||
| `ha_config_get_category` | List/get categories |
|
||||
| `ha_config_set_category` | Create/update category |
|
||||
| `ha_config_remove_category` | Delete category |
|
||||
|
||||
## System
|
||||
| Tool | Purpose |
|
||||
|------|---------|
|
||||
| `ha_reload_core` | Reload config without restart |
|
||||
| `ha_manage_updates` | Manage system updates |
|
||||
| `ha_get_overview` | System overview |
|
||||
| `ha_get_skill_guide` | Best practices |
|
||||
| `ha_report_issue` | File bug reports |
|
||||
|
||||
## Control
|
||||
| Tool | Purpose |
|
||||
|------|---------|
|
||||
| `ha_call_service` | Call any HA service |
|
||||
| `ha_call_event` | Fire custom event |
|
||||
|
||||
## Search
|
||||
| Tool | Purpose |
|
||||
|------|---------|
|
||||
| `ha_search` | Search entities/configs |
|
||||
|
||||
## Notes
|
||||
- Write tools require `BestPracticeKey` (read from `SKILL.md` first)
|
||||
- Key rotates hourly, re-read for fresh key
|
||||
- `python_transform` requires `config_hash` from GET call
|
||||
@@ -0,0 +1,61 @@
|
||||
# MCP Backup Test Session - 2026-07-24
|
||||
|
||||
## Goal
|
||||
Test ha-direct MCP's auto-backup feature by creating, saving, and modifying an automation.
|
||||
|
||||
## Status
|
||||
- Automation WAS created successfully (despite error message)
|
||||
- User deleted it manually
|
||||
- Session interrupted for full restart
|
||||
|
||||
## Key Findings
|
||||
1. **ha-direct has an asyncio bug**: `ha_config_set_automation` throws `INTERNAL_ERROR: Task got Future attached to a different loop` but the automation still gets created
|
||||
2. **Two MCP servers are connected**:
|
||||
- `homeassistant` - Direct HA integration (prefix: `homeassistant_*`)
|
||||
- `ha-direct` - Best practices skill + automation CRUD (prefix: `ha-direct_ha_*`)
|
||||
3. **BestPracticeKey**: Required for write tools when strict mode is ON. Key rotates hourly, read from SKILL.md
|
||||
|
||||
## Test Automation Created
|
||||
```yaml
|
||||
alias: "MCP Backup Test"
|
||||
description: "Test automation to verify ha-direct backup functionality"
|
||||
triggers:
|
||||
- trigger: state
|
||||
entity_id: sun.sun
|
||||
to: above_horizon
|
||||
actions:
|
||||
- action: notify.notify
|
||||
data:
|
||||
title: "MCP Test"
|
||||
message: "Automation created via ha-direct!"
|
||||
```
|
||||
|
||||
## Next Steps After Restart
|
||||
1. Recreate the test automation using `ha_config_set_automation`
|
||||
2. Verify backup was created using `ha_manage_backup(scope="edits", action="list")`
|
||||
3. Modify the automation
|
||||
4. Verify new backup was created
|
||||
5. Test restore from backup
|
||||
|
||||
## Command Sequence
|
||||
```
|
||||
# 1. Get BestPracticeKey (read SKILL.md)
|
||||
ha-direct_ha_get_skill_guide(skill='home-assistant-best-practices', file='SKILL.md')
|
||||
|
||||
# 2. Create automation (include BestPracticeKey)
|
||||
ha-direct_ha_config_set_automation(config={...}, BestPracticeKey="I-HAVE-READ-THE-BEST-PRACTICES-GUIDE-bd08e62b")
|
||||
|
||||
# 3. List backups to verify
|
||||
ha-direct_ha_manage_backup(scope="edits", action="list")
|
||||
|
||||
# 4. Modify automation (get identifier from step 2)
|
||||
ha-direct_ha_config_set_automation(identifier="automation.entity_id", config={...}, BestPracticeKey="...")
|
||||
|
||||
# 5. Verify new backup
|
||||
ha-direct_ha_manage_backup(scope="edits", action="list")
|
||||
```
|
||||
|
||||
## Bug Report Filed
|
||||
- Error: INTERNAL_ERROR on ha_config_set_automation
|
||||
- Details: asyncio event loop mismatch
|
||||
- Report saved: /data/.local/share/opencode/tool-output/tool_f95b39529001j266BHbdc6n5ve
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,24 @@
|
||||
# Ollama Vision Models for Home Assistant
|
||||
|
||||
Use these models for camera snapshot analysis (e.g., Motion Front Door AI automation).
|
||||
|
||||
| Model | Size | Command | Best For |
|
||||
|-------|------|---------|----------|
|
||||
| llama3.2-vision:11b | ~7.8GB | `ollama pull llama3.2-vision:11b` | Scene/object description, general vision |
|
||||
| moondream | ~1.7GB | `ollama pull moondream` | Tiny and fast, simple descriptions |
|
||||
| gemma4:12b | ~8GB | `ollama pull gemma4:12b` | Newest, best quality, all-rounder |
|
||||
| llava:13b | ~8GB | `ollama pull llava:13b` | Older but proven, general-purpose |
|
||||
|
||||
## How to switch models
|
||||
|
||||
1. Pull the model: `ollama pull <model-name>`
|
||||
2. Go to **Settings → AI Tasks → Ollama AI Task** in Home Assistant
|
||||
3. Change the model to the new one
|
||||
4. Test by triggering the automation
|
||||
|
||||
## Notes
|
||||
|
||||
- Vision models are required for image/camera analysis - text-only models (llama3, qwen3, etc.) will fail
|
||||
- `llama3.2-vision:11b` is the recommended default (best balance of quality and speed)
|
||||
- `moondream` is a good fallback for slower hardware
|
||||
- All models run locally - no data leaves your network
|
||||
@@ -0,0 +1,276 @@
|
||||
{
|
||||
"0xffffb40e0607ace4": {
|
||||
"energy": 12.43,
|
||||
"state": "ON",
|
||||
"led_brightness": 100,
|
||||
"countdown_to_turn_off": 0,
|
||||
"voltage": 122.2,
|
||||
"countdown_to_turn_on": 0,
|
||||
"ac_frequency": 60,
|
||||
"power_factor": 0.13,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 268513381,
|
||||
"latest_version": 268513381,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/ThirdReality/SmartPlug_Zigbee_PROD_OTA_V101_1.01.01.ota",
|
||||
"latest_release_notes": null
|
||||
},
|
||||
"power": 0.5,
|
||||
"linkquality": 120,
|
||||
"current": 0.03,
|
||||
"power_on_behavior": "on"
|
||||
},
|
||||
"0xffffb40e0607af27": {
|
||||
"state": "ON",
|
||||
"voltage": 122,
|
||||
"ac_frequency": 60,
|
||||
"led_brightness": 100,
|
||||
"countdown_to_turn_off": 0,
|
||||
"countdown_to_turn_on": 0,
|
||||
"power": 2,
|
||||
"current": 0.12,
|
||||
"energy": 23.05,
|
||||
"power_factor": 0.14,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 268513381,
|
||||
"latest_version": 268513381,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/ThirdReality/SmartPlug_Zigbee_PROD_OTA_V101_1.01.01.ota",
|
||||
"latest_release_notes": null
|
||||
},
|
||||
"linkquality": 109,
|
||||
"power_on_behavior": "on"
|
||||
},
|
||||
"0xffffb40e0607aee8": {
|
||||
"state": "ON",
|
||||
"led_brightness": 100,
|
||||
"countdown_to_turn_off": 0,
|
||||
"voltage": 122,
|
||||
"countdown_to_turn_on": 0,
|
||||
"energy": 42.43,
|
||||
"power_factor": 0.2,
|
||||
"ac_frequency": 60,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 268513381,
|
||||
"latest_version": 268513381,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/ThirdReality/SmartPlug_Zigbee_PROD_OTA_V101_1.01.01.ota",
|
||||
"latest_release_notes": null
|
||||
},
|
||||
"linkquality": 83,
|
||||
"power": 0.2,
|
||||
"current": 0.01,
|
||||
"power_on_behavior": "on"
|
||||
},
|
||||
"0xb40e060fffe031e3": {
|
||||
"battery": 100,
|
||||
"contact": true,
|
||||
"tamper": false,
|
||||
"battery_low": false,
|
||||
"linkquality": 87,
|
||||
"voltage": 3100
|
||||
},
|
||||
"0xffffb40e060762a4": {
|
||||
"led_brightness": 100,
|
||||
"countdown_to_turn_off": 0,
|
||||
"countdown_to_turn_on": 0,
|
||||
"voltage": 121.3,
|
||||
"state": "ON",
|
||||
"ac_frequency": 60,
|
||||
"energy": 85.15,
|
||||
"power": 0.8,
|
||||
"current": 0.05,
|
||||
"power_factor": 0.41,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 268513381,
|
||||
"latest_version": 268513381,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/ThirdReality/SmartPlug_Zigbee_PROD_OTA_V101_1.01.01.ota",
|
||||
"latest_release_notes": null
|
||||
},
|
||||
"linkquality": 109,
|
||||
"power_on_behavior": "on"
|
||||
},
|
||||
"0xffffb40e0607b680": {
|
||||
"led_brightness": 100,
|
||||
"countdown_to_turn_off": 0,
|
||||
"countdown_to_turn_on": 0,
|
||||
"voltage": 122.4,
|
||||
"energy": 34.63,
|
||||
"state": "ON",
|
||||
"power": 16.9,
|
||||
"current": 0.28,
|
||||
"ac_frequency": 60,
|
||||
"power_factor": 0.55,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 268513381,
|
||||
"latest_version": 268513381,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/ThirdReality/SmartPlug_Zigbee_PROD_OTA_V101_1.01.01.ota",
|
||||
"latest_release_notes": null
|
||||
},
|
||||
"linkquality": 69,
|
||||
"power_on_behavior": "on"
|
||||
},
|
||||
"0xffffb40e060895b3": {
|
||||
"state": "ON",
|
||||
"voltage": 122.1,
|
||||
"ac_frequency": 60,
|
||||
"energy": 5.46,
|
||||
"current": 0.01,
|
||||
"power": 0.1,
|
||||
"power_factor": 0.11,
|
||||
"linkquality": 109,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 268513381,
|
||||
"latest_version": 268513381,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/ThirdReality/SmartPlug_Zigbee_PROD_OTA_V101_1.01.01.ota",
|
||||
"latest_release_notes": null
|
||||
},
|
||||
"led_brightness": 100,
|
||||
"countdown_to_turn_off": 0,
|
||||
"countdown_to_turn_on": 0,
|
||||
"power_on_behavior": "on"
|
||||
},
|
||||
"0xffffb40e0608864e": {
|
||||
"led_brightness": 100,
|
||||
"countdown_to_turn_off": 0,
|
||||
"voltage": 122.4,
|
||||
"energy": 15.09,
|
||||
"countdown_to_turn_on": 0,
|
||||
"state": "ON",
|
||||
"current": 0.02,
|
||||
"ac_frequency": 60,
|
||||
"power": 0.3,
|
||||
"power_factor": 0.14,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 268513381,
|
||||
"latest_version": 268513381,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/ThirdReality/SmartPlug_Zigbee_PROD_OTA_V101_1.01.01.ota",
|
||||
"latest_release_notes": null
|
||||
},
|
||||
"linkquality": 112,
|
||||
"power_on_behavior": "on"
|
||||
},
|
||||
"0xb40e060fffe2d218": {
|
||||
"linkquality": 134,
|
||||
"water_leak_buzzer": "OFF",
|
||||
"battery": 0,
|
||||
"water_leak": false,
|
||||
"battery_low": false,
|
||||
"state": "ON",
|
||||
"update": {
|
||||
"state": "available",
|
||||
"installed_version": 66,
|
||||
"latest_version": 73,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/ThirdReality/Water_Leak_Sensor_PROD_OTA_V73_v1.00.73.ota",
|
||||
"latest_release_notes": null
|
||||
}
|
||||
},
|
||||
"0xffffb40e060893d8": {
|
||||
"state": "ON",
|
||||
"led_brightness": 100,
|
||||
"voltage": 122.6,
|
||||
"countdown_to_turn_off": 0,
|
||||
"countdown_to_turn_on": 0,
|
||||
"energy": 2.96,
|
||||
"power_on_behavior": "on",
|
||||
"linkquality": 94,
|
||||
"current": 0.03,
|
||||
"ac_frequency": 60,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 268513381,
|
||||
"latest_version": 268513381,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/ThirdReality/SmartPlug_Zigbee_PROD_OTA_V101_1.01.01.ota",
|
||||
"latest_release_notes": null
|
||||
},
|
||||
"power_factor": 0.13,
|
||||
"power": 0.3
|
||||
},
|
||||
"0xa4c1380d0679ffff": {
|
||||
"battery": 100,
|
||||
"temperature": 26.9,
|
||||
"temperature_units": "celsius",
|
||||
"temperature_calibration": 0,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 4352,
|
||||
"latest_version": 4352,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/Sonoff/snzb02lwd_v1.1.0.ota",
|
||||
"latest_release_notes": null
|
||||
},
|
||||
"linkquality": 102
|
||||
},
|
||||
"0xffffb40e0606234b": {
|
||||
"contact": true,
|
||||
"battery_low": false,
|
||||
"battery": 100,
|
||||
"linkquality": 94,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 36,
|
||||
"latest_version": 36,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/ThirdReality/GarageDoorSensor_PROD_OTA_V36_v1.00.36.ota",
|
||||
"latest_release_notes": null
|
||||
}
|
||||
},
|
||||
"0x881a14fffe410db3": {
|
||||
"state": "ON",
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 50331681,
|
||||
"latest_version": 50331681,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/IKEA/zingo-ws_release_prod_v50331681_969bee21-eca6-4f10-a4c0-9685c0cd5d52.ota",
|
||||
"latest_release_notes": "https://ww8.ikea.com/ikeahomesmart/releasenotes/releasenotes.html"
|
||||
},
|
||||
"brightness": 254,
|
||||
"color_temp": 357,
|
||||
"color_mode": "color_temp",
|
||||
"linkquality": 43
|
||||
},
|
||||
"0x7cc6b6fffe606710": {
|
||||
"state": "ON",
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 16777282,
|
||||
"latest_version": 16777282,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/IKEA/zingo-ww_release_prod_v16777282_a39f1e76-af87-4f04-bd7f-0faf71baf3e4.ota",
|
||||
"latest_release_notes": "https://ww8.ikea.com/ikeahomesmart/releasenotes/releasenotes.html"
|
||||
},
|
||||
"brightness": 254,
|
||||
"linkquality": 36
|
||||
},
|
||||
"0xb40e060fffe717c5": {
|
||||
"battery": 100,
|
||||
"occupancy": false,
|
||||
"tamper": false,
|
||||
"battery_low": false,
|
||||
"linkquality": 65,
|
||||
"voltage": 3100,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 79,
|
||||
"latest_version": 79,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/ThirdReality/Motion_Sensor_PROD_OTA_V79_v1.00.79.ota",
|
||||
"latest_release_notes": null
|
||||
}
|
||||
},
|
||||
"0xb40e060fffe7180a": {
|
||||
"battery": 100,
|
||||
"occupancy": false,
|
||||
"tamper": false,
|
||||
"battery_low": false,
|
||||
"linkquality": 91,
|
||||
"voltage": 3200,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 79,
|
||||
"latest_version": 79,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/ThirdReality/Motion_Sensor_PROD_OTA_V79_v1.00.79.ota",
|
||||
"latest_release_notes": null
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user