diff --git a/syncthing-status@geo-sudo/README.md b/syncthing-status@geo-sudo/README.md new file mode 100644 index 000000000..7c5d49e49 --- /dev/null +++ b/syncthing-status@geo-sudo/README.md @@ -0,0 +1,20 @@ +# Syncthing Status + +Monitors Syncthing folders using its [REST API](https://docs.syncthing.net/dev/rest.html). + +- Has Dark & Light Mode +- Status Indicators for Folders (Up to Date, Syncing & Scanning, Paused, Error) +- Syncing Percentage Montioring +- Can Adjust Refresh & Timeout Intervals & Size +- Supports Arabic 🇸🇦, French 🇫🇷, Greek 🇬🇷, German 🇩🇪, Italian 🇮🇹, Spanish 🇪🇸 + +## Dependencies + +This requires [syncthing](https://syncthing.net) to run. + +## Installation + +- Install [syncthing](https://syncthing.net) through the official website. +- Set the API Key; [follow this](https://docs.syncthing.net/dev/rest.html). Or Find it in Syncthing -> Actions -> Settings -> General. +- Add the API Key to the desklet's configuration. +- Add the URL to the web interface to the desklet's configuration (default="http://localhost:8384"). diff --git a/syncthing-status@geo-sudo/files/syncthing-status@geo-sudo/desklet.js b/syncthing-status@geo-sudo/files/syncthing-status@geo-sudo/desklet.js new file mode 100644 index 000000000..cc8fc07b8 --- /dev/null +++ b/syncthing-status@geo-sudo/files/syncthing-status@geo-sudo/desklet.js @@ -0,0 +1,360 @@ +const Desklet = imports.ui.desklet; +const St = imports.gi.St; +const Soup = imports.gi.Soup; +const Mainloop = imports.mainloop; +const Settings = imports.ui.settings; +const Gettext = imports.gettext; + +const UUID = "syncthing-status@geo-sudo"; +Gettext.bindtextdomain(UUID, imports.gi.GLib.get_home_dir() + imports.gi.GLib.get_user_data_dir()); + +function _(str) { + let translation = Gettext.dgettext(UUID, str); + if (translation !== str) return translation; + return Gettext.gettext(str); +} + +function MyApplet(metadata, desklet_id) { + this._init(metadata, desklet_id); +} + +MyApplet.prototype = { + __proto__: Desklet.Desklet.prototype, + + _init: function (metadata, desklet_id) { + Desklet.Desklet.prototype._init.call(this, metadata, desklet_id); + + this.settings = new Settings.DeskletSettings(this, metadata.uuid, desklet_id); + + this.settings.bindProperty(Settings.BindingDirection.IN, "baseUrl", "baseUrl", this.on_settings_changed, null); + this.settings.bindProperty(Settings.BindingDirection.IN, "apiKey", "apiKey", this.on_settings_changed, null); + this.settings.bindProperty( + Settings.BindingDirection.IN, + "heartbeatInterval", + "heartbeatInterval", + this.on_settings_changed, + null + ); + this.settings.bindProperty( + Settings.BindingDirection.IN, + "timeoutInterval", + "timeoutInterval", + this.on_settings_changed, + null + ); + this.settings.bindProperty(Settings.BindingDirection.IN, "darkMode", "darkMode", this._refreshUI, null); + this.settings.bindProperty(Settings.BindingDirection.IN, "scale-size", "scaleSize", this._refreshUI, null); + + // Tasks: Add Device Integration + Ability to Toggle Folders & Devices + this._showFolders = true; + this._showDevices = true; + + this._syncResources = { + folders: {}, + devices: {}, + }; + + this._httpSession = new Soup.Session(); + + this._checkIfUp(); + this._setupUI(); + }, + + _checkIfUp: function () { + this._httpGet("/rest/system/ping") + .then((data) => { + if (data && data.ping == "pong") { + this._discoverFolders(); + } else { + throw new Error("Not pong"); + } + }) + .catch(() => { + Mainloop.timeout_add_seconds(this.timeoutInterval, () => this._checkIfUp()); + }); + }, + + _discoverFolders: function () { + this._httpGet("/rest/config/folders") + .then((data) => { + data.forEach((folder) => { + let id = folder.id; + + this._syncResources.folders[id] = { + label: folder.label || id, + state: "unknown", + errors: 0, + localBytes: 0, + globalBytes: 0, + completion: 0, + paused: folder.paused, + }; + }); + + this._updateFolders(); + }) + .catch((err) => { + global.logError(`${UUID}: Discovery Error: ${err.message}`); + }); + }, + + _updateFolders: async function () { + let folderIds = Object.keys(this._syncResources.folders); + let needsRefresh = false; + + try { + const requests = folderIds.flatMap((id) => [ + this._httpGet("/rest/db/status?folder=" + id) + .then((data) => ({ id, type: "status", data })) + .catch((err) => { + return { id, type: "status", data: null }; + }), + this._httpGet("/rest/db/completion?folder=" + id) + .then((data) => ({ id, type: "completion", data, isPaused: false })) + .catch((err) => { + return { id, type: "completion", data: null, isPaused: true }; + }), + ]); + + const results = await Promise.all(requests); + + results.forEach(({ id, type, data, isPaused }) => { + let folder = this._syncResources.folders[id]; + if (!folder) return; + + if (type === "status" && data) { + if (folder.state !== data.state || folder.errors !== data.errors || folder.localBytes !== data.localBytes) { + needsRefresh = true; + + folder.state = data.state; + folder.errors = data.errors; + folder.localBytes = data.localBytes; + folder.globalBytes = data.globalBytes; + } + } else if (type === "completion") { + if (folder.paused !== isPaused) { + needsRefresh = true; + folder.paused = isPaused; + } + + if (!isPaused && folder.completion !== data.completion) { + needsRefresh = true; + folder.completion = data.completion; + } + } + }); + + if (needsRefresh) { + this._refreshUI(); + } + } catch (err) { + global.logError(`${UUID}: Update failed: ${err.message}`); + } finally { + this._startPoll(); + } + }, + + _httpGet: function (path) { + return new Promise((resolve, reject) => { + let url; + if (path.indexOf("http://") === 0 || path.indexOf("https://") === 0) { + url = path; + } else { + url = this.baseUrl + path; + } + let message = Soup.Message.new("GET", url); + let isPing = path.includes("/system/ping"); + + if (!message) { + return reject(new Error("Failed to create message")); + } + + if (this.apiKey && this.apiKey.length > 0) { + message.request_headers.append("X-API-Key", this.apiKey); + } else if (!isPing) { + return reject(new Error("No API Key present!")); + } + + this._httpSession.send_and_read_async(message, 0, null, (session, res) => { + try { + let statusCode = message.get_status(); + let bytes = session.send_and_read_finish(res); + + if (statusCode !== 200) { + return reject(new Error("HTTP " + statusCode + " returned for " + url)); + } + + if (!bytes) { + return reject(new Error("Empty response body from " + url)); + } + + let body = imports.gi.GLib.Variant.new_from_bytes(imports.gi.GLib.VariantType.new("ay"), bytes, true) + .get_data_as_bytes() + .get_data(); + + let decoder = new TextDecoder("utf-8"); + let decodedBody = decoder.decode(body); + + resolve(JSON.parse(decodedBody)); + } catch (e) { + reject(new Error("Error processing response from " + url + ": " + e.message)); + } + }); + }); + }, + + _startPoll: function () { + this._stopPoll(); + this._updateTimerId = Mainloop.timeout_add_seconds(this.heartbeatInterval, () => this._updateFolders()); + }, + + _stopPoll: function () { + if (this._updateTimerId) { + Mainloop.source_remove(this._updateTimerId); + this._updateTimerId = null; + } + }, + + _setupUI: function () { + this.window = new St.Bin(); + + this.container = new St.BoxLayout({ + vertical: true, + }); + + this._statusLabel = new St.Label({ + text: "Connecting to Syncthing...", + style: "font-weight: bold;", + }); + + this.container.add_actor(this._statusLabel); + this.window.set_child(this.container); + + this.setContent(this.window); + }, + + _refreshUI: function () { + this.container.destroy_all_children(); + + const s = this.scaleSize; + + let textColor, cardBg; + + if (this.darkMode) { + textColor = "rgba(230, 230, 230, 1)"; + cardBg = "rgba(30, 30, 30, 0.85)"; + } else { + textColor = "rgba(24, 32, 60, 1)"; + cardBg = "rgba(255, 255, 255, 0.85)"; + } + + let card = new St.BoxLayout({ + vertical: true, + style: `background-color: ${cardBg}; border: ${1 * s}px solid rgba(241, 242, 246, 1); border-radius: ${24 * s}px; padding: ${24 * s}px;`, + }); + + card.add_actor( + new St.Label({ + text: _("Folders"), + style: `color: ${textColor}; font-size: ${1.4 * s}em; font-weight: bold;`, + }) + ); + + let folderCount = Object.keys(this._syncResources.folders).length; + card.add_actor( + new St.Label({ + text: `${folderCount}` + _(" folders tracked"), + style: `color: rgba(78, 159, 255, 1); font-size: ${1 * s}em; font-weight: bold;`, + }) + ); + + let folderList = new St.BoxLayout({ + vertical: true, + style: `margin-top: ${10 * s}px;`, + }); + + Object.keys(this._syncResources.folders).forEach((id) => { + let folder = this._syncResources.folders[id]; + + let row = new St.BoxLayout({ + vertical: false, + style: `margin-bottom: ${6 * s}px; align-items: center;`, + }); + let folderStateText; + let dotColor = "rgba(128, 128, 128, 1)"; + if (folder.paused) { + dotColor = "rgba(150, 150, 150, 1)"; + folderStateText = _("Paused"); + } else if (folder.errors > 0) { + dotColor = "rgba(231, 76, 60, 1)"; + folderStateText = _("Error"); + } else if (folder.state === "scanning") { + dotColor = "rgba(52, 152, 219, 1)"; + folderStateText = _("Scanning"); + } else if (folder.state === "syncing") { + dotColor = "rgba(52, 152, 219, 1)"; + folderStateText = _("Syncing"); + } else if (folder.state === "idle") { + dotColor = "rgba(46, 204, 113, 1)"; + folderStateText = _("Up to Date"); + } + + let dot = new St.Bin({ + style: `background-color: ${dotColor}; width: ${1.3 * s}em; height: ${0.7 * s}em; border-radius: ${2 * s}em; margin-right: ${8 * s}px;`, + }); + + let folderLabel = new St.Label({ + text: `${folder.label}: `, + style: `color: ${textColor}; font-size: ${1.2 * s}em; font-weight: bold`, + }); + + let folderState = new St.Label({ + text: `${folderStateText}`, + style: `color: ${dotColor}; font-size: ${1.1 * s}em; font-weight: bold; margin-right: ${8 * s}px;`, + }); + + let statusText; + if (folder.paused) { + statusText = "---"; + } else { + statusText = `${Math.floor(folder.completion || 0)}%`; + } + + let folderStatus = new St.Label({ + text: `${statusText}`, + style: `color: ${dotColor}; font-size: ${1.1 * s}em; font-weight: bold; margin-right: ${2 * s}px;`, + }); + + row.add_actor(dot); + row.add_actor(folderLabel); + row.add_actor(folderState); + row.add_actor(folderStatus); + folderList.add_actor(row); + }); + + card.add_actor(folderList); + this.container.add_actor(card); + }, + + on_settings_changed: function () { + this._stopPoll(); + if (this._retryTimerId) { + Mainloop.source_remove(this._retryTimerId); + } + this._syncResources.folders = {}; + this._checkIfUp(); + }, + + _on_desklet_removed: function () { + if (this._updateTimerId) { + Mainloop.source_remove(this._updateTimerId); + } + if (this._httpSession) { + this._httpSession.abort(); + } + }, +}; + +function main(metadata, desklet_id) { + return new MyApplet(metadata, desklet_id); +} diff --git a/syncthing-status@geo-sudo/files/syncthing-status@geo-sudo/icon.png b/syncthing-status@geo-sudo/files/syncthing-status@geo-sudo/icon.png new file mode 100644 index 000000000..c32bdf809 Binary files /dev/null and b/syncthing-status@geo-sudo/files/syncthing-status@geo-sudo/icon.png differ diff --git a/syncthing-status@geo-sudo/files/syncthing-status@geo-sudo/metadata.json b/syncthing-status@geo-sudo/files/syncthing-status@geo-sudo/metadata.json new file mode 100644 index 000000000..68d9c4836 --- /dev/null +++ b/syncthing-status@geo-sudo/files/syncthing-status@geo-sudo/metadata.json @@ -0,0 +1,9 @@ +{ + "uuid": "syncthing-status@geo-sudo", + "name": "Syncthing Status", + "description": "A simple desklet to monitor Syncthing folders.", + "settings-schema": "settings-schema.json", + "prevent-decorations": false, + "version": "1.0.0", + "author": "geo-sudo" +} diff --git a/syncthing-status@geo-sudo/files/syncthing-status@geo-sudo/po/ar.po b/syncthing-status@geo-sudo/files/syncthing-status@geo-sudo/po/ar.po new file mode 100644 index 000000000..564e61e4a --- /dev/null +++ b/syncthing-status@geo-sudo/files/syncthing-status@geo-sudo/po/ar.po @@ -0,0 +1,83 @@ +msgid "" +msgstr "" +"Project-Id-Version: syncthing-status@geo-sudo\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-04-24 01:32+0200\n" +"PO-Revision-Date: 2026-04-24 01:32+0200\n" +"Last-Translator: George Salib \n" +"Language-Team: Arabic \n" +"Language: ar\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " +"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5);\n" + +#: desklet.js:25 +msgid "Folders" +msgstr "مجلدات" + +#: desklet.js:32 +msgid " folders tracked" +msgstr " مجلدات يتم تتبعها" + +#: desklet.js:52 +msgid "Paused" +msgstr "متوقف مؤقتاً" + +#: desklet.js:55 +msgid "Error" +msgstr "خطأ" + +#: desklet.js:58 +msgid "Scanning" +msgstr "جارٍ الفحص" + +#: desklet.js:61 +msgid "Syncing" +msgstr "جارٍ المزامنة" + +#: desklet.js:64 +msgid "Up to Date" +msgstr "محدّث" + +# Settings: baseUrl +msgid "Syncthing URL (include http:// and port & make sure it's accessible)" +msgstr "رابط Syncthing (تأكد من إضافة http:// وال port وتوافر الوصول)" + +msgid "Usually http://127.0.0.1:8384 for local instances." +msgstr "عادة يكون http://127.0.0.1:8384 إن كان محلياً." + +# Settings: apiKey +msgid "API Key" +msgstr "مفتاح API" + +msgid "Find this in Syncthing -> Actions -> Settings -> General" +msgstr "تجد هذا في Syncthing -> الإجراءات -> الإعدادات -> عام" + +# Settings: Intervals +msgid "Refresh Interval" +msgstr "فترة التحديث" + +msgid "Timeout Interval" +msgstr "مهلة الاتصال" + +msgid "seconds" +msgstr "ثوانٍ" + +# Settings: scale-size +msgid "Size Scale" +msgstr "مقياس الحجم" + +msgid "Adjust the overall size of the desklet" +msgstr "ضبط الحجم الإجمالي" + +msgid "multiplier" +msgstr "مُعامل" + +# Settings: darkMode +msgid "Dark Mode" +msgstr "الوضع الداكن" + +msgid "Switch between light and dark themes" +msgstr "التبديل بين المظهر الفاتح والداكن" \ No newline at end of file diff --git a/syncthing-status@geo-sudo/files/syncthing-status@geo-sudo/po/de.po b/syncthing-status@geo-sudo/files/syncthing-status@geo-sudo/po/de.po new file mode 100644 index 000000000..33db70658 --- /dev/null +++ b/syncthing-status@geo-sudo/files/syncthing-status@geo-sudo/po/de.po @@ -0,0 +1,78 @@ +msgid "" +msgstr "" +"Project-Id-Version: syncthing-status@geo-sudo\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-04-24 01:38+0200\n" +"PO-Revision-Date: 2026-04-24 01:38+0200\n" +"Last-Translator: George Salib \n" +"Language-Team: German \n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: desklet.js:25 +msgid "Folders" +msgstr "Ordner" + +#: desklet.js:32 +msgid " folders tracked" +msgstr " Ordner überwacht" + +#: desklet.js:52 +msgid "Paused" +msgstr "Pausiert" + +#: desklet.js:55 +msgid "Error" +msgstr "Fehler" + +#: desklet.js:58 +msgid "Scanning" +msgstr "Scan-Vorgang" + +#: desklet.js:61 +msgid "Syncing" +msgstr "Synchronisierung" + +#: desklet.js:64 +msgid "Up to Date" +msgstr "Aktuell" + +# Settings +msgid "Syncthing URL (include http:// and port & make sure it's accessible)" +msgstr "Syncthing-URL (http:// und Port angeben & Erreichbarkeit sicherstellen)" + +msgid "Usually http://127.0.0.1:8384 for local instances." +msgstr "Normalerweise http://127.0.0.1:8384 für lokale Instanzen." + +msgid "API Key" +msgstr "API-Schlüssel" + +msgid "Find this in Syncthing -> Actions -> Settings -> General" +msgstr "Zu finden unter Syncthing -> Aktionen -> Einstellungen -> Allgemein" + +msgid "Refresh Interval" +msgstr "Aktualisierungsintervall" + +msgid "Timeout Interval" +msgstr "Timeout-Intervall" + +msgid "seconds" +msgstr "Sekunden" + +msgid "Size Scale" +msgstr "Größenanpassung" + +msgid "Adjust the overall size of the desklet" +msgstr "Gesamte Größe des Desklets anpassen" + +msgid "multiplier" +msgstr "Multiplikator" + +msgid "Dark Mode" +msgstr "Dunkler Modus" + +msgid "Switch between light and dark themes" +msgstr "Zwischen hellem und dunklem Design wechseln" \ No newline at end of file diff --git a/syncthing-status@geo-sudo/files/syncthing-status@geo-sudo/po/el.po b/syncthing-status@geo-sudo/files/syncthing-status@geo-sudo/po/el.po new file mode 100644 index 000000000..9f8f1ddf9 --- /dev/null +++ b/syncthing-status@geo-sudo/files/syncthing-status@geo-sudo/po/el.po @@ -0,0 +1,77 @@ +msgid "" +msgstr "" +"Project-Id-Version: syncthing-status@geo-sudo 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-04-24 01:32+0000\n" +"PO-Revision-Date: 2026-04-24 01:32+0000\n" +"Last-Translator: Your Name \n" +"Language-Team: Greek \n" +"Language: el\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: desklet.js:25 +msgid "Folders" +msgstr "Φάκελοι" + +#: desklet.js:32 +msgid " folders tracked" +msgstr " φάκελοι παρακολουθούνται" + +#: desklet.js:52 +msgid "Paused" +msgstr "Σε παύση" + +#: desklet.js:55 +msgid "Error" +msgstr "Σφάλμα" + +#: desklet.js:58 +msgid "Scanning" +msgstr "Σάρωση" + +#: desklet.js:61 +msgid "Syncing" +msgstr "Συγχρονισμός" + +#: desklet.js:64 +msgid "Up to Date" +msgstr "Ενημερωμένο" + +# Settings +msgid "Syncthing URL (include http:// and port & make sure it's accessible)" +msgstr "URL του Syncthing (συμπεριλάβετε http:// και θύρα & βεβαιωθείτε ότι είναι προσβάσιμο)" + +msgid "Usually http://127.0.0.1:8384 for local instances." +msgstr "Συνήθως http://127.0.0.1:8384 για τοπικές εγκαταστάσεις." + +msgid "API Key" +msgstr "Κλειδί API" + +msgid "Find this in Syncthing -> Actions -> Settings -> General" +msgstr "Βρείτε το στο Syncthing -> Ενέργειες -> Ρυθμίσεις -> Γενικά" + +msgid "Refresh Interval" +msgstr "Διάστημα ανανέωσης" + +msgid "Timeout Interval" +msgstr "Διάστημα λήξης χρόνου" + +msgid "seconds" +msgstr "δευτερόλεπτα" + +msgid "Size Scale" +msgstr "Κλιμάκωση μεγέθους" + +msgid "Adjust the overall size of the desklet" +msgstr "Προσαρμόστε το συνολικό μέγεθος του desklet" + +msgid "multiplier" +msgstr "πολλαπλασιαστής" + +msgid "Dark Mode" +msgstr "Σκούρα λειτουργία" + +msgid "Switch between light and dark themes" +msgstr "Εναλλαγή μεταξύ φωτεινών και σκούρων θεμάτων" \ No newline at end of file diff --git a/syncthing-status@geo-sudo/files/syncthing-status@geo-sudo/po/es.po b/syncthing-status@geo-sudo/files/syncthing-status@geo-sudo/po/es.po new file mode 100644 index 000000000..66badcd04 --- /dev/null +++ b/syncthing-status@geo-sudo/files/syncthing-status@geo-sudo/po/es.po @@ -0,0 +1,78 @@ +msgid "" +msgstr "" +"Project-Id-Version: syncthing-status@geo-sudo\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-04-24 01:34+0200\n" +"PO-Revision-Date: 2026-04-24 01:34+0200\n" +"Last-Translator: George Salib \n" +"Language-Team: Spanish \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: desklet.js:25 +msgid "Folders" +msgstr "Carpetas" + +#: desklet.js:32 +msgid " folders tracked" +msgstr " carpetas rastreadas" + +#: desklet.js:52 +msgid "Paused" +msgstr "En pausa" + +#: desklet.js:55 +msgid "Error" +msgstr "Error" + +#: desklet.js:58 +msgid "Scanning" +msgstr "Escaneando" + +#: desklet.js:61 +msgid "Syncing" +msgstr "Sincronizando" + +#: desklet.js:64 +msgid "Up to Date" +msgstr "Actualizado" + +# Settings +msgid "Syncthing URL (include http:// and port & make sure it's accessible)" +msgstr "URL de Syncthing (incluya http:// y el puerto y asegúrese de que sea accesible)" + +msgid "Usually http://127.0.0.1:8384 for local instances." +msgstr "Normalmente http://127.0.0.1:8384 para instancias locales." + +msgid "API Key" +msgstr "Clave API" + +msgid "Find this in Syncthing -> Actions -> Settings -> General" +msgstr "Encuéntrelo en Syncthing -> Acciones -> Ajustes -> General" + +msgid "Refresh Interval" +msgstr "Intervalo de actualización" + +msgid "Timeout Interval" +msgstr "Intervalo de tiempo de espera" + +msgid "seconds" +msgstr "segundos" + +msgid "Size Scale" +msgstr "Escala de tamaño" + +msgid "Adjust the overall size of the desklet" +msgstr "Ajusta el tamaño general del desklet" + +msgid "multiplier" +msgstr "multiplicador" + +msgid "Dark Mode" +msgstr "Modo oscuro" + +msgid "Switch between light and dark themes" +msgstr "Alternar entre temas claros y oscuros" \ No newline at end of file diff --git a/syncthing-status@geo-sudo/files/syncthing-status@geo-sudo/po/fr.po b/syncthing-status@geo-sudo/files/syncthing-status@geo-sudo/po/fr.po new file mode 100644 index 000000000..c3d181c1e --- /dev/null +++ b/syncthing-status@geo-sudo/files/syncthing-status@geo-sudo/po/fr.po @@ -0,0 +1,82 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-05-23 10:00+0000\n" +"PO-Revision-Date: 2024-05-23 10:05+0000\n" +"Last-Translator: \n" +"Language-Team: French \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: desklet.js:25 +msgid "Folders" +msgstr "Dossiers" + +#: desklet.js:32 +msgid " folders tracked" +msgstr " dossiers suivis" + +#: desklet.js:52 +msgid "Paused" +msgstr "En pause" + +#: desklet.js:55 +msgid "Error" +msgstr "Erreur" + +#: desklet.js:58 +msgid "Scanning" +msgstr "Analyse en cours" + +#: desklet.js:61 +msgid "Syncing" +msgstr "Synchronisation" + +#: desklet.js:64 +msgid "Up to Date" +msgstr "À jour" + +# Settings: baseUrl +msgid "Syncthing URL (include http:// and port & make sure it's accessible)" +msgstr "URL de Syncthing (inclure http://, le port et vérifier l'accessibilité)" + +msgid "Usually http://127.0.0.1:8384 for local instances." +msgstr "Généralement http://127.0.0.1:8384 pour les instances locales." + +# Settings: apiKey +msgid "API Key" +msgstr "Clé API" + +msgid "Find this in Syncthing -> Actions -> Settings -> General" +msgstr "Se trouve dans Syncthing -> Actions -> Paramètres -> Général" + +# Settings: Intervals +msgid "Refresh Interval" +msgstr "Intervalle d'actualisation" + +msgid "Timeout Interval" +msgstr "Délai d'expiration" + +msgid "seconds" +msgstr "secondes" + +# Settings: scale-size +msgid "Size Scale" +msgstr "Échelle de taille" + +msgid "Adjust the overall size of the desklet" +msgstr "Ajuster la taille globale du desklet" + +msgid "multiplier" +msgstr "multiplicateur" + +# Settings: darkMode +msgid "Dark Mode" +msgstr "Mode sombre" + +msgid "Switch between light and dark themes" +msgstr "Basculer entre les thèmes clair et sombre" \ No newline at end of file diff --git a/syncthing-status@geo-sudo/files/syncthing-status@geo-sudo/po/it.po b/syncthing-status@geo-sudo/files/syncthing-status@geo-sudo/po/it.po new file mode 100644 index 000000000..35b37b642 --- /dev/null +++ b/syncthing-status@geo-sudo/files/syncthing-status@geo-sudo/po/it.po @@ -0,0 +1,78 @@ +msgid "" +msgstr "" +"Project-Id-Version: syncthing-status@geo-sudo\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-04-24 01:35+0200\n" +"PO-Revision-Date: 2026-04-24 01:35+0200\n" +"Last-Translator: George Salib \n" +"Language-Team: Italian \n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: desklet.js:25 +msgid "Folders" +msgstr "Cartelle" + +#: desklet.js:32 +msgid " folders tracked" +msgstr " cartelle monitorate" + +#: desklet.js:52 +msgid "Paused" +msgstr "In pausa" + +#: desklet.js:55 +msgid "Error" +msgstr "Errore" + +#: desklet.js:58 +msgid "Scanning" +msgstr "Scansione" + +#: desklet.js:61 +msgid "Syncing" +msgstr "Sincronizzazione" + +#: desklet.js:64 +msgid "Up to Date" +msgstr "Aggiornato" + +# Settings +msgid "Syncthing URL (include http:// and port & make sure it's accessible)" +msgstr "URL di Syncthing (includere http:// e porta e assicurarsi che sia accessibile)" + +msgid "Usually http://127.0.0.1:8384 for local instances." +msgstr "Di solito http://127.0.0.1:8384 per istanze locali." + +msgid "API Key" +msgstr "Chiave API" + +msgid "Find this in Syncthing -> Actions -> Settings -> General" +msgstr "Si trova in Syncthing -> Azioni -> Impostazioni -> Generale" + +msgid "Refresh Interval" +msgstr "Intervallo di aggiornamento" + +msgid "Timeout Interval" +msgstr "Intervallo di timeout" + +msgid "seconds" +msgstr "secondi" + +msgid "Size Scale" +msgstr "Scala dimensioni" + +msgid "Adjust the overall size of the desklet" +msgstr "Regola la dimensione complessiva del desklet" + +msgid "multiplier" +msgstr "moltiplicatore" + +msgid "Dark Mode" +msgstr "Modalità scura" + +msgid "Switch between light and dark themes" +msgstr "Passa dal tema chiaro a quello scuro" \ No newline at end of file diff --git a/syncthing-status@geo-sudo/files/syncthing-status@geo-sudo/po/syncthing-fork-status.pot b/syncthing-status@geo-sudo/files/syncthing-status@geo-sudo/po/syncthing-fork-status.pot new file mode 100644 index 000000000..b8d274a6e --- /dev/null +++ b/syncthing-status@geo-sudo/files/syncthing-status@geo-sudo/po/syncthing-fork-status.pot @@ -0,0 +1,81 @@ +msgid "" +msgstr "" +"Project-Id-Version: syncthing-fork-status@geo-sudo\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-05-23 10:00+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: desklet.js:25 +msgid "Folders" +msgstr "" + +#: desklet.js:32 +msgid " folders tracked" +msgstr "" + +#: desklet.js:52 +msgid "Paused" +msgstr "" + +#: desklet.js:55 +msgid "Error" +msgstr "" + +#: desklet.js:58 +msgid "Scanning" +msgstr "" + +#: desklet.js:61 +msgid "Syncing" +msgstr "" + +#: desklet.js:64 +msgid "Up to Date" +msgstr "" + +# Settings: baseUrl +msgid "Syncthing URL (include http:// and port & make sure it's accessible)" +msgstr "" + +msgid "Usually http://127.0.0.1:8384 for local instances." +msgstr "" + +# Settings: apiKey +msgid "API Key" +msgstr "" + +msgid "Find this in Syncthing -> Actions -> Settings -> General" +msgstr "" + +# Settings: Intervals +msgid "Refresh Interval" +msgstr "" + +msgid "Timeout Interval" +msgstr "" + +msgid "seconds" +msgstr "" + +# Settings: scale-size +msgid "Size Scale" +msgstr "" + +msgid "Adjust the overall size of the desklet" +msgstr "" + +msgid "multiplier" +msgstr "" + +# Settings: darkMode +msgid "Dark Mode" +msgstr "" + +msgid "Switch between light and dark themes" +msgstr "" \ No newline at end of file diff --git a/syncthing-status@geo-sudo/files/syncthing-status@geo-sudo/settings-schema.json b/syncthing-status@geo-sudo/files/syncthing-status@geo-sudo/settings-schema.json new file mode 100644 index 000000000..d536a4c46 --- /dev/null +++ b/syncthing-status@geo-sudo/files/syncthing-status@geo-sudo/settings-schema.json @@ -0,0 +1,48 @@ +{ + "baseUrl": { + "type": "entry", + "default": "http://127.0.0.1:8384", + "description": "Syncthing URL (include http:// and port & make sure it's accessible)", + "tooltip": "Usually http://127.0.0.1:8384 for local instances." + }, + "apiKey": { + "type": "entry", + "default": "", + "description": "API Key", + "tooltip": "Find this in Syncthing -> Actions -> Settings -> General" + }, + "heartbeatInterval": { + "type": "spinbutton", + "default": 5, + "min": 1, + "max": 120, + "step": 1, + "units": "seconds", + "description": "Refresh Interval" + }, + "timeoutInterval": { + "type": "spinbutton", + "default": 15, + "min": 5, + "max": 120, + "step": 1, + "units": "seconds", + "description": "Timeout Interval" + }, + "scale-size": { + "type": "scale", + "default": 1.0, + "min": 0.5, + "max": 2.5, + "step": 0.05, + "units": "multiplier", + "description": "Size Scale", + "tooltip": "Adjust the overall size of the desklet" + }, + "darkMode": { + "type": "checkbox", + "default": false, + "description": "Dark Mode", + "tooltip": "Switch between light and dark themes" + } +} diff --git a/syncthing-status@geo-sudo/info.json b/syncthing-status@geo-sudo/info.json new file mode 100644 index 000000000..5d2972ee7 --- /dev/null +++ b/syncthing-status@geo-sudo/info.json @@ -0,0 +1,8 @@ +{ + "uuid": "syncthing-status@geo-sudo", + "name": "Syncthing Status", + "description": "A simple desklet to monitor Syncthing folders.", + "icon": "icon.png", + "version": "1.0.0", + "author": "geo-sudo" +} diff --git a/syncthing-status@geo-sudo/screenshot.png b/syncthing-status@geo-sudo/screenshot.png new file mode 100644 index 000000000..fefc62aaa Binary files /dev/null and b/syncthing-status@geo-sudo/screenshot.png differ