iobroker.parcelapp 0.4.0 → 0.4.1
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.
- package/README.md +11 -4
- package/build/lib/i18n-states.js.map +1 -1
- package/build/main.js +13 -16
- package/build/main.js.map +2 -2
- package/io-package.json +14 -14
- package/package.json +2 -2
- package/build/lib/i18n-logs.js +0 -229
- package/build/lib/i18n-logs.js.map +0 -7
package/README.md
CHANGED
|
@@ -118,9 +118,17 @@ The delivery is added to your parcel.app account and immediately appears in ioBr
|
|
|
118
118
|
---
|
|
119
119
|
|
|
120
120
|
## Changelog
|
|
121
|
+
<!--
|
|
122
|
+
Placeholder for the next version (at the beginning of the line):
|
|
123
|
+
### **WORK IN PROGRESS**
|
|
124
|
+
-->
|
|
125
|
+
### 0.4.1 (2026-05-09)
|
|
126
|
+
|
|
127
|
+
- Adapter log messages are now English only, in line with the ioBroker community standard. Localized state names (11 languages) are unchanged.
|
|
128
|
+
|
|
121
129
|
### 0.4.0 (2026-05-06)
|
|
122
130
|
|
|
123
|
-
- State names now follow your ioBroker system language (11 languages).
|
|
131
|
+
- State names now follow your ioBroker system language (11 languages).
|
|
124
132
|
- Minimum requirements: Node.js 22 and ioBroker Admin 7.8.23.
|
|
125
133
|
|
|
126
134
|
### 0.3.2 (2026-05-01)
|
|
@@ -132,10 +140,9 @@ The delivery is added to your parcel.app account and immediately appears in ioBr
|
|
|
132
140
|
### 0.3.0 (2026-04-30)
|
|
133
141
|
- Internal cleanup. No user-facing changes.
|
|
134
142
|
|
|
135
|
-
|
|
136
|
-
- Internal cleanup. No user-facing changes.
|
|
143
|
+
Older entries are in [CHANGELOG_OLD.md](CHANGELOG_OLD.md).
|
|
137
144
|
|
|
138
|
-
|
|
145
|
+
## Support
|
|
139
146
|
|
|
140
147
|
- [ioBroker Forum](https://forum.iobroker.net/)
|
|
141
148
|
- [GitHub Issues](https://github.com/krobipd/ioBroker.parcelapp/issues)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/lib/i18n-states.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Localized state names for parcel deliveries in 11 ioBroker system languages.\n *\n * ioBroker accepts plain strings or `{ en, de, ... }` translation objects for\n * `common.name`. Admin, vis and the Object-Browser pick the user's language\n * automatically \u2014 we just hand them the object.\n *\n *
|
|
4
|
+
"sourcesContent": ["/**\n * Localized state names for parcel deliveries in 11 ioBroker system languages.\n *\n * ioBroker accepts plain strings or `{ en, de, ... }` translation objects for\n * `common.name`. Admin, vis and the Object-Browser pick the user's language\n * automatically \u2014 we just hand them the object.\n *\n * Adapter logs (`this.log.*`) stay English by ioBroker convention so that\n * user bug reports remain readable for maintainers regardless of the user's\n * system language.\n */\n\ntype Lang = \"en\" | \"de\" | \"ru\" | \"pt\" | \"nl\" | \"fr\" | \"it\" | \"es\" | \"pl\" | \"uk\" | \"zh-cn\";\n\n/** Translation object as ioBroker expects it. */\nexport type StateName = Record<Lang, string>;\n\n/** State / channel display names (`common.name`). */\nexport const STATE_NAMES: Record<string, StateName> = {\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Per-delivery states \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n carrier: {\n en: \"Carrier\",\n de: \"Versanddienst\",\n ru: \"\u041F\u0435\u0440\u0435\u0432\u043E\u0437\u0447\u0438\u043A\",\n pt: \"Transportadora\",\n nl: \"Vervoerder\",\n fr: \"Transporteur\",\n it: \"Corriere\",\n es: \"Transportista\",\n pl: \"Przewo\u017Anik\",\n uk: \"\u041F\u0435\u0440\u0435\u0432\u0456\u0437\u043D\u0438\u043A\",\n \"zh-cn\": \"\u627F\u8FD0\u5546\",\n },\n status: {\n en: \"Status\",\n de: \"Status\",\n ru: \"\u0421\u0442\u0430\u0442\u0443\u0441\",\n pt: \"Estado\",\n nl: \"Status\",\n fr: \"\u00C9tat\",\n it: \"Stato\",\n es: \"Estado\",\n pl: \"Status\",\n uk: \"\u0421\u0442\u0430\u0442\u0443\u0441\",\n \"zh-cn\": \"\u72B6\u6001\",\n },\n statusCode: {\n en: \"Status Code\",\n de: \"Status-Code\",\n ru: \"\u041A\u043E\u0434 \u0441\u0442\u0430\u0442\u0443\u0441\u0430\",\n pt: \"C\u00F3digo de estado\",\n nl: \"Statuscode\",\n fr: \"Code d'\u00E9tat\",\n it: \"Codice di stato\",\n es: \"C\u00F3digo de estado\",\n pl: \"Kod statusu\",\n uk: \"\u041A\u043E\u0434 \u0441\u0442\u0430\u0442\u0443\u0441\u0443\",\n \"zh-cn\": \"\u72B6\u6001\u4EE3\u7801\",\n },\n description: {\n en: \"Description\",\n de: \"Beschreibung\",\n ru: \"\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435\",\n pt: \"Descri\u00E7\u00E3o\",\n nl: \"Beschrijving\",\n fr: \"Description\",\n it: \"Descrizione\",\n es: \"Descripci\u00F3n\",\n pl: \"Opis\",\n uk: \"\u041E\u043F\u0438\u0441\",\n \"zh-cn\": \"\u63CF\u8FF0\",\n },\n trackingNumber: {\n en: \"Tracking Number\",\n de: \"Sendungsnummer\",\n ru: \"\u0422\u0440\u0435\u043A-\u043D\u043E\u043C\u0435\u0440\",\n pt: \"N\u00FAmero de rastreio\",\n nl: \"Trackingnummer\",\n fr: \"Num\u00E9ro de suivi\",\n it: \"Numero di tracciamento\",\n es: \"N\u00FAmero de seguimiento\",\n pl: \"Numer \u015Bledzenia\",\n uk: \"\u041D\u043E\u043C\u0435\u0440 \u0432\u0456\u0434\u0441\u0442\u0435\u0436\u0435\u043D\u043D\u044F\",\n \"zh-cn\": \"\u8FFD\u8E2A\u53F7\",\n },\n extraInfo: {\n en: \"Extra Information\",\n de: \"Zusatz-Information\",\n ru: \"\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u0430\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F\",\n pt: \"Informa\u00E7\u00E3o adicional\",\n nl: \"Extra informatie\",\n fr: \"Informations suppl\u00E9mentaires\",\n it: \"Informazioni aggiuntive\",\n es: \"Informaci\u00F3n adicional\",\n pl: \"Dodatkowe informacje\",\n uk: \"\u0414\u043E\u0434\u0430\u0442\u043A\u043E\u0432\u0430 \u0456\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u044F\",\n \"zh-cn\": \"\u9644\u52A0\u4FE1\u606F\",\n },\n deliveryWindow: {\n en: \"Delivery Window\",\n de: \"Zustellfenster\",\n ru: \"\u041E\u043A\u043D\u043E \u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0438\",\n pt: \"Janela de entrega\",\n nl: \"Bezorgvenster\",\n fr: \"Cr\u00E9neau de livraison\",\n it: \"Finestra di consegna\",\n es: \"Ventana de entrega\",\n pl: \"Okno dostawy\",\n uk: \"\u0412\u0456\u043A\u043D\u043E \u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0438\",\n \"zh-cn\": \"\u6D3E\u9001\u65F6\u6BB5\",\n },\n deliveryEstimate: {\n en: \"Delivery Estimate\",\n de: \"Voraussichtliche Zustellung\",\n ru: \"\u041E\u0436\u0438\u0434\u0430\u0435\u043C\u0430\u044F \u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0430\",\n pt: \"Previs\u00E3o de entrega\",\n nl: \"Verwachte bezorging\",\n fr: \"Livraison estim\u00E9e\",\n it: \"Consegna prevista\",\n es: \"Entrega estimada\",\n pl: \"Szacowana dostawa\",\n uk: \"\u041E\u0447\u0456\u043A\u0443\u0432\u0430\u043D\u0430 \u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0430\",\n \"zh-cn\": \"\u9884\u8BA1\u9001\u8FBE\",\n },\n lastEvent: {\n en: \"Last Event\",\n de: \"Letztes Ereignis\",\n ru: \"\u041F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u0435 \u0441\u043E\u0431\u044B\u0442\u0438\u0435\",\n pt: \"\u00DAltimo evento\",\n nl: \"Laatste gebeurtenis\",\n fr: \"Dernier \u00E9v\u00E9nement\",\n it: \"Ultimo evento\",\n es: \"\u00DAltimo evento\",\n pl: \"Ostatnie zdarzenie\",\n uk: \"\u041E\u0441\u0442\u0430\u043D\u043D\u044F \u043F\u043E\u0434\u0456\u044F\",\n \"zh-cn\": \"\u6700\u8FD1\u4E8B\u4EF6\",\n },\n lastLocation: {\n en: \"Last Location\",\n de: \"Letzter Standort\",\n ru: \"\u041F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u0435 \u043C\u0435\u0441\u0442\u043E\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435\",\n pt: \"\u00DAltima localiza\u00E7\u00E3o\",\n nl: \"Laatste locatie\",\n fr: \"Dernier emplacement\",\n it: \"Ultima posizione\",\n es: \"\u00DAltima ubicaci\u00F3n\",\n pl: \"Ostatnia lokalizacja\",\n uk: \"\u041E\u0441\u0442\u0430\u043D\u043D\u0454 \u043C\u0456\u0441\u0446\u0435\u0437\u043D\u0430\u0445\u043E\u0434\u0436\u0435\u043D\u043D\u044F\",\n \"zh-cn\": \"\u6700\u8FD1\u4F4D\u7F6E\",\n },\n lastUpdated: {\n en: \"Last Updated\",\n de: \"Zuletzt aktualisiert\",\n ru: \"\u041F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u0435 \u043E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u0435\",\n pt: \"\u00DAltima atualiza\u00E7\u00E3o\",\n nl: \"Laatst bijgewerkt\",\n fr: \"Derni\u00E8re mise \u00E0 jour\",\n it: \"Ultimo aggiornamento\",\n es: \"\u00DAltima actualizaci\u00F3n\",\n pl: \"Ostatnia aktualizacja\",\n uk: \"\u041E\u0441\u0442\u0430\u043D\u043D\u0454 \u043E\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044F\",\n \"zh-cn\": \"\u6700\u540E\u66F4\u65B0\",\n },\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Summary states \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n activeCount: {\n en: \"Active Deliveries\",\n de: \"Aktive Sendungen\",\n ru: \"\u0410\u043A\u0442\u0438\u0432\u043D\u044B\u0435 \u043F\u043E\u0441\u044B\u043B\u043A\u0438\",\n pt: \"Entregas ativas\",\n nl: \"Actieve zendingen\",\n fr: \"Livraisons actives\",\n it: \"Spedizioni attive\",\n es: \"Env\u00EDos activos\",\n pl: \"Aktywne przesy\u0142ki\",\n uk: \"\u0410\u043A\u0442\u0438\u0432\u043D\u0456 \u0432\u0456\u0434\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043D\u044F\",\n \"zh-cn\": \"\u6D3B\u52A8\u4E2D\u7684\u5305\u88F9\",\n },\n todayCount: {\n en: \"Deliveries Today\",\n de: \"Sendungen heute\",\n ru: \"\u0414\u043E\u0441\u0442\u0430\u0432\u043A\u0438 \u0441\u0435\u0433\u043E\u0434\u043D\u044F\",\n pt: \"Entregas hoje\",\n nl: \"Zendingen vandaag\",\n fr: \"Livraisons aujourd'hui\",\n it: \"Spedizioni di oggi\",\n es: \"Entregas de hoy\",\n pl: \"Dostawy dzisiaj\",\n uk: \"\u0414\u043E\u0441\u0442\u0430\u0432\u043A\u0438 \u0441\u044C\u043E\u0433\u043E\u0434\u043D\u0456\",\n \"zh-cn\": \"\u4ECA\u65E5\u9001\u8FBE\",\n },\n summaryDeliveryWindow: {\n en: \"Combined Delivery Window\",\n de: \"Kombiniertes Zustellfenster\",\n ru: \"\u041E\u0431\u044A\u0435\u0434\u0438\u043D\u0451\u043D\u043D\u043E\u0435 \u043E\u043A\u043D\u043E \u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0438\",\n pt: \"Janela de entrega combinada\",\n nl: \"Gecombineerd bezorgvenster\",\n fr: \"Cr\u00E9neau de livraison combin\u00E9\",\n it: \"Finestra di consegna combinata\",\n es: \"Ventana de entrega combinada\",\n pl: \"\u0141\u0105czne okno dostawy\",\n uk: \"\u041E\u0431'\u0454\u0434\u043D\u0430\u043D\u0435 \u0432\u0456\u043A\u043D\u043E \u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0438\",\n \"zh-cn\": \"\u5408\u5E76\u6D3E\u9001\u65F6\u6BB5\",\n },\n};\n\n/**\n * Translation object for a state name. Pass into `common.name`; ioBroker\n * Admin/vis/Object-Browser localizes automatically.\n *\n * @param key Translation key in {@link STATE_NAMES}.\n */\nexport function tName(key: keyof typeof STATE_NAMES): StateName {\n return STATE_NAMES[key];\n}\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/build/main.js
CHANGED
|
@@ -23,7 +23,6 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
23
23
|
));
|
|
24
24
|
var utils = __toESM(require("@iobroker/adapter-core"));
|
|
25
25
|
var import_coerce = require("./lib/coerce");
|
|
26
|
-
var import_i18n_logs = require("./lib/i18n-logs");
|
|
27
26
|
var import_parcel_client = require("./lib/parcel-client");
|
|
28
27
|
var import_state_manager = require("./lib/state-manager");
|
|
29
28
|
const MIN_POLL_INTERVAL = 5;
|
|
@@ -50,19 +49,17 @@ class ParcelappAdapter extends utils.Adapter {
|
|
|
50
49
|
name: "parcelapp"
|
|
51
50
|
});
|
|
52
51
|
this.on("ready", () => {
|
|
53
|
-
this.onReady().catch((err) => this.log.error(
|
|
52
|
+
this.onReady().catch((err) => this.log.error(`onReady failed: ${(0, import_coerce.errText)(err)}`));
|
|
54
53
|
});
|
|
55
54
|
this.on("unload", this.onUnload.bind(this));
|
|
56
55
|
this.on("message", (obj) => {
|
|
57
|
-
this.onMessage(obj).catch(
|
|
58
|
-
(err) => this.log.error((0, import_i18n_logs.tLog)(this.systemLang, "onMessageFailed", { error: (0, import_coerce.errText)(err) }))
|
|
59
|
-
);
|
|
56
|
+
this.onMessage(obj).catch((err) => this.log.error(`onMessage failed: ${(0, import_coerce.errText)(err)}`));
|
|
60
57
|
});
|
|
61
58
|
this.unhandledRejectionHandler = (reason) => {
|
|
62
|
-
this.log.error(
|
|
59
|
+
this.log.error(`Unhandled rejection: ${(0, import_coerce.errText)(reason)}`);
|
|
63
60
|
};
|
|
64
61
|
this.uncaughtExceptionHandler = (err) => {
|
|
65
|
-
this.log.error(
|
|
62
|
+
this.log.error(`Uncaught exception: ${(0, import_coerce.errText)(err)}`);
|
|
66
63
|
};
|
|
67
64
|
process.on("unhandledRejection", this.unhandledRejectionHandler);
|
|
68
65
|
process.on("uncaughtException", this.uncaughtExceptionHandler);
|
|
@@ -77,7 +74,7 @@ class ParcelappAdapter extends utils.Adapter {
|
|
|
77
74
|
await this.setStateAsync("info.connection", { val: false, ack: true });
|
|
78
75
|
const { apiKey } = this.config;
|
|
79
76
|
if (!apiKey || apiKey.trim().length < 10) {
|
|
80
|
-
this.log.error(
|
|
77
|
+
this.log.error("No valid API key configured \u2014 please enter your parcel.app API key in the adapter settings");
|
|
81
78
|
return;
|
|
82
79
|
}
|
|
83
80
|
this.client = new import_parcel_client.ParcelClient(apiKey.trim());
|
|
@@ -90,7 +87,7 @@ class ParcelappAdapter extends utils.Adapter {
|
|
|
90
87
|
);
|
|
91
88
|
const intervalMs = interval * 60 * 1e3;
|
|
92
89
|
this.pollTimer = this.setInterval(() => void this.poll(), intervalMs);
|
|
93
|
-
this.log.info(
|
|
90
|
+
this.log.info(`Parcel tracking started \u2014 polling every ${interval} minutes`);
|
|
94
91
|
}
|
|
95
92
|
onUnload(callback) {
|
|
96
93
|
try {
|
|
@@ -209,7 +206,7 @@ class ParcelappAdapter extends utils.Adapter {
|
|
|
209
206
|
const deliveries = await this.client.getDeliveries(autoRemove ? "active" : "recent");
|
|
210
207
|
this.rateLimitedUntil = 0;
|
|
211
208
|
if (this.lastErrorCode) {
|
|
212
|
-
this.log.info(
|
|
209
|
+
this.log.info("Connection restored");
|
|
213
210
|
this.lastErrorCode = "";
|
|
214
211
|
}
|
|
215
212
|
await this.setStateAsync("info.connection", { val: true, ack: true });
|
|
@@ -227,7 +224,7 @@ class ParcelappAdapter extends utils.Adapter {
|
|
|
227
224
|
if (this.failedDeliveries.has(delivery.tracking_number)) {
|
|
228
225
|
this.log.debug(`Failed to update "${delivery.tracking_number}": ${msg}`);
|
|
229
226
|
} else {
|
|
230
|
-
this.log.warn(
|
|
227
|
+
this.log.warn(`Failed to update '${delivery.tracking_number}': ${msg}`);
|
|
231
228
|
this.failedDeliveries.add(delivery.tracking_number);
|
|
232
229
|
}
|
|
233
230
|
}
|
|
@@ -243,17 +240,17 @@ class ParcelappAdapter extends utils.Adapter {
|
|
|
243
240
|
if (error.code === "RATE_LIMITED") {
|
|
244
241
|
const cooldownSec = error.retryAfterSeconds || 5 * 60;
|
|
245
242
|
this.rateLimitedUntil = Date.now() + cooldownSec * 1e3;
|
|
246
|
-
this.log.warn(
|
|
243
|
+
this.log.warn(`Rate limit hit \u2014 pausing API requests for ${Math.ceil(cooldownSec / 60)} minute(s)`);
|
|
247
244
|
} else if (error.code === "INVALID_API_KEY") {
|
|
248
|
-
this.log.error(
|
|
245
|
+
this.log.error("Invalid API key \u2014 please check your parcel.app API key");
|
|
249
246
|
} else if (isRepeat) {
|
|
250
247
|
this.log.debug(`Poll failed (ongoing): ${error.message}`);
|
|
251
248
|
} else if (errorCode === "NETWORK") {
|
|
252
|
-
this.log.warn(
|
|
249
|
+
this.log.warn("Cannot reach parcel.app API \u2014 will keep retrying");
|
|
253
250
|
} else if (errorCode === "TIMEOUT") {
|
|
254
|
-
this.log.warn(
|
|
251
|
+
this.log.warn("API request timeout \u2014 will retry next cycle");
|
|
255
252
|
} else {
|
|
256
|
-
this.log.error(
|
|
253
|
+
this.log.error(`Poll failed: ${error.message}`);
|
|
257
254
|
}
|
|
258
255
|
await this.setStateAsync("info.connection", { val: false, ack: true });
|
|
259
256
|
} finally {
|
package/build/main.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/main.ts"],
|
|
4
|
-
"sourcesContent": ["import * as utils from \"@iobroker/adapter-core\";\nimport { errText } from \"./lib/coerce\";\nimport { tLog } from \"./lib/i18n-logs\";\nimport { ParcelClient } from \"./lib/parcel-client\";\nimport { StateManager } from \"./lib/state-manager\";\n\nconst MIN_POLL_INTERVAL = 5;\nconst MAX_POLL_INTERVAL = 60;\nconst DEFAULT_POLL_INTERVAL = 10;\nconst MIN_POLL_GAP_MS = 60_000; // Minimum 60s between polls\n\n/** ioBroker adapter for parcel.app package tracking */\nclass ParcelappAdapter extends utils.Adapter {\n private client: ParcelClient | null = null;\n private stateManager: StateManager | null = null;\n private pollTimer: ioBroker.Interval | undefined = undefined;\n private isPolling = false;\n private lastPollTime = 0;\n private rateLimitedUntil = 0;\n private lastErrorCode = \"\";\n private failedDeliveries = new Set<string>();\n private unhandledRejectionHandler: ((reason: unknown) => void) | null = null;\n private uncaughtExceptionHandler: ((err: Error) => void) | null = null;\n /** ioBroker system language \u2014 read once in `onReady` from `system.config`. EN fallback. */\n private systemLang: string = \"en\";\n\n /** @param options Adapter options */\n public constructor(options: Partial<utils.AdapterOptions> = {}) {\n super({\n ...options,\n name: \"parcelapp\",\n });\n // Wrap async handlers with .catch() so a rejection can never become an\n // unhandled promise rejection (which would SIGKILL the adapter and trap\n // js-controller in a restart loop without any stack trace).\n this.on(\"ready\", () => {\n this.onReady().catch(err => this.log.error(tLog(this.systemLang, \"onReadyFailed\", { error: errText(err) })));\n });\n this.on(\"unload\", this.onUnload.bind(this));\n this.on(\"message\", obj => {\n this.onMessage(obj).catch(err =>\n this.log.error(tLog(this.systemLang, \"onMessageFailed\", { error: errText(err) })),\n );\n });\n // Last-line-of-defence against unhandled rejections / sync throws from\n // fire-and-forget paths (e.g. `void this.poll()`). The per-handler\n // .catch() wrappers cover the documented async paths; this catches\n // anything that slips past during refactors.\n this.unhandledRejectionHandler = (reason: unknown) => {\n this.log.error(tLog(this.systemLang, \"unhandledRejection\", { error: errText(reason) }));\n };\n this.uncaughtExceptionHandler = (err: Error) => {\n this.log.error(tLog(this.systemLang, \"uncaughtException\", { error: errText(err) }));\n };\n process.on(\"unhandledRejection\", this.unhandledRejectionHandler);\n process.on(\"uncaughtException\", this.uncaughtExceptionHandler);\n }\n\n private async onReady(): Promise<void> {\n // Pick the system language up-front so all user-facing logs go out in the\n // user's language. StateManager also gets it for state-name localization.\n const sysConfig = await this.getForeignObjectAsync(\"system.config\");\n const language = (sysConfig?.common as { language?: string } | undefined)?.language ?? \"\";\n if (typeof language === \"string\" && language.length > 0) {\n this.systemLang = language;\n }\n\n await this.setStateAsync(\"info.connection\", { val: false, ack: true });\n\n // Validate config\n const { apiKey } = this.config;\n if (!apiKey || apiKey.trim().length < 10) {\n this.log.error(tLog(this.systemLang, \"noApiKey\"));\n return;\n }\n\n // Initialize\n this.client = new ParcelClient(apiKey.trim());\n this.stateManager = new StateManager(this, language);\n\n // Cleanup obsolete states\n await this.cleanupObsoleteStates();\n\n // Initial poll\n await this.poll();\n\n // Set up recurring poll\n const interval = Math.max(\n MIN_POLL_INTERVAL,\n Math.min(MAX_POLL_INTERVAL, this.config.pollInterval ?? DEFAULT_POLL_INTERVAL),\n );\n const intervalMs = interval * 60 * 1000;\n this.pollTimer = this.setInterval(() => void this.poll(), intervalMs);\n\n this.log.info(tLog(this.systemLang, \"trackingStarted\", { minutes: interval }));\n }\n\n private onUnload(callback: () => void): void {\n try {\n if (this.pollTimer) {\n this.clearInterval(this.pollTimer);\n this.pollTimer = undefined;\n }\n if (this.unhandledRejectionHandler) {\n process.off(\"unhandledRejection\", this.unhandledRejectionHandler);\n this.unhandledRejectionHandler = null;\n }\n if (this.uncaughtExceptionHandler) {\n process.off(\"uncaughtException\", this.uncaughtExceptionHandler);\n this.uncaughtExceptionHandler = null;\n }\n void this.setState(\"info.connection\", { val: false, ack: true });\n } catch {\n // ignore\n }\n callback();\n }\n\n private async onMessage(obj: ioBroker.Message): Promise<void> {\n if (!obj?.command || !obj.callback) {\n return;\n }\n\n try {\n switch (obj.command) {\n case \"checkConnection\": {\n const msg = obj.message as { apiKey?: string };\n const key = msg?.apiKey?.trim() || \"\";\n if (!key || key.length < 10) {\n this.sendTo(obj.from, obj.command, { success: false, message: \"API key is too short\" }, obj.callback);\n return;\n }\n const testClient = new ParcelClient(key);\n const result = await testClient.testConnection();\n this.sendTo(obj.from, obj.command, result, obj.callback);\n break;\n }\n case \"addDelivery\": {\n if (!this.client) {\n this.sendTo(\n obj.from,\n obj.command,\n { success: false, error_message: \"Adapter not initialized\" },\n obj.callback,\n );\n return;\n }\n const request = obj.message as {\n tracking_number: string;\n carrier_code: string;\n description: string;\n };\n const addResult = await this.client.addDelivery(request);\n this.sendTo(obj.from, obj.command, addResult, obj.callback);\n if (addResult.success) {\n void this.poll();\n }\n break;\n }\n default:\n this.sendTo(obj.from, obj.command, { error: \"Unknown command\" }, obj.callback);\n }\n } catch (err) {\n this.sendTo(obj.from, obj.command, { success: false, error_message: errText(err) }, obj.callback);\n }\n }\n\n private async cleanupObsoleteStates(): Promise<void> {\n const obsoleteStates = [\n \"summary.json\", // removed in 0.2.0\n ];\n for (const stateId of obsoleteStates) {\n const obj = await this.getObjectAsync(stateId);\n if (obj) {\n await this.delObjectAsync(stateId);\n this.log.debug(`Removed obsolete state: ${stateId}`);\n }\n }\n }\n\n /**\n * Classify an error for deduplication and log-level decisions.\n *\n * @param error The error to classify\n */\n private classifyError(error: Error & { code?: string }): string {\n if (error.code === \"RATE_LIMITED\") {\n return \"RATE_LIMITED\";\n }\n if (error.code === \"INVALID_API_KEY\") {\n return \"INVALID_API_KEY\";\n }\n // Network errors: DNS, connection refused, no internet\n if (\n error.code === \"ENOTFOUND\" ||\n error.code === \"ECONNREFUSED\" ||\n error.code === \"ECONNRESET\" ||\n error.code === \"ENETUNREACH\" ||\n error.code === \"EHOSTUNREACH\" ||\n error.code === \"EAI_AGAIN\"\n ) {\n return \"NETWORK\";\n }\n if (error.message.includes(\"timeout\") || error.code === \"ETIMEDOUT\") {\n return \"TIMEOUT\";\n }\n return error.code || \"UNKNOWN\";\n }\n\n private async poll(): Promise<void> {\n if (this.isPolling || !this.client || !this.stateManager) {\n return;\n }\n\n const now = Date.now();\n\n // Skip if rate limited\n if (now < this.rateLimitedUntil) {\n const waitMin = Math.ceil((this.rateLimitedUntil - now) / 60_000);\n this.log.debug(`Skipping poll \u2014 rate limited for ${waitMin} more minute(s)`);\n return;\n }\n\n // Throttle: minimum gap between polls\n if (now - this.lastPollTime < MIN_POLL_GAP_MS) {\n this.log.debug(\"Skipping poll \u2014 too soon after last poll\");\n return;\n }\n\n this.isPolling = true;\n this.lastPollTime = now;\n try {\n // When keeping delivered packages, use \"recent\" to get them from API\n const autoRemove = this.config.autoRemoveDelivered !== false;\n const deliveries = await this.client.getDeliveries(autoRemove ? \"active\" : \"recent\");\n\n // Reset error state on success\n this.rateLimitedUntil = 0;\n if (this.lastErrorCode) {\n this.log.info(tLog(this.systemLang, \"connectionRestored\"));\n this.lastErrorCode = \"\";\n }\n await this.setStateAsync(\"info.connection\", { val: true, ack: true });\n\n // Split into active (non-delivered) and visible (what gets states)\n const activeDeliveries = deliveries.filter(d => this.stateManager!.parseStatus(d) !== 0);\n const visibleDeliveries = autoRemove ? activeDeliveries : deliveries;\n\n // Update each delivery (isolated: one failure must not block others)\n const activeIds: string[] = [];\n for (const delivery of visibleDeliveries) {\n try {\n const carrierName = await this.client.getCarrierName(delivery.carrier_code);\n await this.stateManager.updateDelivery(delivery, carrierName);\n activeIds.push(this.stateManager.packageId(delivery));\n this.failedDeliveries.delete(delivery.tracking_number);\n } catch (err) {\n const msg = errText(err);\n if (this.failedDeliveries.has(delivery.tracking_number)) {\n this.log.debug(`Failed to update \"${delivery.tracking_number}\": ${msg}`);\n } else {\n this.log.warn(tLog(this.systemLang, \"updateFailed\", { tracking: delivery.tracking_number, error: msg }));\n this.failedDeliveries.add(delivery.tracking_number);\n }\n }\n }\n\n // Cleanup stale deliveries\n await this.stateManager.cleanupDeliveries(activeIds);\n\n // Update summary (always uses active/non-delivered)\n await this.stateManager.updateSummary(activeDeliveries);\n\n this.log.debug(`Polled ${visibleDeliveries.length} deliveries (${activeDeliveries.length} active)`);\n } catch (err) {\n const error = err as Error & {\n code?: string;\n retryAfterSeconds?: number;\n };\n\n // Classify the error\n const errorCode = this.classifyError(error);\n const isRepeat = errorCode === this.lastErrorCode;\n this.lastErrorCode = errorCode;\n\n if (error.code === \"RATE_LIMITED\") {\n const cooldownSec = error.retryAfterSeconds || 5 * 60;\n this.rateLimitedUntil = Date.now() + cooldownSec * 1000;\n this.log.warn(tLog(this.systemLang, \"rateLimitHit\", { minutes: Math.ceil(cooldownSec / 60) }));\n } else if (error.code === \"INVALID_API_KEY\") {\n // Always log \u2014 user must fix config\n this.log.error(tLog(this.systemLang, \"invalidApiKey\"));\n } else if (isRepeat) {\n // Same error as last time \u2014 don't spam the log\n this.log.debug(`Poll failed (ongoing): ${error.message}`);\n } else if (errorCode === \"NETWORK\") {\n this.log.warn(tLog(this.systemLang, \"cannotReach\"));\n } else if (errorCode === \"TIMEOUT\") {\n this.log.warn(tLog(this.systemLang, \"apiTimeout\"));\n } else {\n this.log.error(tLog(this.systemLang, \"pollFailed\", { error: error.message }));\n }\n\n await this.setStateAsync(\"info.connection\", { val: false, ack: true });\n } finally {\n this.isPolling = false;\n }\n }\n}\n\nif (require.main !== module) {\n module.exports = (options: Partial<utils.AdapterOptions> | undefined) => new ParcelappAdapter(options);\n} else {\n (() => new ParcelappAdapter())();\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;AAAA,YAAuB;AACvB,oBAAwB;AACxB,
|
|
4
|
+
"sourcesContent": ["import * as utils from \"@iobroker/adapter-core\";\nimport { errText } from \"./lib/coerce\";\nimport { ParcelClient } from \"./lib/parcel-client\";\nimport { StateManager } from \"./lib/state-manager\";\n\nconst MIN_POLL_INTERVAL = 5;\nconst MAX_POLL_INTERVAL = 60;\nconst DEFAULT_POLL_INTERVAL = 10;\nconst MIN_POLL_GAP_MS = 60_000; // Minimum 60s between polls\n\n/** ioBroker adapter for parcel.app package tracking */\nclass ParcelappAdapter extends utils.Adapter {\n private client: ParcelClient | null = null;\n private stateManager: StateManager | null = null;\n private pollTimer: ioBroker.Interval | undefined = undefined;\n private isPolling = false;\n private lastPollTime = 0;\n private rateLimitedUntil = 0;\n private lastErrorCode = \"\";\n private failedDeliveries = new Set<string>();\n private unhandledRejectionHandler: ((reason: unknown) => void) | null = null;\n private uncaughtExceptionHandler: ((err: Error) => void) | null = null;\n /** ioBroker system language \u2014 read once in `onReady` from `system.config`. EN fallback. */\n private systemLang: string = \"en\";\n\n /** @param options Adapter options */\n public constructor(options: Partial<utils.AdapterOptions> = {}) {\n super({\n ...options,\n name: \"parcelapp\",\n });\n // Wrap async handlers with .catch() so a rejection can never become an\n // unhandled promise rejection (which would SIGKILL the adapter and trap\n // js-controller in a restart loop without any stack trace).\n this.on(\"ready\", () => {\n this.onReady().catch(err => this.log.error(`onReady failed: ${errText(err)}`));\n });\n this.on(\"unload\", this.onUnload.bind(this));\n this.on(\"message\", obj => {\n this.onMessage(obj).catch(err => this.log.error(`onMessage failed: ${errText(err)}`));\n });\n // Last-line-of-defence against unhandled rejections / sync throws from\n // fire-and-forget paths (e.g. `void this.poll()`). The per-handler\n // .catch() wrappers cover the documented async paths; this catches\n // anything that slips past during refactors.\n this.unhandledRejectionHandler = (reason: unknown) => {\n this.log.error(`Unhandled rejection: ${errText(reason)}`);\n };\n this.uncaughtExceptionHandler = (err: Error) => {\n this.log.error(`Uncaught exception: ${errText(err)}`);\n };\n process.on(\"unhandledRejection\", this.unhandledRejectionHandler);\n process.on(\"uncaughtException\", this.uncaughtExceptionHandler);\n }\n\n private async onReady(): Promise<void> {\n // Pick the system language up-front so all user-facing logs go out in the\n // user's language. StateManager also gets it for state-name localization.\n const sysConfig = await this.getForeignObjectAsync(\"system.config\");\n const language = (sysConfig?.common as { language?: string } | undefined)?.language ?? \"\";\n if (typeof language === \"string\" && language.length > 0) {\n this.systemLang = language;\n }\n\n await this.setStateAsync(\"info.connection\", { val: false, ack: true });\n\n // Validate config\n const { apiKey } = this.config;\n if (!apiKey || apiKey.trim().length < 10) {\n this.log.error(\"No valid API key configured \u2014 please enter your parcel.app API key in the adapter settings\");\n return;\n }\n\n // Initialize\n this.client = new ParcelClient(apiKey.trim());\n this.stateManager = new StateManager(this, language);\n\n // Cleanup obsolete states\n await this.cleanupObsoleteStates();\n\n // Initial poll\n await this.poll();\n\n // Set up recurring poll\n const interval = Math.max(\n MIN_POLL_INTERVAL,\n Math.min(MAX_POLL_INTERVAL, this.config.pollInterval ?? DEFAULT_POLL_INTERVAL),\n );\n const intervalMs = interval * 60 * 1000;\n this.pollTimer = this.setInterval(() => void this.poll(), intervalMs);\n\n this.log.info(`Parcel tracking started \u2014 polling every ${interval} minutes`);\n }\n\n private onUnload(callback: () => void): void {\n try {\n if (this.pollTimer) {\n this.clearInterval(this.pollTimer);\n this.pollTimer = undefined;\n }\n if (this.unhandledRejectionHandler) {\n process.off(\"unhandledRejection\", this.unhandledRejectionHandler);\n this.unhandledRejectionHandler = null;\n }\n if (this.uncaughtExceptionHandler) {\n process.off(\"uncaughtException\", this.uncaughtExceptionHandler);\n this.uncaughtExceptionHandler = null;\n }\n void this.setState(\"info.connection\", { val: false, ack: true });\n } catch {\n // ignore\n }\n callback();\n }\n\n private async onMessage(obj: ioBroker.Message): Promise<void> {\n if (!obj?.command || !obj.callback) {\n return;\n }\n\n try {\n switch (obj.command) {\n case \"checkConnection\": {\n const msg = obj.message as { apiKey?: string };\n const key = msg?.apiKey?.trim() || \"\";\n if (!key || key.length < 10) {\n this.sendTo(obj.from, obj.command, { success: false, message: \"API key is too short\" }, obj.callback);\n return;\n }\n const testClient = new ParcelClient(key);\n const result = await testClient.testConnection();\n this.sendTo(obj.from, obj.command, result, obj.callback);\n break;\n }\n case \"addDelivery\": {\n if (!this.client) {\n this.sendTo(\n obj.from,\n obj.command,\n { success: false, error_message: \"Adapter not initialized\" },\n obj.callback,\n );\n return;\n }\n const request = obj.message as {\n tracking_number: string;\n carrier_code: string;\n description: string;\n };\n const addResult = await this.client.addDelivery(request);\n this.sendTo(obj.from, obj.command, addResult, obj.callback);\n if (addResult.success) {\n void this.poll();\n }\n break;\n }\n default:\n this.sendTo(obj.from, obj.command, { error: \"Unknown command\" }, obj.callback);\n }\n } catch (err) {\n this.sendTo(obj.from, obj.command, { success: false, error_message: errText(err) }, obj.callback);\n }\n }\n\n private async cleanupObsoleteStates(): Promise<void> {\n const obsoleteStates = [\n \"summary.json\", // removed in 0.2.0\n ];\n for (const stateId of obsoleteStates) {\n const obj = await this.getObjectAsync(stateId);\n if (obj) {\n await this.delObjectAsync(stateId);\n this.log.debug(`Removed obsolete state: ${stateId}`);\n }\n }\n }\n\n /**\n * Classify an error for deduplication and log-level decisions.\n *\n * @param error The error to classify\n */\n private classifyError(error: Error & { code?: string }): string {\n if (error.code === \"RATE_LIMITED\") {\n return \"RATE_LIMITED\";\n }\n if (error.code === \"INVALID_API_KEY\") {\n return \"INVALID_API_KEY\";\n }\n // Network errors: DNS, connection refused, no internet\n if (\n error.code === \"ENOTFOUND\" ||\n error.code === \"ECONNREFUSED\" ||\n error.code === \"ECONNRESET\" ||\n error.code === \"ENETUNREACH\" ||\n error.code === \"EHOSTUNREACH\" ||\n error.code === \"EAI_AGAIN\"\n ) {\n return \"NETWORK\";\n }\n if (error.message.includes(\"timeout\") || error.code === \"ETIMEDOUT\") {\n return \"TIMEOUT\";\n }\n return error.code || \"UNKNOWN\";\n }\n\n private async poll(): Promise<void> {\n if (this.isPolling || !this.client || !this.stateManager) {\n return;\n }\n\n const now = Date.now();\n\n // Skip if rate limited\n if (now < this.rateLimitedUntil) {\n const waitMin = Math.ceil((this.rateLimitedUntil - now) / 60_000);\n this.log.debug(`Skipping poll \u2014 rate limited for ${waitMin} more minute(s)`);\n return;\n }\n\n // Throttle: minimum gap between polls\n if (now - this.lastPollTime < MIN_POLL_GAP_MS) {\n this.log.debug(\"Skipping poll \u2014 too soon after last poll\");\n return;\n }\n\n this.isPolling = true;\n this.lastPollTime = now;\n try {\n // When keeping delivered packages, use \"recent\" to get them from API\n const autoRemove = this.config.autoRemoveDelivered !== false;\n const deliveries = await this.client.getDeliveries(autoRemove ? \"active\" : \"recent\");\n\n // Reset error state on success\n this.rateLimitedUntil = 0;\n if (this.lastErrorCode) {\n this.log.info(\"Connection restored\");\n this.lastErrorCode = \"\";\n }\n await this.setStateAsync(\"info.connection\", { val: true, ack: true });\n\n // Split into active (non-delivered) and visible (what gets states)\n const activeDeliveries = deliveries.filter(d => this.stateManager!.parseStatus(d) !== 0);\n const visibleDeliveries = autoRemove ? activeDeliveries : deliveries;\n\n // Update each delivery (isolated: one failure must not block others)\n const activeIds: string[] = [];\n for (const delivery of visibleDeliveries) {\n try {\n const carrierName = await this.client.getCarrierName(delivery.carrier_code);\n await this.stateManager.updateDelivery(delivery, carrierName);\n activeIds.push(this.stateManager.packageId(delivery));\n this.failedDeliveries.delete(delivery.tracking_number);\n } catch (err) {\n const msg = errText(err);\n if (this.failedDeliveries.has(delivery.tracking_number)) {\n this.log.debug(`Failed to update \"${delivery.tracking_number}\": ${msg}`);\n } else {\n this.log.warn(`Failed to update '${delivery.tracking_number}': ${msg}`);\n this.failedDeliveries.add(delivery.tracking_number);\n }\n }\n }\n\n // Cleanup stale deliveries\n await this.stateManager.cleanupDeliveries(activeIds);\n\n // Update summary (always uses active/non-delivered)\n await this.stateManager.updateSummary(activeDeliveries);\n\n this.log.debug(`Polled ${visibleDeliveries.length} deliveries (${activeDeliveries.length} active)`);\n } catch (err) {\n const error = err as Error & {\n code?: string;\n retryAfterSeconds?: number;\n };\n\n // Classify the error\n const errorCode = this.classifyError(error);\n const isRepeat = errorCode === this.lastErrorCode;\n this.lastErrorCode = errorCode;\n\n if (error.code === \"RATE_LIMITED\") {\n const cooldownSec = error.retryAfterSeconds || 5 * 60;\n this.rateLimitedUntil = Date.now() + cooldownSec * 1000;\n this.log.warn(`Rate limit hit \u2014 pausing API requests for ${Math.ceil(cooldownSec / 60)} minute(s)`);\n } else if (error.code === \"INVALID_API_KEY\") {\n // Always log \u2014 user must fix config\n this.log.error(\"Invalid API key \u2014 please check your parcel.app API key\");\n } else if (isRepeat) {\n // Same error as last time \u2014 don't spam the log\n this.log.debug(`Poll failed (ongoing): ${error.message}`);\n } else if (errorCode === \"NETWORK\") {\n this.log.warn(\"Cannot reach parcel.app API \u2014 will keep retrying\");\n } else if (errorCode === \"TIMEOUT\") {\n this.log.warn(\"API request timeout \u2014 will retry next cycle\");\n } else {\n this.log.error(`Poll failed: ${error.message}`);\n }\n\n await this.setStateAsync(\"info.connection\", { val: false, ack: true });\n } finally {\n this.isPolling = false;\n }\n }\n}\n\nif (require.main !== module) {\n module.exports = (options: Partial<utils.AdapterOptions> | undefined) => new ParcelappAdapter(options);\n} else {\n (() => new ParcelappAdapter())();\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/io-package.json
CHANGED
|
@@ -1,8 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "parcelapp",
|
|
4
|
-
"version": "0.4.
|
|
4
|
+
"version": "0.4.1",
|
|
5
5
|
"news": {
|
|
6
|
+
"0.4.1": {
|
|
7
|
+
"en": "Adapter log messages are now English only, in line with the ioBroker community standard. Localized state names (11 languages) remain unchanged.",
|
|
8
|
+
"de": "Adapter-Logs sind jetzt nur noch auf Englisch, gemäß ioBroker-Community-Standard. Lokalisierte Datenpunkt-Namen (11 Sprachen) bleiben erhalten.",
|
|
9
|
+
"ru": "Сообщения журнала теперь только на английском, согласно стандарту сообщества ioBroker. Локализованные имена состояний (11 языков) сохраняются.",
|
|
10
|
+
"pt": "As mensagens de log do adaptador agora são apenas em inglês, conforme o padrão da comunidade ioBroker. Os nomes de estados localizados (11 idiomas) permanecem inalterados.",
|
|
11
|
+
"nl": "Adapter-logberichten zijn nu alleen Engels, conform de ioBroker-communitystandaard. Gelokaliseerde statusnamen (11 talen) blijven ongewijzigd.",
|
|
12
|
+
"fr": "Les messages de log de l'adaptateur sont désormais uniquement en anglais, conformément au standard de la communauté ioBroker. Les noms d'états localisés (11 langues) restent inchangés.",
|
|
13
|
+
"it": "I messaggi di log dell'adattatore sono ora solo in inglese, secondo lo standard della community ioBroker. I nomi degli stati localizzati (11 lingue) rimangono invariati.",
|
|
14
|
+
"es": "Los mensajes de registro del adaptador ahora son solo en inglés, conforme al estándar de la comunidad ioBroker. Los nombres de estados localizados (11 idiomas) permanecen sin cambios.",
|
|
15
|
+
"pl": "Komunikaty dziennika adaptera są teraz wyłącznie po angielsku, zgodnie ze standardem społeczności ioBroker. Zlokalizowane nazwy stanów (11 języków) pozostają bez zmian.",
|
|
16
|
+
"uk": "Повідомлення журналу адаптера тепер лише англійською, відповідно до стандарту спільноти ioBroker. Локалізовані назви станів (11 мов) залишаються без змін.",
|
|
17
|
+
"zh-cn": "适配器日志消息现在仅为英文,符合 ioBroker 社区标准。本地化的数据点名称(11 种语言)保持不变。"
|
|
18
|
+
},
|
|
6
19
|
"0.4.0": {
|
|
7
20
|
"en": "State names now follow your ioBroker system language across 11 languages. User-visible info/warn/error logs are localized too. Min Node 22, Admin 7.8.23.",
|
|
8
21
|
"de": "Datenpunkt-Namen folgen jetzt der ioBroker-Systemsprache in 11 Sprachen. User-sichtbare info/warn/error-Logs ebenfalls lokalisiert. Min Node 22, Admin 7.8.23.",
|
|
@@ -80,19 +93,6 @@
|
|
|
80
93
|
"pl": "Wewnętrzne porządki. Brak zmian widocznych dla użytkownika.",
|
|
81
94
|
"uk": "Внутрішнє прибирання. Без помітних для користувача змін.",
|
|
82
95
|
"zh-cn": "内部清理。对用户无可见变化。"
|
|
83
|
-
},
|
|
84
|
-
"0.2.16": {
|
|
85
|
-
"en": "Min js-controller restored to >=6.0.11 (was incorrectly bumped to >=7.0.23 in 0.2.15).",
|
|
86
|
-
"de": "Min js-controller zurück auf >=6.0.11 (war in 0.2.15 fälschlich auf >=7.0.23 gesetzt).",
|
|
87
|
-
"ru": "Мин. js-controller восстановлен на >=6.0.11 (в 0.2.15 ошибочно был >=7.0.23).",
|
|
88
|
-
"pt": "Mín. js-controller restaurado para >=6.0.11 (em 0.2.15 estava erroneamente em >=7.0.23).",
|
|
89
|
-
"nl": "Min. js-controller hersteld op >=6.0.11 (was in 0.2.15 ten onrechte >=7.0.23).",
|
|
90
|
-
"fr": "Min js-controller rétabli à >=6.0.11 (était par erreur à >=7.0.23 en 0.2.15).",
|
|
91
|
-
"it": "Min js-controller ripristinato a >=6.0.11 (in 0.2.15 era erroneamente >=7.0.23).",
|
|
92
|
-
"es": "Mín. js-controller restaurado a >=6.0.11 (en 0.2.15 estaba incorrectamente en >=7.0.23).",
|
|
93
|
-
"pl": "Min. js-controller przywrócony do >=6.0.11 (w 0.2.15 błędnie ustawiony na >=7.0.23).",
|
|
94
|
-
"uk": "Мін. js-controller повернено на >=6.0.11 (у 0.2.15 помилково було >=7.0.23).",
|
|
95
|
-
"zh-cn": "最低 js-controller 恢复为 >=6.0.11(0.2.15 中错误地设置为 >=7.0.23)。"
|
|
96
96
|
}
|
|
97
97
|
},
|
|
98
98
|
"titleLang": {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.parcelapp",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"description": "ioBroker adapter for the parcel.app API",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "krobi",
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"@tsconfig/node22": "^22.0.5",
|
|
44
44
|
"@types/iobroker": "npm:@iobroker/types@^7.1.1",
|
|
45
45
|
"@types/node": "^22.19.17",
|
|
46
|
-
"nyc": "^
|
|
46
|
+
"nyc": "^18.0.0",
|
|
47
47
|
"rimraf": "^6.1.3",
|
|
48
48
|
"source-map-support": "^0.5.21",
|
|
49
49
|
"ts-node": "^10.9.2",
|
package/build/lib/i18n-logs.js
DELETED
|
@@ -1,229 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __export = (target, all) => {
|
|
7
|
-
for (var name in all)
|
|
8
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
-
};
|
|
10
|
-
var __copyProps = (to, from, except, desc) => {
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
-
for (let key of __getOwnPropNames(from))
|
|
13
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
-
}
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
var i18n_logs_exports = {};
|
|
20
|
-
__export(i18n_logs_exports, {
|
|
21
|
-
LOG_STRINGS: () => LOG_STRINGS,
|
|
22
|
-
tLog: () => tLog
|
|
23
|
-
});
|
|
24
|
-
module.exports = __toCommonJS(i18n_logs_exports);
|
|
25
|
-
const SUPPORTED_LANGS = ["en", "de", "ru", "pt", "nl", "fr", "it", "es", "pl", "uk", "zh-cn"];
|
|
26
|
-
function fmt(template, params) {
|
|
27
|
-
if (!params) {
|
|
28
|
-
return template;
|
|
29
|
-
}
|
|
30
|
-
return template.replace(/\{(\w+)\}/g, (_, key) => {
|
|
31
|
-
const v = params[key];
|
|
32
|
-
if (v === null) {
|
|
33
|
-
return "(none)";
|
|
34
|
-
}
|
|
35
|
-
if (v === void 0) {
|
|
36
|
-
return `{${key}}`;
|
|
37
|
-
}
|
|
38
|
-
return String(v);
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
const LOG_STRINGS = {
|
|
42
|
-
// ──────── Adapter lifecycle / crash defense ────────
|
|
43
|
-
onReadyFailed: {
|
|
44
|
-
en: "onReady failed: {error}",
|
|
45
|
-
de: "onReady fehlgeschlagen: {error}",
|
|
46
|
-
ru: "onReady \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043B\u0441\u044F \u0441 \u043E\u0448\u0438\u0431\u043A\u043E\u0439: {error}",
|
|
47
|
-
pt: "onReady falhou: {error}",
|
|
48
|
-
nl: "onReady is mislukt: {error}",
|
|
49
|
-
fr: "onReady a \xE9chou\xE9 : {error}",
|
|
50
|
-
it: "onReady non riuscito: {error}",
|
|
51
|
-
es: "onReady fall\xF3: {error}",
|
|
52
|
-
pl: "onReady nie powi\xF3d\u0142 si\u0119: {error}",
|
|
53
|
-
uk: "onReady \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0432\u0441\u044F \u0437 \u043F\u043E\u043C\u0438\u043B\u043A\u043E\u044E: {error}",
|
|
54
|
-
"zh-cn": "onReady \u5931\u8D25\uFF1A{error}"
|
|
55
|
-
},
|
|
56
|
-
onMessageFailed: {
|
|
57
|
-
en: "onMessage failed: {error}",
|
|
58
|
-
de: "onMessage fehlgeschlagen: {error}",
|
|
59
|
-
ru: "onMessage \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043B\u0441\u044F \u0441 \u043E\u0448\u0438\u0431\u043A\u043E\u0439: {error}",
|
|
60
|
-
pt: "onMessage falhou: {error}",
|
|
61
|
-
nl: "onMessage is mislukt: {error}",
|
|
62
|
-
fr: "onMessage a \xE9chou\xE9 : {error}",
|
|
63
|
-
it: "onMessage non riuscito: {error}",
|
|
64
|
-
es: "onMessage fall\xF3: {error}",
|
|
65
|
-
pl: "onMessage nie powi\xF3d\u0142 si\u0119: {error}",
|
|
66
|
-
uk: "onMessage \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0432\u0441\u044F \u0437 \u043F\u043E\u043C\u0438\u043B\u043A\u043E\u044E: {error}",
|
|
67
|
-
"zh-cn": "onMessage \u5931\u8D25\uFF1A{error}"
|
|
68
|
-
},
|
|
69
|
-
unhandledRejection: {
|
|
70
|
-
en: "Unhandled rejection: {error}",
|
|
71
|
-
de: "Unbehandelte Promise-Rejection: {error}",
|
|
72
|
-
ru: "\u041D\u0435\u043E\u0431\u0440\u0430\u0431\u043E\u0442\u0430\u043D\u043D\u044B\u0439 rejection: {error}",
|
|
73
|
-
pt: "Rejei\xE7\xE3o n\xE3o tratada: {error}",
|
|
74
|
-
nl: "Onafgehandelde rejection: {error}",
|
|
75
|
-
fr: "Rejet non g\xE9r\xE9 : {error}",
|
|
76
|
-
it: "Rejection non gestita: {error}",
|
|
77
|
-
es: "Rechazo no manejado: {error}",
|
|
78
|
-
pl: "Nieobs\u0142u\u017Cone odrzucenie: {error}",
|
|
79
|
-
uk: "\u041D\u0435\u043E\u0431\u0440\u043E\u0431\u043B\u0435\u043D\u0438\u0439 rejection: {error}",
|
|
80
|
-
"zh-cn": "\u672A\u5904\u7406\u7684 rejection\uFF1A{error}"
|
|
81
|
-
},
|
|
82
|
-
uncaughtException: {
|
|
83
|
-
en: "Uncaught exception: {error}",
|
|
84
|
-
de: "Nicht abgefangene Exception: {error}",
|
|
85
|
-
ru: "\u041D\u0435\u043E\u0431\u0440\u0430\u0431\u043E\u0442\u0430\u043D\u043D\u043E\u0435 \u0438\u0441\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435: {error}",
|
|
86
|
-
pt: "Exce\xE7\xE3o n\xE3o capturada: {error}",
|
|
87
|
-
nl: "Niet-opgevangen exception: {error}",
|
|
88
|
-
fr: "Exception non captur\xE9e : {error}",
|
|
89
|
-
it: "Eccezione non catturata: {error}",
|
|
90
|
-
es: "Excepci\xF3n no capturada: {error}",
|
|
91
|
-
pl: "Nieprzechwycony wyj\u0105tek: {error}",
|
|
92
|
-
uk: "\u041D\u0435\u043F\u0435\u0440\u0435\u0445\u043E\u043F\u043B\u0435\u043D\u0435 \u0432\u0438\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044F: {error}",
|
|
93
|
-
"zh-cn": "\u672A\u6355\u83B7\u7684\u5F02\u5E38\uFF1A{error}"
|
|
94
|
-
},
|
|
95
|
-
// ──────── Configuration / startup ────────
|
|
96
|
-
noApiKey: {
|
|
97
|
-
en: "No valid API key configured \u2014 please enter your parcel.app API key in the adapter settings",
|
|
98
|
-
de: "Kein g\xFCltiger API-Key konfiguriert \u2014 bitte trage deinen parcel.app API-Key in den Adapter-Einstellungen ein",
|
|
99
|
-
ru: "API-\u043A\u043B\u044E\u0447 \u043D\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043D \u2014 \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0432\u0430\u0448 parcel.app API-\u043A\u043B\u044E\u0447 \u0432 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430\u0445 \u0430\u0434\u0430\u043F\u0442\u0435\u0440\u0430",
|
|
100
|
-
pt: "Nenhuma chave de API v\xE1lida configurada \u2014 insira a sua chave parcel.app nas configura\xE7\xF5es do adaptador",
|
|
101
|
-
nl: "Geen geldige API-sleutel geconfigureerd \u2014 voer je parcel.app API-sleutel in de adapter-instellingen in",
|
|
102
|
-
fr: "Aucune cl\xE9 API valide configur\xE9e \u2014 saisissez votre cl\xE9 parcel.app dans les param\xE8tres de l'adaptateur",
|
|
103
|
-
it: "Nessuna chiave API valida configurata \u2014 inserisci la tua chiave parcel.app nelle impostazioni dell'adattatore",
|
|
104
|
-
es: "Ninguna clave API v\xE1lida configurada \u2014 introduce tu clave parcel.app en los ajustes del adaptador",
|
|
105
|
-
pl: "Nie skonfigurowano poprawnego klucza API \u2014 wprowad\u017A sw\xF3j klucz parcel.app w ustawieniach adaptera",
|
|
106
|
-
uk: "\u041D\u0435\u043C\u0430\u0454 \u043D\u0430\u043B\u0430\u0448\u0442\u043E\u0432\u0430\u043D\u043E\u0433\u043E API-\u043A\u043B\u044E\u0447\u0430 \u2014 \u0432\u0432\u0435\u0434\u0456\u0442\u044C \u0432\u0430\u0448 parcel.app API-\u043A\u043B\u044E\u0447 \u0443 \u043D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F\u0445 \u0430\u0434\u0430\u043F\u0442\u0435\u0440\u0430",
|
|
107
|
-
"zh-cn": "\u672A\u914D\u7F6E\u6709\u6548\u7684 API \u5BC6\u94A5 \u2014 \u8BF7\u5728\u9002\u914D\u5668\u8BBE\u7F6E\u4E2D\u8F93\u5165\u60A8\u7684 parcel.app API \u5BC6\u94A5"
|
|
108
|
-
},
|
|
109
|
-
trackingStarted: {
|
|
110
|
-
en: "Parcel tracking started \u2014 polling every {minutes} minutes",
|
|
111
|
-
de: "Paketverfolgung gestartet \u2014 Abfrage alle {minutes} Minuten",
|
|
112
|
-
ru: "\u041E\u0442\u0441\u043B\u0435\u0436\u0438\u0432\u0430\u043D\u0438\u0435 \u043F\u043E\u0441\u044B\u043B\u043E\u043A \u0437\u0430\u043F\u0443\u0449\u0435\u043D\u043E \u2014 \u043E\u043F\u0440\u043E\u0441 \u043A\u0430\u0436\u0434\u044B\u0435 {minutes} \u043C\u0438\u043D",
|
|
113
|
-
pt: "Monitoriza\xE7\xE3o de encomendas iniciada \u2014 sondagem a cada {minutes} minutos",
|
|
114
|
-
nl: "Pakketvolg-systeem gestart \u2014 pollen elke {minutes} minuten",
|
|
115
|
-
fr: "Suivi des colis d\xE9marr\xE9 \u2014 interrogation toutes les {minutes} minutes",
|
|
116
|
-
it: "Tracciamento pacchi avviato \u2014 interrogazione ogni {minutes} minuti",
|
|
117
|
-
es: "Seguimiento de paquetes iniciado \u2014 consulta cada {minutes} minutos",
|
|
118
|
-
pl: "\u015Aledzenie paczek uruchomione \u2014 odpytywanie co {minutes} minut",
|
|
119
|
-
uk: "\u0412\u0456\u0434\u0441\u0442\u0435\u0436\u0435\u043D\u043D\u044F \u043F\u043E\u0441\u0438\u043B\u043E\u043A \u0437\u0430\u043F\u0443\u0449\u0435\u043D\u043E \u2014 \u043E\u043F\u0438\u0442\u0443\u0432\u0430\u043D\u043D\u044F \u043A\u043E\u0436\u043D\u0456 {minutes} \u0445\u0432",
|
|
120
|
-
"zh-cn": "\u5305\u88F9\u8DDF\u8E2A\u5DF2\u542F\u52A8 \u2014 \u6BCF {minutes} \u5206\u949F\u8F6E\u8BE2\u4E00\u6B21"
|
|
121
|
-
},
|
|
122
|
-
// ──────── Connection / poll ────────
|
|
123
|
-
connectionRestored: {
|
|
124
|
-
en: "Connection restored",
|
|
125
|
-
de: "Verbindung wiederhergestellt",
|
|
126
|
-
ru: "\u0421\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435 \u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E",
|
|
127
|
-
pt: "Conex\xE3o restabelecida",
|
|
128
|
-
nl: "Verbinding hersteld",
|
|
129
|
-
fr: "Connexion r\xE9tablie",
|
|
130
|
-
it: "Connessione ripristinata",
|
|
131
|
-
es: "Conexi\xF3n restablecida",
|
|
132
|
-
pl: "Po\u0142\u0105czenie przywr\xF3cone",
|
|
133
|
-
uk: "\u0417'\u0454\u0434\u043D\u0430\u043D\u043D\u044F \u0432\u0456\u0434\u043D\u043E\u0432\u043B\u0435\u043D\u043E",
|
|
134
|
-
"zh-cn": "\u8FDE\u63A5\u5DF2\u6062\u590D"
|
|
135
|
-
},
|
|
136
|
-
cannotReach: {
|
|
137
|
-
en: "Cannot reach parcel.app API \u2014 will keep retrying",
|
|
138
|
-
de: "parcel.app-API nicht erreichbar \u2014 Versuche werden fortgesetzt",
|
|
139
|
-
ru: "parcel.app API \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u2014 \u043F\u043E\u043F\u044B\u0442\u043A\u0438 \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0430\u044E\u0442\u0441\u044F",
|
|
140
|
-
pt: "N\xE3o foi poss\xEDvel contactar a API parcel.app \u2014 tentativas continuar\xE3o",
|
|
141
|
-
nl: "parcel.app-API onbereikbaar \u2014 pogingen worden voortgezet",
|
|
142
|
-
fr: "API parcel.app injoignable \u2014 les tentatives continuent",
|
|
143
|
-
it: "API parcel.app non raggiungibile \u2014 i tentativi continueranno",
|
|
144
|
-
es: "API parcel.app inaccesible \u2014 se seguir\xE1n intentando",
|
|
145
|
-
pl: "API parcel.app niedost\u0119pne \u2014 pr\xF3by b\u0119d\u0105 kontynuowane",
|
|
146
|
-
uk: "API parcel.app \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0438\u0439 \u2014 \u0441\u043F\u0440\u043E\u0431\u0438 \u0442\u0440\u0438\u0432\u0430\u0442\u0438\u043C\u0443\u0442\u044C",
|
|
147
|
-
"zh-cn": "\u65E0\u6CD5\u8BBF\u95EE parcel.app API \u2014 \u5C06\u7EE7\u7EED\u91CD\u8BD5"
|
|
148
|
-
},
|
|
149
|
-
apiTimeout: {
|
|
150
|
-
en: "API request timeout \u2014 will retry next cycle",
|
|
151
|
-
de: "API-Anfrage-Timeout \u2014 Wiederholung im n\xE4chsten Zyklus",
|
|
152
|
-
ru: "\u0422\u0430\u0439\u043C-\u0430\u0443\u0442 API-\u0437\u0430\u043F\u0440\u043E\u0441\u0430 \u2014 \u043F\u043E\u0432\u0442\u043E\u0440 \u0432 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u043C \u0446\u0438\u043A\u043B\u0435",
|
|
153
|
-
pt: "Tempo limite da API \u2014 tentar de novo no pr\xF3ximo ciclo",
|
|
154
|
-
nl: "API-verzoek-time-out \u2014 opnieuw proberen volgende cyclus",
|
|
155
|
-
fr: "D\xE9lai d'API d\xE9pass\xE9 \u2014 nouvelle tentative au prochain cycle",
|
|
156
|
-
it: "Timeout della richiesta API \u2014 riprovo al prossimo ciclo",
|
|
157
|
-
es: "Tiempo de espera de la API agotado \u2014 se reintentar\xE1 en el pr\xF3ximo ciclo",
|
|
158
|
-
pl: "Przekroczono limit czasu API \u2014 ponowa pr\xF3ba w nast\u0119pnym cyklu",
|
|
159
|
-
uk: "\u0422\u0430\u0439\u043C-\u0430\u0443\u0442 API-\u0437\u0430\u043F\u0438\u0442\u0443 \u2014 \u043F\u043E\u0432\u0442\u043E\u0440 \u0443 \u043D\u0430\u0441\u0442\u0443\u043F\u043D\u043E\u043C\u0443 \u0446\u0438\u043A\u043B\u0456",
|
|
160
|
-
"zh-cn": "API \u8BF7\u6C42\u8D85\u65F6 \u2014 \u5C06\u5728\u4E0B\u4E00\u4E2A\u5468\u671F\u91CD\u8BD5"
|
|
161
|
-
},
|
|
162
|
-
pollFailed: {
|
|
163
|
-
en: "Poll failed: {error}",
|
|
164
|
-
de: "Abfrage fehlgeschlagen: {error}",
|
|
165
|
-
ru: "\u041E\u043F\u0440\u043E\u0441 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043B\u0441\u044F \u0441 \u043E\u0448\u0438\u0431\u043A\u043E\u0439: {error}",
|
|
166
|
-
pt: "Sondagem falhou: {error}",
|
|
167
|
-
nl: "Poll is mislukt: {error}",
|
|
168
|
-
fr: "\xC9chec de l'interrogation : {error}",
|
|
169
|
-
it: "Interrogazione non riuscita: {error}",
|
|
170
|
-
es: "Consulta fall\xF3: {error}",
|
|
171
|
-
pl: "Odpytywanie nie powiod\u0142o si\u0119: {error}",
|
|
172
|
-
uk: "\u041E\u043F\u0438\u0442\u0443\u0432\u0430\u043D\u043D\u044F \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043B\u043E\u0441\u044C \u0437 \u043F\u043E\u043C\u0438\u043B\u043A\u043E\u044E: {error}",
|
|
173
|
-
"zh-cn": "\u8F6E\u8BE2\u5931\u8D25\uFF1A{error}"
|
|
174
|
-
},
|
|
175
|
-
// ──────── Rate limit / auth ────────
|
|
176
|
-
rateLimitHit: {
|
|
177
|
-
en: "Rate limit hit \u2014 pausing API requests for {minutes} minute(s)",
|
|
178
|
-
de: "Rate-Limit erreicht \u2014 API-Anfragen pausieren f\xFCr {minutes} Minute(n)",
|
|
179
|
-
ru: "\u0414\u043E\u0441\u0442\u0438\u0433\u043D\u0443\u0442 \u043B\u0438\u043C\u0438\u0442 \u0437\u0430\u043F\u0440\u043E\u0441\u043E\u0432 \u2014 \u043F\u0430\u0443\u0437\u0430 API \u043D\u0430 {minutes} \u043C\u0438\u043D",
|
|
180
|
-
pt: "Limite de taxa atingido \u2014 pausa nos pedidos \xE0 API por {minutes} minuto(s)",
|
|
181
|
-
nl: "Rate limit bereikt \u2014 API-verzoeken pauzeren voor {minutes} minuut/minuten",
|
|
182
|
-
fr: "Limite de d\xE9bit atteinte \u2014 pause des requ\xEAtes API pendant {minutes} minute(s)",
|
|
183
|
-
it: "Limite di frequenza raggiunto \u2014 pausa delle richieste API per {minutes} minuto/i",
|
|
184
|
-
es: "L\xEDmite de solicitudes alcanzado \u2014 pausando peticiones API durante {minutes} minuto(s)",
|
|
185
|
-
pl: "Osi\u0105gni\u0119to limit zapyta\u0144 \u2014 pauza w \u017C\u0105daniach API przez {minutes} minut",
|
|
186
|
-
uk: "\u0414\u043E\u0441\u044F\u0433\u043D\u0443\u0442\u043E \u043B\u0456\u043C\u0456\u0442 \u0437\u0430\u043F\u0438\u0442\u0456\u0432 \u2014 \u043F\u0430\u0443\u0437\u0430 API \u043D\u0430 {minutes} \u0445\u0432",
|
|
187
|
-
"zh-cn": "\u8FBE\u5230\u901F\u7387\u9650\u5236 \u2014 API \u8BF7\u6C42\u6682\u505C {minutes} \u5206\u949F"
|
|
188
|
-
},
|
|
189
|
-
invalidApiKey: {
|
|
190
|
-
en: "Invalid API key \u2014 please check your parcel.app API key",
|
|
191
|
-
de: "Ung\xFCltiger API-Key \u2014 bitte pr\xFCfe deinen parcel.app API-Key",
|
|
192
|
-
ru: "\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 API-\u043A\u043B\u044E\u0447 \u2014 \u043F\u0440\u043E\u0432\u0435\u0440\u044C\u0442\u0435 \u0432\u0430\u0448 parcel.app API-\u043A\u043B\u044E\u0447",
|
|
193
|
-
pt: "Chave de API inv\xE1lida \u2014 verifique a sua chave parcel.app",
|
|
194
|
-
nl: "Ongeldige API-sleutel \u2014 controleer je parcel.app API-sleutel",
|
|
195
|
-
fr: "Cl\xE9 API invalide \u2014 v\xE9rifiez votre cl\xE9 parcel.app",
|
|
196
|
-
it: "Chiave API non valida \u2014 verifica la tua chiave parcel.app",
|
|
197
|
-
es: "Clave API inv\xE1lida \u2014 comprueba tu clave parcel.app",
|
|
198
|
-
pl: "Nieprawid\u0142owy klucz API \u2014 sprawd\u017A sw\xF3j klucz parcel.app",
|
|
199
|
-
uk: "\u041D\u0435\u0432\u0456\u0440\u043D\u0438\u0439 API-\u043A\u043B\u044E\u0447 \u2014 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u0442\u0435 \u0432\u0430\u0448 parcel.app API-\u043A\u043B\u044E\u0447",
|
|
200
|
-
"zh-cn": "API \u5BC6\u94A5\u65E0\u6548 \u2014 \u8BF7\u68C0\u67E5\u60A8\u7684 parcel.app API \u5BC6\u94A5"
|
|
201
|
-
},
|
|
202
|
-
// ──────── Per-package update failure ────────
|
|
203
|
-
updateFailed: {
|
|
204
|
-
en: "Failed to update '{tracking}': {error}",
|
|
205
|
-
de: "Aktualisierung von '{tracking}' fehlgeschlagen: {error}",
|
|
206
|
-
ru: "\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0431\u043D\u043E\u0432\u0438\u0442\u044C '{tracking}': {error}",
|
|
207
|
-
pt: "Falha ao atualizar '{tracking}': {error}",
|
|
208
|
-
nl: "Bijwerken van '{tracking}' is mislukt: {error}",
|
|
209
|
-
fr: "\xC9chec de la mise \xE0 jour de '{tracking}' : {error}",
|
|
210
|
-
it: "Impossibile aggiornare '{tracking}': {error}",
|
|
211
|
-
es: "Error al actualizar '{tracking}': {error}",
|
|
212
|
-
pl: "Nie uda\u0142o si\u0119 zaktualizowa\u0107 '{tracking}': {error}",
|
|
213
|
-
uk: "\u041D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044F \u043E\u043D\u043E\u0432\u0438\u0442\u0438 '{tracking}': {error}",
|
|
214
|
-
"zh-cn": "\u66F4\u65B0 '{tracking}' \u5931\u8D25\uFF1A{error}"
|
|
215
|
-
}
|
|
216
|
-
};
|
|
217
|
-
function tLog(lang, key, params) {
|
|
218
|
-
var _a;
|
|
219
|
-
const langKey = SUPPORTED_LANGS.includes(lang) ? lang : "en";
|
|
220
|
-
const bundle = LOG_STRINGS[key];
|
|
221
|
-
const template = (_a = bundle[langKey]) != null ? _a : bundle.en;
|
|
222
|
-
return fmt(template, params);
|
|
223
|
-
}
|
|
224
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
225
|
-
0 && (module.exports = {
|
|
226
|
-
LOG_STRINGS,
|
|
227
|
-
tLog
|
|
228
|
-
});
|
|
229
|
-
//# sourceMappingURL=i18n-logs.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/lib/i18n-logs.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Localized log strings \u2014 info/warn/error end up in the ioBroker admin log,\n * which is user-facing. Translations cover all 11 ioBroker system languages\n * (en/de/ru/pt/nl/fr/it/es/pl/uk/zh-cn).\n *\n * The active language is read once in `main.onReady` from\n * `system.config.language` and stored on the adapter instance. A language\n * change in admin requires an adapter restart \u2014 acceptable, users don't\n * switch languages on the fly.\n *\n * Debug logs stay English (maintainer diagnostics, not user-visible at\n * default loglevel).\n */\n\nconst SUPPORTED_LANGS = [\"en\", \"de\", \"ru\", \"pt\", \"nl\", \"fr\", \"it\", \"es\", \"pl\", \"uk\", \"zh-cn\"] as const;\ntype Lang = (typeof SUPPORTED_LANGS)[number];\n\n/**\n * Token substitution: `{name}` in the template is replaced with `params.name`.\n * `null` values render as `(none)`, missing tokens are kept as `{key}` so a\n * caller bug surfaces in the log instead of silently emitting an empty string.\n *\n * @param template Localized log string with `{key}` placeholders.\n * @param params Token values; `null` \u2192 `(none)`, `undefined` \u2192 token kept.\n */\nfunction fmt(template: string, params?: Record<string, string | number | null | undefined>): string {\n if (!params) {\n return template;\n }\n return template.replace(/\\{(\\w+)\\}/g, (_, key: string) => {\n const v = params[key];\n if (v === null) {\n return \"(none)\";\n }\n if (v === undefined) {\n return `{${key}}`;\n }\n return String(v);\n });\n}\n\n/**\n * All user-facing info/warn/error strings. Keys are descriptive identifiers,\n * values are bundles for the 11 supported ioBroker system languages.\n */\nexport const LOG_STRINGS = {\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Adapter lifecycle / crash defense \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n onReadyFailed: {\n en: \"onReady failed: {error}\",\n de: \"onReady fehlgeschlagen: {error}\",\n ru: \"onReady \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043B\u0441\u044F \u0441 \u043E\u0448\u0438\u0431\u043A\u043E\u0439: {error}\",\n pt: \"onReady falhou: {error}\",\n nl: \"onReady is mislukt: {error}\",\n fr: \"onReady a \u00E9chou\u00E9 : {error}\",\n it: \"onReady non riuscito: {error}\",\n es: \"onReady fall\u00F3: {error}\",\n pl: \"onReady nie powi\u00F3d\u0142 si\u0119: {error}\",\n uk: \"onReady \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0432\u0441\u044F \u0437 \u043F\u043E\u043C\u0438\u043B\u043A\u043E\u044E: {error}\",\n \"zh-cn\": \"onReady \u5931\u8D25\uFF1A{error}\",\n },\n onMessageFailed: {\n en: \"onMessage failed: {error}\",\n de: \"onMessage fehlgeschlagen: {error}\",\n ru: \"onMessage \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043B\u0441\u044F \u0441 \u043E\u0448\u0438\u0431\u043A\u043E\u0439: {error}\",\n pt: \"onMessage falhou: {error}\",\n nl: \"onMessage is mislukt: {error}\",\n fr: \"onMessage a \u00E9chou\u00E9 : {error}\",\n it: \"onMessage non riuscito: {error}\",\n es: \"onMessage fall\u00F3: {error}\",\n pl: \"onMessage nie powi\u00F3d\u0142 si\u0119: {error}\",\n uk: \"onMessage \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0432\u0441\u044F \u0437 \u043F\u043E\u043C\u0438\u043B\u043A\u043E\u044E: {error}\",\n \"zh-cn\": \"onMessage \u5931\u8D25\uFF1A{error}\",\n },\n unhandledRejection: {\n en: \"Unhandled rejection: {error}\",\n de: \"Unbehandelte Promise-Rejection: {error}\",\n ru: \"\u041D\u0435\u043E\u0431\u0440\u0430\u0431\u043E\u0442\u0430\u043D\u043D\u044B\u0439 rejection: {error}\",\n pt: \"Rejei\u00E7\u00E3o n\u00E3o tratada: {error}\",\n nl: \"Onafgehandelde rejection: {error}\",\n fr: \"Rejet non g\u00E9r\u00E9 : {error}\",\n it: \"Rejection non gestita: {error}\",\n es: \"Rechazo no manejado: {error}\",\n pl: \"Nieobs\u0142u\u017Cone odrzucenie: {error}\",\n uk: \"\u041D\u0435\u043E\u0431\u0440\u043E\u0431\u043B\u0435\u043D\u0438\u0439 rejection: {error}\",\n \"zh-cn\": \"\u672A\u5904\u7406\u7684 rejection\uFF1A{error}\",\n },\n uncaughtException: {\n en: \"Uncaught exception: {error}\",\n de: \"Nicht abgefangene Exception: {error}\",\n ru: \"\u041D\u0435\u043E\u0431\u0440\u0430\u0431\u043E\u0442\u0430\u043D\u043D\u043E\u0435 \u0438\u0441\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435: {error}\",\n pt: \"Exce\u00E7\u00E3o n\u00E3o capturada: {error}\",\n nl: \"Niet-opgevangen exception: {error}\",\n fr: \"Exception non captur\u00E9e : {error}\",\n it: \"Eccezione non catturata: {error}\",\n es: \"Excepci\u00F3n no capturada: {error}\",\n pl: \"Nieprzechwycony wyj\u0105tek: {error}\",\n uk: \"\u041D\u0435\u043F\u0435\u0440\u0435\u0445\u043E\u043F\u043B\u0435\u043D\u0435 \u0432\u0438\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044F: {error}\",\n \"zh-cn\": \"\u672A\u6355\u83B7\u7684\u5F02\u5E38\uFF1A{error}\",\n },\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Configuration / startup \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n noApiKey: {\n en: \"No valid API key configured \u2014 please enter your parcel.app API key in the adapter settings\",\n de: \"Kein g\u00FCltiger API-Key konfiguriert \u2014 bitte trage deinen parcel.app API-Key in den Adapter-Einstellungen ein\",\n ru: \"API-\u043A\u043B\u044E\u0447 \u043D\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043D \u2014 \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0432\u0430\u0448 parcel.app API-\u043A\u043B\u044E\u0447 \u0432 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430\u0445 \u0430\u0434\u0430\u043F\u0442\u0435\u0440\u0430\",\n pt: \"Nenhuma chave de API v\u00E1lida configurada \u2014 insira a sua chave parcel.app nas configura\u00E7\u00F5es do adaptador\",\n nl: \"Geen geldige API-sleutel geconfigureerd \u2014 voer je parcel.app API-sleutel in de adapter-instellingen in\",\n fr: \"Aucune cl\u00E9 API valide configur\u00E9e \u2014 saisissez votre cl\u00E9 parcel.app dans les param\u00E8tres de l'adaptateur\",\n it: \"Nessuna chiave API valida configurata \u2014 inserisci la tua chiave parcel.app nelle impostazioni dell'adattatore\",\n es: \"Ninguna clave API v\u00E1lida configurada \u2014 introduce tu clave parcel.app en los ajustes del adaptador\",\n pl: \"Nie skonfigurowano poprawnego klucza API \u2014 wprowad\u017A sw\u00F3j klucz parcel.app w ustawieniach adaptera\",\n uk: \"\u041D\u0435\u043C\u0430\u0454 \u043D\u0430\u043B\u0430\u0448\u0442\u043E\u0432\u0430\u043D\u043E\u0433\u043E API-\u043A\u043B\u044E\u0447\u0430 \u2014 \u0432\u0432\u0435\u0434\u0456\u0442\u044C \u0432\u0430\u0448 parcel.app API-\u043A\u043B\u044E\u0447 \u0443 \u043D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F\u0445 \u0430\u0434\u0430\u043F\u0442\u0435\u0440\u0430\",\n \"zh-cn\": \"\u672A\u914D\u7F6E\u6709\u6548\u7684 API \u5BC6\u94A5 \u2014 \u8BF7\u5728\u9002\u914D\u5668\u8BBE\u7F6E\u4E2D\u8F93\u5165\u60A8\u7684 parcel.app API \u5BC6\u94A5\",\n },\n trackingStarted: {\n en: \"Parcel tracking started \u2014 polling every {minutes} minutes\",\n de: \"Paketverfolgung gestartet \u2014 Abfrage alle {minutes} Minuten\",\n ru: \"\u041E\u0442\u0441\u043B\u0435\u0436\u0438\u0432\u0430\u043D\u0438\u0435 \u043F\u043E\u0441\u044B\u043B\u043E\u043A \u0437\u0430\u043F\u0443\u0449\u0435\u043D\u043E \u2014 \u043E\u043F\u0440\u043E\u0441 \u043A\u0430\u0436\u0434\u044B\u0435 {minutes} \u043C\u0438\u043D\",\n pt: \"Monitoriza\u00E7\u00E3o de encomendas iniciada \u2014 sondagem a cada {minutes} minutos\",\n nl: \"Pakketvolg-systeem gestart \u2014 pollen elke {minutes} minuten\",\n fr: \"Suivi des colis d\u00E9marr\u00E9 \u2014 interrogation toutes les {minutes} minutes\",\n it: \"Tracciamento pacchi avviato \u2014 interrogazione ogni {minutes} minuti\",\n es: \"Seguimiento de paquetes iniciado \u2014 consulta cada {minutes} minutos\",\n pl: \"\u015Aledzenie paczek uruchomione \u2014 odpytywanie co {minutes} minut\",\n uk: \"\u0412\u0456\u0434\u0441\u0442\u0435\u0436\u0435\u043D\u043D\u044F \u043F\u043E\u0441\u0438\u043B\u043E\u043A \u0437\u0430\u043F\u0443\u0449\u0435\u043D\u043E \u2014 \u043E\u043F\u0438\u0442\u0443\u0432\u0430\u043D\u043D\u044F \u043A\u043E\u0436\u043D\u0456 {minutes} \u0445\u0432\",\n \"zh-cn\": \"\u5305\u88F9\u8DDF\u8E2A\u5DF2\u542F\u52A8 \u2014 \u6BCF {minutes} \u5206\u949F\u8F6E\u8BE2\u4E00\u6B21\",\n },\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Connection / poll \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n connectionRestored: {\n en: \"Connection restored\",\n de: \"Verbindung wiederhergestellt\",\n ru: \"\u0421\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435 \u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E\",\n pt: \"Conex\u00E3o restabelecida\",\n nl: \"Verbinding hersteld\",\n fr: \"Connexion r\u00E9tablie\",\n it: \"Connessione ripristinata\",\n es: \"Conexi\u00F3n restablecida\",\n pl: \"Po\u0142\u0105czenie przywr\u00F3cone\",\n uk: \"\u0417'\u0454\u0434\u043D\u0430\u043D\u043D\u044F \u0432\u0456\u0434\u043D\u043E\u0432\u043B\u0435\u043D\u043E\",\n \"zh-cn\": \"\u8FDE\u63A5\u5DF2\u6062\u590D\",\n },\n cannotReach: {\n en: \"Cannot reach parcel.app API \u2014 will keep retrying\",\n de: \"parcel.app-API nicht erreichbar \u2014 Versuche werden fortgesetzt\",\n ru: \"parcel.app API \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u2014 \u043F\u043E\u043F\u044B\u0442\u043A\u0438 \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0430\u044E\u0442\u0441\u044F\",\n pt: \"N\u00E3o foi poss\u00EDvel contactar a API parcel.app \u2014 tentativas continuar\u00E3o\",\n nl: \"parcel.app-API onbereikbaar \u2014 pogingen worden voortgezet\",\n fr: \"API parcel.app injoignable \u2014 les tentatives continuent\",\n it: \"API parcel.app non raggiungibile \u2014 i tentativi continueranno\",\n es: \"API parcel.app inaccesible \u2014 se seguir\u00E1n intentando\",\n pl: \"API parcel.app niedost\u0119pne \u2014 pr\u00F3by b\u0119d\u0105 kontynuowane\",\n uk: \"API parcel.app \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0438\u0439 \u2014 \u0441\u043F\u0440\u043E\u0431\u0438 \u0442\u0440\u0438\u0432\u0430\u0442\u0438\u043C\u0443\u0442\u044C\",\n \"zh-cn\": \"\u65E0\u6CD5\u8BBF\u95EE parcel.app API \u2014 \u5C06\u7EE7\u7EED\u91CD\u8BD5\",\n },\n apiTimeout: {\n en: \"API request timeout \u2014 will retry next cycle\",\n de: \"API-Anfrage-Timeout \u2014 Wiederholung im n\u00E4chsten Zyklus\",\n ru: \"\u0422\u0430\u0439\u043C-\u0430\u0443\u0442 API-\u0437\u0430\u043F\u0440\u043E\u0441\u0430 \u2014 \u043F\u043E\u0432\u0442\u043E\u0440 \u0432 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u043C \u0446\u0438\u043A\u043B\u0435\",\n pt: \"Tempo limite da API \u2014 tentar de novo no pr\u00F3ximo ciclo\",\n nl: \"API-verzoek-time-out \u2014 opnieuw proberen volgende cyclus\",\n fr: \"D\u00E9lai d'API d\u00E9pass\u00E9 \u2014 nouvelle tentative au prochain cycle\",\n it: \"Timeout della richiesta API \u2014 riprovo al prossimo ciclo\",\n es: \"Tiempo de espera de la API agotado \u2014 se reintentar\u00E1 en el pr\u00F3ximo ciclo\",\n pl: \"Przekroczono limit czasu API \u2014 ponowa pr\u00F3ba w nast\u0119pnym cyklu\",\n uk: \"\u0422\u0430\u0439\u043C-\u0430\u0443\u0442 API-\u0437\u0430\u043F\u0438\u0442\u0443 \u2014 \u043F\u043E\u0432\u0442\u043E\u0440 \u0443 \u043D\u0430\u0441\u0442\u0443\u043F\u043D\u043E\u043C\u0443 \u0446\u0438\u043A\u043B\u0456\",\n \"zh-cn\": \"API \u8BF7\u6C42\u8D85\u65F6 \u2014 \u5C06\u5728\u4E0B\u4E00\u4E2A\u5468\u671F\u91CD\u8BD5\",\n },\n pollFailed: {\n en: \"Poll failed: {error}\",\n de: \"Abfrage fehlgeschlagen: {error}\",\n ru: \"\u041E\u043F\u0440\u043E\u0441 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043B\u0441\u044F \u0441 \u043E\u0448\u0438\u0431\u043A\u043E\u0439: {error}\",\n pt: \"Sondagem falhou: {error}\",\n nl: \"Poll is mislukt: {error}\",\n fr: \"\u00C9chec de l'interrogation : {error}\",\n it: \"Interrogazione non riuscita: {error}\",\n es: \"Consulta fall\u00F3: {error}\",\n pl: \"Odpytywanie nie powiod\u0142o si\u0119: {error}\",\n uk: \"\u041E\u043F\u0438\u0442\u0443\u0432\u0430\u043D\u043D\u044F \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043B\u043E\u0441\u044C \u0437 \u043F\u043E\u043C\u0438\u043B\u043A\u043E\u044E: {error}\",\n \"zh-cn\": \"\u8F6E\u8BE2\u5931\u8D25\uFF1A{error}\",\n },\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Rate limit / auth \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n rateLimitHit: {\n en: \"Rate limit hit \u2014 pausing API requests for {minutes} minute(s)\",\n de: \"Rate-Limit erreicht \u2014 API-Anfragen pausieren f\u00FCr {minutes} Minute(n)\",\n ru: \"\u0414\u043E\u0441\u0442\u0438\u0433\u043D\u0443\u0442 \u043B\u0438\u043C\u0438\u0442 \u0437\u0430\u043F\u0440\u043E\u0441\u043E\u0432 \u2014 \u043F\u0430\u0443\u0437\u0430 API \u043D\u0430 {minutes} \u043C\u0438\u043D\",\n pt: \"Limite de taxa atingido \u2014 pausa nos pedidos \u00E0 API por {minutes} minuto(s)\",\n nl: \"Rate limit bereikt \u2014 API-verzoeken pauzeren voor {minutes} minuut/minuten\",\n fr: \"Limite de d\u00E9bit atteinte \u2014 pause des requ\u00EAtes API pendant {minutes} minute(s)\",\n it: \"Limite di frequenza raggiunto \u2014 pausa delle richieste API per {minutes} minuto/i\",\n es: \"L\u00EDmite de solicitudes alcanzado \u2014 pausando peticiones API durante {minutes} minuto(s)\",\n pl: \"Osi\u0105gni\u0119to limit zapyta\u0144 \u2014 pauza w \u017C\u0105daniach API przez {minutes} minut\",\n uk: \"\u0414\u043E\u0441\u044F\u0433\u043D\u0443\u0442\u043E \u043B\u0456\u043C\u0456\u0442 \u0437\u0430\u043F\u0438\u0442\u0456\u0432 \u2014 \u043F\u0430\u0443\u0437\u0430 API \u043D\u0430 {minutes} \u0445\u0432\",\n \"zh-cn\": \"\u8FBE\u5230\u901F\u7387\u9650\u5236 \u2014 API \u8BF7\u6C42\u6682\u505C {minutes} \u5206\u949F\",\n },\n invalidApiKey: {\n en: \"Invalid API key \u2014 please check your parcel.app API key\",\n de: \"Ung\u00FCltiger API-Key \u2014 bitte pr\u00FCfe deinen parcel.app API-Key\",\n ru: \"\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 API-\u043A\u043B\u044E\u0447 \u2014 \u043F\u0440\u043E\u0432\u0435\u0440\u044C\u0442\u0435 \u0432\u0430\u0448 parcel.app API-\u043A\u043B\u044E\u0447\",\n pt: \"Chave de API inv\u00E1lida \u2014 verifique a sua chave parcel.app\",\n nl: \"Ongeldige API-sleutel \u2014 controleer je parcel.app API-sleutel\",\n fr: \"Cl\u00E9 API invalide \u2014 v\u00E9rifiez votre cl\u00E9 parcel.app\",\n it: \"Chiave API non valida \u2014 verifica la tua chiave parcel.app\",\n es: \"Clave API inv\u00E1lida \u2014 comprueba tu clave parcel.app\",\n pl: \"Nieprawid\u0142owy klucz API \u2014 sprawd\u017A sw\u00F3j klucz parcel.app\",\n uk: \"\u041D\u0435\u0432\u0456\u0440\u043D\u0438\u0439 API-\u043A\u043B\u044E\u0447 \u2014 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u0442\u0435 \u0432\u0430\u0448 parcel.app API-\u043A\u043B\u044E\u0447\",\n \"zh-cn\": \"API \u5BC6\u94A5\u65E0\u6548 \u2014 \u8BF7\u68C0\u67E5\u60A8\u7684 parcel.app API \u5BC6\u94A5\",\n },\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Per-package update failure \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n updateFailed: {\n en: \"Failed to update '{tracking}': {error}\",\n de: \"Aktualisierung von '{tracking}' fehlgeschlagen: {error}\",\n ru: \"\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0431\u043D\u043E\u0432\u0438\u0442\u044C '{tracking}': {error}\",\n pt: \"Falha ao atualizar '{tracking}': {error}\",\n nl: \"Bijwerken van '{tracking}' is mislukt: {error}\",\n fr: \"\u00C9chec de la mise \u00E0 jour de '{tracking}' : {error}\",\n it: \"Impossibile aggiornare '{tracking}': {error}\",\n es: \"Error al actualizar '{tracking}': {error}\",\n pl: \"Nie uda\u0142o si\u0119 zaktualizowa\u0107 '{tracking}': {error}\",\n uk: \"\u041D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044F \u043E\u043D\u043E\u0432\u0438\u0442\u0438 '{tracking}': {error}\",\n \"zh-cn\": \"\u66F4\u65B0 '{tracking}' \u5931\u8D25\uFF1A{error}\",\n },\n} as const;\n\n/**\n * Look up a log string in the requested language with EN fallback.\n *\n * @param lang ioBroker system language (`'en'`, `'de'`, \u2026) \u2014 any string\n * accepted, falls back to `en` for unknown values.\n * @param key Translation key from {@link LOG_STRINGS}.\n * @param params Token values for `{name}` placeholders.\n */\nexport function tLog(\n lang: string,\n key: keyof typeof LOG_STRINGS,\n params?: Record<string, string | number | null | undefined>,\n): string {\n const langKey = (SUPPORTED_LANGS as readonly string[]).includes(lang) ? (lang as Lang) : \"en\";\n const bundle = LOG_STRINGS[key];\n const template = bundle[langKey] ?? bundle.en;\n return fmt(template, params);\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|