148 files
This commit is contained in:
1 parent
43021c1d3a
commit
94e9f32a43
148 files changed
+15528
-2013
No files matched your search
+59
-4
@@ -48,6 +48,11 @@ export class MaintenanceAdoptProblemSensorsDialog extends LitElement {
|
||||
@state() private _error = "";
|
||||
@state() private _sensors: ProblemSensor[] = [];
|
||||
@state() private _selected: Set<string> = new Set();
|
||||
/** #188: the object each selected sensor goes to — typed per row; the same
|
||||
* name on several rows makes them ONE object, an existing object's name
|
||||
* adds them to it. */
|
||||
@state() private _objectNames: Record<string, string> = {};
|
||||
@state() private _objects: Array<{ entry_id: string; name: string }> = [];
|
||||
@state() private _users: HAUser[] = [];
|
||||
@state() private _responsible = "";
|
||||
// #136: minutes the problem must persist before the created task triggers
|
||||
@@ -74,18 +79,28 @@ export class MaintenanceAdoptProblemSensorsDialog extends LitElement {
|
||||
this._error = "";
|
||||
this._sensors = [];
|
||||
this._selected = new Set();
|
||||
this._objectNames = {};
|
||||
this._responsible = "";
|
||||
this._forMinutes = "0";
|
||||
try {
|
||||
if (!this._userService) this._userService = new UserService(this.hass);
|
||||
else this._userService.updateHass(this.hass);
|
||||
const [resp, users] = await Promise.all([
|
||||
const [resp, users, objs] = await Promise.all([
|
||||
this.hass.connection.sendMessagePromise<DiscoverResponse>({
|
||||
type: "maintenance_supporter/problem_sensors/discover",
|
||||
}),
|
||||
// Best-effort: adoption works fine without the user list.
|
||||
this._userService.getUsers().catch(() => [] as HAUser[]),
|
||||
// Best-effort too: the existing objects feed the name suggestions.
|
||||
this.hass.connection
|
||||
.sendMessagePromise<{ objects: Array<{ entry_id: string; object: { name: string; archived_at?: string | null } }> }>({
|
||||
type: "maintenance_supporter/objects",
|
||||
})
|
||||
.catch(() => ({ objects: [] })),
|
||||
]);
|
||||
this._objects = (objs.objects || [])
|
||||
.filter((o) => !o.object.archived_at)
|
||||
.map((o) => ({ entry_id: o.entry_id, name: o.object.name }));
|
||||
this._sensors = resp.sensors || [];
|
||||
this._selected = new Set(this._sensors.map((s) => s.entity_id));
|
||||
this._users = users;
|
||||
@@ -96,6 +111,21 @@ export class MaintenanceAdoptProblemSensorsDialog extends LitElement {
|
||||
}
|
||||
}
|
||||
|
||||
/** The object name a row will be adopted into (typed, else the suggestion). */
|
||||
private _effectiveName(s: ProblemSensor): string {
|
||||
const typed = (this._objectNames[s.entity_id] ?? "").trim();
|
||||
return typed || s.suggested_object_name;
|
||||
}
|
||||
|
||||
/** An existing object the row lands in: the suggestion's entry when the
|
||||
* name is untouched, else an existing object with exactly that name. */
|
||||
private _existingEntryFor(s: ProblemSensor): string | null {
|
||||
const name = this._effectiveName(s);
|
||||
if (name === s.suggested_object_name && s.suggested_entry_id) return s.suggested_entry_id;
|
||||
const hit = this._objects.find((o) => o.name.trim().toLowerCase() === name.toLowerCase());
|
||||
return hit ? hit.entry_id : null;
|
||||
}
|
||||
|
||||
private _close(): void {
|
||||
this._open = false;
|
||||
}
|
||||
@@ -125,8 +155,8 @@ export class MaintenanceAdoptProblemSensorsDialog extends LitElement {
|
||||
.map((s) => ({
|
||||
entity_id: s.entity_id,
|
||||
name: s.name,
|
||||
entry_id: s.suggested_entry_id ?? undefined,
|
||||
object_name: s.suggested_object_name,
|
||||
entry_id: this._existingEntryFor(s) ?? undefined,
|
||||
object_name: this._effectiveName(s),
|
||||
device_id: s.device_id ?? undefined,
|
||||
part_id: s.suggested_part_id ?? undefined,
|
||||
responsible_user_id: this._responsible || undefined,
|
||||
@@ -177,6 +207,10 @@ export class MaintenanceAdoptProblemSensorsDialog extends LitElement {
|
||||
/>
|
||||
<span>${t("selected", L)}: ${this._selected.size} / ${this._sensors.length}</span>
|
||||
</label>
|
||||
<div class="row-sub adopt-object-hint">${t("adopt_object_hint", L)}</div>
|
||||
<datalist id="adopt-object-names">
|
||||
${this._objects.map((o) => html`<option value=${o.name}></option>`)}
|
||||
</datalist>
|
||||
<div class="list">
|
||||
${this._sensors.map((s) => {
|
||||
const checked = this._selected.has(s.entity_id);
|
||||
@@ -201,8 +235,22 @@ export class MaintenanceAdoptProblemSensorsDialog extends LitElement {
|
||||
</span>
|
||||
</div>
|
||||
${sub ? html`<div class="row-sub">${sub}</div>` : nothing}
|
||||
${checked
|
||||
? html`<div class="row-object" @click=${(e: Event) => e.stopPropagation()}>
|
||||
<input
|
||||
class="adopt-object"
|
||||
list="adopt-object-names"
|
||||
aria-label=${t("object", L)}
|
||||
placeholder=${s.suggested_object_name}
|
||||
.value=${this._objectNames[s.entity_id] ?? s.suggested_object_name}
|
||||
@input=${(e: Event) => {
|
||||
this._objectNames = { ...this._objectNames, [s.entity_id]: (e.target as HTMLInputElement).value };
|
||||
}}
|
||||
/>
|
||||
</div>`
|
||||
: nothing}
|
||||
<div class="row-target">
|
||||
→ ${s.suggested_object_name}${s.suggested_entry_id
|
||||
→ ${this._effectiveName(s)}${this._existingEntryFor(s)
|
||||
? nothing
|
||||
: html` <span class="new-tag">${t("adopt_problem_new_object", L)}</span>`}
|
||||
</div>
|
||||
@@ -365,6 +413,13 @@ export class MaintenanceAdoptProblemSensorsDialog extends LitElement {
|
||||
color: var(--secondary-text-color);
|
||||
font-size: 12px;
|
||||
}
|
||||
.row-object { margin-top: 6px; }
|
||||
.row-object input {
|
||||
width: 100%; box-sizing: border-box; padding: 6px 8px; font: inherit;
|
||||
border: 1px solid var(--divider-color); border-radius: 6px;
|
||||
background: var(--card-background-color); color: var(--primary-text-color);
|
||||
}
|
||||
.adopt-object-hint { margin: 0 0 8px; }
|
||||
.row-target {
|
||||
color: var(--secondary-text-color);
|
||||
font-size: 12px;
|
||||
|
||||
@@ -18,12 +18,16 @@ import { runWs } from "../helpers/ws-run";
|
||||
import type { TriggerType } from "../types";
|
||||
import { REQUIRED_COMPLETION_KEYS, REQUIRED_COMPLETION_LABELS } from "./required-completion-labels";
|
||||
import "./ms-textfield";
|
||||
import { defaultNotifyIcon } from "../helpers/notify-icons";
|
||||
import "./ms-date-field";
|
||||
|
||||
const MAINTENANCE_TYPE_KEYS = ["cleaning", "inspection", "replacement", "calibration", "service", "reading", "custom"];
|
||||
const PRIORITY_KEYS = ["low", "normal", "high"];
|
||||
const SCHEDULE_TYPE_KEYS = ["time_based", "weekdays", "nth_weekday", "day_of_month", "sensor_based", "one_time", "manual"];
|
||||
const CALENDAR_KINDS = ["weekdays", "nth_weekday", "day_of_month"];
|
||||
const SCHEDULE_TYPE_KEYS = ["time_based", "weekdays", "nth_weekday", "day_of_month", "calendar", "sensor_based", "one_time", "manual"];
|
||||
// The nested calendar kinds — the three date patterns plus, since #187, a HA
|
||||
// calendar entity (one occurrence per event). Mirrors _CALENDAR_KINDS in
|
||||
// helpers/schedule.py (tripwire: tests/test_cross_layer_vocab.py).
|
||||
const CALENDAR_KINDS = ["weekdays", "nth_weekday", "day_of_month", "calendar"];
|
||||
// #168: kinds that produce a due DATE and therefore take a time of day
|
||||
// (mirrors SCHEDULE_TIME_KINDS in config_flow_helpers.py).
|
||||
const SCHEDULE_TIME_KINDS = ["time_based", "one_time", ...CALENDAR_KINDS];
|
||||
@@ -194,6 +198,8 @@ export class MaintenanceTaskDialog extends LitElement {
|
||||
@state() private _domLastDay = false;
|
||||
@state() private _domBusiness = false;
|
||||
@state() private _calOffset = "0";
|
||||
// #187: the HA calendar entity whose events are the occurrences ("calendar" kind).
|
||||
@state() private _calendarEntity = "";
|
||||
// Recurrence extras (apply to interval + calendar kinds): a seasonal active
|
||||
// window and a finite-series end condition.
|
||||
@state() private _seasonMonths: number[] = [];
|
||||
@@ -209,6 +215,8 @@ export class MaintenanceTaskDialog extends LitElement {
|
||||
@state() private _notes = "";
|
||||
@state() private _documentationUrl = "";
|
||||
@state() private _customIcon = "";
|
||||
/** #185: mdi icon for this task's push notifications ("" = type default). */
|
||||
@state() private _notifyIcon = "";
|
||||
@state() private _priority = "normal";
|
||||
@state() private _labels = "";
|
||||
/** D#183: external todo.* lists the task is mirrored into while due. */
|
||||
@@ -402,6 +410,7 @@ export class MaintenanceTaskDialog extends LitElement {
|
||||
this._domDay = sched?.kind === "day_of_month" && (sched.day ?? 1) >= 1 ? String(sched.day ?? 1) : "1";
|
||||
this._domLastDay = sched?.kind === "day_of_month" && sched.day === -1;
|
||||
this._domBusiness = sched?.kind === "day_of_month" && sched.business === true;
|
||||
this._calendarEntity = sched?.kind === "calendar" ? (sched.entity_id || "") : "";
|
||||
this._calOffset = sched?.offset ? String(sched.offset) : "0";
|
||||
// Recurrence extras — read from the nested schedule wherever it lives.
|
||||
this._seasonMonths = Array.isArray(sched?.season_months) ? [...sched!.season_months] : [];
|
||||
@@ -420,6 +429,7 @@ export class MaintenanceTaskDialog extends LitElement {
|
||||
this._notes = task.notes || "";
|
||||
this._documentationUrl = task.documentation_url || "";
|
||||
this._customIcon = task.custom_icon || "";
|
||||
this._notifyIcon = task.notify_icon || "";
|
||||
this._priority = task.priority || "normal";
|
||||
this._labels = (task.labels || []).join(", ");
|
||||
this._mirrorTodoEntities = [...(task.mirror_todo_entities || [])];
|
||||
@@ -577,6 +587,7 @@ export class MaintenanceTaskDialog extends LitElement {
|
||||
this._notes = "";
|
||||
this._documentationUrl = "";
|
||||
this._customIcon = "";
|
||||
this._notifyIcon = "";
|
||||
this._priority = "normal";
|
||||
this._labels = "";
|
||||
this._mirrorTodoEntities = [];
|
||||
@@ -1266,6 +1277,11 @@ export class MaintenanceTaskDialog extends LitElement {
|
||||
this._error = t("trigger_hint_overlap", this._lang);
|
||||
return;
|
||||
}
|
||||
if (this._scheduleType === "calendar" && !this._calendarEntity.trim().startsWith("calendar.")) {
|
||||
// #187: the backend would store entity_id null (a task without dates).
|
||||
this._error = t("calendar_entity_required", this._lang);
|
||||
return;
|
||||
}
|
||||
this._loading = true;
|
||||
this._error = "";
|
||||
try {
|
||||
@@ -1326,6 +1342,8 @@ export class MaintenanceTaskDialog extends LitElement {
|
||||
data.notes = this._notes || null;
|
||||
data.documentation_url = this._documentationUrl || null;
|
||||
data.custom_icon = this._customIcon || null;
|
||||
// #185: null clears the override (the update path pops the key).
|
||||
data.notify_icon = this._notifyIcon.trim() || null;
|
||||
data.priority = this._priority;
|
||||
data.labels = this._labels
|
||||
.split(",")
|
||||
@@ -2071,6 +2089,7 @@ export class MaintenanceTaskDialog extends LitElement {
|
||||
if (this._scheduleType === "one_time") {
|
||||
return this._dueDate ? { kind: "one_time", due_date: this._dueDate } : null;
|
||||
}
|
||||
if (this._scheduleType === "calendar" && !this._calendarEntity.trim()) return null;
|
||||
if (CALENDAR_KINDS.includes(this._scheduleType)) {
|
||||
return { ...this._buildSchedule(), ...this._recurrenceExtras() };
|
||||
}
|
||||
@@ -2088,7 +2107,7 @@ export class MaintenanceTaskDialog extends LitElement {
|
||||
private static readonly _PREVIEW_RELEVANT = new Set([
|
||||
"_open", "_scheduleType", "_intervalDays", "_intervalUnit", "_intervalAnchor",
|
||||
"_dueDate", "_weekdays", "_nth", "_nthWeekday", "_domDay", "_domLastDay",
|
||||
"_domBusiness", "_calOffset", "_seasonMonths", "_endsMode", "_endsCount",
|
||||
"_domBusiness", "_calOffset", "_calendarEntity", "_seasonMonths", "_endsMode", "_endsCount",
|
||||
"_endsUntil", "_lastPerformed",
|
||||
]);
|
||||
|
||||
@@ -2231,6 +2250,10 @@ export class MaintenanceTaskDialog extends LitElement {
|
||||
weekday: parseInt(this._nthWeekday, 10),
|
||||
});
|
||||
}
|
||||
if (this._scheduleType === "calendar") {
|
||||
// #187: once per event of the picked HA calendar entity.
|
||||
return withOffset({ kind: "calendar", entity_id: this._calendarEntity.trim() });
|
||||
}
|
||||
// (#83) "last day" wins over the day number; business rolls weekends back.
|
||||
const schedule: Record<string, unknown> = {
|
||||
kind: "day_of_month",
|
||||
@@ -2345,6 +2368,33 @@ export class MaintenanceTaskDialog extends LitElement {
|
||||
</div>
|
||||
${this._renderCalOffsetField()}`;
|
||||
}
|
||||
if (this._scheduleType === "calendar") {
|
||||
// #187: pick the HA calendar. Same <ha-form> entity-selector idiom as the
|
||||
// trigger pickers (never <ha-entity-picker> directly — see the
|
||||
// dialog-no-lazy-load-elements tripwire), with the text fallback the
|
||||
// picker probe flips to in a broken context.
|
||||
return html`
|
||||
${this._entityPickerFallback ? html`
|
||||
<ms-textfield
|
||||
label="${t("calendar_entity_label", L)}"
|
||||
helper="${t("calendar_entity_hint", L)}"
|
||||
.value=${this._calendarEntity}
|
||||
@input=${(e: Event) => (this._calendarEntity = (e.target as HTMLInputElement).value.trim())}
|
||||
></ms-textfield>
|
||||
` : html`
|
||||
<ha-form
|
||||
class="entity-picker-form calendar-entity-form"
|
||||
.hass=${this.hass}
|
||||
.schema=${[{ name: "calendar_entity", selector: { entity: { domain: "calendar" } } }]}
|
||||
.data=${{ calendar_entity: this._calendarEntity }}
|
||||
.computeLabel=${() => t("calendar_entity_label", L)}
|
||||
.computeHelper=${() => t("calendar_entity_hint", L)}
|
||||
@value-changed=${(e: CustomEvent) => {
|
||||
this._calendarEntity = ((e.detail.value as { calendar_entity?: string }).calendar_entity || "").trim();
|
||||
}}
|
||||
></ha-form>`}
|
||||
${this._renderCalOffsetField()}`;
|
||||
}
|
||||
if (this._scheduleType === "day_of_month") {
|
||||
return html`
|
||||
${this._domLastDay ? nothing : html`
|
||||
@@ -2962,6 +3012,18 @@ export class MaintenanceTaskDialog extends LitElement {
|
||||
@value-changed=${(e: CustomEvent) =>
|
||||
(this._customIcon = (e.detail.value as string) || "")}
|
||||
></ha-icon-picker>
|
||||
<ha-icon-picker
|
||||
class="notify-icon-picker"
|
||||
.hass=${this.hass}
|
||||
label="${t("notify_icon", L)}"
|
||||
.value=${this._notifyIcon}
|
||||
@value-changed=${(e: CustomEvent) =>
|
||||
(this._notifyIcon = (e.detail.value as string) || "")}
|
||||
></ha-icon-picker>
|
||||
<div class="field-help notify-icon-help">
|
||||
<ha-icon icon=${this._notifyIcon.trim() || defaultNotifyIcon(this._type)}></ha-icon>
|
||||
${t("notify_icon_hint", L).replace("{default}", defaultNotifyIcon(this._type))}
|
||||
</div>
|
||||
${this._availableTags.length > 0
|
||||
? html`
|
||||
<div class="select-row">
|
||||
|
||||
@@ -19,6 +19,9 @@
|
||||
"task_moved": "Úkol přesunut",
|
||||
"move_task_target": "Cílový objekt",
|
||||
"move_task_message": "Vyberte objekt, ke kterému má tento úkol patřit. Historie, odečty a stav spouštěče se přesunou s ním; dostane nové referenční číslo a jeho entity se vytvoří znovu pod novým objektem. Propojené dokumenty zůstanou u aktuálního objektu.",
|
||||
"bulk_move_message": "Vyberte objekt, ke kterému mají vybrané úkoly patřit. Úkoly, které tam už jsou, se přeskočí; historie, odečty a stav spouštěče se přesunou s nimi.",
|
||||
"bulk_moved": "Přesunuto úkolů: {n}",
|
||||
"more_actions": "Další akce",
|
||||
"move_task_title": "Přesunout úkol",
|
||||
"move_task": "Přesunout do jiného objektu…",
|
||||
"object_duplicated": "Objekt duplikován",
|
||||
@@ -38,6 +41,9 @@
|
||||
"bulk_n_selected": "{n} vybráno",
|
||||
"bulk_completed": "Dokončeno {n} úkolů",
|
||||
"bulk_archived": "Archivováno {n} úkolů",
|
||||
"bulk_delete_objects_confirm": "Smazat {n} objektů včetně všech jejich úkolů? Archivace místo toho zachová historii.",
|
||||
"bulk_objects_deleted": "Smazáno objektů: {n}",
|
||||
"bulk_objects_archived": "Archivováno objektů: {n}",
|
||||
"completing": "Dokončování…",
|
||||
"interval": "Interval",
|
||||
"warning": "Upozornění",
|
||||
@@ -64,6 +70,10 @@
|
||||
"weekdays": "Dny v týdnu",
|
||||
"nth_weekday": "N-tý den v týdnu v měsíci",
|
||||
"day_of_month": "Den v měsíci",
|
||||
"calendar": "Entita kalendáře",
|
||||
"calendar_entity_label": "Kalendář",
|
||||
"calendar_entity_hint": "Splatné jednou za každou událost tohoto kalendáře, v den začátku události — další událost po posledním dokončení.",
|
||||
"calendar_entity_required": "Vyberte entitu kalendáře.",
|
||||
"recurrence_on_days": "Opakovat v",
|
||||
"recurrence_occurrence": "Výskyt",
|
||||
"recurrence_weekday": "Den v týdnu",
|
||||
@@ -165,6 +175,7 @@
|
||||
"ws_err_self_link_device": "Objekt nelze propojit sám se sebou",
|
||||
"ws_err_too_early": "Příliš brzy — tento úkol lze dokončit až blíže k termínu",
|
||||
"ws_err_invalid_search_template": "Odkaz pro vyhledávání musí být URL http(s) obsahující {q}",
|
||||
"ws_err_invalid_icon": "Ikona oznámení musí být název mdi:, např. mdi:air-filter",
|
||||
"feat_schedule_time": "Plánování podle denní doby",
|
||||
"feat_schedule_time_desc": "Úkoly se stanou po termínu v určenou denní dobu místo o půlnoci.",
|
||||
"schedule_time_toggle": "Termín v určitou hodinu",
|
||||
@@ -454,6 +465,8 @@
|
||||
"objects_table_columns_label": "Sloupce tabulky objektů",
|
||||
"objects_table_columns_hint": "Vyberte, které sloupce se zobrazí v tabulkovém zobrazení objektů.",
|
||||
"custom_icon_optional": "Ikona (volitelná, např. mdi:wrench)",
|
||||
"notify_icon": "Ikona oznámení",
|
||||
"notify_icon_hint": "Zobrazuje aplikace Companion na Androidu. Prázdné = ikona typu údržby tohoto úkolu ({default}).",
|
||||
"task_enabled": "Úkol povolen",
|
||||
"skip_reason_prompt": "Přeskočit tento úkol?",
|
||||
"reason_optional": "Důvod (volitelný)",
|
||||
@@ -778,6 +791,7 @@
|
||||
"doc_camera": "Vyfotit",
|
||||
"camera_capture_shoot": "Vyfotit",
|
||||
"camera_switch_lens": "Přepnout kameru",
|
||||
"camera_switch_failed": "Žádná jiná kamera neodpověděla – tento telefon uvolňuje jen jednu. Pro druhý objektiv použijte výběr souboru.",
|
||||
"doc_drop_hint": "Přetáhněte soubory sem",
|
||||
"doc_task_none": "Žádné dokumenty spojené s tímto úkolem.",
|
||||
"doc_link_existing": "Připojit dokument…",
|
||||
@@ -886,6 +900,7 @@
|
||||
"adopt_problem_active": "aktivní",
|
||||
"adopt_problem_ok": "ok",
|
||||
"adopt_problem_new_object": "(nový)",
|
||||
"adopt_object_hint": "Dejte několika senzorům stejný název objektu a stanou se jedním objektem; zadejte název existujícího objektu a přidají se tam.",
|
||||
"adopt_problem_adopt": "Převzít vybrané",
|
||||
"adopt_problem_done": "Převzato {tasks} senzorů problémů",
|
||||
"views_label": "Zobrazení",
|
||||
|
||||
@@ -21,6 +21,9 @@
|
||||
"task_moved": "Opgave flyttet",
|
||||
"move_task_target": "Målobjekt",
|
||||
"move_task_message": "Vælg det objekt, opgaven skal høre til. Historik, aflæsninger og triggerstatus flytter med; den får et nyt referencenummer, og dens entiteter oprettes igen under det nye objekt. Tilknyttede dokumenter bliver hos det nuværende objekt.",
|
||||
"bulk_move_message": "Vælg det objekt, de markerede opgaver skal høre til. Opgaver, der allerede er der, springes over; historik, aflæsninger og triggerstatus flytter med.",
|
||||
"bulk_moved": "{n} opgaver flyttet",
|
||||
"more_actions": "Flere handlinger",
|
||||
"move_task_title": "Flyt opgave",
|
||||
"move_task": "Flyt til et andet objekt…",
|
||||
"object_duplicated": "Objekt duplikeret",
|
||||
@@ -40,6 +43,9 @@
|
||||
"bulk_n_selected": "{n} valgt",
|
||||
"bulk_completed": "{n} opgaver fuldført",
|
||||
"bulk_archived": "{n} opgaver arkiveret",
|
||||
"bulk_delete_objects_confirm": "Slet {n} objekter og alle deres opgaver? Arkivering bevarer i stedet historikken.",
|
||||
"bulk_objects_deleted": "{n} objekter slettet",
|
||||
"bulk_objects_archived": "{n} objekter arkiveret",
|
||||
"completing": "Fuldfører…",
|
||||
"interval": "Interval",
|
||||
"warning": "Advarsel",
|
||||
@@ -66,6 +72,10 @@
|
||||
"weekdays": "Ugedage",
|
||||
"nth_weekday": "N'te ugedag i måneden",
|
||||
"day_of_month": "Dag i måneden",
|
||||
"calendar": "Kalenderentitet",
|
||||
"calendar_entity_label": "Kalender",
|
||||
"calendar_entity_hint": "Forfalder én gang pr. begivenhed i denne kalender, på begivenhedens startdato — den næste begivenhed efter seneste udførelse.",
|
||||
"calendar_entity_required": "Vælg en kalenderentitet.",
|
||||
"recurrence_on_days": "Gentag på",
|
||||
"recurrence_occurrence": "Forekomst",
|
||||
"recurrence_weekday": "Ugedag",
|
||||
@@ -167,6 +177,7 @@
|
||||
"ws_err_self_link_device": "Et objekt kan ikke knyttes til sig selv",
|
||||
"ws_err_too_early": "For tidligt — opgaven kan først fuldføres tættere på forfaldsdatoen",
|
||||
"ws_err_invalid_search_template": "Søgelinket skal være en http(s)-URL, der indeholder {q}",
|
||||
"ws_err_invalid_icon": "Notifikationsikonet skal være et mdi:-navn, f.eks. mdi:air-filter",
|
||||
"feat_schedule_time": "Planlægning efter tidspunkt på dagen",
|
||||
"feat_schedule_time_desc": "Opgaver bliver forfaldne på et bestemt tidspunkt på dagen i stedet for midnat.",
|
||||
"schedule_time_toggle": "Forfalder på et bestemt tidspunkt",
|
||||
@@ -456,6 +467,8 @@
|
||||
"objects_table_columns_label": "Kolonner i objekttabel",
|
||||
"objects_table_columns_hint": "Vælg, hvilke kolonner der vises i objekttabelvisningen.",
|
||||
"custom_icon_optional": "Ikon (valgfrit, f.eks. mdi:wrench)",
|
||||
"notify_icon": "Notifikationsikon",
|
||||
"notify_icon_hint": "Vises af Companion-appen på Android. Tom = ikonet for opgavens vedligeholdelsestype ({default}).",
|
||||
"task_enabled": "Opgave aktiveret",
|
||||
"skip_reason_prompt": "Spring denne opgave over?",
|
||||
"reason_optional": "Årsag (valgfrit)",
|
||||
@@ -778,6 +791,7 @@
|
||||
"doc_camera": "Tag billede",
|
||||
"camera_capture_shoot": "Tag billede",
|
||||
"camera_switch_lens": "Skift kamera",
|
||||
"camera_switch_failed": "Intet andet kamera svarede — denne telefon frigiver kun ét. Brug filvælgeren til det andet objektiv.",
|
||||
"doc_drop_hint": "Slip filer her",
|
||||
"doc_task_none": "Ingen dokumenter knyttet til denne opgave.",
|
||||
"doc_link_existing": "Knyt et dokument…",
|
||||
@@ -886,6 +900,7 @@
|
||||
"adopt_problem_active": "aktiv",
|
||||
"adopt_problem_ok": "ok",
|
||||
"adopt_problem_new_object": "(ny)",
|
||||
"adopt_object_hint": "Giv flere sensorer samme objektnavn, så bliver de ét objekt; skriv et eksisterende objekts navn for at tilføje dem der.",
|
||||
"adopt_problem_adopt": "Adopter valgte",
|
||||
"adopt_problem_done": "Adopterede {tasks} problemsensor(er)",
|
||||
"views_label": "Visninger",
|
||||
|
||||
@@ -21,6 +21,9 @@
|
||||
"task_moved": "Aufgabe verschoben",
|
||||
"move_task_target": "Zielobjekt",
|
||||
"move_task_message": "Wähle das Objekt, zu dem diese Aufgabe gehören soll. Historie, Zählerstände und Trigger-Zustand wandern mit; sie bekommt eine neue Referenznummer und ihre Entitäten werden unter dem neuen Objekt neu angelegt. Verknüpfte Dokumente bleiben beim aktuellen Objekt.",
|
||||
"bulk_move_message": "Wähle das Objekt, zu dem die markierten Aufgaben gehören sollen. Aufgaben, die schon dort sind, werden übersprungen; Historie, Messwerte und Trigger-Zustand wandern mit.",
|
||||
"bulk_moved": "{n} Aufgaben verschoben",
|
||||
"more_actions": "Weitere Aktionen",
|
||||
"move_task_title": "Aufgabe verschieben",
|
||||
"move_task": "In anderes Objekt verschieben…",
|
||||
"object_duplicated": "Objekt dupliziert",
|
||||
@@ -40,6 +43,9 @@
|
||||
"bulk_n_selected": "{n} ausgewählt",
|
||||
"bulk_completed": "{n} Aufgaben erledigt",
|
||||
"bulk_archived": "{n} Aufgaben archiviert",
|
||||
"bulk_delete_objects_confirm": "{n} Objekte mit allen ihren Aufgaben löschen? Archivieren behält stattdessen die Historie.",
|
||||
"bulk_objects_deleted": "{n} Objekte gelöscht",
|
||||
"bulk_objects_archived": "{n} Objekte archiviert",
|
||||
"completing": "Wird erledigt…",
|
||||
"interval": "Intervall",
|
||||
"warning": "Vorwarnung",
|
||||
@@ -66,6 +72,10 @@
|
||||
"weekdays": "Wochentage",
|
||||
"nth_weekday": "N-ter Wochentag im Monat",
|
||||
"day_of_month": "Tag im Monat",
|
||||
"calendar": "Kalender-Entität",
|
||||
"calendar_entity_label": "Kalender",
|
||||
"calendar_entity_hint": "Einmal pro Termin dieses Kalenders fällig, am Starttag des Termins — der nächste Termin nach der letzten Erledigung.",
|
||||
"calendar_entity_required": "Bitte eine Kalender-Entität auswählen.",
|
||||
"recurrence_on_days": "Wiederholen an",
|
||||
"recurrence_occurrence": "Vorkommen",
|
||||
"recurrence_weekday": "Wochentag",
|
||||
@@ -167,6 +177,7 @@
|
||||
"ws_err_self_link_device": "Ein Objekt kann nicht mit sich selbst verknüpft werden",
|
||||
"ws_err_too_early": "Zu früh — diese Aufgabe kann erst näher am Fälligkeitsdatum erledigt werden",
|
||||
"ws_err_invalid_search_template": "Der Suchlink muss eine http(s)-URL mit {q} sein",
|
||||
"ws_err_invalid_icon": "Das Benachrichtigungs-Icon muss ein mdi:-Name sein, z. B. mdi:air-filter",
|
||||
"feat_schedule_time": "Uhrzeit-Scheduling",
|
||||
"feat_schedule_time_desc": "Tasks werden zu einer festen Uhrzeit fällig statt um Mitternacht.",
|
||||
"schedule_time_toggle": "Zu einer bestimmten Uhrzeit fällig",
|
||||
@@ -456,6 +467,8 @@
|
||||
"objects_table_columns_label": "Spalten der Objekt-Tabelle",
|
||||
"objects_table_columns_hint": "Wähle die Spalten für die Tabellenansicht der Objektübersicht.",
|
||||
"custom_icon_optional": "Icon (optional, z.B. mdi:wrench)",
|
||||
"notify_icon": "Benachrichtigungs-Icon",
|
||||
"notify_icon_hint": "Zeigt die Companion-App auf Android. Leer = das Icon der Wartungsart dieser Aufgabe ({default}).",
|
||||
"task_enabled": "Aufgabe aktiviert",
|
||||
"skip_reason_prompt": "Aufgabe überspringen?",
|
||||
"reason_optional": "Grund (optional)",
|
||||
@@ -778,6 +791,7 @@
|
||||
"doc_camera": "Foto aufnehmen",
|
||||
"camera_capture_shoot": "Aufnehmen",
|
||||
"camera_switch_lens": "Kamera wechseln",
|
||||
"camera_switch_failed": "Keine andere Kamera hat geantwortet – dieses Telefon gibt nur eine frei. Für das andere Objektiv die Dateiauswahl nutzen.",
|
||||
"doc_drop_hint": "Dateien hier ablegen",
|
||||
"doc_task_none": "Keine Dokumente mit dieser Aufgabe verknüpft.",
|
||||
"doc_link_existing": "Dokument verknüpfen…",
|
||||
@@ -886,6 +900,7 @@
|
||||
"adopt_problem_active": "aktiv",
|
||||
"adopt_problem_ok": "ok",
|
||||
"adopt_problem_new_object": "(neu)",
|
||||
"adopt_object_hint": "Gib mehreren Sensoren denselben Objektnamen, dann werden sie ein Objekt; der Name eines vorhandenen Objekts ordnet sie dort zu.",
|
||||
"adopt_problem_adopt": "Auswahl übernehmen",
|
||||
"adopt_problem_done": "{tasks} Problem-Sensor(en) übernommen",
|
||||
"views_label": "Ansichten",
|
||||
|
||||
@@ -21,6 +21,9 @@
|
||||
"task_moved": "Task moved",
|
||||
"move_task_target": "Target object",
|
||||
"move_task_message": "Choose the object this task should belong to. Its history, readings and trigger state move with it; it gets a new reference number and its entities are recreated under the new object. Linked documents stay with the current object.",
|
||||
"bulk_move_message": "Choose the object the selected tasks should belong to. Tasks that already live there are skipped; history, readings and trigger state move along.",
|
||||
"bulk_moved": "{n} tasks moved",
|
||||
"more_actions": "More actions",
|
||||
"move_task_title": "Move task",
|
||||
"move_task": "Move to another object…",
|
||||
"object_duplicated": "Object duplicated",
|
||||
@@ -40,6 +43,9 @@
|
||||
"bulk_n_selected": "{n} selected",
|
||||
"bulk_completed": "{n} tasks completed",
|
||||
"bulk_archived": "{n} tasks archived",
|
||||
"bulk_delete_objects_confirm": "Delete {n} objects and all their tasks? Archiving keeps their history instead.",
|
||||
"bulk_objects_deleted": "{n} objects deleted",
|
||||
"bulk_objects_archived": "{n} objects archived",
|
||||
"completing": "Completing…",
|
||||
"interval": "Interval",
|
||||
"warning": "Warning",
|
||||
@@ -66,6 +72,10 @@
|
||||
"weekdays": "Weekdays",
|
||||
"nth_weekday": "Nth weekday of month",
|
||||
"day_of_month": "Day of month",
|
||||
"calendar": "Calendar entity",
|
||||
"calendar_entity_label": "Calendar",
|
||||
"calendar_entity_hint": "Due once per event of this calendar, on the event's start date — the next event after the last completion.",
|
||||
"calendar_entity_required": "Choose a calendar entity.",
|
||||
"recurrence_on_days": "Repeat on",
|
||||
"recurrence_occurrence": "Occurrence",
|
||||
"recurrence_weekday": "Weekday",
|
||||
@@ -167,6 +177,7 @@
|
||||
"ws_err_self_link_device": "An object cannot be linked to itself",
|
||||
"ws_err_too_early": "Too early — this task can only be completed closer to its due date",
|
||||
"ws_err_invalid_search_template": "The search link must be an http(s) URL containing {q}",
|
||||
"ws_err_invalid_icon": "The notification icon must be an mdi: name, e.g. mdi:air-filter",
|
||||
"feat_schedule_time": "Time-of-day scheduling",
|
||||
"feat_schedule_time_desc": "Tasks become overdue at a specific time of day instead of midnight.",
|
||||
"schedule_time_toggle": "Due at a specific time",
|
||||
@@ -456,6 +467,8 @@
|
||||
"objects_table_columns_label": "Objects table columns",
|
||||
"objects_table_columns_hint": "Choose which columns appear in the objects table view.",
|
||||
"custom_icon_optional": "Icon (optional, e.g. mdi:wrench)",
|
||||
"notify_icon": "Notification icon",
|
||||
"notify_icon_hint": "Shown by the Companion app on Android. Empty = the icon of this task's maintenance type ({default}).",
|
||||
"task_enabled": "Task enabled",
|
||||
"skip_reason_prompt": "Skip this task?",
|
||||
"reason_optional": "Reason (optional)",
|
||||
@@ -784,6 +797,7 @@
|
||||
"doc_camera": "Take photo",
|
||||
"camera_capture_shoot": "Capture",
|
||||
"camera_switch_lens": "Switch camera",
|
||||
"camera_switch_failed": "No other camera answered — this phone hands out only one. Use the file picker for the other lens.",
|
||||
"doc_drop_hint": "Drop files here",
|
||||
"doc_task_none": "No documents linked to this task.",
|
||||
"doc_link_existing": "Link a document…",
|
||||
@@ -886,6 +900,7 @@
|
||||
"adopt_problem_active": "active",
|
||||
"adopt_problem_ok": "ok",
|
||||
"adopt_problem_new_object": "(new)",
|
||||
"adopt_object_hint": "Give several sensors the same object name and they become one object; type an existing object's name to add them there.",
|
||||
"adopt_problem_adopt": "Adopt selected",
|
||||
"adopt_problem_done": "Adopted {tasks} problem sensor(s)",
|
||||
"views_label": "Views",
|
||||
|
||||
@@ -19,6 +19,9 @@
|
||||
"task_moved": "Tarea movida",
|
||||
"move_task_target": "Objeto de destino",
|
||||
"move_task_message": "Elige el objeto al que debe pertenecer esta tarea. Su historial, lecturas y estado del disparador se mueven con ella; recibe un nuevo número de referencia y sus entidades se recrean bajo el nuevo objeto. Los documentos vinculados se quedan con el objeto actual.",
|
||||
"bulk_move_message": "Elige el objeto al que deben pertenecer las tareas seleccionadas. Las que ya están allí se omiten; el historial, las lecturas y el estado del disparador se mueven con ellas.",
|
||||
"bulk_moved": "{n} tareas movidas",
|
||||
"more_actions": "Más acciones",
|
||||
"move_task_title": "Mover tarea",
|
||||
"move_task": "Mover a otro objeto…",
|
||||
"object_duplicated": "Objeto duplicado",
|
||||
@@ -38,6 +41,9 @@
|
||||
"bulk_n_selected": "{n} seleccionados",
|
||||
"bulk_completed": "{n} tareas completadas",
|
||||
"bulk_archived": "{n} tareas archivadas",
|
||||
"bulk_delete_objects_confirm": "¿Eliminar {n} objetos y todas sus tareas? Archivar conserva su historial.",
|
||||
"bulk_objects_deleted": "{n} objetos eliminados",
|
||||
"bulk_objects_archived": "{n} objetos archivados",
|
||||
"completing": "Completando…",
|
||||
"interval": "Intervalo",
|
||||
"warning": "Aviso",
|
||||
@@ -64,6 +70,10 @@
|
||||
"weekdays": "Días de la semana",
|
||||
"nth_weekday": "N-ésimo día de la semana del mes",
|
||||
"day_of_month": "Día del mes",
|
||||
"calendar": "Entidad de calendario",
|
||||
"calendar_entity_label": "Calendario",
|
||||
"calendar_entity_hint": "Vence una vez por evento de este calendario, en la fecha de inicio del evento — el siguiente evento tras la última finalización.",
|
||||
"calendar_entity_required": "Elige una entidad de calendario.",
|
||||
"recurrence_on_days": "Repetir los",
|
||||
"recurrence_occurrence": "Aparición",
|
||||
"recurrence_weekday": "Día de la semana",
|
||||
@@ -165,6 +175,7 @@
|
||||
"ws_err_self_link_device": "Un objeto no puede vincularse a sí mismo",
|
||||
"ws_err_too_early": "Demasiado pronto — esta tarea solo puede completarse más cerca de su vencimiento",
|
||||
"ws_err_invalid_search_template": "El enlace de búsqueda debe ser una URL http(s) que contenga {q}",
|
||||
"ws_err_invalid_icon": "El icono de la notificación debe ser un nombre mdi:, p. ej. mdi:air-filter",
|
||||
"feat_schedule_time": "Programación por hora",
|
||||
"feat_schedule_time_desc": "Las tareas vencen a una hora específica en lugar de medianoche.",
|
||||
"schedule_time_toggle": "Vence a una hora concreta",
|
||||
@@ -454,6 +465,8 @@
|
||||
"objects_table_columns_label": "Columnas de la tabla de objetos",
|
||||
"objects_table_columns_hint": "Elige qué columnas aparecen en la vista de tabla de objetos.",
|
||||
"custom_icon_optional": "Icono (opcional, ej. mdi:wrench)",
|
||||
"notify_icon": "Icono de la notificación",
|
||||
"notify_icon_hint": "Lo muestra la app Companion en Android. Vacío = el icono del tipo de mantenimiento de esta tarea ({default}).",
|
||||
"task_enabled": "Tarea habilitada",
|
||||
"skip_reason_prompt": "¿Omitir esta tarea?",
|
||||
"reason_optional": "Motivo (opcional)",
|
||||
@@ -778,6 +791,7 @@
|
||||
"doc_camera": "Tomar foto",
|
||||
"camera_capture_shoot": "Capturar",
|
||||
"camera_switch_lens": "Cambiar de cámara",
|
||||
"camera_switch_failed": "Ninguna otra cámara respondió: este teléfono solo expone una. Usa el selector de archivos para el otro objetivo.",
|
||||
"doc_drop_hint": "Suelta los archivos aquí",
|
||||
"doc_task_none": "Ningún documento vinculado a esta tarea.",
|
||||
"doc_link_existing": "Vincular un documento…",
|
||||
@@ -886,6 +900,7 @@
|
||||
"adopt_problem_active": "activo",
|
||||
"adopt_problem_ok": "ok",
|
||||
"adopt_problem_new_object": "(nuevo)",
|
||||
"adopt_object_hint": "Da a varios sensores el mismo nombre de objeto y se convierten en un solo objeto; escribe el nombre de un objeto existente para añadirlos allí.",
|
||||
"adopt_problem_adopt": "Adoptar seleccionados",
|
||||
"adopt_problem_done": "{tasks} sensor(es) de problema adoptado(s)",
|
||||
"views_label": "Vistas",
|
||||
|
||||
@@ -21,6 +21,9 @@
|
||||
"task_moved": "Tehtävä siirretty",
|
||||
"move_task_target": "Kohde",
|
||||
"move_task_message": "Valitse kohde, johon tämän tehtävän tulee kuulua. Historia, lukemat ja liipaisimen tila siirtyvät mukana; tehtävä saa uuden viitenumeron ja sen entiteetit luodaan uudelleen uuden kohteen alle. Linkitetyt asiakirjat jäävät nykyiseen kohteeseen.",
|
||||
"bulk_move_message": "Valitse kohde, johon valittujen tehtävien tulee kuulua. Siellä jo olevat tehtävät ohitetaan; historia, lukemat ja liipaisimen tila siirtyvät mukana.",
|
||||
"bulk_moved": "{n} tehtävää siirretty",
|
||||
"more_actions": "Lisää toimintoja",
|
||||
"move_task_title": "Siirrä tehtävä",
|
||||
"move_task": "Siirrä toiseen kohteeseen…",
|
||||
"object_duplicated": "Kohde monistettu",
|
||||
@@ -40,6 +43,9 @@
|
||||
"bulk_n_selected": "{n} valittu",
|
||||
"bulk_completed": "{n} tehtävää valmiina",
|
||||
"bulk_archived": "{n} tehtävää arkistoitu",
|
||||
"bulk_delete_objects_confirm": "Poistetaanko {n} kohdetta kaikkine tehtävineen? Arkistointi säilyttää historian.",
|
||||
"bulk_objects_deleted": "{n} kohdetta poistettu",
|
||||
"bulk_objects_archived": "{n} kohdetta arkistoitu",
|
||||
"completing": "Suoritetaan…",
|
||||
"interval": "Väli",
|
||||
"warning": "Varoitus",
|
||||
@@ -66,6 +72,10 @@
|
||||
"weekdays": "Viikonpäivät",
|
||||
"nth_weekday": "Kuukauden n:s viikonpäivä",
|
||||
"day_of_month": "Kuukauden päivä",
|
||||
"calendar": "Kalenterientiteetti",
|
||||
"calendar_entity_label": "Kalenteri",
|
||||
"calendar_entity_hint": "Erääntyy kerran tämän kalenterin jokaista tapahtumaa kohti, tapahtuman alkupäivänä — seuraava tapahtuma viimeisimmän suorituksen jälkeen.",
|
||||
"calendar_entity_required": "Valitse kalenterientiteetti.",
|
||||
"recurrence_on_days": "Toista päivinä",
|
||||
"recurrence_occurrence": "Esiintymä",
|
||||
"recurrence_weekday": "Viikonpäivä",
|
||||
@@ -167,6 +177,7 @@
|
||||
"ws_err_self_link_device": "Objektia ei voi linkittää itseensä",
|
||||
"ws_err_too_early": "Liian aikaista — tehtävän voi merkitä tehdyksi vasta lähempänä eräpäivää",
|
||||
"ws_err_invalid_search_template": "Hakulinkin on oltava http(s)-URL, joka sisältää {q}",
|
||||
"ws_err_invalid_icon": "Ilmoituksen kuvakkeen on oltava mdi:-nimi, esim. mdi:air-filter",
|
||||
"feat_schedule_time": "Kellonajan ajoitus",
|
||||
"feat_schedule_time_desc": "Tehtävät erääntyvät tiettyyn kellonaikaan keskiyön sijaan.",
|
||||
"schedule_time_toggle": "Erääntyy tiettyyn kellonaikaan",
|
||||
@@ -456,6 +467,8 @@
|
||||
"objects_table_columns_label": "Kohdetaulukon sarakkeet",
|
||||
"objects_table_columns_hint": "Valitse, mitkä sarakkeet näkyvät kohdetaulukkonäkymässä.",
|
||||
"custom_icon_optional": "Kuvake (valinnainen, esim. mdi:wrench)",
|
||||
"notify_icon": "Ilmoituksen kuvake",
|
||||
"notify_icon_hint": "Näytetään Companion-sovelluksessa Androidilla. Tyhjä = tämän tehtävän huoltotyypin kuvake ({default}).",
|
||||
"task_enabled": "Tehtävä käytössä",
|
||||
"skip_reason_prompt": "Ohitetaanko tämä tehtävä?",
|
||||
"reason_optional": "Syy (valinnainen)",
|
||||
@@ -778,6 +791,7 @@
|
||||
"doc_camera": "Ota kuva",
|
||||
"camera_capture_shoot": "Ota kuva",
|
||||
"camera_switch_lens": "Vaihda kameraa",
|
||||
"camera_switch_failed": "Muu kamera ei vastannut – tämä puhelin antaa käyttöön vain yhden. Käytä toiselle objektiiville tiedostovalitsinta.",
|
||||
"doc_drop_hint": "Pudota tiedostot tähän",
|
||||
"doc_task_none": "Tähän tehtävään ei ole liitetty asiakirjoja.",
|
||||
"doc_link_existing": "Liitä asiakirja…",
|
||||
@@ -886,6 +900,7 @@
|
||||
"adopt_problem_active": "aktiivinen",
|
||||
"adopt_problem_ok": "ok",
|
||||
"adopt_problem_new_object": "(uusi)",
|
||||
"adopt_object_hint": "Anna useille antureille sama kohteen nimi, niin niistä tulee yksi kohde; kirjoita olemassa olevan kohteen nimi lisätäksesi ne sinne.",
|
||||
"adopt_problem_adopt": "Ota valitut käyttöön",
|
||||
"adopt_problem_done": "Otettiin käyttöön {tasks} ongelma-anturia",
|
||||
"views_label": "Näkymät",
|
||||
|
||||
@@ -19,6 +19,9 @@
|
||||
"task_moved": "Tâche déplacée",
|
||||
"move_task_target": "Objet cible",
|
||||
"move_task_message": "Choisissez l'objet auquel cette tâche doit appartenir. Son historique, ses relevés et l'état de son déclencheur la suivent ; elle reçoit un nouveau numéro de référence et ses entités sont recréées sous le nouvel objet. Les documents liés restent avec l'objet actuel.",
|
||||
"bulk_move_message": "Choisissez l'objet auquel les tâches sélectionnées doivent appartenir. Les tâches déjà présentes sont ignorées ; historique, relevés et état du déclencheur suivent.",
|
||||
"bulk_moved": "{n} tâches déplacées",
|
||||
"more_actions": "Autres actions",
|
||||
"move_task_title": "Déplacer la tâche",
|
||||
"move_task": "Déplacer vers un autre objet…",
|
||||
"object_duplicated": "Objet dupliqué",
|
||||
@@ -38,6 +41,9 @@
|
||||
"bulk_n_selected": "{n} sélectionné(s)",
|
||||
"bulk_completed": "{n} tâches terminées",
|
||||
"bulk_archived": "{n} tâches archivées",
|
||||
"bulk_delete_objects_confirm": "Supprimer {n} objets et toutes leurs tâches ? L'archivage conserve leur historique.",
|
||||
"bulk_objects_deleted": "{n} objets supprimés",
|
||||
"bulk_objects_archived": "{n} objets archivés",
|
||||
"completing": "En cours…",
|
||||
"interval": "Intervalle",
|
||||
"warning": "Avertissement",
|
||||
@@ -64,6 +70,10 @@
|
||||
"weekdays": "Jours de semaine",
|
||||
"nth_weekday": "N-ième jour de la semaine du mois",
|
||||
"day_of_month": "Jour du mois",
|
||||
"calendar": "Entité calendrier",
|
||||
"calendar_entity_label": "Calendrier",
|
||||
"calendar_entity_hint": "À faire une fois par événement de ce calendrier, à la date de début de l'événement — le prochain événement après la dernière réalisation.",
|
||||
"calendar_entity_required": "Choisissez une entité calendrier.",
|
||||
"recurrence_on_days": "Répéter le",
|
||||
"recurrence_occurrence": "Occurrence",
|
||||
"recurrence_weekday": "Jour de semaine",
|
||||
@@ -165,6 +175,7 @@
|
||||
"ws_err_self_link_device": "Un objet ne peut pas être lié à lui-même",
|
||||
"ws_err_too_early": "Trop tôt — cette tâche ne peut être terminée que plus près de son échéance",
|
||||
"ws_err_invalid_search_template": "Le lien de recherche doit être une URL http(s) contenant {q}",
|
||||
"ws_err_invalid_icon": "L'icône de notification doit être un nom mdi:, p. ex. mdi:air-filter",
|
||||
"feat_schedule_time": "Planification à l'heure",
|
||||
"feat_schedule_time_desc": "Les tâches arrivent à échéance à une heure précise plutôt qu'à minuit.",
|
||||
"schedule_time_toggle": "Échéance à une heure précise",
|
||||
@@ -454,6 +465,8 @@
|
||||
"objects_table_columns_label": "Colonnes du tableau d'objets",
|
||||
"objects_table_columns_hint": "Choisissez les colonnes affichées dans la vue tableau des objets.",
|
||||
"custom_icon_optional": "Icône (optionnel, ex. mdi:wrench)",
|
||||
"notify_icon": "Icône de notification",
|
||||
"notify_icon_hint": "Affichée par l'application Companion sur Android. Vide = l'icône du type d'entretien de cette tâche ({default}).",
|
||||
"task_enabled": "Tâche activée",
|
||||
"skip_reason_prompt": "Ignorer cette tâche ?",
|
||||
"reason_optional": "Raison (optionnel)",
|
||||
@@ -778,6 +791,7 @@
|
||||
"doc_camera": "Prendre une photo",
|
||||
"camera_capture_shoot": "Prendre la photo",
|
||||
"camera_switch_lens": "Changer de caméra",
|
||||
"camera_switch_failed": "Aucune autre caméra n'a répondu — ce téléphone n'en expose qu'une. Utilisez le sélecteur de fichiers pour l'autre objectif.",
|
||||
"doc_drop_hint": "Déposez les fichiers ici",
|
||||
"doc_task_none": "Aucun document lié à cette tâche.",
|
||||
"doc_link_existing": "Lier un document…",
|
||||
@@ -886,6 +900,7 @@
|
||||
"adopt_problem_active": "actif",
|
||||
"adopt_problem_ok": "ok",
|
||||
"adopt_problem_new_object": "(nouveau)",
|
||||
"adopt_object_hint": "Donnez le même nom d'objet à plusieurs capteurs et ils forment un seul objet ; saisissez le nom d'un objet existant pour les y ajouter.",
|
||||
"adopt_problem_adopt": "Adopter la sélection",
|
||||
"adopt_problem_done": "{tasks} capteur(s) de problème adopté(s)",
|
||||
"views_label": "Vues",
|
||||
|
||||
@@ -21,6 +21,9 @@
|
||||
"task_moved": "कार्य ले जाया गया",
|
||||
"move_task_target": "लक्ष्य ऑब्जेक्ट",
|
||||
"move_task_message": "वह ऑब्जेक्ट चुनें जिससे यह कार्य जुड़ा होना चाहिए। इतिहास, रीडिंग और ट्रिगर स्थिति साथ जाएँगे; इसे नया संदर्भ नंबर मिलेगा और इसकी एंटिटी नए ऑब्जेक्ट के अंतर्गत फिर से बनेंगी। जुड़े दस्तावेज़ वर्तमान ऑब्जेक्ट के पास रहेंगे।",
|
||||
"bulk_move_message": "वह ऑब्जेक्ट चुनें जिससे चयनित कार्य जुड़ने चाहिए। जो पहले से वहाँ हैं उन्हें छोड़ दिया जाता है; इतिहास, रीडिंग और ट्रिगर स्थिति साथ में जाते हैं।",
|
||||
"bulk_moved": "{n} कार्य स्थानांतरित किए गए",
|
||||
"more_actions": "और कार्रवाइयाँ",
|
||||
"move_task_title": "कार्य ले जाएँ",
|
||||
"move_task": "दूसरे ऑब्जेक्ट में ले जाएँ…",
|
||||
"object_duplicated": "ऑब्जेक्ट डुप्लिकेट किया गया",
|
||||
@@ -40,6 +43,9 @@
|
||||
"bulk_n_selected": "{n} चयनित",
|
||||
"bulk_completed": "{n} कार्य पूर्ण",
|
||||
"bulk_archived": "{n} कार्य संग्रहित",
|
||||
"bulk_delete_objects_confirm": "{n} ऑब्जेक्ट और उनके सभी कार्य हटाएँ? संग्रहित करने से उनका इतिहास बना रहता है।",
|
||||
"bulk_objects_deleted": "{n} ऑब्जेक्ट हटाए गए",
|
||||
"bulk_objects_archived": "{n} ऑब्जेक्ट संग्रहित किए गए",
|
||||
"completing": "पूर्ण किया जा रहा है…",
|
||||
"interval": "अंतराल",
|
||||
"warning": "चेतावनी",
|
||||
@@ -66,6 +72,10 @@
|
||||
"weekdays": "सप्ताह के दिन",
|
||||
"nth_weekday": "महीने का N-वाँ सप्ताह-दिन",
|
||||
"day_of_month": "महीने का दिन",
|
||||
"calendar": "कैलेंडर एंटिटी",
|
||||
"calendar_entity_label": "कैलेंडर",
|
||||
"calendar_entity_hint": "इस कैलेंडर की हर घटना पर एक बार, घटना की शुरुआत की तारीख को देय — पिछली बार पूरा करने के बाद की अगली घटना।",
|
||||
"calendar_entity_required": "एक कैलेंडर एंटिटी चुनें।",
|
||||
"recurrence_on_days": "दोहराएँ",
|
||||
"recurrence_occurrence": "घटना",
|
||||
"recurrence_weekday": "सप्ताह-दिन",
|
||||
@@ -167,6 +177,7 @@
|
||||
"ws_err_self_link_device": "कोई ऑब्जेक्ट स्वयं से लिंक नहीं हो सकता",
|
||||
"ws_err_too_early": "बहुत जल्दी — यह कार्य केवल नियत तारीख के करीब ही पूरा किया जा सकता है",
|
||||
"ws_err_invalid_search_template": "खोज लिंक {q} वाला http(s) URL होना चाहिए",
|
||||
"ws_err_invalid_icon": "सूचना आइकन एक mdi: नाम होना चाहिए, जैसे mdi:air-filter",
|
||||
"feat_schedule_time": "दिन का समय निर्धारण",
|
||||
"feat_schedule_time_desc": "कार्य मध्यरात्रि के बजाय दिन के एक विशिष्ट समय पर अतिदेय हो जाते हैं।",
|
||||
"schedule_time_toggle": "किसी निश्चित समय पर देय",
|
||||
@@ -456,6 +467,8 @@
|
||||
"objects_table_columns_label": "वस्तु तालिका कॉलम",
|
||||
"objects_table_columns_hint": "चुनें कि वस्तु तालिका दृश्य में कौन से कॉलम दिखाई दें।",
|
||||
"custom_icon_optional": "आइकन (वैकल्पिक, उदा. mdi:wrench)",
|
||||
"notify_icon": "सूचना आइकन",
|
||||
"notify_icon_hint": "Android पर Companion ऐप में दिखता है। खाली = इस कार्य के रखरखाव प्रकार का आइकन ({default})।",
|
||||
"task_enabled": "कार्य सक्षम",
|
||||
"skip_reason_prompt": "इस कार्य को छोड़ें?",
|
||||
"reason_optional": "कारण (वैकल्पिक)",
|
||||
@@ -778,6 +791,7 @@
|
||||
"doc_camera": "फ़ोटो लें",
|
||||
"camera_capture_shoot": "कैप्चर करें",
|
||||
"camera_switch_lens": "कैमरा बदलें",
|
||||
"camera_switch_failed": "किसी अन्य कैमरे ने जवाब नहीं दिया — यह फ़ोन केवल एक ही देता है। दूसरे लेंस के लिए फ़ाइल चयनकर्ता का उपयोग करें।",
|
||||
"doc_drop_hint": "फ़ाइलें यहाँ छोड़ें",
|
||||
"doc_task_none": "इस कार्य से कोई दस्तावेज़ संबद्ध नहीं है।",
|
||||
"doc_link_existing": "दस्तावेज़ जोड़ें…",
|
||||
@@ -886,6 +900,7 @@
|
||||
"adopt_problem_active": "सक्रिय",
|
||||
"adopt_problem_ok": "ठीक",
|
||||
"adopt_problem_new_object": "(नया)",
|
||||
"adopt_object_hint": "कई सेंसरों को एक ही ऑब्जेक्ट नाम दें तो वे एक ऑब्जेक्ट बन जाते हैं; मौजूदा ऑब्जेक्ट का नाम लिखें तो वे वहीं जुड़ जाते हैं।",
|
||||
"adopt_problem_adopt": "चयनित अपनाएँ",
|
||||
"adopt_problem_done": "{tasks} समस्या सेंसर अपनाए गए",
|
||||
"views_label": "व्यू",
|
||||
|
||||
@@ -21,6 +21,9 @@
|
||||
"task_moved": "Feladat áthelyezve",
|
||||
"move_task_target": "Célobjektum",
|
||||
"move_task_message": "Válaszd ki, melyik objektumhoz tartozzon ez a feladat. Az előzmények, a mérőállások és a trigger állapota vele költöznek; új hivatkozási számot kap, és az entitásai az új objektum alatt jönnek létre újra. A csatolt dokumentumok a jelenlegi objektumnál maradnak.",
|
||||
"bulk_move_message": "Válassza ki az objektumot, amelyhez a kijelölt feladatok tartozzanak. Az ott lévőket kihagyja; az előzmények, mérések és a kioldó állapota velük költöznek.",
|
||||
"bulk_moved": "{n} feladat áthelyezve",
|
||||
"more_actions": "További műveletek",
|
||||
"move_task_title": "Feladat áthelyezése",
|
||||
"move_task": "Áthelyezés másik objektumba…",
|
||||
"object_duplicated": "Objektum duplikálva",
|
||||
@@ -40,6 +43,9 @@
|
||||
"bulk_n_selected": "{n} kijelölve",
|
||||
"bulk_completed": "{n} feladat elvégezve",
|
||||
"bulk_archived": "{n} feladat archiválva",
|
||||
"bulk_delete_objects_confirm": "Törli a(z) {n} objektumot az összes feladatával együtt? Az archiválás ehelyett megőrzi az előzményeket.",
|
||||
"bulk_objects_deleted": "{n} objektum törölve",
|
||||
"bulk_objects_archived": "{n} objektum archiválva",
|
||||
"completing": "Elvégzés…",
|
||||
"interval": "Intervallum",
|
||||
"warning": "Figyelmeztetés",
|
||||
@@ -66,6 +72,10 @@
|
||||
"weekdays": "Hét napjai",
|
||||
"nth_weekday": "A hónap n. hétnapja",
|
||||
"day_of_month": "A hónap napja",
|
||||
"calendar": "Naptárentitás",
|
||||
"calendar_entity_label": "Naptár",
|
||||
"calendar_entity_hint": "A naptár minden eseményénél egyszer esedékes, az esemény kezdőnapján — az utolsó elvégzés utáni következő esemény.",
|
||||
"calendar_entity_required": "Válasszon egy naptárentitást.",
|
||||
"recurrence_on_days": "Ismétlés ezeken a napokon",
|
||||
"recurrence_occurrence": "Előfordulás",
|
||||
"recurrence_weekday": "Hét napja",
|
||||
@@ -167,6 +177,7 @@
|
||||
"ws_err_self_link_device": "Egy objektum nem kapcsolható önmagához",
|
||||
"ws_err_too_early": "Túl korai — ez a feladat csak a határidőhöz közelebb fejezhető be",
|
||||
"ws_err_invalid_search_template": "A keresőhivatkozásnak {q}-t tartalmazó http(s) URL-nek kell lennie",
|
||||
"ws_err_invalid_icon": "Az értesítés ikonjának mdi: névnek kell lennie, pl. mdi:air-filter",
|
||||
"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_toggle": "Adott időpontban esedékes",
|
||||
@@ -456,6 +467,8 @@
|
||||
"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)",
|
||||
"notify_icon": "Értesítés ikonja",
|
||||
"notify_icon_hint": "Az androidos Companion alkalmazás mutatja. Üres = a feladat karbantartási típusának ikonja ({default}).",
|
||||
"task_enabled": "Feladat engedélyezve",
|
||||
"skip_reason_prompt": "Kihagyja ezt a feladatot?",
|
||||
"reason_optional": "Indoklás (opcionális)",
|
||||
@@ -784,6 +797,7 @@
|
||||
"doc_camera": "Fotó készítése",
|
||||
"camera_capture_shoot": "Felvétel",
|
||||
"camera_switch_lens": "Kamera váltása",
|
||||
"camera_switch_failed": "Nem válaszolt másik kamera – ez a telefon csak egyet ad ki. A másik objektívhez használja a fájlválasztót.",
|
||||
"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…",
|
||||
@@ -886,6 +900,7 @@
|
||||
"adopt_problem_active": "aktív",
|
||||
"adopt_problem_ok": "ok",
|
||||
"adopt_problem_new_object": "(új)",
|
||||
"adopt_object_hint": "Adja több érzékelőnek ugyanazt az objektumnevet, és egy objektummá válnak; meglévő objektum nevét beírva oda kerülnek.",
|
||||
"adopt_problem_adopt": "Kijelöltek átvétele",
|
||||
"adopt_problem_done": "{tasks} problémaérzékelő átvéve",
|
||||
"views_label": "Nézetek",
|
||||
|
||||
@@ -19,6 +19,9 @@
|
||||
"task_moved": "Attività spostata",
|
||||
"move_task_target": "Oggetto di destinazione",
|
||||
"move_task_message": "Scegli l'oggetto a cui deve appartenere questa attività. Storico, letture e stato del trigger si spostano con lei; riceve un nuovo numero di riferimento e le sue entità vengono ricreate sotto il nuovo oggetto. I documenti collegati restano con l'oggetto attuale.",
|
||||
"bulk_move_message": "Scegli l'oggetto a cui devono appartenere le attività selezionate. Quelle già presenti vengono saltate; cronologia, letture e stato del trigger si spostano insieme.",
|
||||
"bulk_moved": "{n} attività spostate",
|
||||
"more_actions": "Altre azioni",
|
||||
"move_task_title": "Sposta attività",
|
||||
"move_task": "Sposta in un altro oggetto…",
|
||||
"object_duplicated": "Oggetto duplicato",
|
||||
@@ -38,6 +41,9 @@
|
||||
"bulk_n_selected": "{n} selezionati",
|
||||
"bulk_completed": "{n} attività completate",
|
||||
"bulk_archived": "{n} attività archiviate",
|
||||
"bulk_delete_objects_confirm": "Eliminare {n} oggetti con tutte le loro attività? L'archiviazione conserva invece la cronologia.",
|
||||
"bulk_objects_deleted": "{n} oggetti eliminati",
|
||||
"bulk_objects_archived": "{n} oggetti archiviati",
|
||||
"completing": "Completamento…",
|
||||
"interval": "Intervallo",
|
||||
"warning": "Avviso",
|
||||
@@ -64,6 +70,10 @@
|
||||
"weekdays": "Giorni della settimana",
|
||||
"nth_weekday": "N-esimo giorno della settimana del mese",
|
||||
"day_of_month": "Giorno del mese",
|
||||
"calendar": "Entità calendario",
|
||||
"calendar_entity_label": "Calendario",
|
||||
"calendar_entity_hint": "Da fare una volta per ogni evento di questo calendario, nella data di inizio dell'evento — il prossimo evento dopo l'ultimo completamento.",
|
||||
"calendar_entity_required": "Scegli un'entità calendario.",
|
||||
"recurrence_on_days": "Ripeti il",
|
||||
"recurrence_occurrence": "Occorrenza",
|
||||
"recurrence_weekday": "Giorno della settimana",
|
||||
@@ -165,6 +175,7 @@
|
||||
"ws_err_self_link_device": "Un oggetto non può essere collegato a sé stesso",
|
||||
"ws_err_too_early": "Troppo presto — questa attività può essere completata solo più vicino alla scadenza",
|
||||
"ws_err_invalid_search_template": "Il link di ricerca deve essere un URL http(s) contenente {q}",
|
||||
"ws_err_invalid_icon": "L'icona della notifica deve essere un nome mdi:, ad es. mdi:air-filter",
|
||||
"feat_schedule_time": "Pianificazione oraria",
|
||||
"feat_schedule_time_desc": "Le attività scadono a un'ora specifica anziché a mezzanotte.",
|
||||
"schedule_time_toggle": "Scadenza a un orario preciso",
|
||||
@@ -454,6 +465,8 @@
|
||||
"objects_table_columns_label": "Colonne tabella oggetti",
|
||||
"objects_table_columns_hint": "Scegli quali colonne mostrare nella vista tabella degli oggetti.",
|
||||
"custom_icon_optional": "Icona (opzionale, es. mdi:wrench)",
|
||||
"notify_icon": "Icona della notifica",
|
||||
"notify_icon_hint": "Mostrata dall'app Companion su Android. Vuoto = l'icona del tipo di manutenzione di questa attività ({default}).",
|
||||
"task_enabled": "Attività abilitata",
|
||||
"skip_reason_prompt": "Saltare questa attività?",
|
||||
"reason_optional": "Motivo (opzionale)",
|
||||
@@ -778,6 +791,7 @@
|
||||
"doc_camera": "Scatta foto",
|
||||
"camera_capture_shoot": "Scatta",
|
||||
"camera_switch_lens": "Cambia fotocamera",
|
||||
"camera_switch_failed": "Nessun'altra fotocamera ha risposto: questo telefono ne espone una sola. Per l'altro obiettivo usa la selezione file.",
|
||||
"doc_drop_hint": "Trascina qui i file",
|
||||
"doc_task_none": "Nessun documento collegato a questa attività.",
|
||||
"doc_link_existing": "Collega un documento…",
|
||||
@@ -886,6 +900,7 @@
|
||||
"adopt_problem_active": "attivo",
|
||||
"adopt_problem_ok": "ok",
|
||||
"adopt_problem_new_object": "(nuovo)",
|
||||
"adopt_object_hint": "Assegna lo stesso nome oggetto a più sensori e diventano un unico oggetto; digita il nome di un oggetto esistente per aggiungerli lì.",
|
||||
"adopt_problem_adopt": "Adotta selezionati",
|
||||
"adopt_problem_done": "{tasks} sensore/i di problema adottato/i",
|
||||
"views_label": "Viste",
|
||||
|
||||
@@ -21,6 +21,9 @@
|
||||
"task_moved": "タスクを移動しました",
|
||||
"move_task_target": "移動先オブジェクト",
|
||||
"move_task_message": "このタスクを所属させるオブジェクトを選んでください。履歴・検針値・トリガー状態は一緒に移動し、新しい参照番号が付き、エンティティは新しいオブジェクトの下で作り直されます。関連付けた文書は現在のオブジェクトに残ります。",
|
||||
"bulk_move_message": "選択したタスクの所属先オブジェクトを選んでください。すでにそこにあるタスクはスキップされ、履歴・計測値・トリガー状態は一緒に移動します。",
|
||||
"bulk_moved": "{n} 件のタスクを移動しました",
|
||||
"more_actions": "その他の操作",
|
||||
"move_task_title": "タスクを移動",
|
||||
"move_task": "別のオブジェクトへ移動…",
|
||||
"object_duplicated": "オブジェクトを複製しました",
|
||||
@@ -40,6 +43,9 @@
|
||||
"bulk_n_selected": "{n} 件選択",
|
||||
"bulk_completed": "{n} 件のタスクを完了",
|
||||
"bulk_archived": "{n} 件のタスクをアーカイブ",
|
||||
"bulk_delete_objects_confirm": "{n} 件のオブジェクトとそのすべてのタスクを削除しますか?アーカイブなら履歴が残ります。",
|
||||
"bulk_objects_deleted": "{n} 件のオブジェクトを削除しました",
|
||||
"bulk_objects_archived": "{n} 件のオブジェクトをアーカイブしました",
|
||||
"completing": "完了処理中…",
|
||||
"interval": "間隔",
|
||||
"warning": "警告",
|
||||
@@ -66,6 +72,10 @@
|
||||
"weekdays": "曜日",
|
||||
"nth_weekday": "毎月第N曜日",
|
||||
"day_of_month": "毎月の日",
|
||||
"calendar": "カレンダーエンティティ",
|
||||
"calendar_entity_label": "カレンダー",
|
||||
"calendar_entity_hint": "このカレンダーの予定ごとに1回、予定の開始日に期限を迎えます — 前回完了後の次の予定です。",
|
||||
"calendar_entity_required": "カレンダーエンティティを選択してください。",
|
||||
"recurrence_on_days": "繰り返す曜日",
|
||||
"recurrence_occurrence": "出現週",
|
||||
"recurrence_weekday": "曜日",
|
||||
@@ -167,6 +177,7 @@
|
||||
"ws_err_self_link_device": "オブジェクトを自分自身にリンクすることはできません",
|
||||
"ws_err_too_early": "早すぎます — このタスクは期日が近づいてからのみ完了できます",
|
||||
"ws_err_invalid_search_template": "検索リンクは {q} を含む http(s) URL である必要があります",
|
||||
"ws_err_invalid_icon": "通知アイコンは mdi: 名である必要があります(例: mdi:air-filter)",
|
||||
"feat_schedule_time": "時刻指定スケジュール",
|
||||
"feat_schedule_time_desc": "タスクが深夜0時ではなく指定した時刻に期限超過となります。",
|
||||
"schedule_time_toggle": "特定の時刻に期限",
|
||||
@@ -456,6 +467,8 @@
|
||||
"objects_table_columns_label": "対象テーブルの列",
|
||||
"objects_table_columns_hint": "対象のテーブル表示に表示する列を選択します。",
|
||||
"custom_icon_optional": "アイコン(任意、例: mdi:wrench)",
|
||||
"notify_icon": "通知アイコン",
|
||||
"notify_icon_hint": "Android の Companion アプリに表示されます。空欄 = このタスクのメンテナンス種別のアイコン({default})。",
|
||||
"task_enabled": "タスク有効",
|
||||
"skip_reason_prompt": "このタスクをスキップしますか?",
|
||||
"reason_optional": "理由(任意)",
|
||||
@@ -778,6 +791,7 @@
|
||||
"doc_camera": "写真を撮る",
|
||||
"camera_capture_shoot": "撮影",
|
||||
"camera_switch_lens": "カメラを切り替え",
|
||||
"camera_switch_failed": "他のカメラが応答しませんでした。この端末は1台しか公開していません。別のレンズにはファイル選択を使ってください。",
|
||||
"doc_drop_hint": "ここにファイルをドロップ",
|
||||
"doc_task_none": "このタスクに紐付いたドキュメントはありません。",
|
||||
"doc_link_existing": "ドキュメントを紐付け…",
|
||||
@@ -886,6 +900,7 @@
|
||||
"adopt_problem_active": "発生中",
|
||||
"adopt_problem_ok": "正常",
|
||||
"adopt_problem_new_object": "(新規)",
|
||||
"adopt_object_hint": "複数のセンサーに同じオブジェクト名を付けると1つのオブジェクトになります。既存のオブジェクト名を入力すればそこに追加されます。",
|
||||
"adopt_problem_adopt": "選択を取り込む",
|
||||
"adopt_problem_done": "{tasks} 件の問題センサーを取り込みました",
|
||||
"views_label": "ビュー",
|
||||
|
||||
@@ -21,6 +21,9 @@
|
||||
"task_moved": "작업을 이동했습니다",
|
||||
"move_task_target": "대상 개체",
|
||||
"move_task_message": "이 작업이 속할 개체를 선택하세요. 이력, 검침값, 트리거 상태가 함께 이동하며 새 참조 번호를 받고 엔티티는 새 개체 아래에 다시 생성됩니다. 연결된 문서는 현재 개체에 남습니다.",
|
||||
"bulk_move_message": "선택한 작업이 속할 개체를 고르세요. 이미 그곳에 있는 작업은 건너뛰며 기록, 측정값, 트리거 상태가 함께 이동합니다.",
|
||||
"bulk_moved": "작업 {n}개 이동됨",
|
||||
"more_actions": "추가 작업",
|
||||
"move_task_title": "작업 이동",
|
||||
"move_task": "다른 개체로 이동…",
|
||||
"object_duplicated": "객체가 복제되었습니다",
|
||||
@@ -40,6 +43,9 @@
|
||||
"bulk_n_selected": "{n}개 선택됨",
|
||||
"bulk_completed": "작업 {n}개 완료됨",
|
||||
"bulk_archived": "작업 {n}개 보관됨",
|
||||
"bulk_delete_objects_confirm": "개체 {n}개와 모든 작업을 삭제할까요? 보관하면 기록이 유지됩니다.",
|
||||
"bulk_objects_deleted": "개체 {n}개 삭제됨",
|
||||
"bulk_objects_archived": "개체 {n}개 보관됨",
|
||||
"completing": "완료 처리 중…",
|
||||
"interval": "주기",
|
||||
"warning": "경고",
|
||||
@@ -66,6 +72,10 @@
|
||||
"weekdays": "요일",
|
||||
"nth_weekday": "매월 N번째 요일",
|
||||
"day_of_month": "매월 특정 일",
|
||||
"calendar": "캘린더 엔티티",
|
||||
"calendar_entity_label": "캘린더",
|
||||
"calendar_entity_hint": "이 캘린더의 이벤트마다 한 번, 이벤트 시작일에 기한이 됩니다 — 마지막 완료 이후의 다음 이벤트입니다.",
|
||||
"calendar_entity_required": "캘린더 엔티티를 선택하세요.",
|
||||
"recurrence_on_days": "반복 요일",
|
||||
"recurrence_occurrence": "회차",
|
||||
"recurrence_weekday": "요일",
|
||||
@@ -167,6 +177,7 @@
|
||||
"ws_err_self_link_device": "객체는 자기 자신에게 연결할 수 없음",
|
||||
"ws_err_too_early": "너무 이름 — 이 작업은 기한에 가까워져야 완료할 수 있습니다",
|
||||
"ws_err_invalid_search_template": "검색 링크는 {q}를 포함한 http(s) URL이어야 합니다",
|
||||
"ws_err_invalid_icon": "알림 아이콘은 mdi: 이름이어야 합니다(예: mdi:air-filter)",
|
||||
"feat_schedule_time": "시각 지정 일정",
|
||||
"feat_schedule_time_desc": "작업이 자정이 아닌 지정한 시각에 기한 초과로 전환됩니다.",
|
||||
"schedule_time_toggle": "특정 시각에 기한",
|
||||
@@ -456,6 +467,8 @@
|
||||
"objects_table_columns_label": "객체 표 열",
|
||||
"objects_table_columns_hint": "객체 표 보기에 표시할 열을 선택하세요.",
|
||||
"custom_icon_optional": "아이콘 (선택, 예: mdi:wrench)",
|
||||
"notify_icon": "알림 아이콘",
|
||||
"notify_icon_hint": "Android의 Companion 앱에 표시됩니다. 비워 두면 이 작업의 유지보수 유형 아이콘({default})을 사용합니다.",
|
||||
"task_enabled": "작업 활성화",
|
||||
"skip_reason_prompt": "이 작업을 건너뛸까요?",
|
||||
"reason_optional": "사유 (선택)",
|
||||
@@ -784,6 +797,7 @@
|
||||
"doc_camera": "사진 촬영",
|
||||
"camera_capture_shoot": "촬영",
|
||||
"camera_switch_lens": "카메라 전환",
|
||||
"camera_switch_failed": "다른 카메라가 응답하지 않았습니다. 이 휴대폰은 하나만 제공합니다. 다른 렌즈는 파일 선택기를 사용하세요.",
|
||||
"doc_drop_hint": "파일을 여기에 놓으세요",
|
||||
"doc_task_none": "이 작업에 연결된 문서가 없습니다.",
|
||||
"doc_link_existing": "문서 연결…",
|
||||
@@ -886,6 +900,7 @@
|
||||
"adopt_problem_active": "활성",
|
||||
"adopt_problem_ok": "정상",
|
||||
"adopt_problem_new_object": "(신규)",
|
||||
"adopt_object_hint": "여러 센서에 같은 개체 이름을 주면 하나의 개체가 됩니다. 기존 개체 이름을 입력하면 거기에 추가됩니다.",
|
||||
"adopt_problem_adopt": "선택 항목 가져오기",
|
||||
"adopt_problem_done": "문제 센서 {tasks}개를 가져왔습니다",
|
||||
"views_label": "보기",
|
||||
|
||||
@@ -21,6 +21,9 @@
|
||||
"task_moved": "Oppgave flyttet",
|
||||
"move_task_target": "Målobjekt",
|
||||
"move_task_message": "Velg objektet denne oppgaven skal tilhøre. Historikk, avlesninger og utløserstatus følger med; den får et nytt referansenummer, og entitetene opprettes på nytt under det nye objektet. Tilknyttede dokumenter blir hos det nåværende objektet.",
|
||||
"bulk_move_message": "Velg objektet de merkede oppgavene skal tilhøre. Oppgaver som allerede er der hoppes over; historikk, avlesninger og utløserstatus flytter med.",
|
||||
"bulk_moved": "{n} oppgaver flyttet",
|
||||
"more_actions": "Flere handlinger",
|
||||
"move_task_title": "Flytt oppgave",
|
||||
"move_task": "Flytt til et annet objekt…",
|
||||
"object_duplicated": "Objekt duplisert",
|
||||
@@ -40,6 +43,9 @@
|
||||
"bulk_n_selected": "{n} valgt",
|
||||
"bulk_completed": "{n} oppgaver fullført",
|
||||
"bulk_archived": "{n} oppgaver arkivert",
|
||||
"bulk_delete_objects_confirm": "Slette {n} objekter og alle oppgavene deres? Arkivering beholder historikken i stedet.",
|
||||
"bulk_objects_deleted": "{n} objekter slettet",
|
||||
"bulk_objects_archived": "{n} objekter arkivert",
|
||||
"completing": "Fullfører…",
|
||||
"interval": "Intervall",
|
||||
"warning": "Advarsel",
|
||||
@@ -66,6 +72,10 @@
|
||||
"weekdays": "Ukedager",
|
||||
"nth_weekday": "N-te ukedag i måneden",
|
||||
"day_of_month": "Dag i måneden",
|
||||
"calendar": "Kalenderentitet",
|
||||
"calendar_entity_label": "Kalender",
|
||||
"calendar_entity_hint": "Forfaller én gang per hendelse i denne kalenderen, på hendelsens startdato — neste hendelse etter siste utførelse.",
|
||||
"calendar_entity_required": "Velg en kalenderentitet.",
|
||||
"recurrence_on_days": "Gjenta på",
|
||||
"recurrence_occurrence": "Forekomst",
|
||||
"recurrence_weekday": "Ukedag",
|
||||
@@ -167,6 +177,7 @@
|
||||
"ws_err_self_link_device": "Et objekt kan ikke kobles til seg selv",
|
||||
"ws_err_too_early": "For tidlig — oppgaven kan først fullføres nærmere forfallsdatoen",
|
||||
"ws_err_invalid_search_template": "Søkelenken må være en http(s)-URL som inneholder {q}",
|
||||
"ws_err_invalid_icon": "Varselikonet må være et mdi:-navn, f.eks. mdi:air-filter",
|
||||
"feat_schedule_time": "Planlegging med klokkeslett",
|
||||
"feat_schedule_time_desc": "Oppgaver forfaller på et bestemt klokkeslett i stedet for ved midnatt.",
|
||||
"schedule_time_toggle": "Forfaller på et bestemt klokkeslett",
|
||||
@@ -456,6 +467,8 @@
|
||||
"objects_table_columns_label": "Kolonner i objekttabell",
|
||||
"objects_table_columns_hint": "Velg hvilke kolonner som vises i tabellvisningen for objekter.",
|
||||
"custom_icon_optional": "Ikon (valgfritt, f.eks. mdi:wrench)",
|
||||
"notify_icon": "Varselikon",
|
||||
"notify_icon_hint": "Vises av Companion-appen på Android. Tom = ikonet for oppgavens vedlikeholdstype ({default}).",
|
||||
"task_enabled": "Oppgave aktivert",
|
||||
"skip_reason_prompt": "Hoppe over denne oppgaven?",
|
||||
"reason_optional": "Årsak (valgfritt)",
|
||||
@@ -778,6 +791,7 @@
|
||||
"doc_camera": "Ta bilde",
|
||||
"camera_capture_shoot": "Ta bilde",
|
||||
"camera_switch_lens": "Bytt kamera",
|
||||
"camera_switch_failed": "Ingen andre kameraer svarte – denne telefonen gir bare fra seg ett. Bruk filvelgeren for det andre objektivet.",
|
||||
"doc_drop_hint": "Slipp filer her",
|
||||
"doc_task_none": "Ingen dokumenter knyttet til denne oppgaven.",
|
||||
"doc_link_existing": "Knytt et dokument…",
|
||||
@@ -886,6 +900,7 @@
|
||||
"adopt_problem_active": "aktiv",
|
||||
"adopt_problem_ok": "ok",
|
||||
"adopt_problem_new_object": "(ny)",
|
||||
"adopt_object_hint": "Gi flere sensorer samme objektnavn, så blir de ett objekt; skriv navnet på et eksisterende objekt for å legge dem der.",
|
||||
"adopt_problem_adopt": "Ta i bruk valgte",
|
||||
"adopt_problem_done": "Tok i bruk {tasks} problemsensor(er)",
|
||||
"views_label": "Visninger",
|
||||
|
||||
@@ -19,6 +19,9 @@
|
||||
"task_moved": "Taak verplaatst",
|
||||
"move_task_target": "Doelobject",
|
||||
"move_task_message": "Kies het object waar deze taak bij hoort. Geschiedenis, meterstanden en triggerstatus verhuizen mee; de taak krijgt een nieuw referentienummer en haar entiteiten worden onder het nieuwe object opnieuw aangemaakt. Gekoppelde documenten blijven bij het huidige object.",
|
||||
"bulk_move_message": "Kies het object waartoe de geselecteerde taken moeten behoren. Taken die daar al staan worden overgeslagen; geschiedenis, meetwaarden en triggerstatus verhuizen mee.",
|
||||
"bulk_moved": "{n} taken verplaatst",
|
||||
"more_actions": "Meer acties",
|
||||
"move_task_title": "Taak verplaatsen",
|
||||
"move_task": "Naar ander object verplaatsen…",
|
||||
"object_duplicated": "Object gedupliceerd",
|
||||
@@ -38,6 +41,9 @@
|
||||
"bulk_n_selected": "{n} geselecteerd",
|
||||
"bulk_completed": "{n} taken voltooid",
|
||||
"bulk_archived": "{n} taken gearchiveerd",
|
||||
"bulk_delete_objects_confirm": "{n} objecten met al hun taken verwijderen? Archiveren bewaart in plaats daarvan de geschiedenis.",
|
||||
"bulk_objects_deleted": "{n} objecten verwijderd",
|
||||
"bulk_objects_archived": "{n} objecten gearchiveerd",
|
||||
"completing": "Wordt voltooid…",
|
||||
"interval": "Interval",
|
||||
"warning": "Waarschuwing",
|
||||
@@ -64,6 +70,10 @@
|
||||
"weekdays": "Weekdagen",
|
||||
"nth_weekday": "Zoveelste weekdag van de maand",
|
||||
"day_of_month": "Dag van de maand",
|
||||
"calendar": "Kalender-entiteit",
|
||||
"calendar_entity_label": "Kalender",
|
||||
"calendar_entity_hint": "Eén keer per gebeurtenis van deze kalender, op de startdatum van de gebeurtenis — de volgende gebeurtenis na de laatste afronding.",
|
||||
"calendar_entity_required": "Kies een kalender-entiteit.",
|
||||
"recurrence_on_days": "Herhalen op",
|
||||
"recurrence_occurrence": "Voorkomen",
|
||||
"recurrence_weekday": "Weekdag",
|
||||
@@ -165,6 +175,7 @@
|
||||
"ws_err_self_link_device": "Een object kan niet aan zichzelf worden gekoppeld",
|
||||
"ws_err_too_early": "Te vroeg — deze taak kan pas dichter bij de vervaldatum worden afgerond",
|
||||
"ws_err_invalid_search_template": "De zoeklink moet een http(s)-URL met {q} zijn",
|
||||
"ws_err_invalid_icon": "Het meldingspictogram moet een mdi:-naam zijn, bijv. mdi:air-filter",
|
||||
"feat_schedule_time": "Tijd-van-dag-planning",
|
||||
"feat_schedule_time_desc": "Taken vervallen op een specifieke tijd in plaats van middernacht.",
|
||||
"schedule_time_toggle": "Vervalt op een vast tijdstip",
|
||||
@@ -454,6 +465,8 @@
|
||||
"objects_table_columns_label": "Kolommen objecttabel",
|
||||
"objects_table_columns_hint": "Kies welke kolommen in de tabelweergave van objecten verschijnen.",
|
||||
"custom_icon_optional": "Icoon (optioneel, bijv. mdi:wrench)",
|
||||
"notify_icon": "Meldingspictogram",
|
||||
"notify_icon_hint": "Getoond door de Companion-app op Android. Leeg = het pictogram van het onderhoudstype van deze taak ({default}).",
|
||||
"task_enabled": "Taak ingeschakeld",
|
||||
"skip_reason_prompt": "Deze taak overslaan?",
|
||||
"reason_optional": "Reden (optioneel)",
|
||||
@@ -778,6 +791,7 @@
|
||||
"doc_camera": "Foto maken",
|
||||
"camera_capture_shoot": "Vastleggen",
|
||||
"camera_switch_lens": "Camera wisselen",
|
||||
"camera_switch_failed": "Geen andere camera reageerde — deze telefoon geeft er maar één vrij. Gebruik de bestandskiezer voor de andere lens.",
|
||||
"doc_drop_hint": "Sleep bestanden hierheen",
|
||||
"doc_task_none": "Geen documenten aan deze taak gekoppeld.",
|
||||
"doc_link_existing": "Document koppelen…",
|
||||
@@ -886,6 +900,7 @@
|
||||
"adopt_problem_active": "actief",
|
||||
"adopt_problem_ok": "ok",
|
||||
"adopt_problem_new_object": "(nieuw)",
|
||||
"adopt_object_hint": "Geef meerdere sensoren dezelfde objectnaam en ze worden één object; typ de naam van een bestaand object om ze daar toe te voegen.",
|
||||
"adopt_problem_adopt": "Selectie overnemen",
|
||||
"adopt_problem_done": "{tasks} probleemsensor(en) overgenomen",
|
||||
"views_label": "Weergaven",
|
||||
|
||||
@@ -19,6 +19,9 @@
|
||||
"task_moved": "Zadanie przeniesione",
|
||||
"move_task_target": "Obiekt docelowy",
|
||||
"move_task_message": "Wybierz obiekt, do którego ma należeć to zadanie. Historia, odczyty i stan wyzwalacza przenoszą się razem z nim; dostaje nowy numer referencyjny, a jego encje są tworzone na nowo pod nowym obiektem. Powiązane dokumenty zostają przy obecnym obiekcie.",
|
||||
"bulk_move_message": "Wybierz obiekt, do którego mają należeć zaznaczone zadania. Te, które już tam są, zostaną pominięte; historia, odczyty i stan wyzwalacza przenoszą się razem.",
|
||||
"bulk_moved": "Przeniesiono zadań: {n}",
|
||||
"more_actions": "Więcej działań",
|
||||
"move_task_title": "Przenieś zadanie",
|
||||
"move_task": "Przenieś do innego obiektu…",
|
||||
"object_duplicated": "Obiekt zduplikowany",
|
||||
@@ -38,6 +41,9 @@
|
||||
"bulk_n_selected": "Zaznaczono {n}",
|
||||
"bulk_completed": "Ukończono {n} zadań",
|
||||
"bulk_archived": "Zarchiwizowano {n} zadań",
|
||||
"bulk_delete_objects_confirm": "Usunąć {n} obiektów wraz ze wszystkimi zadaniami? Archiwizacja zachowa ich historię.",
|
||||
"bulk_objects_deleted": "Usunięto obiektów: {n}",
|
||||
"bulk_objects_archived": "Zarchiwizowano obiektów: {n}",
|
||||
"completing": "Wykonywanie…",
|
||||
"interval": "Interwał",
|
||||
"warning": "Ostrzeżenie",
|
||||
@@ -64,6 +70,10 @@
|
||||
"weekdays": "Dni tygodnia",
|
||||
"nth_weekday": "N-ty dzień tygodnia w miesiącu",
|
||||
"day_of_month": "Dzień miesiąca",
|
||||
"calendar": "Encja kalendarza",
|
||||
"calendar_entity_label": "Kalendarz",
|
||||
"calendar_entity_hint": "Termin przypada raz na każde wydarzenie z tego kalendarza, w dniu rozpoczęcia wydarzenia — następne wydarzenie po ostatnim wykonaniu.",
|
||||
"calendar_entity_required": "Wybierz encję kalendarza.",
|
||||
"recurrence_on_days": "Powtarzaj w",
|
||||
"recurrence_occurrence": "Wystąpienie",
|
||||
"recurrence_weekday": "Dzień tygodnia",
|
||||
@@ -165,6 +175,7 @@
|
||||
"ws_err_self_link_device": "Obiekt nie może być powiązany sam ze sobą",
|
||||
"ws_err_too_early": "Za wcześnie — to zadanie można ukończyć dopiero bliżej terminu",
|
||||
"ws_err_invalid_search_template": "Link wyszukiwania musi być adresem URL http(s) zawierającym {q}",
|
||||
"ws_err_invalid_icon": "Ikona powiadomienia musi być nazwą mdi:, np. mdi:air-filter",
|
||||
"feat_schedule_time": "Harmonogram według pory dnia",
|
||||
"feat_schedule_time_desc": "Zadania stają się zaległe o określonej porze dnia zamiast o północy.",
|
||||
"schedule_time_toggle": "Termin o określonej godzinie",
|
||||
@@ -454,6 +465,8 @@
|
||||
"objects_table_columns_label": "Kolumny tabeli obiektów",
|
||||
"objects_table_columns_hint": "Wybierz, które kolumny mają być widoczne w widoku tabeli obiektów.",
|
||||
"custom_icon_optional": "Ikona (opcjonalna, np. mdi:wrench)",
|
||||
"notify_icon": "Ikona powiadomienia",
|
||||
"notify_icon_hint": "Wyświetlana przez aplikację Companion na Androidzie. Puste = ikona typu konserwacji tego zadania ({default}).",
|
||||
"task_enabled": "Zadanie włączone",
|
||||
"skip_reason_prompt": "Pominąć to zadanie?",
|
||||
"reason_optional": "Powód (opcjonalny)",
|
||||
@@ -778,6 +791,7 @@
|
||||
"doc_camera": "Zrób zdjęcie",
|
||||
"camera_capture_shoot": "Zrób zdjęcie",
|
||||
"camera_switch_lens": "Przełącz kamerę",
|
||||
"camera_switch_failed": "Żadna inna kamera nie odpowiedziała — ten telefon udostępnia tylko jedną. Dla drugiego obiektywu użyj wyboru pliku.",
|
||||
"doc_drop_hint": "Upuść pliki tutaj",
|
||||
"doc_task_none": "Brak dokumentów powiązanych z tym zadaniem.",
|
||||
"doc_link_existing": "Powiąż dokument…",
|
||||
@@ -886,6 +900,7 @@
|
||||
"adopt_problem_active": "aktywny",
|
||||
"adopt_problem_ok": "ok",
|
||||
"adopt_problem_new_object": "(nowy)",
|
||||
"adopt_object_hint": "Nadaj kilku czujnikom tę samą nazwę obiektu, a staną się jednym obiektem; wpisz nazwę istniejącego obiektu, aby je tam dodać.",
|
||||
"adopt_problem_adopt": "Przejmij zaznaczone",
|
||||
"adopt_problem_done": "Przejęto {tasks} czujnik(ów) problemów",
|
||||
"views_label": "Widoki",
|
||||
|
||||
@@ -21,6 +21,9 @@
|
||||
"task_moved": "Tarefa movida",
|
||||
"move_task_target": "Objeto de destino",
|
||||
"move_task_message": "Escolha o objeto ao qual esta tarefa deve pertencer. Histórico, leituras e estado do gatilho vão junto; ela recebe um novo número de referência e suas entidades são recriadas no novo objeto. Documentos vinculados permanecem no objeto atual.",
|
||||
"bulk_move_message": "Escolha o objeto ao qual as tarefas selecionadas devem pertencer. As que já estão lá são ignoradas; histórico, leituras e estado do gatilho vão junto.",
|
||||
"bulk_moved": "{n} tarefas movidas",
|
||||
"more_actions": "Mais ações",
|
||||
"move_task_title": "Mover tarefa",
|
||||
"move_task": "Mover para outro objeto…",
|
||||
"object_duplicated": "Objeto duplicado",
|
||||
@@ -40,6 +43,9 @@
|
||||
"bulk_n_selected": "{n} selecionadas",
|
||||
"bulk_completed": "{n} tarefas concluídas",
|
||||
"bulk_archived": "{n} tarefas arquivadas",
|
||||
"bulk_delete_objects_confirm": "Excluir {n} objetos e todas as suas tarefas? Arquivar mantém o histórico.",
|
||||
"bulk_objects_deleted": "{n} objetos excluídos",
|
||||
"bulk_objects_archived": "{n} objetos arquivados",
|
||||
"completing": "Concluindo…",
|
||||
"interval": "Intervalo",
|
||||
"warning": "Aviso",
|
||||
@@ -66,6 +72,10 @@
|
||||
"weekdays": "Dias da semana",
|
||||
"nth_weekday": "Enésimo dia da semana do mês",
|
||||
"day_of_month": "Dia do mês",
|
||||
"calendar": "Entidade de calendário",
|
||||
"calendar_entity_label": "Calendário",
|
||||
"calendar_entity_hint": "Vence uma vez por evento deste calendário, na data de início do evento — o próximo evento após a última conclusão.",
|
||||
"calendar_entity_required": "Escolha uma entidade de calendário.",
|
||||
"recurrence_on_days": "Repetir em",
|
||||
"recurrence_occurrence": "Ocorrência",
|
||||
"recurrence_weekday": "Dia da semana",
|
||||
@@ -167,6 +177,7 @@
|
||||
"ws_err_self_link_device": "Um objeto não pode ser vinculado a si mesmo",
|
||||
"ws_err_too_early": "Cedo demais — esta tarefa só pode ser concluída mais perto do vencimento",
|
||||
"ws_err_invalid_search_template": "O link de busca deve ser uma URL http(s) contendo {q}",
|
||||
"ws_err_invalid_icon": "O ícone da notificação deve ser um nome mdi:, por ex. mdi:air-filter",
|
||||
"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_toggle": "Vence em um horário específico",
|
||||
@@ -456,6 +467,8 @@
|
||||
"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)",
|
||||
"notify_icon": "Ícone da notificação",
|
||||
"notify_icon_hint": "Exibido pelo app Companion no Android. Vazio = o ícone do tipo de manutenção desta tarefa ({default}).",
|
||||
"task_enabled": "Tarefa ativada",
|
||||
"skip_reason_prompt": "Pular esta tarefa?",
|
||||
"reason_optional": "Motivo (opcional)",
|
||||
@@ -784,6 +797,7 @@
|
||||
"doc_camera": "Tirar foto",
|
||||
"camera_capture_shoot": "Capturar",
|
||||
"camera_switch_lens": "Trocar de câmera",
|
||||
"camera_switch_failed": "Nenhuma outra câmera respondeu — este celular libera só uma. Use o seletor de arquivos para a outra lente.",
|
||||
"doc_drop_hint": "Solte os arquivos aqui",
|
||||
"doc_task_none": "Nenhum documento vinculado a esta tarefa.",
|
||||
"doc_link_existing": "Vincular um documento…",
|
||||
@@ -886,6 +900,7 @@
|
||||
"adopt_problem_active": "ativo",
|
||||
"adopt_problem_ok": "ok",
|
||||
"adopt_problem_new_object": "(novo)",
|
||||
"adopt_object_hint": "Dê a vários sensores o mesmo nome de objeto e eles viram um único objeto; digite o nome de um objeto existente para adicioná-los lá.",
|
||||
"adopt_problem_adopt": "Adotar selecionados",
|
||||
"adopt_problem_done": "{tasks} sensor(es) de problema adotado(s)",
|
||||
"views_label": "Visualizações",
|
||||
|
||||
@@ -19,6 +19,9 @@
|
||||
"task_moved": "Tarefa movida",
|
||||
"move_task_target": "Objeto de destino",
|
||||
"move_task_message": "Escolha o objeto a que esta tarefa deve pertencer. O histórico, as leituras e o estado do gatilho vão com ela; recebe um novo número de referência e as suas entidades são recriadas no novo objeto. Os documentos ligados ficam no objeto atual.",
|
||||
"bulk_move_message": "Escolha o objeto a que as tarefas selecionadas devem pertencer. As que já lá estão são ignoradas; histórico, leituras e estado do gatilho acompanham.",
|
||||
"bulk_moved": "{n} tarefas movidas",
|
||||
"more_actions": "Mais ações",
|
||||
"move_task_title": "Mover tarefa",
|
||||
"move_task": "Mover para outro objeto…",
|
||||
"object_duplicated": "Objeto duplicado",
|
||||
@@ -38,6 +41,9 @@
|
||||
"bulk_n_selected": "{n} selecionados",
|
||||
"bulk_completed": "{n} tarefas concluídas",
|
||||
"bulk_archived": "{n} tarefas arquivadas",
|
||||
"bulk_delete_objects_confirm": "Eliminar {n} objetos e todas as suas tarefas? Arquivar mantém o histórico.",
|
||||
"bulk_objects_deleted": "{n} objetos eliminados",
|
||||
"bulk_objects_archived": "{n} objetos arquivados",
|
||||
"completing": "A concluir…",
|
||||
"interval": "Intervalo",
|
||||
"warning": "Aviso",
|
||||
@@ -64,6 +70,10 @@
|
||||
"weekdays": "Dias da semana",
|
||||
"nth_weekday": "N-ésimo dia da semana do mês",
|
||||
"day_of_month": "Dia do mês",
|
||||
"calendar": "Entidade de calendário",
|
||||
"calendar_entity_label": "Calendário",
|
||||
"calendar_entity_hint": "Vence uma vez por evento deste calendário, na data de início do evento — o próximo evento após a última conclusão.",
|
||||
"calendar_entity_required": "Escolha uma entidade de calendário.",
|
||||
"recurrence_on_days": "Repetir em",
|
||||
"recurrence_occurrence": "Ocorrência",
|
||||
"recurrence_weekday": "Dia da semana",
|
||||
@@ -165,6 +175,7 @@
|
||||
"ws_err_self_link_device": "Um objeto não pode ser ligado a si próprio",
|
||||
"ws_err_too_early": "Demasiado cedo — esta tarefa só pode ser concluída mais perto do prazo",
|
||||
"ws_err_invalid_search_template": "A ligação de pesquisa tem de ser um URL http(s) com {q}",
|
||||
"ws_err_invalid_icon": "O ícone da notificação tem de ser um nome mdi:, p. ex. mdi:air-filter",
|
||||
"feat_schedule_time": "Agendamento por hora",
|
||||
"feat_schedule_time_desc": "Tarefas vencem em um horário específico em vez de meia-noite.",
|
||||
"schedule_time_toggle": "Vence a uma hora específica",
|
||||
@@ -454,6 +465,8 @@
|
||||
"objects_table_columns_label": "Colunas da tabela de objetos",
|
||||
"objects_table_columns_hint": "Escolha que colunas aparecem na vista de tabela de objetos.",
|
||||
"custom_icon_optional": "Ícone (opcional, ex. mdi:wrench)",
|
||||
"notify_icon": "Ícone da notificação",
|
||||
"notify_icon_hint": "Mostrado pela app Companion no Android. Vazio = o ícone do tipo de manutenção desta tarefa ({default}).",
|
||||
"task_enabled": "Tarefa ativada",
|
||||
"skip_reason_prompt": "Saltar esta tarefa?",
|
||||
"reason_optional": "Motivo (opcional)",
|
||||
@@ -778,6 +791,7 @@
|
||||
"doc_camera": "Tirar foto",
|
||||
"camera_capture_shoot": "Capturar",
|
||||
"camera_switch_lens": "Mudar de câmara",
|
||||
"camera_switch_failed": "Nenhuma outra câmara respondeu — este telemóvel só disponibiliza uma. Use o seletor de ficheiros para a outra objetiva.",
|
||||
"doc_drop_hint": "Solte os ficheiros aqui",
|
||||
"doc_task_none": "Nenhum documento associado a esta tarefa.",
|
||||
"doc_link_existing": "Associar um documento…",
|
||||
@@ -886,6 +900,7 @@
|
||||
"adopt_problem_active": "ativo",
|
||||
"adopt_problem_ok": "ok",
|
||||
"adopt_problem_new_object": "(novo)",
|
||||
"adopt_object_hint": "Dê a vários sensores o mesmo nome de objeto e tornam-se um só objeto; escreva o nome de um objeto existente para os juntar lá.",
|
||||
"adopt_problem_adopt": "Adotar selecionados",
|
||||
"adopt_problem_done": "{tasks} sensor(es) de problema adotado(s)",
|
||||
"views_label": "Vistas",
|
||||
|
||||
@@ -19,6 +19,9 @@
|
||||
"task_moved": "Задача перемещена",
|
||||
"move_task_target": "Целевой объект",
|
||||
"move_task_message": "Выберите объект, к которому должна относиться эта задача. История, показания и состояние триггера переедут вместе с ней; она получит новый номер, а её сущности будут созданы заново под новым объектом. Привязанные документы остаются у текущего объекта.",
|
||||
"bulk_move_message": "Выберите объект, к которому должны относиться выбранные задачи. Уже находящиеся там пропускаются; история, показания и состояние триггера переносятся.",
|
||||
"bulk_moved": "Перемещено задач: {n}",
|
||||
"more_actions": "Другие действия",
|
||||
"move_task_title": "Переместить задачу",
|
||||
"move_task": "Переместить в другой объект…",
|
||||
"object_duplicated": "Объект продублирован",
|
||||
@@ -38,6 +41,9 @@
|
||||
"bulk_n_selected": "Выбрано: {n}",
|
||||
"bulk_completed": "Выполнено задач: {n}",
|
||||
"bulk_archived": "Архивировано задач: {n}",
|
||||
"bulk_delete_objects_confirm": "Удалить {n} объектов со всеми их задачами? Архивация вместо этого сохранит историю.",
|
||||
"bulk_objects_deleted": "Удалено объектов: {n}",
|
||||
"bulk_objects_archived": "Архивировано объектов: {n}",
|
||||
"completing": "Выполнение…",
|
||||
"interval": "Интервал",
|
||||
"warning": "Предупреждение",
|
||||
@@ -64,6 +70,10 @@
|
||||
"weekdays": "Дни недели",
|
||||
"nth_weekday": "N-й день недели месяца",
|
||||
"day_of_month": "День месяца",
|
||||
"calendar": "Сущность календаря",
|
||||
"calendar_entity_label": "Календарь",
|
||||
"calendar_entity_hint": "Срок наступает один раз на каждое событие этого календаря, в дату начала события — следующее событие после последнего выполнения.",
|
||||
"calendar_entity_required": "Выберите сущность календаря.",
|
||||
"recurrence_on_days": "Повторять в",
|
||||
"recurrence_occurrence": "Вхождение",
|
||||
"recurrence_weekday": "День недели",
|
||||
@@ -165,6 +175,7 @@
|
||||
"ws_err_self_link_device": "Объект нельзя связать с самим собой",
|
||||
"ws_err_too_early": "Слишком рано — эту задачу можно завершить только ближе к сроку",
|
||||
"ws_err_invalid_search_template": "Ссылка для поиска должна быть URL http(s) с {q}",
|
||||
"ws_err_invalid_icon": "Значок уведомления должен быть именем mdi:, например mdi:air-filter",
|
||||
"feat_schedule_time": "Планирование по времени дня",
|
||||
"feat_schedule_time_desc": "Задачи становятся просроченными в определённое время дня, а не в полночь.",
|
||||
"schedule_time_toggle": "Срок в определённое время",
|
||||
@@ -454,6 +465,8 @@
|
||||
"objects_table_columns_label": "Столбцы таблицы объектов",
|
||||
"objects_table_columns_hint": "Выберите, какие столбцы показывать в табличном виде объектов.",
|
||||
"custom_icon_optional": "Иконка (опционально, например mdi:wrench)",
|
||||
"notify_icon": "Значок уведомления",
|
||||
"notify_icon_hint": "Показывается приложением Companion на Android. Пусто = значок типа обслуживания этой задачи ({default}).",
|
||||
"task_enabled": "Задача включена",
|
||||
"skip_reason_prompt": "Пропустить эту задачу?",
|
||||
"reason_optional": "Причина (опционально)",
|
||||
@@ -778,6 +791,7 @@
|
||||
"doc_camera": "Сделать фото",
|
||||
"camera_capture_shoot": "Снять",
|
||||
"camera_switch_lens": "Сменить камеру",
|
||||
"camera_switch_failed": "Другая камера не ответила — этот телефон отдаёт только одну. Для другого объектива используйте выбор файла.",
|
||||
"doc_drop_hint": "Перетащите файлы сюда",
|
||||
"doc_task_none": "Нет документов, связанных с этой задачей.",
|
||||
"doc_link_existing": "Связать документ…",
|
||||
@@ -886,6 +900,7 @@
|
||||
"adopt_problem_active": "активна",
|
||||
"adopt_problem_ok": "норма",
|
||||
"adopt_problem_new_object": "(новый)",
|
||||
"adopt_object_hint": "Дайте нескольким датчикам одно имя объекта — они станут одним объектом; введите имя существующего объекта, чтобы добавить их туда.",
|
||||
"adopt_problem_adopt": "Принять выбранные",
|
||||
"adopt_problem_done": "Принято сенсоров проблем: {tasks}",
|
||||
"views_label": "Представления",
|
||||
|
||||
@@ -19,6 +19,9 @@
|
||||
"task_moved": "Uppgift flyttad",
|
||||
"move_task_target": "Målobjekt",
|
||||
"move_task_message": "Välj vilket objekt uppgiften ska tillhöra. Historik, avläsningar och utlösarstatus följer med; den får ett nytt referensnummer och dess entiteter skapas om under det nya objektet. Länkade dokument stannar hos det nuvarande objektet.",
|
||||
"bulk_move_message": "Välj det objekt som de markerade uppgifterna ska tillhöra. Uppgifter som redan finns där hoppas över; historik, avläsningar och utlösarstatus följer med.",
|
||||
"bulk_moved": "{n} uppgifter flyttade",
|
||||
"more_actions": "Fler åtgärder",
|
||||
"move_task_title": "Flytta uppgift",
|
||||
"move_task": "Flytta till ett annat objekt…",
|
||||
"object_duplicated": "Objekt duplicerat",
|
||||
@@ -38,6 +41,9 @@
|
||||
"bulk_n_selected": "{n} valda",
|
||||
"bulk_completed": "{n} uppgifter slutförda",
|
||||
"bulk_archived": "{n} uppgifter arkiverade",
|
||||
"bulk_delete_objects_confirm": "Ta bort {n} objekt och alla deras uppgifter? Arkivering behåller historiken i stället.",
|
||||
"bulk_objects_deleted": "{n} objekt borttagna",
|
||||
"bulk_objects_archived": "{n} objekt arkiverade",
|
||||
"completing": "Slutför…",
|
||||
"interval": "Intervall",
|
||||
"warning": "Varning",
|
||||
@@ -64,6 +70,10 @@
|
||||
"weekdays": "Veckodagar",
|
||||
"nth_weekday": "N:te veckodag i månaden",
|
||||
"day_of_month": "Dag i månaden",
|
||||
"calendar": "Kalenderentitet",
|
||||
"calendar_entity_label": "Kalender",
|
||||
"calendar_entity_hint": "Förfaller en gång per händelse i den här kalendern, på händelsens startdatum — nästa händelse efter det senaste utförandet.",
|
||||
"calendar_entity_required": "Välj en kalenderentitet.",
|
||||
"recurrence_on_days": "Upprepa på",
|
||||
"recurrence_occurrence": "Förekomst",
|
||||
"recurrence_weekday": "Veckodag",
|
||||
@@ -165,6 +175,7 @@
|
||||
"ws_err_self_link_device": "Ett objekt kan inte länkas till sig självt",
|
||||
"ws_err_too_early": "För tidigt — uppgiften kan bara slutföras närmare förfallodatumet",
|
||||
"ws_err_invalid_search_template": "Söklänken måste vara en http(s)-URL som innehåller {q}",
|
||||
"ws_err_invalid_icon": "Aviseringsikonen måste vara ett mdi:-namn, t.ex. mdi:air-filter",
|
||||
"feat_schedule_time": "Schemaläggning per tid på dygnet",
|
||||
"feat_schedule_time_desc": "Uppgifter blir försenade vid en specifik tid på dygnet istället för midnatt.",
|
||||
"schedule_time_toggle": "Förfaller vid en viss tid",
|
||||
@@ -454,6 +465,8 @@
|
||||
"objects_table_columns_label": "Kolumner i objekttabell",
|
||||
"objects_table_columns_hint": "Välj vilka kolumner som visas i objekttabellvyn.",
|
||||
"custom_icon_optional": "Ikon (valfritt, t.ex. mdi:wrench)",
|
||||
"notify_icon": "Aviseringsikon",
|
||||
"notify_icon_hint": "Visas av Companion-appen på Android. Tomt = ikonen för uppgiftens underhållstyp ({default}).",
|
||||
"task_enabled": "Uppgift aktiverad",
|
||||
"skip_reason_prompt": "Hoppa över denna uppgift?",
|
||||
"reason_optional": "Anledning (valfritt)",
|
||||
@@ -778,6 +791,7 @@
|
||||
"doc_camera": "Ta foto",
|
||||
"camera_capture_shoot": "Ta bild",
|
||||
"camera_switch_lens": "Byt kamera",
|
||||
"camera_switch_failed": "Ingen annan kamera svarade – den här telefonen lämnar bara ut en. Använd filväljaren för det andra objektivet.",
|
||||
"doc_drop_hint": "Släpp filer här",
|
||||
"doc_task_none": "Inga dokument kopplade till denna uppgift.",
|
||||
"doc_link_existing": "Koppla ett dokument…",
|
||||
@@ -886,6 +900,7 @@
|
||||
"adopt_problem_active": "aktiv",
|
||||
"adopt_problem_ok": "ok",
|
||||
"adopt_problem_new_object": "(ny)",
|
||||
"adopt_object_hint": "Ge flera sensorer samma objektnamn så blir de ett objekt; skriv ett befintligt objekts namn för att lägga dem där.",
|
||||
"adopt_problem_adopt": "Anta valda",
|
||||
"adopt_problem_done": "Antog {tasks} problemsensor(er)",
|
||||
"views_label": "Vyer",
|
||||
|
||||
@@ -21,6 +21,9 @@
|
||||
"task_moved": "Görev taşındı",
|
||||
"move_task_target": "Hedef nesne",
|
||||
"move_task_message": "Bu görevin ait olacağı nesneyi seçin. Geçmiş, okumalar ve tetikleyici durumu birlikte taşınır; yeni bir referans numarası alır ve varlıkları yeni nesne altında yeniden oluşturulur. Bağlı belgeler mevcut nesnede kalır.",
|
||||
"bulk_move_message": "Seçili görevlerin ait olacağı nesneyi seçin. Zaten orada olanlar atlanır; geçmiş, okumalar ve tetikleyici durumu birlikte taşınır.",
|
||||
"bulk_moved": "{n} görev taşındı",
|
||||
"more_actions": "Diğer işlemler",
|
||||
"move_task_title": "Görevi taşı",
|
||||
"move_task": "Başka bir nesneye taşı…",
|
||||
"object_duplicated": "Nesne çoğaltıldı",
|
||||
@@ -40,6 +43,9 @@
|
||||
"bulk_n_selected": "{n} seçildi",
|
||||
"bulk_completed": "{n} görev tamamlandı",
|
||||
"bulk_archived": "{n} görev arşivlendi",
|
||||
"bulk_delete_objects_confirm": "{n} nesne ve tüm görevleri silinsin mi? Arşivlemek geçmişi korur.",
|
||||
"bulk_objects_deleted": "{n} nesne silindi",
|
||||
"bulk_objects_archived": "{n} nesne arşivlendi",
|
||||
"completing": "Tamamlanıyor…",
|
||||
"interval": "Aralık",
|
||||
"warning": "Uyarı",
|
||||
@@ -66,6 +72,10 @@
|
||||
"weekdays": "Haftanın günleri",
|
||||
"nth_weekday": "Ayın n. hafta günü",
|
||||
"day_of_month": "Ayın günü",
|
||||
"calendar": "Takvim varlığı",
|
||||
"calendar_entity_label": "Takvim",
|
||||
"calendar_entity_hint": "Bu takvimin her etkinliği için bir kez, etkinliğin başlangıç tarihinde vadesi gelir — son tamamlamadan sonraki bir sonraki etkinlik.",
|
||||
"calendar_entity_required": "Bir takvim varlığı seçin.",
|
||||
"recurrence_on_days": "Tekrar günleri",
|
||||
"recurrence_occurrence": "Kaçıncı",
|
||||
"recurrence_weekday": "Haftanın günü",
|
||||
@@ -167,6 +177,7 @@
|
||||
"ws_err_self_link_device": "Bir nesne kendisine bağlanamaz",
|
||||
"ws_err_too_early": "Çok erken — bu görev ancak son tarihine yaklaşınca tamamlanabilir",
|
||||
"ws_err_invalid_search_template": "Arama bağlantısı {q} içeren bir http(s) URL olmalıdır",
|
||||
"ws_err_invalid_icon": "Bildirim simgesi bir mdi: adı olmalıdır, örn. mdi:air-filter",
|
||||
"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_toggle": "Belirli bir saatte vadesi dolar",
|
||||
@@ -456,6 +467,8 @@
|
||||
"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)",
|
||||
"notify_icon": "Bildirim simgesi",
|
||||
"notify_icon_hint": "Android'de Companion uygulamasında gösterilir. Boş = bu görevin bakım türünün simgesi ({default}).",
|
||||
"task_enabled": "Görev etkin",
|
||||
"skip_reason_prompt": "Bu görev atlansın mı?",
|
||||
"reason_optional": "Neden (isteğe bağlı)",
|
||||
@@ -784,6 +797,7 @@
|
||||
"doc_camera": "Fotoğraf çek",
|
||||
"camera_capture_shoot": "Çek",
|
||||
"camera_switch_lens": "Kamerayı değiştir",
|
||||
"camera_switch_failed": "Başka bir kamera yanıt vermedi — bu telefon yalnızca birini açıyor. Diğer lens için dosya seçiciyi kullanın.",
|
||||
"doc_drop_hint": "Dosyaları buraya bırakın",
|
||||
"doc_task_none": "Bu göreve bağlı belge yok.",
|
||||
"doc_link_existing": "Belge bağla…",
|
||||
@@ -886,6 +900,7 @@
|
||||
"adopt_problem_active": "etkin",
|
||||
"adopt_problem_ok": "tamam",
|
||||
"adopt_problem_new_object": "(yeni)",
|
||||
"adopt_object_hint": "Birden çok sensöre aynı nesne adını verin, tek nesne olurlar; mevcut bir nesnenin adını yazarsanız oraya eklenirler.",
|
||||
"adopt_problem_adopt": "Seçilenleri devral",
|
||||
"adopt_problem_done": "{tasks} sorun sensörü devralındı",
|
||||
"views_label": "Görünümler",
|
||||
|
||||
@@ -19,6 +19,9 @@
|
||||
"task_moved": "Завдання переміщено",
|
||||
"move_task_target": "Цільовий об'єкт",
|
||||
"move_task_message": "Виберіть об'єкт, до якого має належати це завдання. Історія, показники та стан тригера переїдуть разом із ним; воно отримає новий номер, а його сутності буде створено заново під новим об'єктом. Прив'язані документи залишаться в поточному об'єкті.",
|
||||
"bulk_move_message": "Виберіть об'єкт, до якого мають належати вибрані завдання. Ті, що вже там, пропускаються; історія, показники та стан тригера переносяться.",
|
||||
"bulk_moved": "Переміщено завдань: {n}",
|
||||
"more_actions": "Інші дії",
|
||||
"move_task_title": "Перемістити завдання",
|
||||
"move_task": "Перемістити до іншого об'єкта…",
|
||||
"object_duplicated": "Об'єкт продубльовано",
|
||||
@@ -38,6 +41,9 @@
|
||||
"bulk_n_selected": "Вибрано: {n}",
|
||||
"bulk_completed": "Виконано завдань: {n}",
|
||||
"bulk_archived": "Архівовано завдань: {n}",
|
||||
"bulk_delete_objects_confirm": "Видалити {n} об'єктів з усіма їхніми завданнями? Архівування натомість збереже історію.",
|
||||
"bulk_objects_deleted": "Видалено об'єктів: {n}",
|
||||
"bulk_objects_archived": "Архівовано об'єктів: {n}",
|
||||
"completing": "Виконується…",
|
||||
"interval": "Інтервал",
|
||||
"warning": "Попередження",
|
||||
@@ -64,6 +70,10 @@
|
||||
"weekdays": "Дні тижня",
|
||||
"nth_weekday": "N-й день тижня в місяці",
|
||||
"day_of_month": "День місяця",
|
||||
"calendar": "Сутність календаря",
|
||||
"calendar_entity_label": "Календар",
|
||||
"calendar_entity_hint": "Термін настає один раз на кожну подію цього календаря, у дату початку події — наступна подія після останнього виконання.",
|
||||
"calendar_entity_required": "Виберіть сутність календаря.",
|
||||
"recurrence_on_days": "Повторювати у",
|
||||
"recurrence_occurrence": "Входження",
|
||||
"recurrence_weekday": "День тижня",
|
||||
@@ -165,6 +175,7 @@
|
||||
"ws_err_self_link_device": "Об'єкт не можна пов'язати із самим собою",
|
||||
"ws_err_too_early": "Зарано — це завдання можна завершити лише ближче до терміну",
|
||||
"ws_err_invalid_search_template": "Посилання для пошуку має бути URL http(s) із {q}",
|
||||
"ws_err_invalid_icon": "Значок сповіщення має бути іменем mdi:, наприклад mdi:air-filter",
|
||||
"feat_schedule_time": "Планування за часом доби",
|
||||
"feat_schedule_time_desc": "Задачі стають простроченими у певний час доби, а не опівночі.",
|
||||
"schedule_time_toggle": "Термін у визначений час",
|
||||
@@ -454,6 +465,8 @@
|
||||
"objects_table_columns_label": "Стовпці таблиці об'єктів",
|
||||
"objects_table_columns_hint": "Виберіть, які стовпці показувати в табличному вигляді об'єктів.",
|
||||
"custom_icon_optional": "Іконка (необов'язково, наприклад mdi:wrench)",
|
||||
"notify_icon": "Значок сповіщення",
|
||||
"notify_icon_hint": "Показується застосунком Companion на Android. Порожньо = значок типу обслуговування цього завдання ({default}).",
|
||||
"task_enabled": "Завдання увімкнено",
|
||||
"skip_reason_prompt": "Пропустити це завдання?",
|
||||
"reason_optional": "Причина (необов'язково)",
|
||||
@@ -778,6 +791,7 @@
|
||||
"doc_camera": "Зробити фото",
|
||||
"camera_capture_shoot": "Зняти",
|
||||
"camera_switch_lens": "Змінити камеру",
|
||||
"camera_switch_failed": "Інша камера не відповіла — цей телефон надає лише одну. Для іншого об'єктива скористайтеся вибором файлу.",
|
||||
"doc_drop_hint": "Перетягніть файли сюди",
|
||||
"doc_task_none": "Немає документів, пов'язаних із цим завданням.",
|
||||
"doc_link_existing": "Пов'язати документ…",
|
||||
@@ -886,6 +900,7 @@
|
||||
"adopt_problem_active": "активна",
|
||||
"adopt_problem_ok": "норма",
|
||||
"adopt_problem_new_object": "(новий)",
|
||||
"adopt_object_hint": "Дайте кільком сенсорам однакову назву об'єкта — вони стануть одним об'єктом; введіть назву наявного об'єкта, щоб додати їх туди.",
|
||||
"adopt_problem_adopt": "Прийняти вибрані",
|
||||
"adopt_problem_done": "Прийнято сенсорів проблем: {tasks}",
|
||||
"views_label": "Подання",
|
||||
|
||||
@@ -21,6 +21,9 @@
|
||||
"task_moved": "任务已移动",
|
||||
"move_task_target": "目标对象",
|
||||
"move_task_message": "选择此任务应归属的对象。历史记录、读数和触发器状态会一并迁移;任务将获得新的编号,其实体会在新对象下重新创建。关联的文档仍留在当前对象。",
|
||||
"bulk_move_message": "选择所选任务应归属的对象。已在该对象下的任务将被跳过;历史记录、读数和触发状态会一并迁移。",
|
||||
"bulk_moved": "已移动 {n} 个任务",
|
||||
"more_actions": "更多操作",
|
||||
"move_task_title": "移动任务",
|
||||
"move_task": "移动到其他对象…",
|
||||
"object_duplicated": "对象已复制",
|
||||
@@ -40,6 +43,9 @@
|
||||
"bulk_n_selected": "已选 {n} 项",
|
||||
"bulk_completed": "已完成 {n} 个任务",
|
||||
"bulk_archived": "已归档 {n} 个任务",
|
||||
"bulk_delete_objects_confirm": "删除 {n} 个对象及其全部任务?归档则会保留其历史记录。",
|
||||
"bulk_objects_deleted": "已删除 {n} 个对象",
|
||||
"bulk_objects_archived": "已归档 {n} 个对象",
|
||||
"completing": "正在完成…",
|
||||
"interval": "间隔",
|
||||
"warning": "预警",
|
||||
@@ -66,6 +72,10 @@
|
||||
"weekdays": "工作日",
|
||||
"nth_weekday": "每月第 N 个工作日",
|
||||
"day_of_month": "每月某天",
|
||||
"calendar": "日历实体",
|
||||
"calendar_entity_label": "日历",
|
||||
"calendar_entity_hint": "此日历的每个事件到期一次,以事件开始日期为准——即上次完成后的下一个事件。",
|
||||
"calendar_entity_required": "请选择一个日历实体。",
|
||||
"recurrence_on_days": "重复日期",
|
||||
"recurrence_occurrence": "发生次数",
|
||||
"recurrence_weekday": "星期",
|
||||
@@ -167,6 +177,7 @@
|
||||
"ws_err_self_link_device": "对象不能链接到自身",
|
||||
"ws_err_too_early": "为时过早 — 此任务只能在临近到期日时完成",
|
||||
"ws_err_invalid_search_template": "搜索链接必须是包含 {q} 的 http(s) 网址",
|
||||
"ws_err_invalid_icon": "通知图标必须是 mdi: 名称,例如 mdi:air-filter",
|
||||
"feat_schedule_time": "具体时间调度",
|
||||
"feat_schedule_time_desc": "任务将在特定时间点变为逾期,而非默认的午夜。",
|
||||
"schedule_time_toggle": "在特定时间到期",
|
||||
@@ -456,6 +467,8 @@
|
||||
"objects_table_columns_label": "对象表格列",
|
||||
"objects_table_columns_hint": "选择对象表格视图中显示的列。",
|
||||
"custom_icon_optional": "图标 (可选,例如 mdi:wrench)",
|
||||
"notify_icon": "通知图标",
|
||||
"notify_icon_hint": "由 Android 上的 Companion 应用显示。留空 = 此任务维护类型的图标({default})。",
|
||||
"task_enabled": "任务已启用",
|
||||
"skip_reason_prompt": "跳过此任务?",
|
||||
"reason_optional": "原因 (可选)",
|
||||
@@ -778,6 +791,7 @@
|
||||
"doc_camera": "拍照",
|
||||
"camera_capture_shoot": "拍摄",
|
||||
"camera_switch_lens": "切换摄像头",
|
||||
"camera_switch_failed": "没有其他摄像头响应——这部手机只开放一个。另一个镜头请使用文件选择器。",
|
||||
"doc_drop_hint": "将文件拖放到此处",
|
||||
"doc_task_none": "没有与此任务关联的文档。",
|
||||
"doc_link_existing": "关联文档…",
|
||||
@@ -886,6 +900,7 @@
|
||||
"adopt_problem_active": "存在",
|
||||
"adopt_problem_ok": "正常",
|
||||
"adopt_problem_new_object": "(新建)",
|
||||
"adopt_object_hint": "给多个传感器相同的对象名称,它们就会合并为一个对象;输入已有对象的名称即可加入该对象。",
|
||||
"adopt_problem_adopt": "采用所选",
|
||||
"adopt_problem_done": "已采用 {tasks} 个问题传感器",
|
||||
"views_label": "视图",
|
||||
|
||||
@@ -307,6 +307,11 @@ export class MaintenanceSupporterPanel extends LitElement {
|
||||
// complete/archive). Keys are `${entry_id}:${task_id}`.
|
||||
@state() private _bulkMode = false;
|
||||
@state() private _bulkSelected = new Set<string>();
|
||||
/** #188: multi-select in the All-objects view (delete / archive many at once). */
|
||||
@state() private _objBulkMode = false;
|
||||
@state() private _objBulkSelected = new Set<string>();
|
||||
/** #188: the task selection bar's overflow menu (Move to another object…). */
|
||||
@state() private _bulkMenuOpen = false;
|
||||
// Virtualized dashboard task table (large installs): only rows in the
|
||||
// scroll window are in the DOM; spacers keep the scrollbar honest. The
|
||||
// window is recomputed from `.content` scroll/resize (rAF-throttled).
|
||||
@@ -1308,6 +1313,8 @@ export class MaintenanceSupporterPanel extends LitElement {
|
||||
private _showAllObjects(): void {
|
||||
this._pushPanelState("all_objects");
|
||||
this._view = "all_objects";
|
||||
this._objBulkMode = false;
|
||||
this._objBulkSelected = new Set();
|
||||
this._selectedEntryId = null;
|
||||
this._selectedTaskId = null;
|
||||
this._scrollContentToTop();
|
||||
@@ -2003,6 +2010,7 @@ export class MaintenanceSupporterPanel extends LitElement {
|
||||
|
||||
private _toggleBulkMode(): void {
|
||||
this._bulkMode = !this._bulkMode;
|
||||
this._bulkMenuOpen = false;
|
||||
if (!this._bulkMode) this._bulkSelected = new Set();
|
||||
}
|
||||
|
||||
@@ -2045,6 +2053,122 @@ export class MaintenanceSupporterPanel extends LitElement {
|
||||
else this._showToast(doneMsg(ok));
|
||||
}
|
||||
|
||||
/** #188: move every selected task to one object (the single-task move's
|
||||
* prompt, then task/move per row; rows already there are skipped). */
|
||||
private async _bulkMove(rows: TaskRow[]): Promise<void> {
|
||||
const targets = this._objects
|
||||
.filter((o) => !o.object.archived_at)
|
||||
.sort((a, b) => (a.object.name || "").localeCompare(b.object.name || ""));
|
||||
if (!targets.length || this._bulkSelected.size === 0) return;
|
||||
const dlg = this.shadowRoot!.querySelector<MaintenanceConfirmDialog>("maintenance-confirm-dialog");
|
||||
const result = await dlg?.prompt({
|
||||
title: t("move_task_title", this._lang),
|
||||
message: t("bulk_move_message", this._lang),
|
||||
confirmText: t("move_task_title", this._lang),
|
||||
inputLabel: t("move_task_target", this._lang),
|
||||
inputValue: targets[0].entry_id,
|
||||
options: targets.map((o) => ({ value: o.entry_id, label: o.object.name || o.entry_id })),
|
||||
});
|
||||
if (!result?.confirmed || !result.value) return;
|
||||
const target = result.value;
|
||||
await this._runBulk(
|
||||
rows.filter((r) => r.entry_id !== target),
|
||||
(row) => ({ type: "maintenance_supporter/task/move", entry_id: row.entry_id, task_id: row.task_id, target_entry_id: target }),
|
||||
(n) => t("bulk_moved", this._lang).replace("{n}", String(n)),
|
||||
);
|
||||
}
|
||||
|
||||
// ── #188: bulk select in the All-objects view ──────────────────────────
|
||||
private _toggleObjBulkMode(): void {
|
||||
this._objBulkMode = !this._objBulkMode;
|
||||
if (!this._objBulkMode) this._objBulkSelected = new Set();
|
||||
}
|
||||
|
||||
private _toggleObjBulk(entryId: string): void {
|
||||
const next = new Set(this._objBulkSelected);
|
||||
if (next.has(entryId)) next.delete(entryId);
|
||||
else next.add(entryId);
|
||||
this._objBulkSelected = next;
|
||||
}
|
||||
|
||||
private _objBulkSelectAll(objs: MaintenanceObjectResponse[]): void {
|
||||
const ids = objs.map((o) => o.entry_id);
|
||||
const all = ids.length > 0 && ids.every((id) => this._objBulkSelected.has(id));
|
||||
this._objBulkSelected = all ? new Set() : new Set(ids);
|
||||
}
|
||||
|
||||
/** One WS call per selected object, sequentially (config entries are
|
||||
* removed one at a time on the backend); the successful count is reported. */
|
||||
private async _runObjBulk(type: string, doneMsg: (n: number) => string, undo?: (ids: string[]) => Promise<void>): Promise<void> {
|
||||
const ids = [...this._objBulkSelected];
|
||||
if (ids.length === 0) return;
|
||||
this._actionLoading = true;
|
||||
const done: string[] = [];
|
||||
for (const id of ids) {
|
||||
try {
|
||||
await this.hass.connection.sendMessagePromise({ type, entry_id: id });
|
||||
done.push(id);
|
||||
} catch { /* keep going; report the successful count */ }
|
||||
}
|
||||
this._actionLoading = false;
|
||||
this._objBulkSelected = new Set();
|
||||
this._objBulkMode = false;
|
||||
await this._loadData();
|
||||
if (undo && done.length > 0) this._showUndoToast(doneMsg(done.length), () => { void undo(done); });
|
||||
else this._showToast(doneMsg(done.length));
|
||||
}
|
||||
|
||||
private async _objBulkDelete(): Promise<void> {
|
||||
const n = this._objBulkSelected.size;
|
||||
if (n === 0) return;
|
||||
const dlg = this.shadowRoot!.querySelector<MaintenanceConfirmDialog>("maintenance-confirm-dialog");
|
||||
const ok = await dlg?.confirm({
|
||||
title: t("delete", this._lang),
|
||||
message: t("bulk_delete_objects_confirm", this._lang).replace("{n}", String(n)),
|
||||
confirmText: t("delete", this._lang),
|
||||
danger: true,
|
||||
});
|
||||
if (!ok) return;
|
||||
await this._runObjBulk("maintenance_supporter/object/delete", (k) => t("bulk_objects_deleted", this._lang).replace("{n}", String(k)));
|
||||
}
|
||||
|
||||
private _objBulkArchive(): void {
|
||||
void this._runObjBulk(
|
||||
"maintenance_supporter/object/archive",
|
||||
(k) => t("bulk_objects_archived", this._lang).replace("{n}", String(k)),
|
||||
async (ids) => {
|
||||
for (const id of ids) {
|
||||
try {
|
||||
await this.hass.connection.sendMessagePromise({ type: "maintenance_supporter/object/unarchive", entry_id: id });
|
||||
} catch { /* best effort */ }
|
||||
}
|
||||
await this._loadData();
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
private _renderObjBulkBar(objs: MaintenanceObjectResponse[], L: string) {
|
||||
const n = this._objBulkSelected.size;
|
||||
const allSelected = objs.length > 0 && objs.every((o) => this._objBulkSelected.has(o.entry_id));
|
||||
return html`
|
||||
<div class="bulk-bar obj-bulk-bar">
|
||||
<label class="bulk-selectall">
|
||||
<input type="checkbox" .checked=${allSelected} @change=${() => this._objBulkSelectAll(objs)} />
|
||||
${t("bulk_select_all", L)}
|
||||
</label>
|
||||
<span class="bulk-count">${t("bulk_n_selected", L).replace("{n}", String(n))}</span>
|
||||
<span class="bulk-actions">
|
||||
<ha-button appearance="plain" class="obj-bulk-archive" .disabled=${n === 0 || this._actionLoading} @click=${() => this._objBulkArchive()}>
|
||||
<ha-icon icon="mdi:archive-outline"></ha-icon> ${t("archive", L)}
|
||||
</ha-button>
|
||||
<ha-button appearance="filled" variant="danger" class="obj-bulk-delete" .disabled=${n === 0 || this._actionLoading} @click=${() => this._objBulkDelete()}>
|
||||
<ha-icon icon="mdi:delete-outline"></ha-icon> ${t("delete", L)}
|
||||
</ha-button>
|
||||
</span>
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
|
||||
private _bulkComplete(rows: TaskRow[]): void {
|
||||
void this._runBulk(
|
||||
rows,
|
||||
@@ -3311,6 +3435,17 @@ export class MaintenanceSupporterPanel extends LitElement {
|
||||
@click=${() => this._bulkArchive(rows)}>
|
||||
<ha-icon icon="mdi:archive-outline"></ha-icon> ${t("archive", L)}
|
||||
</ha-button>
|
||||
<span class="bulk-more-wrapper">
|
||||
<ha-button appearance="plain" class="bulk-more" title=${t("more_actions", L)} aria-label=${t("more_actions", L)} .disabled=${n === 0 || this._actionLoading}
|
||||
@click=${(e: Event) => { e.stopPropagation(); this._bulkMenuOpen = !this._bulkMenuOpen; }}>
|
||||
<ha-icon icon="mdi:dots-vertical"></ha-icon>
|
||||
</ha-button>
|
||||
${this._bulkMenuOpen ? html`
|
||||
<div class="popup-menu" @click=${(e: Event) => e.stopPropagation()}>
|
||||
<div class="popup-menu-item bulk-move" @click=${() => { this._bulkMenuOpen = false; void this._bulkMove(rows); }}>${t("move_task", L)}</div>
|
||||
</div>
|
||||
` : nothing}
|
||||
</span>
|
||||
</span>
|
||||
</div>
|
||||
`;
|
||||
@@ -3454,7 +3589,13 @@ export class MaintenanceSupporterPanel extends LitElement {
|
||||
const renderObject = (obj: MaintenanceObjectResponse) => {
|
||||
const overdue = obj.tasks.some(t => t.status === "overdue" || t.status === "triggered");
|
||||
return html`
|
||||
<div class="object-card${overdue ? ' object-card-overdue' : ''}" @click=${() => this._showObject(obj.entry_id)}>
|
||||
<div class="object-card${overdue ? ' object-card-overdue' : ''}${this._objBulkMode ? ' selectable' : ''}${this._objBulkMode && this._objBulkSelected.has(obj.entry_id) ? ' bulk-selected' : ''}"
|
||||
@click=${() => (this._objBulkMode ? this._toggleObjBulk(obj.entry_id) : this._showObject(obj.entry_id))}>
|
||||
${this._objBulkMode
|
||||
? html`<label class="obj-bulk-check bulk-check" @click=${(e: Event) => e.stopPropagation()}>
|
||||
<input type="checkbox" .checked=${this._objBulkSelected.has(obj.entry_id)} @change=${() => this._toggleObjBulk(obj.entry_id)} />
|
||||
</label>`
|
||||
: nothing}
|
||||
${overdue ? html`<span class="overdue-dot" title="${t("has_overdue", L)}"></span>` : nothing}
|
||||
<div class="object-card-header">
|
||||
<span class="object-card-name">${this._objRef(obj.object)}${obj.object.name}</span>
|
||||
@@ -3544,6 +3685,12 @@ export class MaintenanceSupporterPanel extends LitElement {
|
||||
<ha-button appearance="plain" @click=${() => this._exportObjectsCsv()}>
|
||||
<ha-icon icon="mdi:file-delimited-outline"></ha-icon> ${t("settings_export_csv", L)}
|
||||
</ha-button>
|
||||
${!isOperator ? html`
|
||||
<ha-button appearance="plain" class="bulk-toggle obj-bulk-toggle ${this._objBulkMode ? "active" : ""}" @click=${() => this._toggleObjBulkMode()}>
|
||||
<ha-icon icon="mdi:checkbox-multiple-marked-outline"></ha-icon>
|
||||
${this._objBulkMode ? t("cancel", L) : t("bulk_select", L)}
|
||||
</ha-button>
|
||||
` : nothing}
|
||||
${archivedObjCount > 0 ? html`
|
||||
<ha-button
|
||||
class="archived-toggle ${this._showArchived ? "active" : ""}"
|
||||
@@ -3554,6 +3701,7 @@ export class MaintenanceSupporterPanel extends LitElement {
|
||||
</ha-button>
|
||||
` : nothing}
|
||||
</div>
|
||||
${this._objBulkMode ? this._renderObjBulkBar(sorted, L) : nothing}
|
||||
${tableMode
|
||||
? this._renderObjectsTable(sorted)
|
||||
: this._groupByMode === "area"
|
||||
@@ -3696,6 +3844,7 @@ export class MaintenanceSupporterPanel extends LitElement {
|
||||
<table class="objects-table">
|
||||
<thead>
|
||||
<tr>
|
||||
${this._objBulkMode ? html`<th class="oc-bulk"></th>` : nothing}
|
||||
${cols.map((key) => {
|
||||
const def = OBJECT_COLUMNS.find((c) => c.key === key);
|
||||
// The actions column header stays blank (icon-only cells).
|
||||
@@ -3706,7 +3855,12 @@ export class MaintenanceSupporterPanel extends LitElement {
|
||||
</thead>
|
||||
<tbody>
|
||||
${objs.map((obj) => html`
|
||||
<tr class="objects-table-row" @click=${() => this._showObject(obj.entry_id)}>
|
||||
<tr class="objects-table-row${this._objBulkMode && this._objBulkSelected.has(obj.entry_id) ? ' bulk-selected' : ''}"
|
||||
@click=${() => (this._objBulkMode ? this._toggleObjBulk(obj.entry_id) : this._showObject(obj.entry_id))}>
|
||||
${this._objBulkMode
|
||||
? html`<td class="oc-bulk"><input type="checkbox" .checked=${this._objBulkSelected.has(obj.entry_id)}
|
||||
@click=${(e: Event) => e.stopPropagation()} @change=${() => this._toggleObjBulk(obj.entry_id)} /></td>`
|
||||
: nothing}
|
||||
${cols.map((key) => this._renderObjectCell(key, obj, L))}
|
||||
</tr>
|
||||
`)}
|
||||
|
||||
@@ -360,6 +360,7 @@ export const panelStyles = css`
|
||||
.bulk-selectall { display: inline-flex; align-items: center; gap: 6px; cursor: pointer; font-size: 13px; }
|
||||
.bulk-count { color: var(--secondary-text-color); font-size: 13px; }
|
||||
.bulk-actions { margin-left: auto; display: inline-flex; gap: 8px; }
|
||||
.bulk-more-wrapper { position: relative; display: inline-flex; }
|
||||
.bulk-toggle.active { --mdc-theme-primary: var(--primary-color); }
|
||||
|
||||
/* Collapsible analysis sections on the task-detail overview tab. The header
|
||||
|
||||
@@ -435,12 +435,14 @@ interface RecurrenceLike {
|
||||
schedule?: {
|
||||
kind?: string; every?: number | null; unit?: string;
|
||||
weekdays?: number[]; nth?: number; weekday?: number; day?: number;
|
||||
business?: boolean; offset?: number;
|
||||
business?: boolean; offset?: number; entity_id?: string | null;
|
||||
} | null;
|
||||
interval_days?: number | null;
|
||||
interval_unit?: string | null;
|
||||
due_date?: string | null;
|
||||
schedule_type?: string;
|
||||
/** (#187) calendar kind: friendly name of the driving calendar entity. */
|
||||
schedule_entity_name?: string | null;
|
||||
}
|
||||
|
||||
/** A task's recurrence as a localized human label, for ANY schedule kind.
|
||||
@@ -474,6 +476,10 @@ export function formatRecurrence(task: RecurrenceLike, lang?: string): string {
|
||||
: `${t("day_word", lang)} ${s.day}`;
|
||||
return base + off;
|
||||
}
|
||||
case "calendar":
|
||||
// (#187) "Calendar: Bio waste" — the summary carries the friendly name;
|
||||
// fall back to the entity_id when the calendar is not loaded.
|
||||
return `${t("calendar_entity_label", lang)}: ${task.schedule_entity_name || s.entity_id || "—"}${off}`;
|
||||
case "one_time":
|
||||
return task.due_date ? formatDate(task.due_date, lang) : t("one_time", lang);
|
||||
case "manual":
|
||||
@@ -653,6 +659,16 @@ export const sharedStyles = css`
|
||||
|
||||
/* Overdue indicator dot on object cards (#35) */
|
||||
.object-card { position: relative; }
|
||||
/* #188: bulk select in the All-objects view */
|
||||
.object-card.bulk-selected, .objects-table-row.bulk-selected {
|
||||
outline: 2px solid var(--primary-color); outline-offset: -2px;
|
||||
background: color-mix(in srgb, var(--primary-color) 10%, transparent);
|
||||
}
|
||||
.object-card.selectable { padding-left: 44px; }
|
||||
.obj-bulk-check { position: absolute; top: 12px; left: 12px; z-index: 1; }
|
||||
.obj-bulk-check input, .oc-bulk input { width: 17px; height: 17px; cursor: pointer; accent-color: var(--primary-color); }
|
||||
.oc-bulk { width: 28px; }
|
||||
.obj-bulk-bar { margin: 0 0 12px; }
|
||||
.object-card-overdue { border-left: 3px solid var(--error-color); }
|
||||
.overdue-dot {
|
||||
position: absolute;
|
||||
|
||||
@@ -10,8 +10,9 @@ export type MaintenanceStatus = "ok" | "due_soon" | "overdue" | "triggered" | "a
|
||||
export type HistoryEntryType = "completed" | "skipped" | "missed" | "reset" | "triggered" | "trigger_removed" | "trigger_replaced";
|
||||
/** const.MaintenanceTypeEnum */
|
||||
export type MaintenanceType = "cleaning" | "inspection" | "replacement" | "calibration" | "service" | "reading" | "custom";
|
||||
/** The nested calendar recurrence kinds (schedule-model v2). */
|
||||
export type CalendarKind = "weekdays" | "nth_weekday" | "day_of_month";
|
||||
/** The nested calendar recurrence kinds (schedule-model v2); `calendar` (#187)
|
||||
* = one occurrence per event of a HA calendar entity. */
|
||||
export type CalendarKind = "weekdays" | "nth_weekday" | "day_of_month" | "calendar";
|
||||
/** const.ScheduleType plus the calendar kinds the dialog exposes as schedule types. */
|
||||
export type ScheduleType = "time_based" | "sensor_based" | "one_time" | "manual" | CalendarKind;
|
||||
/** TaskSchedule.kind — the flat kinds plus the calendar kinds. */
|
||||
@@ -211,6 +212,8 @@ export interface TaskSchedule {
|
||||
months?: number[];
|
||||
/** (#83) day_of_month only: roll a weekend date back to Friday. */
|
||||
business?: boolean;
|
||||
/** (#187) calendar kind only: the `calendar.*` entity whose events are the occurrences. */
|
||||
entity_id?: string | null;
|
||||
/** (#83) shift the computed occurrence by ±N days (clamped ±15). */
|
||||
offset?: number;
|
||||
/** Seasonal active window — months (1..12) the task may be due in. */
|
||||
@@ -230,12 +233,16 @@ export interface MaintenanceTask {
|
||||
allow_skip?: boolean;
|
||||
/** #173: false = this task sends no reminders (dashboard/entities unaffected). */
|
||||
notify_enabled?: boolean;
|
||||
/** #185: mdi icon for this task's push notifications; null/absent = the type's default. */
|
||||
notify_icon?: string | null;
|
||||
schedule_type: ScheduleType;
|
||||
interval_days?: number | null;
|
||||
interval_unit?: IntervalUnit;
|
||||
due_date?: string | null; // one-time task due date (ISO)
|
||||
interval_anchor?: "completion" | "planned";
|
||||
schedule?: TaskSchedule; // nested recurrence (calendar kinds read this)
|
||||
/** (#187) calendar kind: the picked calendar's friendly name (summary-only). */
|
||||
schedule_entity_name?: string | null;
|
||||
schedule_time?: string | null; // "HH:MM" or null/undefined = midnight
|
||||
warning_days: number;
|
||||
last_performed?: string | null;
|
||||
@@ -576,6 +583,8 @@ export interface TaskRow {
|
||||
allow_skip: boolean;
|
||||
/** #173: false = no reminders for this task. */
|
||||
notify_enabled: boolean;
|
||||
/** #185: per-task notification icon override; null/absent = the type's default. */
|
||||
notify_icon?: string | null;
|
||||
nfc_tag_id: string | null;
|
||||
priority: string;
|
||||
labels: string[];
|
||||
|
||||
@@ -35,6 +35,7 @@ export const WS_ERROR_CODE_KEYS: Record<string, string> = {
|
||||
invalid_input: "ws_err_invalid_input",
|
||||
invalid_mirror_todo: "ws_err_invalid_mirror_todo",
|
||||
invalid_parent: "ws_err_invalid_parent",
|
||||
invalid_icon: "ws_err_invalid_icon",
|
||||
invalid_range: "ws_err_invalid_range",
|
||||
invalid_search_template: "ws_err_invalid_search_template",
|
||||
invalid_target: "ws_err_invalid_target",
|
||||
|
||||
Reference in new issue
Block a user