iobroker.alias-workbench 0.9.12 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/README.md +93 -91
  2. package/admin/css/werkbank.css +23 -0
  3. package/admin/i18n/de.json +701 -1
  4. package/admin/i18n/en.json +701 -1
  5. package/admin/i18n/es.json +701 -1
  6. package/admin/i18n/fr.json +701 -1
  7. package/admin/i18n/it.json +701 -1
  8. package/admin/i18n/nl.json +701 -1
  9. package/admin/i18n/pl.json +701 -1
  10. package/admin/i18n/pt.json +701 -1
  11. package/admin/i18n/ru.json +701 -1
  12. package/admin/i18n/uk.json +701 -1
  13. package/admin/i18n/zh-cn.json +701 -1
  14. package/admin/js/ablage.js +118 -0
  15. package/admin/js/aufzaehlungen.js +24 -8
  16. package/admin/js/baum.js +13 -2
  17. package/admin/js/detail.js +362 -86
  18. package/admin/js/entwurf.js +159 -41
  19. package/admin/js/enums.js +7 -0
  20. package/admin/js/ergebnis.js +26 -6
  21. package/admin/js/erkennung.js +45 -0
  22. package/admin/js/katalog.js +235 -40
  23. package/admin/js/mqtt.js +421 -90
  24. package/admin/js/musternamen.js +70 -26
  25. package/admin/js/musterwahl.js +103 -26
  26. package/admin/js/objekte.js +5 -0
  27. package/admin/js/pruefungen.js +1 -2
  28. package/admin/js/quellentausch.js +59 -12
  29. package/admin/js/schreiben.js +25 -20
  30. package/admin/js/sprache.js +7 -8
  31. package/admin/js/vorlagen.js +36 -8
  32. package/admin/js/vorlagenblatt.js +277 -71
  33. package/admin/js/vorschlagen.js +60 -7
  34. package/admin/js/werte.js +392 -25
  35. package/admin/js/zielleiste.js +19 -10
  36. package/admin/js/zuordnung.js +47 -23
  37. package/admin/js/zustand.js +9 -1
  38. package/admin/js/zustandsliste.js +194 -27
  39. package/admin/vorlagen/hm-dimmer.json +32 -8
  40. package/admin/vorlagen/hm-fensterkontakt-hm.json +20 -5
  41. package/admin/vorlagen/hm-fensterkontakt-hmip.json +28 -7
  42. package/admin/vorlagen/hm-heizgruppe.json +38 -11
  43. package/admin/vorlagen/hm-heizkoerper.json +42 -12
  44. package/admin/vorlagen/hm-rollladen.json +30 -8
  45. package/admin/vorlagen/hm-schaltaktor-lampe.json +24 -6
  46. package/admin/vorlagen/hm-schaltaktor-mehrfach.json +32 -8
  47. package/admin/vorlagen/hm-schaltaktor-steckdose.json +24 -6
  48. package/admin/vorlagen/hm-temperatur-feuchte.json +8 -2
  49. package/admin/vorlagen/hm-wandthermostat.json +36 -9
  50. package/admin/vorlagen/messpunkt.json +45 -11
  51. package/admin/vorlagen/tasmota-lampe.json +53 -13
  52. package/admin/vorlagen/tasmota-mehrfach.json +45 -11
  53. package/admin/vorlagen/tasmota-rgb.json +41 -10
  54. package/admin/vorlagen/tasmota-steckdose.json +61 -15
  55. package/io-package.json +41 -28
  56. package/package.json +2 -2
  57. package/admin/sprachen/de.json +0 -661
  58. package/admin/sprachen/en.json +0 -661
@@ -10,5 +10,705 @@
10
10
  "The Admin setup wizard leaves a bare name such as \"Playroom\" in the icon field, which no longer resolves to a picture and shows as a broken box. With this on, the workbench replaces it. It overwrites a field that is not empty — the dry run names it explicitly.": "The Admin setup wizard leaves a bare name such as \"Playroom\" in the icon field, which no longer resolves to a picture and shows as a broken box. With this on, the workbench replaces it. It overwrites a field that is not empty — the dry run names it explicitly.",
11
11
  "The Alias Workbench has no running process — everything happens in the Admin tab. These settings control how it writes.": "The Alias Workbench has no running process — everything happens in the Admin tab. These settings control how it writes.",
12
12
  "The workbench reads them at runtime from the Admin's own bundle instead of keeping a copy that would age with every update. If that fails, the selection lists simply show what already exists — no error, just fewer entries.": "The workbench reads them at runtime from the Admin's own bundle instead of keeping a copy that would age with every update. If that fails, the selection lists simply show what already exists — no error, just fewer entries.",
13
- "Where the templates come from": "Where the templates come from"
13
+ "Where the templates come from": "Where the templates come from",
14
+ "app.connected": "connected",
15
+ "app.detector": "type-detector",
16
+ "app.disconnected": "disconnected",
17
+ "app.objectsCount": "{0} objects",
18
+ "app.patternsCount": "{0} patterns",
19
+ "app.subsCount": "{0} subscriptions",
20
+ "app.subsCount1": "one subscription",
21
+ "app.subsHint": "A subscription covers a whole branch, not a single value — one pattern with a star catches every point below it. Switching nodes unsubscribes all previous ones; if the number keeps growing, one is being left behind. Currently watching:",
22
+ "app.templatesCount": "{0} templates",
23
+ "app.title": "Alias Workbench",
24
+ "catalog.loadingText": "One time after an Admin update — the bundle is a few megabytes. Afterwards the catalogue is stored and will not be fetched again.",
25
+ "catalog.loadingTitle": "Fetching the Admin templates",
26
+ "catalog.missing": "Admin catalogue unavailable — existing entries only",
27
+ "check.allDeliver": "all deliver",
28
+ "check.allFine": "all fine",
29
+ "check.allOk": "{0} ✓",
30
+ "check.button": "Checks",
31
+ "check.canSend": "{0} write paths fine",
32
+ "check.cannotSend": "cannot send: {0}",
33
+ "check.checked": "{0} checked",
34
+ "check.duplicate": "No duplicate point",
35
+ "check.duplicateNone": "each points somewhere else",
36
+ "check.duplicateSome": "point at the same thing: {0}",
37
+ "check.feedback": "feedback arrives at once",
38
+ "check.feedbackFast": "at once, SetOption59 is on",
39
+ "check.feedbackNone": "no row affected — all read from stat/…",
40
+ "check.feedbackSlow": "delayed: {0}",
41
+ "check.feedbackUnknown": "unchecked: {0}",
42
+ "check.formulaYields": "read formula yields something",
43
+ "check.hintCount": "notes: {0}",
44
+ "check.noPatternFits": "no pattern fits",
45
+ "check.noWritePath": "no point writes",
46
+ "check.notMqtt": "no MQTT write path",
47
+ "check.openCount": "{0} open",
48
+ "check.publish": "publish on the cmnd point",
49
+ "check.rolesMakeDevice": "roles make a device",
50
+ "check.sendPointMissing": "send datapoint not created yet: {0}",
51
+ "check.sendUnknown": "Whether {0} may publish is not stated in the object — the topic sits in `native` only. Normal for ioBroker.mqtt and sonoff.",
52
+ "check.sourceExists": "source exists",
53
+ "check.sourceHasValue": "source has a value",
54
+ "check.targetCan": "target can do what is asked",
55
+ "check.targetCanFine": "all fine",
56
+ "check.targetNoWrite": "{0}: the target is not writable",
57
+ "check.targetVoidFormula": "{0}: write formula runs into nothing, the target is {1}",
58
+ "check.title": "Checks — always running, never touching anything",
59
+ "del.allOutputs": "Remove all {0} outputs of this device",
60
+ "del.allOutputsHint": "Otherwise the rest stays behind, orphaned: {0}",
61
+ "del.alsoFunction": "The function “{0}”, created along with this alias, is removed as well — it would be left empty otherwise.",
62
+ "del.alsoRoom": "The room “{0}”, created along with this alias, is removed as well — it would be left empty otherwise.",
63
+ "del.button": "Remove alias …",
64
+ "del.channelsBelow": "Careful: {0} channels of their own sit below this and will be deleted too.",
65
+ "del.count": "objects will be removed: {0}",
66
+ "del.done": "Removed: {0} objects.",
67
+ "del.hint": "The alias and every datapoint below it is deleted. The sources stay untouched — only the shell goes, not the device. This cannot be undone.",
68
+ "del.now": "Remove for good",
69
+ "del.objects": "What disappears",
70
+ "del.scriptsHead": "{0} scripts mention this ID:",
71
+ "del.scriptsHead1": "One script mentions this ID:",
72
+ "del.scriptsHint": "Only the scripts of the javascript adapter were searched, as plain text. vis views, scenes and the settings of other adapters are not covered.",
73
+ "del.title": "Remove alias",
74
+ "detail.aliasEmpty": "The alias leaves this field empty.",
75
+ "detail.aliasHas": "The alias has: ",
76
+ "detail.asDelivered": "as delivered",
77
+ "detail.attention": "Attention",
78
+ "detail.buttonNoRead": "Button without read source — does not read along",
79
+ "detail.caption": "Caption",
80
+ "detail.captionHint": "becomes the display name of the state — shown in the admin, in VIS and wherever names are used instead of IDs",
81
+ "detail.converted": "converted by the alias",
82
+ "detail.datapoint": "Datapoint",
83
+ "detail.decimals": "Decimals",
84
+ "detail.display": "Display",
85
+ "detail.elsewhere": "(elsewhere)",
86
+ "detail.expects": "expects {0}",
87
+ "detail.formula": "Read formula",
88
+ "detail.formulaBroken": "formula is faulty",
89
+ "detail.formulaHint": "\"ON\"/\"OFF\" → boolean is done by the alias itself, no formula needed.",
90
+ "detail.formulaPlaceholder": "empty = take the value unchanged",
91
+ "detail.formulaThrows": "formula throws: {0}",
92
+ "detail.formulaTooSlow": "This formula took {0} ms and is no longer executed. Reloading the tab gives it one more try.",
93
+ "detail.jsonField": "Field in the JSON",
94
+ "detail.matchesState": "✓ matches the state",
95
+ "detail.name": "Name",
96
+ "detail.namePlaceholder": "e.g. UNREACH",
97
+ "detail.nameTaken": "Another row already has the name {0}.",
98
+ "detail.noSource": "— no source known —",
99
+ "detail.noValue": "no value",
100
+ "detail.noWrite": "— do not write —",
101
+ "detail.notWritable": "not writable",
102
+ "detail.objectId": "Object ID",
103
+ "detail.otherObject": "… enter another object",
104
+ "detail.ownFormula": "own formula",
105
+ "detail.pickOne": "— please choose —",
106
+ "detail.rawNothing": "— the source delivers nothing —",
107
+ "detail.rawValue": "Raw value",
108
+ "detail.readIsButton": "button",
109
+ "detail.readIsButtonHint": "Role button with a write target: the alias datapoint gets read: false, and vis, Alexa and matter draw it as a button. The read source does no harm — with it the alias sees every press, including one on the physical button. After a press the last value stays, as it does on the source.",
110
+ "detail.readOnlySlotWrites": "{0} is read-only in the pattern — “writes to” should be “— do not write —”, otherwise a written value goes to the device.",
111
+ "detail.readsFrom": "reads from",
112
+ "detail.removePoint": "Remove this point",
113
+ "detail.role": "Role",
114
+ "detail.sameAsRead": "— same as read —",
115
+ "detail.separateHint": "Reads from somewhere else than it writes to: what is shown is what the device reports back — not the command sent last.",
116
+ "detail.slot": "Place in pattern",
117
+ "detail.slotHint": "Sets role, type, unit and value list as the pattern prescribes for this place. Datapoint and name stay.",
118
+ "detail.slotNone": "— no place —",
119
+ "detail.slotNotGiven": "{0} is chosen but not assigned — see “Role” for what does not fit (usually the type).",
120
+ "detail.slotRequired": "required",
121
+ "detail.sourceGone": "source does not exist",
122
+ "detail.stateSays": "state says {0}",
123
+ "detail.states": "Value list",
124
+ "detail.statesFromSource": "Take the {0} entries from the source",
125
+ "detail.statesHint": "translates numbers into text — the admin then shows a dropdown instead of a number field, and some pattern slots require it. Leave empty for no value list.",
126
+ "detail.statesPlaceholder": "one per line: 0 = closed",
127
+ "detail.takeFromAlias": "Take this one value back from the stored alias",
128
+ "detail.takeOne": "Take this one value from the template",
129
+ "detail.targetNoWrite": "The target point carries write: false — its adapter passes nothing on to the device. ioBroker stores the value anyway, but nothing will happen.",
130
+ "detail.targetTypeHint": "The target point is of type {0}. It decides what survives of the write formula: mixed and string take text, boolean and number convert it back.",
131
+ "detail.targetTypeVoid": "The target is {0} and takes no text. The write formula does produce text — the js-controller converts it back to {0} on write, so the formula has no effect. Switching still works.",
132
+ "detail.tplWants": "The template wants: ",
133
+ "detail.tplWantsEmpty": "The template leaves this field empty.",
134
+ "detail.type": "Type",
135
+ "detail.typeNumber": "number",
136
+ "detail.unit": "Unit",
137
+ "detail.writeFormula": "Write formula",
138
+ "detail.writeFormulaHint": "converts the other way: what the device should receive when switched.",
139
+ "detail.writeFormulaPlaceholder": "e.g. val ? \"ON\" : \"OFF\"",
140
+ "detail.writesTo": "writes to",
141
+ "detail.yields": "yields",
142
+ "detail.yieldsNothing": "yields nothing",
143
+ "diff.addedNoPlace": "additionally ticked — not part of the {0}",
144
+ "diff.addedWithPlace": "additionally ticked — part of the {0}",
145
+ "diff.againstStored": "compared to what is stored",
146
+ "diff.changes": "Changes",
147
+ "diff.deselectedNoPlace": "unticked — would not have been part of the {0} anyway",
148
+ "diff.deselectedWithPlace": "unticked — part of the {0}",
149
+ "diff.deviations": "Deviations from the proposal",
150
+ "diff.formulaChange": "read formula: {0} → {1}",
151
+ "diff.newByHand": "new, added by hand",
152
+ "diff.noName": "(no name)",
153
+ "diff.nothingExists": "none of it exists yet",
154
+ "diff.open": "{0} open",
155
+ "diff.points": "{0} points",
156
+ "diff.roleChange": "role: {0} → {1}",
157
+ "diff.sourceChange": "source: {0} → {1}",
158
+ "diff.unitChange": "unit: {0} → {1}",
159
+ "diff.wouldBeAdded": "ticked on — will be added when updating",
160
+ "diff.wouldBeRemoved": "deselected — exists in the alias and would be removed",
161
+ "enums.addTo": "goes in",
162
+ "enums.alsoFolder": "Store the alias under \"{0}\" as well?",
163
+ "enums.clear": "remove assignment",
164
+ "enums.function": "Function",
165
+ "enums.functionHint": "Assigns the alias to a function such as light or heating. Also stored in an enumeration, not on the object.",
166
+ "enums.iconAdded": "icon will be added",
167
+ "enums.iconNew": "No picture yet — the workbench adds it when writing",
168
+ "enums.iconNewMark": "new",
169
+ "enums.iconThere": "Picture is stored",
170
+ "enums.members": "{0} in it",
171
+ "enums.newSuffix": "new",
172
+ "enums.noMatch": "nothing found for \"{0}\"",
173
+ "enums.notLoadedField": "Rooms and functions could not be loaded — so room and function will not be written; the alias itself is still created. The workbench retries three times by itself, otherwise reload the tab.",
174
+ "enums.nowEmpty": "is empty afterwards and will be removed",
175
+ "enums.placeholder": "empty = no assignment",
176
+ "enums.removeFrom": "is taken out",
177
+ "enums.room": "Room",
178
+ "enums.roomHint": "Assigns the alias to a room. This is not stored on the object but in the \"enum.rooms\" enumeration — Alexa, Google and the dashboards group by it.",
179
+ "enums.suggested": "suggested",
180
+ "enums.unknown": "Enumerations not loaded — room and function stay untouched.",
181
+ "enums.unused": "empty",
182
+ "enums.willCreate": "create new",
183
+ "folder.aliasMissing": "missing",
184
+ "folder.aliasThere": "exists",
185
+ "folder.clickHint": "Click a device to work on it. ",
186
+ "folder.clickHintText": "A node counts as a device as soon as a template matches it — below that nothing is searched. Where none matches, the node still appears in the list as soon as it has datapoints of its own.",
187
+ "folder.colAlias": "Alias",
188
+ "folder.colDetected": "detected as",
189
+ "folder.colSource": "Source",
190
+ "folder.devices": "Devices",
191
+ "folder.devicesBelow": "{0} devices below · {1} datapoints",
192
+ "folder.found": "{0} found",
193
+ "folder.nothingHere": "There is nothing here that could become a device.",
194
+ "folder.withAlias": "{0} with alias",
195
+ "folder.withoutTemplate": "{0} without template",
196
+ "guess.alsoRow": "with suggestions: fits",
197
+ "guess.bar": "{0} slots guessed — please check",
198
+ "guess.better": "{0} might fit better",
199
+ "guess.betterGoHint": "Switches to {0} and presses “{1}” right away. Every assignment then shows as “guessed” and needs checking one by one; discarding stays possible. Nothing changes on the device — only roles in the draft are set.",
200
+ "guess.betterHint": "{0} would reach {1} filled slots, {2} only {3} — both numbers after suggesting. Switch to it, then press “Suggest free slots”; every assignment needs checking.",
201
+ "guess.betterHintNone": "{0} would reach {1} filled slots after suggesting; {2} does not fit even then. Switch to it, then press “Suggest free slots”; every assignment needs checking.",
202
+ "guess.button": "Suggest free slots",
203
+ "guess.drop": "discard",
204
+ "guess.hint": "Fills the pattern’s free slots from the remaining datapoints — an attempt, not knowledge. Guessed by name, value list, unit and type; every assignment is marked “guessed” and can be discarded one by one.",
205
+ "guess.keep": "keep",
206
+ "guess.keepAll": "keep all",
207
+ "guess.locked": "{0}× guessed, still undecided — keep (✓) or discard (✕) first, then creating and saving unlock.",
208
+ "guess.mark": "guessed",
209
+ "guess.noneFit": "{0} stays free. No remaining datapoint fits — guessing goes by name, value list, unit and type, and nothing cleared the threshold.",
210
+ "guess.noneFull": "Every slot of the pattern is taken — there is nothing left to suggest.",
211
+ "guess.noneHand": "{0} rows were decided by hand and are left untouched: {1}.",
212
+ "guess.noneHandOne": "{0} was decided by hand and is left untouched.",
213
+ "guess.noneUsed": "{0} stays free. Every remaining datapoint already serves as a read or write source in a filled row.",
214
+ "guess.slotsMore": "{0} and {1} more",
215
+ "guess.tplAsk": "This device is identified as “{0}”, so the assignment is already settled. The suggestion fills additional slots from the remaining data points — an attempt, not knowledge, and every match would need checking. Meant for special cases, e.g. when the device can do more than the template covers.",
216
+ "guess.tplGo": "Suggest anyway",
217
+ "guess.tplHint": "The template already covers this device — suggesting here is for special cases only.",
218
+ "guess.tplTitle": "Suggest free slots despite a template?",
219
+ "guess.undo": "Discard suggestions",
220
+ "help.aliases": "Pick an existing alias on the left. Remove points, change roles, sources and formulas — or move, rename and delete it.",
221
+ "help.aliasesAdd": "To add points to an alias, the way via “to the source →” (top right, next to the alias name) is easier: the template applies there, and every data point of the device is offered with a ready role — here you would have to enter each one by hand.",
222
+ "help.sources": "Pick a device or channel on the left. The workbench recognises what it is and proposes a finished alias. If one already exists, it is updated instead.",
223
+ "help.templates": "Pick a template on the left. Bundled ones can be viewed and duplicated, your own edited. The trial run shows which devices it matches.",
224
+ "info.dlgTitle": "Not part of the {0} pattern",
225
+ "info.explain": "work perfectly normally and stay where you created them. Nothing extra is written — the alias stays as it is. They simply are not part of what ioBroker considers a {0}; their role does not fit any of its slots. It only starts to matter once you hand the alias to Alexa, Google Home or a device UI: those will see a {0} without these points. In VIS, in scripts and in history you use them like any other datapoint.",
226
+ "info.more": "What this means",
227
+ "leave.body": "There are changes on {0} that have not been written yet. Switching now discards them.",
228
+ "leave.discard": "Discard and switch",
229
+ "leave.stay": "Stay here",
230
+ "leave.title": "Unsaved changes",
231
+ "list.addByHand": "Add datapoint by hand",
232
+ "list.aliasDiffers": "differs from the stored alias",
233
+ "list.all": "all",
234
+ "list.buttonOnly": "write only",
235
+ "list.byHand": "by hand",
236
+ "list.changed": "changed",
237
+ "list.colOn": "on",
238
+ "list.colRole": "Role",
239
+ "list.colState": "State",
240
+ "list.colValue": "Value",
241
+ "list.countOf": "{0} of {1}",
242
+ "list.createAria": "create {0}",
243
+ "list.nameMissing": "name missing",
244
+ "list.newPoint": "new point",
245
+ "list.noRole": "— no role —",
246
+ "list.ofDatapoints": "datapoints",
247
+ "list.onlyPattern": "only what fits the pattern",
248
+ "list.onlyPatternHint": "Checks exactly the points that get a slot in the chosen pattern — everything else is unchecked and not created.",
249
+ "list.onlyWithValue": "only with a value",
250
+ "list.otherSource": "from {0}",
251
+ "list.otherSourceHint": "This point does not read from {0} but from {1}.",
252
+ "list.reset": "reset",
253
+ "list.resetHint": "Discards every change made here — checkboxes, roles, formulas, sources — and shows the state as stored again.",
254
+ "list.sendPointMissing": "send datapoint not created yet",
255
+ "list.sourceGone": "source does not exist",
256
+ "list.sourceHint": "This point reads from {0}.",
257
+ "list.sourceMissing": "source missing",
258
+ "list.tpl": "template",
259
+ "list.tplDiffers": "differs from the template",
260
+ "list.tplHint": "Checks exactly the points the template proposes — regardless of what the alias holds today.",
261
+ "list.willBeCreated": "will be created:",
262
+ "move.button": "Move …",
263
+ "move.done": "Moved. The alias is now at {0}.",
264
+ "move.exists": "{0} already exists. Remove it first or pick another name.",
265
+ "move.from": "from",
266
+ "move.needName": "A name is required.",
267
+ "move.nested": "The target sits below the alias itself (or the other way round). Moving would delete its own parent node — please pick a place beside it.",
268
+ "move.newFolder": "new folder",
269
+ "move.noFolder": "(no folder — directly under alias.0)",
270
+ "move.noScripts": "The ID does not appear in any script.",
271
+ "move.now": "Move now",
272
+ "move.scriptLines": "line {0}",
273
+ "move.scriptLinesN": "lines {0}",
274
+ "move.scriptOff": "disabled",
275
+ "move.scriptsHead": "{0} scripts mention the old ID:",
276
+ "move.scriptsHead1": "One script mentions the old ID:",
277
+ "move.title": "Move alias",
278
+ "move.to": "to",
279
+ "move.unchanged": "Folder and name unchanged — nothing to do.",
280
+ "move.warnHistory": "Only the setting that recording is enabled moves along. From now on a new, empty series starts under the new ID. Everything recorded so far stays in the database under the old ID — it is not lost, but it will no longer be extended. Charts and Grafana queries pointing at the old ID receive nothing new; pointed at the new one, they lack the history.",
281
+ "move.warnHistoryHead": "Recorded values do not move along.",
282
+ "move.warnRefs": "vis views, Alexa and Google names and other adapters cannot be inspected. Anything pointing at the old ID must be adjusted by hand.",
283
+ "move.warnRefsHead": "What else refers to the old ID.",
284
+ "move.willMove": "will be moved",
285
+ "move.with": "with",
286
+ "mq.andMore": "… and {0} more",
287
+ "mq.ask": "Ask the device",
288
+ "mq.askError": "The query failed: {0}",
289
+ "mq.askGotAnswer": "The device answered — commands found: {0}",
290
+ "mq.askHint": "This is a plain query — it switches nothing and changes no setting.",
291
+ "mq.askNoAnswer": "No answer. Either the device is offline, or it listens on a different topic.",
292
+ "mq.askOffline": "The device is not reporting right now — a request will then go unanswered.",
293
+ "mq.askedDays": "asked {0} days ago",
294
+ "mq.askedHours": "asked {0} hours ago",
295
+ "mq.askedMinutes": "asked {0} minutes ago",
296
+ "mq.asking": "asking the device",
297
+ "mq.commandsFrom": "Commands, read from {0}",
298
+ "mq.createdBy": "created by the Alias Workbench",
299
+ "mq.dialogTitle": "Create send points",
300
+ "mq.done": "{0} objects written.",
301
+ "mq.doneHint": "Detection runs again in a moment — a template that did not match before can match now.",
302
+ "mq.duplicate": "same as {0}",
303
+ "mq.fix": "Create send points …",
304
+ "mq.instant": "Immediate feedback",
305
+ "mq.instantCheck": "ask",
306
+ "mq.instantChecking": "asking",
307
+ "mq.instantEnable": "Enable",
308
+ "mq.instantEnabling": "enabling",
309
+ "mq.instantHintOff": "Without SetOption59 the device only reports on its telemetry cycle. {0} reads from tele/… and keeps showing the old value after switching until then. Enabling it is a permanent device setting — it switches nothing and only changes how often the device reports.",
310
+ "mq.instantHintOffTakt": "Without SetOption59 the device only reports every {1} seconds. {0} reads from tele/… and keeps showing the old value after switching until then. Enabling it is a permanent device setting — it switches nothing and only changes how often the device reports.",
311
+ "mq.instantHintOn": "SetOption59 is set: the device reports every change at once, not only with the next telemetry. Measured at three seconds.",
312
+ "mq.instantHintUnknown": "The device has not been asked yet. \"Ask\" sends an empty query to SetOption59 — it changes nothing.",
313
+ "mq.instantOff": "off",
314
+ "mq.instantOffShort": "feedback delayed",
315
+ "mq.instantOn": "enabled",
316
+ "mq.instantUnknown": "unknown",
317
+ "mq.intro": "Not every Tasmota is set up the same way. A missing or mute point is not a fault in itself — it only matters once an alias is meant to switch through it, or a template needs it for detection.",
318
+ "mq.justAsked": "asked just now",
319
+ "mq.missing": "{0} send points missing",
320
+ "mq.missingIp": "The device IP is unknown — it only appears in tele/INFO2 (sent once at boot) or in stat/STATUS5 (on request only).",
321
+ "mq.missingPeriod": "The telemetry period is unknown — the device never reports it on its own, only on request.",
322
+ "mq.mute": "{0} cannot send",
323
+ "mq.neverReported": "The device has not fully reported since it started, so its command list is unknown.",
324
+ "mq.newPoints": "To be created",
325
+ "mq.nothingYet": "The device has not sent anything yet that commands could be read from.",
326
+ "mq.nowValue": "currently:",
327
+ "mq.offline": "offline",
328
+ "mq.onlyResult": "So far only the reply to a single command arrived, not the whole state — the list may be incomplete.",
329
+ "mq.repair": "Present but mute",
330
+ "mq.repairHint": "These points exist but are not allowed to send. An alias switching through them does nothing, and nothing about it shows.",
331
+ "mq.rowAllow": "allow sending",
332
+ "mq.rowCreate": "create",
333
+ "mq.rowWorking": "…",
334
+ "mq.selectedOf": "{0} of {1} selected",
335
+ "mq.silent": "not reporting",
336
+ "mq.split": "from {0} branches",
337
+ "mq.splitHint": "This device does not sit under one node but is spread over {0} branches — that is how the MQTT adapter stores it when the device's FullTopic is \"%prefix%/%topic%/\" (Tasmota's factory setting). The workbench treats the branches as one device; points are created below their device, not beside it.",
338
+ "mq.stFine": "present, sends",
339
+ "mq.stMissing": "point missing",
340
+ "mq.stMute": "cannot send",
341
+ "mq.stOff": "present, but switched off",
342
+ "mq.stUnknown": "present, sending unknown",
343
+ "mq.title": "MQTT device",
344
+ "mq.unknownCommand": "unknown command",
345
+ "mq.write": "Create ({0})",
346
+ "pattern.allPatterns": "all {0} patterns",
347
+ "pattern.doesNotFit": "✕ does not fit",
348
+ "pattern.expectsType": ", expects {0}",
349
+ "pattern.fitsNotType": "✕ {0}: type {1} instead of {2}",
350
+ "pattern.fitsOn": "matches ",
351
+ "pattern.freeSlots": "Free slots in the {0} pattern",
352
+ "pattern.label": "Pattern",
353
+ "pattern.manualInstead": "by hand instead of {0}",
354
+ "pattern.missing": "{0} missing",
355
+ "pattern.noMatch": "no pattern matches \"{0}\"",
356
+ "pattern.noPlaceBecauseType": "The {0} pattern does not apply right now: {1} requires {2}, but {3} is set. That is why no row has a slot.",
357
+ "pattern.noPlaceLegend": "Rows shaded like this have no slot in the {0} pattern",
358
+ "pattern.noPlaceLong": "no slot in the {0} pattern — the point is still created and fully usable, only Alexa and friends count it separately",
359
+ "pattern.notDetected": "not detected",
360
+ "pattern.offCandidate": "{0} fits {1} but is not ticked.",
361
+ "pattern.offCandidateType": "{0} fits {1} by its role, but is not ticked and has type {2} instead of {3}.",
362
+ "pattern.offGuess": "With “{0}” it would apply.",
363
+ "pattern.offMissing": "The {0} pattern does not apply right now: {1} is missing. That is why no row has a slot.",
364
+ "pattern.orRole": "or {0}",
365
+ "pattern.pointsTaken": "✓ {0} points",
366
+ "pattern.required": "REQUIRED — missing",
367
+ "pattern.search": "type to search …",
368
+ "pattern.slotHeldBy": "{1} already holds {0} — this row gets no place that way. Pick a free place under “Place in pattern” above.",
369
+ "pattern.slotName": "This point sits in slot \"{0}\" of the {1} pattern. Slot names come from the type-detector and are the same everywhere — they are not translated, because the alias datapoint is named exactly that.",
370
+ "pattern.slotsTaken": "✓ {0}/{1} filled",
371
+ "pattern.tickIt": "tick it",
372
+ "pattern.tickItType": "tick it, {0}",
373
+ "pattern.toSlot": " → slot {0} in the {1} pattern",
374
+ "pattern.typeMismatch": "Slot {0} requires {1}, but {2} is set — the state drops out of the pattern even though the role is right.",
375
+ "pattern.typeOr": " or ",
376
+ "pattern.usualOnly": "the usual ones only",
377
+ "pattern.viaRole": "role {0}",
378
+ "result.allAnyway": "All anyway ",
379
+ "result.channelsHint": "This device has {0} channels. Choose below: everything flat in one alias, or mirror the structure of the source — a folder for the device, one channel each below it.",
380
+ "result.extraSwitches": "Included: {0} points from other channels that the {1} pattern has no slot for. They are created, but do not count as the device’s switch or feedback. For separate control, use \"one device per channel\" below.",
381
+ "result.header": "What the type-detector makes of it",
382
+ "result.newlyCreated": "will be created",
383
+ "result.noObjectShort": "no object",
384
+ "result.pickSource": "Jump where?",
385
+ "result.pointsFromBranches": "{0} datapoints from {1} branches. ",
386
+ "result.sourceCount": "{0} sources",
387
+ "result.sourceCountHint": "The points of this alias read from more than one node. \"to the source\" leads to the one most of them come from; a click shows all of them.",
388
+ "result.sourceGone": "The source {0} no longer exists.",
389
+ "result.sourceGone1": "1 point points nowhere",
390
+ "result.sourceGoneN": "{0} points point nowhere",
391
+ "result.states": "{0} states",
392
+ "result.statesDirect": "{0} states ({1} directly)",
393
+ "result.toAlias": "to the alias",
394
+ "result.toAliasHint": "Jumps to the alias built from this device.",
395
+ "result.toSource": "to the source",
396
+ "result.toSourceHint": "Jumps to the device this alias was built from. Templates only apply there — in alias mode an alias can be maintained, but not rebuilt from a template.",
397
+ "result.tooManyStates": "That would be a device with {0} states — usually this means the wrong node is selected. In the tree on the left, nodes that look like a single device carry a dot. You can still build it this way.",
398
+ "roles.leadsTo": "→ slot {0}",
399
+ "roles.noMatch": "no match for “{0}”",
400
+ "roles.patternOnly": "show only the pattern’s roles",
401
+ "roles.search": "search role …",
402
+ "roles.showAll": "show all {0} roles",
403
+ "roles.slot": "slot {0} in the {1} pattern",
404
+ "roles.slotFree": "free",
405
+ "roles.slotTaken": "taken by {0}",
406
+ "swap.blocked": "Decide first — these points cannot come along: {0}. Either remove them during the swap or leave the swap be; a point that is meant to write needs a write target.",
407
+ "swap.button": "Swap source …",
408
+ "swap.diffRange": "range {0} → {1}",
409
+ "swap.diffType": "type {0} → {1}",
410
+ "swap.diffUnit": "unit {0} → {1}",
411
+ "swap.done": "Swapped. The alias now reads from {0}.",
412
+ "swap.from": "Currently reads from:",
413
+ "swap.goHigher": "use the level above",
414
+ "swap.gone": "This device no longer exists — which is exactly what this is for.",
415
+ "swap.guessHint": "Rows marked “guessed” were matched by name or role — please check those individually.",
416
+ "swap.guessedByName": "Guessed from the point name: something under the new source is also called \"{0}\". That can be far off — please check.",
417
+ "swap.guessedByRole": "Guessed from the role: a point under the new source carries the same role \"{0}\". Please check.",
418
+ "swap.higherLevel": "One level up ({0}) finds a target for {1} of {2} points, here only {3}.",
419
+ "swap.keeps": "The alias keeps its id, names, roles and formulas, its history in the database and its room and function. Only where each point reads from and writes to changes.",
420
+ "swap.mapping": "Mapping",
421
+ "swap.mind": "Watch out:",
422
+ "swap.mindHint": "The alias formulas stay as they are — if the new source scales differently, the values will be wrong afterwards. The formula sits in the point's detail row.",
423
+ "swap.noDevice": "No device found.",
424
+ "swap.noMatch": "no matching point found",
425
+ "swap.noWriteMatch": "no write target found — this point will not write anywhere",
426
+ "swap.now": "Swap now",
427
+ "swap.pickFirst": "Pick a new source first.",
428
+ "swap.removeIt": "remove this point while swapping",
429
+ "swap.same": "That is the same source as before.",
430
+ "swap.search": "Search (id or name) …",
431
+ "swap.title": "Swap source",
432
+ "swap.to": "New source",
433
+ "swap.unchanged": "unchanged",
434
+ "swap.unknown": "(cannot be determined)",
435
+ "target.alsoRoom": "Set room to \"{0}\" as well?",
436
+ "target.alsoRoomNew": "There is no room \"{0}\" — create and assign it?",
437
+ "target.clearField": "clear field",
438
+ "target.exists": "already exists",
439
+ "target.folder": "Place under",
440
+ "target.folderHint": "separate subfolders with a dot, e.g. House.GF.Kitchen",
441
+ "target.folderPlaceholder": "empty = directly under alias.0",
442
+ "target.moveInstead": "move it instead …",
443
+ "target.moveInsteadHint": "Move the existing alias to the new id instead of creating a second one next to it.",
444
+ "target.name": "Name",
445
+ "target.openFolder": "open “{0}”",
446
+ "target.twinExists": "This source already has {0} — that one stays where it is.",
447
+ "target.yes": "yes",
448
+ "tpl.applyTemplate": "take template values ({0})",
449
+ "tpl.applyTemplateHint": "Sets roles, types, units, formulas and sources to what the template says. The caption stays as it is — that one is yours. Nothing is written before the dry run.",
450
+ "tpl.choose": "— choose template —",
451
+ "tpl.contains": "{0} contains {1}",
452
+ "tpl.fits": "fits",
453
+ "tpl.fitsNot": "✕ {0}",
454
+ "tpl.forbiddenThere": "{0} exists but must not",
455
+ "tpl.forced": "forced",
456
+ "tpl.forcedHint": "Detection does not trigger for this template — chosen by hand.",
457
+ "tpl.identifiedAs": "Identified as: {0}",
458
+ "tpl.label": "Template",
459
+ "tpl.manuallyChosen": "chosen by hand",
460
+ "tpl.missingPoint": "{0} missing",
461
+ "tpl.nameHint": "name matches \"{0}\" — not detectable from MQTT",
462
+ "tpl.noJson": "{0} delivers no JSON",
463
+ "tpl.noNameHint": "the name gives no hint — \"{0}\" is the default, from MQTT they are indistinguishable",
464
+ "tpl.noOutputs": "no outputs found",
465
+ "tpl.none": "— no template —",
466
+ "tpl.noneDetected": "No template detected",
467
+ "tpl.nor": " nor in ",
468
+ "tpl.output": "Output",
469
+ "tpl.outputsFound": "outputs found: {0}",
470
+ "tpl.own": "own",
471
+ "tpl.possibleIn": "{0} is a command the device knows (datapoint not created yet)",
472
+ "tpl.presentIn": "{0} present",
473
+ "tpl.remembered": "remembered",
474
+ "tpl.rememberedHint": "This alias was built from this template — it stays until you change it deliberately.",
475
+ "tpl.showAllPoints": "Load all datapoints of the device",
476
+ "tpl.showAllPointsHelp": "Leaves the template proposal and lists every datapoint the device has, including those no template mentions. From here you can pull a single one into the alias.",
477
+ "tpl.showProposal": "Load the template proposal",
478
+ "tpl.showProposalHelp": "Back to what the template proposes for this device.",
479
+ "tpl.skippedChip": "{0} without source",
480
+ "tpl.skippedEmpty": "\"{0}\" would score higher but builds not a single row on this device — skipped",
481
+ "tpl.skippedHead": "{0} left out because the source is missing",
482
+ "tpl.skippedNowhere": "{0}: neither in {1}",
483
+ "tpl.skippedSource": "{0}: {1} missing",
484
+ "tpl.skippedWhy": "{0}: {1}",
485
+ "tpl.whyNoField": "{0} has no field {1}",
486
+ "tpl.whyNoJson": "{0} delivers no JSON",
487
+ "tpl.whyNoPoint": "{0} does not exist",
488
+ "tpl.whyNone": "Why no template applies",
489
+ "tpl.whyThis": "Why this template",
490
+ "tpl.withoutField": "{0} without {1}",
491
+ "tpl.wouldNeed": "actually missing: {0}",
492
+ "tpls.absolute": "fixed object",
493
+ "tpls.absoluteText": "It does not live under the device and will therefore be the same for every device. Sometimes that is exactly right — a shared setpoint, say. It does not count towards detection.",
494
+ "tpls.absoluteTitle": "One point refers to a fixed object. ",
495
+ "tpls.andMore": "… and {0} more, not listed here",
496
+ "tpls.beats": "beats {0}",
497
+ "tpls.buildsNone": "does not fit — no row finds its source",
498
+ "tpls.button": "Save as template …",
499
+ "tpls.channelName": "Channel per output",
500
+ "tpls.colDefault": "Default",
501
+ "tpls.colInTemplate": "in template",
502
+ "tpls.colName": "Name",
503
+ "tpls.colPath": "Path, relative to the device",
504
+ "tpls.colRequired": "must exist",
505
+ "tpls.content": "Content checks",
506
+ "tpls.contentHelp": "Makes detection more precise — and excludes devices that do not send that block. This is exactly what separates \"socket\" from \"socket with metering\".",
507
+ "tpls.contentRow": "{0} must contain {1}",
508
+ "tpls.contradiction": "This template would fit nothing.",
509
+ "tpls.contradictionText": "These points are listed as required and as forbidden at the same time: {0}. Remove them from one of the two.",
510
+ "tpls.deviceType": "Device type",
511
+ "tpls.dropOff": "Leave out entirely",
512
+ "tpls.dropOthers": "Leave out the other outputs",
513
+ "tpls.droppedCount": "{0} points left out.",
514
+ "tpls.evidence": "{0} verified",
515
+ "tpls.failed": "Saving failed:",
516
+ "tpls.fallbacks": "+{0} fallback",
517
+ "tpls.fitsNot": "{0}× does not fit",
518
+ "tpls.function": "Function",
519
+ "tpls.head": "Header",
520
+ "tpls.hits": "{0} devices matched, {1} of them won",
521
+ "tpls.id": "Id",
522
+ "tpls.idTaken": "This id already belongs to “{0}” (v{1}). Saving would replace it.",
523
+ "tpls.json": "This is what gets stored",
524
+ "tpls.loadFailed": "own templates not loaded",
525
+ "tpls.loadFailedHint": "The instance configuration did not answer or reported an error. Your own templates are not gone — they are only missing from this view. While this notice stands, saving may overwrite an existing template: reload first.",
526
+ "tpls.lockBadHint": "The name hint is not a usable expression",
527
+ "tpls.lockIdTaken": "The id already belongs to \"{0}\"",
528
+ "tpls.lockNoId": "The id is missing",
529
+ "tpls.lockNoRequired": "No point is ticked as required — the template would match nothing",
530
+ "tpls.lockNoRows": "No row is left",
531
+ "tpls.lockedWhy": "Saving is locked:",
532
+ "tpls.losesTo": "loses to {0}",
533
+ "tpls.multiple": "This device has several outputs",
534
+ "tpls.multipleHelp": "The {0} in the paths is replaced by %N% — only at the end of a segment, so ENERGY.Power stays intact.",
535
+ "tpls.multipleNoNumber": "Enter which number in the paths is the output. Without it the template stays a single one.",
536
+ "tpls.multipleOff": "A device with POWER1, POWER2 … becomes a folder with one channel per output.",
537
+ "tpls.nameDe": "Name (German)",
538
+ "tpls.nameEn": "Name (English)",
539
+ "tpls.nameHint": "Name hint",
540
+ "tpls.nameHintBad": "Not a usable expression — it counts as “no match”.",
541
+ "tpls.nameHintHelp": "Only breaks ties between templates that fit equally well — light versus socket, for instance. Separate words with |. This device is called \"{0}\".",
542
+ "tpls.needsRow": "does not fit — {0} finds nothing",
543
+ "tpls.needsRowHint": "A mandatory row of the template does not find its source on this device — usually a field that does not exist in the JSON message there. The template does not even enter the race here; the next best one takes the place.",
544
+ "tpls.noFunction": "— none —",
545
+ "tpls.noHits": "Matches no device right now. Check the required points.",
546
+ "tpls.noInstance": "Instance {0} not found.",
547
+ "tpls.noRequired": "No point is ticked as required — the template would match nothing at all.",
548
+ "tpls.noType": "— none —",
549
+ "tpls.onlyOne": "only one that fits",
550
+ "tpls.otherOutputs": "{0} points refer to other outputs ({1}).",
551
+ "tpls.otherOutputsText": "A template for several outputs always describes just one — the rest are derived from it. Deselect the foreign points on the device, otherwise the template will only ever fit this one device.",
552
+ "tpls.pickDeviceFirst": "pick a device first",
553
+ "tpls.rank": "Rank",
554
+ "tpls.rowBuilt": "1 row",
555
+ "tpls.rowsBuilt": "{0} rows",
556
+ "tpls.saveAsNew": "Save as a new template",
557
+ "tpls.saveAsNewHint": "the existing one stays as it is",
558
+ "tpls.saveNew": "Save template",
559
+ "tpls.saveUpdate": "Update template",
560
+ "tpls.saved": "Template \"{0}\" saved, version {1}.",
561
+ "tpls.savedWhere": "It lives in the instance configuration ({0}) and is therefore part of the backup.",
562
+ "tpls.saving": "saving …",
563
+ "tpls.shadowsPackage": "will then shadow the shipped one",
564
+ "tpls.someOff": "Deselected on the device: {0}. These points come along as “default off” — on the next device they will be listed, just not ticked.",
565
+ "tpls.states": "Datapoints",
566
+ "tpls.statesCount": "{0} of them",
567
+ "tpls.statesHelp": "The left tick says whether the point goes into the template at all. “Default” is the state it will be proposed with on the next device — that comes from your selection on the device. The right tick says whether it must be present for the template to match at all.",
568
+ "tpls.takesOver": "{0} change template",
569
+ "tpls.title": "Save as template — {0}",
570
+ "tpls.tryout": "Try-out",
571
+ "tpls.undrop": "undo",
572
+ "tpls.updateIt": "Update template \"{0}\" — it becomes version {1}",
573
+ "tpls.whatToDo": "What should happen",
574
+ "tpls.whichNumber": "Number of this output",
575
+ "tpls.wissen": "+ {0} more states as role knowledge — used in the “All data points of the device” view",
576
+ "tree.aliases": "Edit alias",
577
+ "tree.collapseAll": "collapse all",
578
+ "tree.emptyNode": "no datapoints — the node exists in the database but is empty",
579
+ "tree.expandAll": "expand all",
580
+ "tree.filter": "filter …",
581
+ "tree.filterAria": "Filter objects",
582
+ "tree.loading": "loading objects …",
583
+ "tree.looksLikeDevice": "looks like a single device",
584
+ "tree.noObjectHint": "not a real folder",
585
+ "tree.nothingFound": "nothing found",
586
+ "tree.sourceGone": "{0} point(s) of this alias refer to a source that does not exist. The js-controller remembers this permanently — only deleting and recreating helps.",
587
+ "tree.sources": "Create alias",
588
+ "tree.templates": "Templates",
589
+ "tv.addFallback": "Add fallback source",
590
+ "tv.addState": "Add datapoint",
591
+ "tv.badContent": "“erkennung.inhalt” must be an object.",
592
+ "tv.badList": "“{0}” must be a list of points.",
593
+ "tv.badName": "The name must be a string or a language object.",
594
+ "tv.badNameHint": "The name hint is not a usable expression.",
595
+ "tv.badNoId": "The id is missing.",
596
+ "tv.badNoStates": "The datapoints (zustaende) are missing.",
597
+ "tv.badNotObject": "A single template as a JSON object is expected.",
598
+ "tv.badRecog": "“erkennung” must be an object.",
599
+ "tv.badState": "{0} datapoints without a name or without any read or write path.",
600
+ "tv.badType": "This detector does not know the device type “{0}”.",
601
+ "tv.clickRow": "Click a row to edit the datapoint",
602
+ "tv.clickRowRead": "Click a row to view it — shipped templates cannot be changed.",
603
+ "tv.delete": "Delete",
604
+ "tv.deleteHint": "If it shadows a shipped template, that one reappears afterwards.",
605
+ "tv.deleteSure": "Really delete",
606
+ "tv.detection": "Detection",
607
+ "tv.discard": "Discard changes",
608
+ "tv.duplicate": "Duplicate",
609
+ "tv.export": "Export as file",
610
+ "tv.fallback": "Fallback sources",
611
+ "tv.fallbackHint": "If the workbench cannot find the datapoint above — or the field inside it — it tries these in order. The first one where both really exist is used.",
612
+ "tv.flagsHelp": "\"Default\" = pre-ticked on the next device. \"must exist\" = without this point the template does not match at all — it moves into the required list above. \"fixed object\" = the read path is not relative to the device but a full object id, the same for every device.",
613
+ "tv.forbidden": "Must not exist",
614
+ "tv.forbiddenHelp": "These points must NOT be present on the device, otherwise the template does not match. This is what separates a single socket from a multi one. Separate several with commas. Absent points do not count as evidence.",
615
+ "tv.hide": "hide",
616
+ "tv.importAndSave": "Import and save",
617
+ "tv.importBad": "This file is not a template.",
618
+ "tv.importFile": "Import …",
619
+ "tv.importNew": "Saving creates \"{0}\".",
620
+ "tv.importReplaces": "Saving replaces your template \"{0}\" — version {1} becomes version {2}.",
621
+ "tv.importShadows": "Saving shadows the shipped template \"{0}\".",
622
+ "tv.importTitle": "Nothing saved yet.",
623
+ "tv.imported": "imported",
624
+ "tv.inTemplate": "in the template",
625
+ "tv.json": "The template as JSON",
626
+ "tv.makeOwn": "Make an editable copy",
627
+ "tv.multi": "several outputs, one channel {0} per output",
628
+ "tv.nameHintShort": "Only breaks ties between templates that fit equally well. Separate words with |.",
629
+ "tv.package": "shipped",
630
+ "tv.packageText": "It cannot be edited, so it always stays the state it was delivered in. Duplicate makes a copy of your own, and that copy shadows the original.",
631
+ "tv.packageTitle": "Shipped template.",
632
+ "tv.paneHead": "The template and what it catches",
633
+ "tv.rank": "rank {0}",
634
+ "tv.rankOwn": "The rank only decides between your own templates. Against a shipped one yours always wins anyway — it needs no high rank for that.",
635
+ "tv.rankPackage": "The rank only decides between shipped templates, and even there only once evidence and name hint come out even.",
636
+ "tv.readOnlyRow": "Shipped template — use \"Own copy for editing\" to change it.",
637
+ "tv.removeFallback": "remove",
638
+ "tv.removeState": "Remove this point",
639
+ "tv.required2": "Must exist",
640
+ "tv.requiredCount": "{0} required points",
641
+ "tv.requiredHelp": "These datapoints must be present on the device, otherwise the template does not match. Separate several with commas. Every required point makes the template more precise and more brittle at the same time.",
642
+ "tv.save": "Save",
643
+ "tv.show": "show",
644
+ "tv.unsaved": "not saved",
645
+ "use.again": "read again",
646
+ "use.aliasHead": "The alias",
647
+ "use.custom": "Logging, smart names",
648
+ "use.enums": "Enumerations",
649
+ "use.files": "Files",
650
+ "use.head": "Referenced in",
651
+ "use.limits": "The search is plain text. Files only in instance folders (vis.0, vis-2.0, web.0 …) — the adapters' own web interfaces stay out, otherwise the workbench would find their examples and its own source files. State values are not searched, and no text search finds IDs assembled at runtime.",
652
+ "use.look": "look it up",
653
+ "use.lookHint": "Searches for the ID of the alias and of its source — in the scripts, the enumerations, the entries on the point itself, in every loaded object and in the files of the instance folders. Done on click only, because everything is read once for it.",
654
+ "use.none": "—",
655
+ "use.objects": "Objects",
656
+ "use.otherAliases": "further aliases on it",
657
+ "use.scripts": "Scripts",
658
+ "use.searching": "searching …",
659
+ "use.sourceHead": "The source",
660
+ "use.sourceHint": "A source that is still mentioned is not a fault: a script that feeds it belongs exactly there. Whether a place should move to the alias is only decided by looking at it.",
661
+ "write.aliasNowAt": "The alias is now at {0}.",
662
+ "write.cannotWrite": "Cannot be written like this:",
663
+ "write.changes": "changes",
664
+ "write.close": "Close",
665
+ "write.createAlias": "Create alias …",
666
+ "write.createAll": "Create all {0} …",
667
+ "write.createAsOne": "create as one device …",
668
+ "write.createNamed": "Create {0} …",
669
+ "write.createPerChannel": "one sub-folder per channel, {0} of them …",
670
+ "write.createSendPoints": "Create the {0} missing send datapoints",
671
+ "write.deselected": "deselected",
672
+ "write.diffNew": "after",
673
+ "write.diffOld": "before",
674
+ "write.diffRaw": "show original order",
675
+ "write.diffSorted": "sort fields",
676
+ "write.diffSortedHint": "Field order inside an object carries no meaning — the same admin writes alias objects in four different orders. Sorted, only the real differences remain; the original order shows how it is actually stored.",
677
+ "write.done": "{0} objects written.",
678
+ "write.doneWithRemoved": "{0} objects written, {1} removed.",
679
+ "write.dryOutputs": " — {0} outputs",
680
+ "write.dryTitleCreate": "Create alias — this is what would appear",
681
+ "write.dryTitleDoneCreate": "Alias created",
682
+ "write.dryTitleDoneUpdate": "Alias updated",
683
+ "write.dryTitleFailed": "Not everything went through",
684
+ "write.dryTitleUpdate": "Update alias — this is what would appear",
685
+ "write.duplicateName": "{0}: name appears twice.",
686
+ "write.enumsUnknown": "Room and function will not be written: the enumerations could not be loaded. The alias itself is created as shown. Without a reliable state an existing enumeration would be replaced by a fresh one holding just this single member.",
687
+ "write.failed": "{0} operations failed:",
688
+ "write.new": "new",
689
+ "write.noName": "One point has no name.",
690
+ "write.noSourceChosen": "{0}: no source chosen.",
691
+ "write.noneSelected": "Not a single datapoint is selected.",
692
+ "write.notInProposal": "not in the proposal",
693
+ "write.notUnderAlias": "{0} is not below alias. — nothing will be written here",
694
+ "write.now": "Create now",
695
+ "write.nowUpdate": "Update now",
696
+ "write.pickDeviceFirst": "pick a device first",
697
+ "write.remove": "Remove",
698
+ "write.removeCount": "datapoints: {0}",
699
+ "write.removeHint": "exist in the alias but no longer appear in the draft",
700
+ "write.retry": "Try again",
701
+ "write.rowSource": "source",
702
+ "write.rowTarget": "target",
703
+ "write.sourceMissing": "{0}: source {1} does not exist.",
704
+ "write.summaryTail": "{0} new, {1} would be overwritten",
705
+ "write.summaryTail3": "{0} new, {1} change, {2} unchanged",
706
+ "write.unchanged": "unchanged",
707
+ "write.updateAlias": "Update alias …",
708
+ "write.updateAsOne": "update as one device …",
709
+ "write.updateNamed": "Update {0} …",
710
+ "write.willKeep": "kept: {0}",
711
+ "write.willRemove": "removed: {0}",
712
+ "write.writeSourceMissing": "{0}: the send datapoint {1} does not exist yet",
713
+ "write.writing": "writing …"
14
714
  }